From 87c697920206ac7ab0f757d3ec0c5550defd2517 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 11 Apr 2018 18:05:40 -0400 Subject: [PATCH 001/174] Fix the botan-test --verbose flag, which did nothing It used to do something, then I broke it. --- src/tests/main.cpp | 1 + src/tests/test_dl_group.cpp | 2 +- src/tests/test_ffi.cpp | 2 +- src/tests/test_ocsp.cpp | 2 +- src/tests/test_runner.cpp | 3 +-- src/tests/test_tests.cpp | 2 +- src/tests/tests.cpp | 8 +++++--- src/tests/tests.h | 32 ++++++++++++++++++-------------- src/tests/unit_ecdsa.cpp | 2 +- 9 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/tests/main.cpp b/src/tests/main.cpp index 0e0360783fc..ef1a16ba765 100644 --- a/src/tests/main.cpp +++ b/src/tests/main.cpp @@ -81,6 +81,7 @@ int main(int argc, char* argv[]) parser.get_arg("provider"), parser.get_arg("drbg-seed"), parser.get_arg_sz("test-runs"), + parser.flag_set("verbose"), parser.flag_set("log-success"), parser.flag_set("run-online-tests"), parser.flag_set("run-long-tests"), diff --git a/src/tests/test_dl_group.cpp b/src/tests/test_dl_group.cpp index 064cb2221a8..64a59f22c30 100644 --- a/src/tests/test_dl_group.cpp +++ b/src/tests/test_dl_group.cpp @@ -44,7 +44,7 @@ class DL_Group_Tests final : public Test "DL_Group uninitialized", []() { Botan::DL_Group dl; dl.get_p(); }); - if(Test::no_avoid_undefined_behavior()) + if(Test::options().undefined_behavior_allowed()) { result.test_throws("Bad generator param", "Invalid argument DL_Group unknown PrimeType", diff --git a/src/tests/test_ffi.cpp b/src/tests/test_ffi.cpp index d5627a45f88..b1c117dcc21 100644 --- a/src/tests/test_ffi.cpp +++ b/src/tests/test_ffi.cpp @@ -842,7 +842,7 @@ class FFI_Unit_Tests final : public Test // delete of null is ok/ignored TEST_FFI_RC(0, botan_hash_destroy, (nullptr)); - if(Test::no_avoid_undefined_behavior()) + if(Test::options().undefined_behavior_allowed()) { // Confirm that botan_x_destroy checks the argument type botan_mp_t mp; diff --git a/src/tests/test_ocsp.cpp b/src/tests/test_ocsp.cpp index 4b344891e13..3b681e193a1 100644 --- a/src/tests/test_ocsp.cpp +++ b/src/tests/test_ocsp.cpp @@ -228,7 +228,7 @@ class OCSP_Tests final : public Test results.push_back(test_response_verification_softfail()); #if defined(BOTAN_HAS_ONLINE_REVOCATION_CHECKS) - if(Test::run_online_tests()) + if(Test::options().run_online_tests()) { results.push_back(test_online_request()); } diff --git a/src/tests/test_runner.cpp b/src/tests/test_runner.cpp index 2816d386d23..849c1a8a989 100644 --- a/src/tests/test_runner.cpp +++ b/src/tests/test_runner.cpp @@ -208,8 +208,7 @@ std::string report_out(const std::vector& results, for(auto const& result : combined) { - const bool verbose = false; - out << result.second.result_string(verbose); + out << result.second.result_string(); tests_failed += result.second.tests_failed(); tests_ran += result.second.tests_run(); } diff --git a/src/tests/test_tests.cpp b/src/tests/test_tests.cpp index 52db0679a44..3a52b85b984 100644 --- a/src/tests/test_tests.cpp +++ b/src/tests/test_tests.cpp @@ -188,7 +188,7 @@ class Test_Tests final : public Test if(test_result.tests_failed() > 0) { result.test_success("Got expected failure for " + what); - const std::string result_str = test_result.result_string(true); + const std::string result_str = test_result.result_string(); result.confirm("result string contains FAIL", result_str.find("FAIL") != std::string::npos); diff --git a/src/tests/tests.cpp b/src/tests/tests.cpp index e51496ab952..beb7e770d3a 100644 --- a/src/tests/tests.cpp +++ b/src/tests/tests.cpp @@ -141,7 +141,7 @@ bool Test::Result::test_throws(const std::string& what, const std::string& expec bool Test::Result::test_success(const std::string& note) { - if(Test::log_success()) + if(Test::options().log_success()) { test_note(note); } @@ -165,7 +165,7 @@ bool Test::Result::test_failure(const std::string& err) { m_fail_log.push_back(err); - if(m_who != "Failing Test" && Test::abort_on_first_fail()) + if(Test::options().abort_on_first_fail() && m_who != "Failing Test") { std::abort(); } @@ -415,8 +415,10 @@ std::string Test::format_time(uint64_t ns) return o.str(); } -std::string Test::Result::result_string(bool verbose) const +std::string Test::Result::result_string() const { + const bool verbose = Test::options().verbose(); + if(tests_run() == 0 && !verbose) { return ""; diff --git a/src/tests/tests.h b/src/tests/tests.h index c3affb6ef58..87ea16379b8 100644 --- a/src/tests/tests.h +++ b/src/tests/tests.h @@ -58,22 +58,24 @@ class Test_Options const std::string& provider, const std::string& drbg_seed, size_t test_runs, + bool verbose, bool log_success, bool run_online_tests, bool run_long_tests, bool abort_on_first_fail, - bool no_avoid_undefined) : + bool undefined_behavior_allowed) : m_requested_tests(requested_tests), m_data_dir(data_dir), m_pkcs11_lib(pkcs11_lib), m_provider(provider), m_drbg_seed(drbg_seed), m_test_runs(test_runs), + m_verbose(verbose), m_log_success(log_success), m_run_online_tests(run_online_tests), m_run_long_tests(run_long_tests), m_abort_on_first_fail(abort_on_first_fail), - m_no_avoid_undefined(no_avoid_undefined) + m_undefined_behavior_allowed(undefined_behavior_allowed) {} const std::vector& requested_tests() const @@ -97,12 +99,14 @@ class Test_Options bool abort_on_first_fail() const { return m_abort_on_first_fail; } - bool no_avoid_undefined_behavior() const + bool verbose() const { return m_verbose; } + + bool undefined_behavior_allowed() const { #if defined(BOTAN_HAS_SANITIZER_UNDEFINED) - return m_no_avoid_undefined; + return m_undefined_behavior_allowed; #else - BOTAN_UNUSED(m_no_avoid_undefined); + BOTAN_UNUSED(m_undefined_behavior_allowed); return true; #endif } @@ -114,11 +118,12 @@ class Test_Options std::string m_provider; std::string m_drbg_seed; size_t m_test_runs; + bool m_verbose; bool m_log_success; bool m_run_online_tests; bool m_run_long_tests; bool m_abort_on_first_fail; - bool m_no_avoid_undefined; + bool m_undefined_behavior_allowed; }; /* @@ -161,7 +166,8 @@ class Test { return m_who; } - std::string result_string(bool verbose) const; + + std::string result_string() const; static Result Failure(const std::string& who, const std::string& what) @@ -474,13 +480,11 @@ class Test static void set_test_rng(std::unique_ptr rng); - static bool no_avoid_undefined_behavior() { return m_opts.no_avoid_undefined_behavior(); } - static bool log_success() { return m_opts.log_success(); } - static bool run_online_tests() { return m_opts.run_online_tests(); } - static bool run_long_tests() { return m_opts.run_long_tests(); } - static bool abort_on_first_fail() { return m_opts.abort_on_first_fail(); } - static const std::string& data_dir() { return m_opts.data_dir(); } - static const std::string& pkcs11_lib() { return m_opts.pkcs11_lib(); } + static const Test_Options& options() { return m_opts; } + + static bool run_long_tests() { return options().run_long_tests(); } + static const std::string& data_dir() { return options().data_dir(); } + static const std::string& pkcs11_lib() { return options().pkcs11_lib(); } static std::string temp_file_name(const std::string& basename); diff --git a/src/tests/unit_ecdsa.cpp b/src/tests/unit_ecdsa.cpp index e21d4764c20..260eb857107 100644 --- a/src/tests/unit_ecdsa.cpp +++ b/src/tests/unit_ecdsa.cpp @@ -299,7 +299,7 @@ Test::Result test_encoding_options() result.test_eq("Hybrid point same size as uncompressed", enc_uncompressed.size(), enc_hybrid.size()); - if(Test::no_avoid_undefined_behavior()) + if(Test::options().undefined_behavior_allowed()) { auto invalid_format = static_cast(99); From d6b7c17d80588dd0d54364cecc7fa8e358a7d198 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 11 Apr 2018 10:02:29 -0400 Subject: [PATCH 002/174] Optimize EC point doubling for a == 0 and a == -3 --- doc/todo.rst | 1 - src/lib/pubkey/ec_group/curve_gfp.cpp | 14 +++++++- src/lib/pubkey/ec_group/curve_gfp.h | 7 ++++ src/lib/pubkey/ec_group/point_gfp.cpp | 49 ++++++++++++++++++++++----- 4 files changed, 61 insertions(+), 10 deletions(-) diff --git a/doc/todo.rst b/doc/todo.rst index c508dd3de30..17a1f340885 100644 --- a/doc/todo.rst +++ b/doc/todo.rst @@ -40,7 +40,6 @@ Public Key Crypto, Math * X448 and Ed448 * FHMQV * Use GLV decomposition to speed up secp256k1 operations -* Optimize ECC point doubling for a=-3 and a=0 curves * wNAF ECC point multiply * Recover ECDSA public key from signature/message pair (GH #664) diff --git a/src/lib/pubkey/ec_group/curve_gfp.cpp b/src/lib/pubkey/ec_group/curve_gfp.cpp index 8953edba406..9f614ac61b3 100644 --- a/src/lib/pubkey/ec_group/curve_gfp.cpp +++ b/src/lib/pubkey/ec_group/curve_gfp.cpp @@ -34,8 +34,14 @@ class CurveGFp_Montgomery final : public CurveGFp_Repr m_r3 = mod_p.multiply(m_r, m_r2); m_a_r = mod_p.multiply(m_r, m_a); m_b_r = mod_p.multiply(m_r, m_b); + + m_a_is_zero = m_a.is_zero(); + m_a_is_minus_3 = (m_a + 3 == m_p); } + bool a_is_zero() const override { return m_a_is_zero; } + bool a_is_minus_3() const override { return m_a_is_minus_3; } + const BigInt& get_a() const override { return m_a; } const BigInt& get_b() const override { return m_b; } @@ -78,6 +84,9 @@ class CurveGFp_Montgomery final : public CurveGFp_Repr // Montgomery parameters BigInt m_r, m_r2, m_r3; word m_p_dash; + + bool m_a_is_zero; + bool m_a_is_minus_3; }; BigInt CurveGFp_Montgomery::invert_element(const BigInt& x, secure_vector& ws) const @@ -190,8 +199,12 @@ class CurveGFp_NIST : public CurveGFp_Repr CurveGFp_NIST(size_t p_bits, const BigInt& a, const BigInt& b) : m_a(a), m_b(b), m_p_words((p_bits + BOTAN_MP_WORD_BITS - 1) / BOTAN_MP_WORD_BITS) { + // All Solinas prime curves are assumed a == -3 } + bool a_is_zero() const override { return false; } + bool a_is_minus_3() const override { return true; } + const BigInt& get_a() const override { return m_a; } const BigInt& get_b() const override { return m_b; } @@ -233,7 +246,6 @@ class CurveGFp_NIST : public CurveGFp_Repr size_t m_p_words; // cache of m_p.sig_words() }; - BigInt CurveGFp_NIST::invert_element(const BigInt& x, secure_vector& ws) const { BOTAN_UNUSED(ws); diff --git a/src/lib/pubkey/ec_group/curve_gfp.h b/src/lib/pubkey/ec_group/curve_gfp.h index 8a83a9c4170..3a17c6678f6 100644 --- a/src/lib/pubkey/ec_group/curve_gfp.h +++ b/src/lib/pubkey/ec_group/curve_gfp.h @@ -30,6 +30,10 @@ class BOTAN_UNSTABLE_API CurveGFp_Repr virtual bool is_one(const BigInt& x) const = 0; + virtual bool a_is_zero() const = 0; + + virtual bool a_is_minus_3() const = 0; + /* * Returns to_curve_rep(get_a()) */ @@ -116,6 +120,9 @@ class BOTAN_UNSTABLE_API CurveGFp final const BigInt& get_b_rep() const { return m_repr->get_b_rep(); } + bool a_is_minus_3() const { return m_repr->a_is_minus_3(); } + bool a_is_zero() const { return m_repr->a_is_zero(); } + bool is_one(const BigInt& x) const { return m_repr->is_one(x); } BigInt invert_element(const BigInt& x, secure_vector& ws) const diff --git a/src/lib/pubkey/ec_group/point_gfp.cpp b/src/lib/pubkey/ec_group/point_gfp.cpp index acbda95d47a..86045925239 100644 --- a/src/lib/pubkey/ec_group/point_gfp.cpp +++ b/src/lib/pubkey/ec_group/point_gfp.cpp @@ -316,14 +316,47 @@ void PointGFp::mult2(std::vector& ws_bn) T1 <<= 2; // * 4 T1.reduce_below(p, T3.get_word_vector()); - m_curve.sqr(T3, m_coord_z, ws); // z^2 - m_curve.sqr(T4, T3, ws); // z^4 - m_curve.mul(T3, m_curve.get_a_rep(), T4, ws); - - m_curve.sqr(T4, m_coord_x, ws); - T4 *= 3; - T4 += T3; - T4.reduce_below(p, T3.get_word_vector()); + if(m_curve.a_is_zero()) + { + // if a == 0 then 3*x^2 + a*z^4 is just 3*x^2 + m_curve.sqr(T4, m_coord_x, ws); // x^2 + T4 *= 3; // 3*x^2 + T4.reduce_below(p, T3.get_word_vector()); + } + else if(m_curve.a_is_minus_3()) + { + /* + if a == -3 then + 3*x^2 + a*z^4 == 3*x^2 - 3*z^4 == 3*(x^2-z^4) == 3*(x-z^2)*(x+z^2) + */ + m_curve.sqr(T3, m_coord_z, ws); // z^2 + + // (x-z^2) + T2 = m_coord_x; + T2 -= T3; + if(T2.is_negative()) + T2 += p; + + // (x+z^2) + T3 += m_coord_x; + T3.reduce_below(p, T4.get_word_vector()); + + m_curve.mul(T4, T2, T3, ws); // (x-z^2)*(x+z^2) + + T4 *= 3; // 3*(x-z^2)*(x+z^2) + T4.reduce_below(p, T3.get_word_vector()); + } + else + { + m_curve.sqr(T3, m_coord_z, ws); // z^2 + m_curve.sqr(T4, T3, ws); // z^4 + m_curve.mul(T3, m_curve.get_a_rep(), T4, ws); // a*z^4 + + m_curve.sqr(T4, m_coord_x, ws); // x^2 + T4 *= 3; // 3*x^2 + T4 += T3; // 3*x^2 + a*z^4 + T4.reduce_below(p, T3.get_word_vector()); + } m_curve.sqr(T2, T4, ws); T2 -= T1; From 9bbc6340fc4da8761faa9613e828571f1b29c059 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 11 Apr 2018 18:26:31 -0400 Subject: [PATCH 003/174] Fix indentation [ci skip] --- src/cli/pubkey.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cli/pubkey.cpp b/src/cli/pubkey.cpp index 3af91b722ac..60119ca1350 100644 --- a/src/cli/pubkey.cpp +++ b/src/cli/pubkey.cpp @@ -259,14 +259,14 @@ class PKCS8_Tool final : public Command std::unique_ptr key; std::string pass_in = get_arg("pass-in"); - if (pass_in.empty()) - { + if(pass_in.empty()) + { key.reset(Botan::PKCS8::load_key(get_arg("key"), rng())); - } + } else - { + { key.reset(Botan::PKCS8::load_key(get_arg("key"), rng(), pass_in)); - } + } const std::chrono::milliseconds pbe_millis(get_arg_sz("pbe-millis")); const std::string pbe = get_arg("pbe"); From be1307661d4eea173458d24580e1039464c83753 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 11 Apr 2018 20:00:35 -0400 Subject: [PATCH 004/174] Update news --- news.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/news.rst b/news.rst index 69a7f2d07b1..a91206b1728 100644 --- a/news.rst +++ b/news.rst @@ -4,6 +4,9 @@ Release Notes Version 2.7.0, Not Yet Released ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* Optimized elliptic point doubling for curves with a parameter of + zero or negative three. (GH #1534) + Version 2.6.0, 2018-04-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From ea9ad889a3c0f585c4f96b20c93961851d782c2e Mon Sep 17 00:00:00 2001 From: Alexander Bluhm Date: Thu, 12 Apr 2018 00:20:17 +0200 Subject: [PATCH 005/174] Do not create shared library symlinks on OpenBSD. Symlinks to shared libraries confuse the OpenBSD dynamic linker. We need one file with two numbers. The problem became apparent when the abi_rev and the OpenBSD ports shared libs numbers diverged. Add a new conditional variable symlink_shared_lib to suppress the symlink in the makefile. --- configure.py | 1 + src/build-data/makefile.in | 2 ++ src/build-data/os/openbsd.txt | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/configure.py b/configure.py index 378e12c822f..9fe0ff2badd 100755 --- a/configure.py +++ b/configure.py @@ -1852,6 +1852,7 @@ def join_with_build_dir(path): 'build_shared_lib': options.build_shared_lib, 'build_unix_shared_lib': options.build_shared_lib and options.compiler != 'msvc', + 'symlink_shared_lib': options.build_shared_lib and options.compiler != 'msvc' and options.os != 'openbsd', 'build_msvc_shared_lib': options.build_shared_lib and options.compiler == 'msvc', 'libobj_dir': build_paths.libobj_dir, diff --git a/src/build-data/makefile.in b/src/build-data/makefile.in index 2039ade4eb3..d3e69642d8f 100644 --- a/src/build-data/makefile.in +++ b/src/build-data/makefile.in @@ -98,6 +98,8 @@ fuzzer_corpus_zip: fuzzer_corpus %{out_dir}/%{shared_lib_name}: $(LIBOBJS) %{lib_link_cmd} $(LDFLAGS) $(LIBOBJS) $(LIB_LINKS_TO) %{output_to_exe}$@ +%{endif} +%{if symlink_shared_lib} cd %{out_dir} && ln -fs %{shared_lib_name} %{soname_base} cd %{out_dir} && ln -fs %{shared_lib_name} %{soname_patch} diff --git a/src/build-data/os/openbsd.txt b/src/build-data/os/openbsd.txt index 5ba148e660b..ad35da15b97 100644 --- a/src/build-data/os/openbsd.txt +++ b/src/build-data/os/openbsd.txt @@ -1,6 +1,6 @@ soname_pattern_base "lib{libname}.so" -soname_pattern_abi "lib{libname}.so.{abi_rev}" +soname_pattern_abi "lib{libname}.so.{abi_rev}.{version_minor}" soname_pattern_patch "lib{libname}.so.{abi_rev}.{version_minor}" From 59012b91d50485bd5aa7d700fdcf40347239ec93 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 11 Apr 2018 20:57:08 -0400 Subject: [PATCH 006/174] Some makefile simplifications --- configure.py | 3 +-- src/build-data/makefile.in | 15 ++++----------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/configure.py b/configure.py index 9fe0ff2badd..f5e06afef50 100755 --- a/configure.py +++ b/configure.py @@ -1851,9 +1851,8 @@ def join_with_build_dir(path): 'build_fuzzers': options.build_fuzzers, 'build_shared_lib': options.build_shared_lib, - 'build_unix_shared_lib': options.build_shared_lib and options.compiler != 'msvc', + 'build_shared_lib': options.build_shared_lib, 'symlink_shared_lib': options.build_shared_lib and options.compiler != 'msvc' and options.os != 'openbsd', - 'build_msvc_shared_lib': options.build_shared_lib and options.compiler == 'msvc', 'libobj_dir': build_paths.libobj_dir, 'cliobj_dir': build_paths.cliobj_dir, diff --git a/src/build-data/makefile.in b/src/build-data/makefile.in index d3e69642d8f..5b408c01679 100644 --- a/src/build-data/makefile.in +++ b/src/build-data/makefile.in @@ -14,6 +14,7 @@ SO_OBJ_FLAGS = %{shared_flags} LDFLAGS = %{ldflags} EXE_LINK_CMD = %{exe_link_cmd} +POST_LINK_CMD = %{post_link_cmd} LIB_LINKS_TO = %{link_to} EXE_LINKS_TO = %{link_to_botan} $(LIB_LINKS_TO) @@ -65,11 +66,11 @@ TESTOBJS = %{join test_objs} $(CLI): $(LIBRARIES) $(CLIOBJS) $(EXE_LINK_CMD) $(LDFLAGS) $(CLIOBJS) $(EXE_LINKS_TO) %{output_to_exe}$@ - %{post_link_cmd} + $(POST_LINK_CMD) $(TEST): $(LIBRARIES) $(TESTOBJS) $(EXE_LINK_CMD) $(LDFLAGS) $(TESTOBJS) $(EXE_LINKS_TO) %{output_to_exe}$@ - %{post_link_cmd} + $(POST_LINK_CMD) %{if build_fuzzers} @@ -94,7 +95,7 @@ fuzzer_corpus_zip: fuzzer_corpus %{endif} -%{if build_unix_shared_lib} +%{if build_shared_lib} %{out_dir}/%{shared_lib_name}: $(LIBOBJS) %{lib_link_cmd} $(LDFLAGS) $(LIBOBJS) $(LIB_LINKS_TO) %{output_to_exe}$@ @@ -102,14 +103,6 @@ fuzzer_corpus_zip: fuzzer_corpus %{if symlink_shared_lib} cd %{out_dir} && ln -fs %{shared_lib_name} %{soname_base} cd %{out_dir} && ln -fs %{shared_lib_name} %{soname_patch} - -%{endif} - -%{if build_msvc_shared_lib} - -%{out_dir}/%{shared_lib_name}: $(LIBOBJS) - %{lib_link_cmd} $(LDFLAGS) $(LIBOBJS) $(LIB_LINKS_TO) %{output_to_exe}$@ - %{endif} # Build Commands From 6a9557cc5528ec01737e77b67959cba8778f1265 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 12 Apr 2018 10:33:33 -0400 Subject: [PATCH 007/174] Lint fixes --- configure.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/configure.py b/configure.py index f5e06afef50..26a5ba8a229 100755 --- a/configure.py +++ b/configure.py @@ -1789,6 +1789,11 @@ def join_with_build_dir(path): return path return os.path.join(build_dir, path) + def shared_lib_uses_symlinks(): + if options.os in ['windows', 'openbsd']: + return False + return True + variables = { 'version_major': Version.major(), 'version_minor': Version.minor(), @@ -1848,11 +1853,11 @@ def join_with_build_dir(path): 'makefile_path': os.path.join(build_paths.build_dir, '..', 'Makefile'), 'build_static_lib': options.build_static_lib, + 'build_shared_lib': options.build_shared_lib, + 'build_fuzzers': options.build_fuzzers, - 'build_shared_lib': options.build_shared_lib, - 'build_shared_lib': options.build_shared_lib, - 'symlink_shared_lib': options.build_shared_lib and options.compiler != 'msvc' and options.os != 'openbsd', + 'symlink_shared_lib': options.build_shared_lib and shared_lib_uses_symlinks(), 'libobj_dir': build_paths.libobj_dir, 'cliobj_dir': build_paths.cliobj_dir, From 25de1f6a94983134e70b1cdbc5ceb226039623ae Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 12 Apr 2018 11:25:38 -0400 Subject: [PATCH 008/174] Allow year up to 2200 in ASN1 time objects Also tighten up checking of days Fixes GH #1536 --- src/lib/asn1/asn1_time.cpp | 21 +++++++++++++---- src/lib/asn1/asn1_time.h | 2 ++ src/tests/data/asn1_time.vec | 37 +++++++++++++++++++++++++++++ src/tests/test_asn1.cpp | 45 +++++++++++++++++++++++++++++++++++- 4 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 src/tests/data/asn1_time.vec diff --git a/src/lib/asn1/asn1_time.cpp b/src/lib/asn1/asn1_time.cpp index e64fd57c792..863a064f0b4 100644 --- a/src/lib/asn1/asn1_time.cpp +++ b/src/lib/asn1/asn1_time.cpp @@ -213,7 +213,7 @@ void X509_Time::set_to(const std::string& t_spec, ASN1_Tag spec_tag) } if(!passes_sanity_check()) - throw Invalid_Argument("Time did not pass sanity check: " + t_spec); + throw Invalid_Argument("Time " + t_spec + " does not seem to be valid"); } /* @@ -221,13 +221,26 @@ void X509_Time::set_to(const std::string& t_spec, ASN1_Tag spec_tag) */ bool X509_Time::passes_sanity_check() const { - if(m_year < 1950 || m_year > 2100) + if(m_year < 1950 || m_year > 2200) return false; if(m_month == 0 || m_month > 12) return false; - if(m_day == 0 || m_day > 31) + + const uint32_t days_in_month[12] = { 31, 28+1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + + if(m_day == 0 || m_day > days_in_month[m_month-1]) return false; - if(m_hour >= 24 || m_minute > 60 || m_second > 60) + + if(m_month == 2 && m_day == 29) + { + if(m_year % 4 != 0) + return false; // not a leap year + + if(m_year % 100 == 0 && m_year % 400 != 0) + return false; + } + + if(m_hour >= 24 || m_minute >= 60 || m_second > 60) return false; if (m_tag == UTC_TIME) diff --git a/src/lib/asn1/asn1_time.h b/src/lib/asn1/asn1_time.h index 73bf2747fcf..717c58a7d9b 100644 --- a/src/lib/asn1/asn1_time.h +++ b/src/lib/asn1/asn1_time.h @@ -72,6 +72,8 @@ bool BOTAN_PUBLIC_API(2,0) operator>=(const X509_Time&, const X509_Time&); bool BOTAN_PUBLIC_API(2,0) operator<(const X509_Time&, const X509_Time&); bool BOTAN_PUBLIC_API(2,0) operator>(const X509_Time&, const X509_Time&); +typedef X509_Time ASN1_Time; + } #endif diff --git a/src/tests/data/asn1_time.vec b/src/tests/data/asn1_time.vec new file mode 100644 index 00000000000..b1b33f27923 --- /dev/null +++ b/src/tests/data/asn1_time.vec @@ -0,0 +1,37 @@ + +[UTC] + +Tspec = 500131053030Z + +[UTC.invalid] + +Tspec = 201801310590Z + +[Generalized] + +Tspec = 19500101000000Z +Tspec = 19500131053030Z +Tspec = 20000229000000Z +Tspec = 20180131000000Z +Tspec = 20180131053030Z +Tspec = 20200229000000Z +Tspec = 20201231235960Z +Tspec = 21000101000060Z +Tspec = 21000101005900Z +Tspec = 21000101230000Z +Tspec = 22001231235960Z + +[Generalized.invalid] + +Tspec = 20000001000000Z +Tspec = 20000100000000Z + +Tspec = 19490131053030Z +Tspec = 20180132000000Z +Tspec = 20180229000000Z +Tspec = 21000101000061Z +Tspec = 21000101006000Z +Tspec = 21000101240000Z +Tspec = 21000101990000Z +Tspec = 21000229000000Z +Tspec = 22010131053030Z diff --git a/src/tests/test_asn1.cpp b/src/tests/test_asn1.cpp index ae9c1dafbbb..f3bf3abc175 100644 --- a/src/tests/test_asn1.cpp +++ b/src/tests/test_asn1.cpp @@ -11,8 +11,8 @@ #include #include #include + #include #endif -#include namespace Botan_Tests { @@ -291,6 +291,49 @@ class ASN1_Tests final : public Test BOTAN_REGISTER_TEST("asn1", ASN1_Tests); +class ASN1_Time_Parsing_Tests final : public Text_Based_Test + { + public: + ASN1_Time_Parsing_Tests() : + Text_Based_Test("asn1_time.vec", "Tspec") {} + + Test::Result run_one_test(const std::string& tag_str, const VarMap& vars) + { + Test::Result result("ASN.1 date parsing"); + + const std::string tspec = get_req_str(vars, "Tspec"); + + if(tag_str != "UTC" && + tag_str != "UTC.invalid" && + tag_str != "Generalized" && + tag_str != "Generalized.invalid") + { + throw Test_Error("Invalid tag value in ASN1 date parsing test"); + } + + const Botan::ASN1_Tag tag = + (tag_str == "UTC" || tag_str == "UTC.invalid") ? Botan::UTC_TIME : Botan::GENERALIZED_TIME; + + const bool valid = tag_str.find(".invalid") == std::string::npos; + + if(valid) + { + Botan::ASN1_Time time(tspec, tag); + result.test_success("Accepted valid time"); + } + else + { + result.test_throws("Invalid time rejected", [=]() { + Botan::ASN1_Time time(tspec, tag); + }); + } + + return result; + } + }; + +BOTAN_REGISTER_TEST("asn1_time", ASN1_Time_Parsing_Tests); + class ASN1_Printer_Tests final : public Test { public: From cd48c9ac47c700f69ca9b7900ace0ea47373535d Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 12 Apr 2018 12:11:44 -0400 Subject: [PATCH 009/174] Correct name of script [ci skip] --- doc/manual/fuzzing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manual/fuzzing.rst b/doc/manual/fuzzing.rst index ac9227e9416..0aceaf29be2 100644 --- a/doc/manual/fuzzing.rst +++ b/doc/manual/fuzzing.rst @@ -61,7 +61,7 @@ To run it against Botan's server:: $ ./configure.py --with-sanitizers $ make botan - $ ./src/scripts/run_tls_fuzzer.py ./botan ./botan-ci-tools + $ ./src/scripts/run_tls_attacker.py ./botan ./botan-ci-tools Output and logs from the fuzzer are placed into `/tmp`. See the TLS-Attacker documentation for more information about how to use this From 99879d3b73455380df27e1063bf1c4e58c6fc936 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 12 Apr 2018 12:14:11 -0400 Subject: [PATCH 010/174] Clarify log message [ci skip] --- news.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/news.rst b/news.rst index a91206b1728..352886c57c2 100644 --- a/news.rst +++ b/news.rst @@ -4,8 +4,8 @@ Release Notes Version 2.7.0, Not Yet Released ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -* Optimized elliptic point doubling for curves with a parameter of - zero or negative three. (GH #1534) +* Optimized elliptic point doubling for curves with an ``a`` parameter + of zero or negative three. (GH #1534) Version 2.6.0, 2018-04-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From c15d82039b916ed453202e499dcfb2dfa0abe967 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 12 Apr 2018 14:06:38 -0400 Subject: [PATCH 011/174] Add missing override [ci skip] --- src/tests/test_asn1.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/test_asn1.cpp b/src/tests/test_asn1.cpp index f3bf3abc175..d025fe9f5c2 100644 --- a/src/tests/test_asn1.cpp +++ b/src/tests/test_asn1.cpp @@ -297,7 +297,7 @@ class ASN1_Time_Parsing_Tests final : public Text_Based_Test ASN1_Time_Parsing_Tests() : Text_Based_Test("asn1_time.vec", "Tspec") {} - Test::Result run_one_test(const std::string& tag_str, const VarMap& vars) + Test::Result run_one_test(const std::string& tag_str, const VarMap& vars) override { Test::Result result("ASN.1 date parsing"); From 03f46b98d57befa06a1c71190ec0b98ef21919ac Mon Sep 17 00:00:00 2001 From: Matthias Gierlings Date: Thu, 12 Apr 2018 00:00:43 +0200 Subject: [PATCH 012/174] Adds missing XMSS signature length check. - Fixes out of bounds read in `XMSS_Signature` constructor when the raw signature data supplied as arguments is shorter than the signature size defined by the XMSS parameter set encoded in the `XMSS_PublicKey`. - Fixes valid signatures with arbitrary appended data to be verified as correct signature. --- src/lib/pubkey/xmss/xmss_signature.cpp | 41 ++++---- src/lib/pubkey/xmss/xmss_signature.h | 2 +- src/tests/data/pubkey/xmss_invalid.vec | 138 +++++++++++++++++++++++++ src/tests/test_xmss.cpp | 25 ++++- 4 files changed, 183 insertions(+), 23 deletions(-) create mode 100644 src/tests/data/pubkey/xmss_invalid.vec diff --git a/src/lib/pubkey/xmss/xmss_signature.cpp b/src/lib/pubkey/xmss/xmss_signature.cpp index 88ef4265509..88809cf7ba8 100644 --- a/src/lib/pubkey/xmss/xmss_signature.cpp +++ b/src/lib/pubkey/xmss/xmss_signature.cpp @@ -1,6 +1,6 @@ /* * XMSS Signature - * (C) 2016,2017 Matthias Gierlings + * (C) 2016,2017,2018 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ @@ -14,24 +14,23 @@ XMSS_Signature::XMSS_Signature(XMSS_Parameters::xmss_algorithm_t oid, const secure_vector& raw_sig) : m_leaf_idx(0), m_randomness(0, 0x00), m_tree_sig() { - BOTAN_ASSERT(sizeof(size_t) >= std::ceil(static_cast( - (XMSS_Parameters(oid)).tree_height()) / 8.f), - "System type \"size_t\" not big enough to support" - " leaf index."); - XMSS_Parameters xmss_params(oid); - uint64_t leaf_idx = 0; + + if(raw_sig.size() != (xmss_params.len() + xmss_params.tree_height() + 1) + * xmss_params.element_size() + sizeof(m_leaf_idx)) + { + throw Integrity_Failure("XMSS signature size invalid."); + } + for(size_t i = 0; i < 8; i++) - { leaf_idx = ((leaf_idx << 8) | raw_sig[i]); } + { m_leaf_idx = ((m_leaf_idx << 8) | raw_sig[i]); } - if(leaf_idx >= (1ull << (xmss_params.tree_height() - 1))) + if(m_leaf_idx >= (1ull << (xmss_params.tree_height() - 1))) { - throw Integrity_Failure("XMSS signature leaf index out of " - "bounds."); + throw Integrity_Failure("XMSS signature leaf index out of bounds."); } - m_leaf_idx = static_cast(leaf_idx); - auto begin = raw_sig.begin() + sizeof(uint64_t); + auto begin = raw_sig.begin() + sizeof(m_leaf_idx); auto end = begin + xmss_params.element_size(); std::copy(begin, end, std::back_inserter(m_randomness)); @@ -64,14 +63,14 @@ secure_vector XMSS_Signature::bytes() const { secure_vector result { - static_cast(static_cast(m_leaf_idx) >> 56U), - static_cast(static_cast(m_leaf_idx) >> 48U), - static_cast(static_cast(m_leaf_idx) >> 40U), - static_cast(static_cast(m_leaf_idx) >> 32U), - static_cast(static_cast(m_leaf_idx) >> 24U), - static_cast(static_cast(m_leaf_idx) >> 16U), - static_cast(static_cast(m_leaf_idx) >> 8U), - static_cast(static_cast(m_leaf_idx)) + static_cast(m_leaf_idx >> 56U), + static_cast(m_leaf_idx >> 48U), + static_cast(m_leaf_idx >> 40U), + static_cast(m_leaf_idx >> 32U), + static_cast(m_leaf_idx >> 24U), + static_cast(m_leaf_idx >> 16U), + static_cast(m_leaf_idx >> 8U), + static_cast(m_leaf_idx) }; std::copy(m_randomness.begin(), diff --git a/src/lib/pubkey/xmss/xmss_signature.h b/src/lib/pubkey/xmss/xmss_signature.h index 838aae2e87b..25e168fd857 100644 --- a/src/lib/pubkey/xmss/xmss_signature.h +++ b/src/lib/pubkey/xmss/xmss_signature.h @@ -117,7 +117,7 @@ class XMSS_Signature final secure_vector bytes() const; private: - size_t m_leaf_idx; + uint64_t m_leaf_idx; secure_vector m_randomness; XMSS_WOTS_PublicKey::TreeSignature m_tree_sig; }; diff --git a/src/tests/data/pubkey/xmss_invalid.vec b/src/tests/data/pubkey/xmss_invalid.vec new file mode 100644 index 00000000000..2430b9d6631 --- /dev/null +++ b/src/tests/data/pubkey/xmss_invalid.vec @@ -0,0 +1,138 @@ +# Signature with appended garbage data "01234567890abcdeff" +Params = SHA2-256_W16_H10 +Msg = 0d8a2b78908b8a2537a194af3b98de9355384accdd7d2e3b542e37dab55f0fbd8fe163e261d37074f7fcc3f4e7d1774cddc6 +PublicKey = 01000001c9802b0c3dfa2596ffde21b7b9abfed5094d7e936a96900ad7ca634ad7bffeade07f1a46e940a2630bb8da78dfeae742d5a9712e15459d9d51f2a22145f25be0 +InvalidSignature = 00000000000000001762b20507b3bf51231e50aa3bed990b93493fdec8040ae24043fc7d5a0e0d8744611ec5f883282695c4a181de84d3fd993e24749f6d855453a1507bc0703cc5645bfb281687fa9c9a8375c19dd51b0a62a5036e570a45fc1f3c89bdd1147dd200f3756b6c04634f7d2abb37da79555cd209975824d0363cebbab14d3419e0e99233413c6226e811a1cdedacce918c467cd468ba21a3bf2f3c549bf0d93a87cb0a7f6574d3db01dbfc5d61c8eb60b8b3adc4ff5d8d63d9f9e91d42c7095e66ed1d5bccc7965eda895350c727fe2c8a618d685d338f1d0eac13c41de2c5b3ba27553b60b48bb94b15adf8d2323efd85b2c438102aab7c230e5affb39ad425fa44a093b4f4b935acdf78d4590815c037ac8d3fc63edcd3b58532d24d7ef2d4253a091f43e51e0238d714a60c54b8e3309257a420ab43340ddc6bd8b43f75562ca7b3190a951a038e17a709607069d44aa039bd0ecf5af5bfab596d14f45f53503f4e8b38ff4b2ce13a3d7fec0ffa513efaf8f0b0320ea759fc86674d97b9a959722da668c57e96bb3dbd20d52f14fb8bcd7d130b8100b475268b6e5aba22029e41c7ec444f4002c5cbcb4c948936e07111dabe243c15bf4c1da2ecc5e52d6db94455edaab2f3f5393f4475845e94e2ecc8f02a9db7290d15563bd37e603f29848d36bb726e9d1ced80d9a7e6d23f89f074a2f0427dd07de7db479d2a5d1bf5b130fa0fb59fa21ae7d4e0d1653fecb9cc15bea0583401d582899f58e9a01bbf86471925245a24f7ed2404a686c9985710c580467e76625760ba4a56a1c72cae259acee23a58191931fed954af2778aaa3cf52aa83380abde5600eab7faeaa867875606a610d858472fe05f4c3fecbbc104ebc45c39cb2bacc70f444a697ccf845d31b0e06b3d399a13b25f51e0b01b005c80a974fbbd22da2662a1e2f7ed07fce73b4a2b2ae72df519a4fd30d8d8ce0cd14c8d570e35ba7dc87745d8742c89d47908e163010a4ebc024ffa73c3c026b8021ef2f9f155a7b8801b1018829efc24cecf1d1d3135fd987f3d15cf442b031a99bf069b8c9cd1d1aa6602cddf57723f718b19991ad58b8e87f5d7e67181bd730743b318336e882e50c95304c289c8efd08ff23ef7888fcde315a82fbb767e6be568d2f8588bc41b7ca3cca0dced1046220a69205757806c90cda9e43394c278f4058b759bb0373e240faef13c721560c06dfebc44eba270003ffa51996a6b3f464f768acc0f2c877e3a8d1e42b9a6049a570d768f0e9bebfddf91112101c751c73e15a4e9ed17310de7cb9cc65c3ee3648bdcdeb0de1c2a0edc241c8a2dad563955b72417f2f8a608ecb4b4680366b816307a7b63966f777a0106d14afad60222097eff9257707449827241c6b0b2dc44a32cfac9a5506f54310cdf2806e3017671ac062e91655ca6f0f9d3be4d95921233d77c8c86518b94c319bdf25009bde19d47d5cafa764f802e94f4fcd4063755d3bcc5a6224b33ed6a27d3839213d8804fb1d18e55c64fd070bd2833457d4fca8b78eaececfc7a7fad2bf1fb2f007bde785452562a4201ea524129685aa7d4a6d5063b12507880a0b0c39971baef9303f0f1227810f9f2457f1d1f390f025aaeffe518682739412c797beebe440e194f5ce7ed8a027bcea23552cc1a1c175f7b716117e0c2a64d4ce695b4b55f92d8985b01f6cab96a25476026f2eec69b83fb445875bf54df507159ed00d7b4c020cc526fddc55e73a01f7712bb8daabc14060f51b412439d08fc94e8d90985336b747f933ee4e174ba8e5dc9f049eaaad832f0c2088bb8cc17a95e1dc967994fc6536828300125555b383ea372a65ed9dd5e92348800d800a0ce0db784216ccd65abf173db327515f7a1e4cad57fe33ac3fc99c0ab80d09d31ecbbadc9adcddee61749388a162495a26ba903f1391e527cfef2b696f8fc42e0a0b3f89fc6f86df62dfe564cecd3f33392b1fa8e68cbeea386827db74ae65e15650c3fbb7d9208e2777c9e5b4a2fbc7f9a84037055709912c0db2196fdc8bbada2160ae677ee0b39cf2bc73653597fc51eeecc70ee7dbea5eaf8a2f9a41fcd33bc2d2c19aeda8d9f1200e8baff73a84ecf5c18fa44fc4827c8938c65a8c79afe26a07f5dc8ebfac1dafeb9d2d16cf5741ec7228e21eacc6e00d258c4b0d0e2c9ac9ffa849b09e1c35234f0608841d5b85a5643ffbf6c084534b503ea1a9017aa008f1c8faa780d6a3eaf5bb69481913156989a499b75480ca22b8d3bea6596100a87b23134d65272dab7770a29f8839d09344982b5d4121ac49ce052cdea7ce9668eb4f3db3c178daafc190327592e9a5a8720c583a7716f0ca51cee67621932c9628143eb40eb6538e378214d8371b1634d4f61a16f28ab147c83cf865248bb899444a32a101b92b49d1fa37e732bc3134026b45b30b57cfdd7754f5368ebe2761f0b1cd3f92542b85711d5c6d56086549709c198880f6c1eae322852ab4e7601971006967e0a869d6a0e764fdd870240862059f1532df541f3a60571c2d00da0d4b67c4002dce0e197970f8404eb19dc3f91036a716c285d5a543a818f1cfe85cd760d7168d3204146ad470f033b2dfb05e422434f36eae7bc46d7aa434240c578dc291cdca5bf2ba94832d37b8977d2401d3d358fd54b68f94b7108b48d96975608d9cc7cc2420911c2e17604efdf396b886f60a57278860d84f26ceb28a7a340f36f0bbf91451b4dd5a599eb661018dd6dd3870c510b251d65006f4e51d1909283c87e086ab3cbeed325a628fb8b885890bdc3062bbd6bbb3ebc59da5a906f347192d69fbb76333099d809456ad7a5fd4dc4e0e23f4473ca9167065ccd60a526fa88e550cb40515804465261df071cf8620ed13935a8bc77db8e231c2adb4a7fc1460b014afddf47466d00093882349aaefd7e20449fa2bff1dc215e0fdf65bbc2555bead769b624632211b05c098c932fa0d203fce526698caad71b897d7c7d297c59bd51dc816b00d03fdf10de774afe52655f14a5c00d9026fbc01878436b5560dae061d220cdc8ddfe5a81ab4fc497bda7fa989e589f3dc87514ff57bf59c099d1787363bf16ce81b1e0ef7db27518fa5ce332165ecea514f7720a84382b6f686a919178acc5bc5b46aba93d98f48e65b16a0c0e26c52b7c94319fa210920dd7cd095362032c6c60cc463b0b5f6eaf70c66f3b8bef88f2bba8b14f5c971b12d90dfdec5894a6b030c08a4e2d6094f5813d596b084f018e45abc6161a1d6755dcc9b1d2b8d2a4ec6cbc827267ef79ebf5647017f6843f6022d2de727fdbfe3e2ef74822684c027b9683e384e5f17f29ac85ccead243198d4e64db77515c2fec030cae5537715b5c579468d5f724d57cd3027665f55ac1a656c6985295aed5ffb5f83d7a294754ef6cfaca603933eb642f3e3ba9bbc2b9192b4a24c660470479c8bc2ff2bd371878be2a60bd3c017f6dbe5a4c7e7bd78278b629b57b909090bab7df5e763096974cd730da560de9a1bd0fdccfe9f5ef901234567890abcdeff + +# Signature with prepended zeroes +Params = SHA2-256_W16_H10 +Msg = +PublicKey = 010000014dc6e78c10845a071e9ca6cd1ad0d49a955a6305c7071ef967efbfd317563fc493c6003c3879279fff396a7db158859ec7476a503f0b349b65ae2b01f7c73715 +InvalidSignature = 0000000000000000000000000000ff3dcc74254edcfd0e54170dc8ea77fd8fbc6a3107ee2142634ae5f8e6ebdde04342fe40867000150779bbaef0018609d7d9f6ac2752f06e3504f3ab515913f236375401048841133ef08cd02d3c299c55bcc2a5da1d8e8afae90dd37ca42f386c19e75c197f62368e7d322a6b479265adeeb246474c240dad7cffd613db90de9e7fea2cdb0817d4f97746ee8c47fbd24a6e724391a35e36b7d2c023bd2f9a0377da244b1c528119d835e74e85232e7d870e994dc779cf3afc3d724cad973a6b040abcdb9e523e191891191bf3c35bbb1df392e389a36cf716d78ad7d309e0bd0b5afc0754d8b59711358bca644de8709a6d3e6a0e945ce8640b8719cca9587373e4644b29c16cb5d0559b228ba2908157c6fc01e4c9fb80f7990cadbf98f5ece46064dc1f5e5b1d6997eb60f41e0a5d5c1f61203d5fa8b210ba584e3d41ff07aef678372efc1a399f6fa2cd14bc0026697f3322a360b5dedc9019f92aafba5855f433c7393e9ee3f4f901ba8e86815ef0c0bbe48a7267f393c012250419782f966b59e2d20ffb0639604aed8a262432d4655fc4870aee16c3a9330be804d6ff3efb19cd50f26b41417595e4c04046e27f2fc2b8ee9e1b7ff5d57f6baae30dc12e71ad74a5699b0e173a6b7ad8be0c0cd63901dd289337ea7c895ae45649875e2ba9b31722bfc227d8224fd0d00acb6b3bbde01ee1f4dd5eb1c730361f8371e650e3bbc8768edf3c1af17398fcdb824c9e78bbac14b386e0a4358a901ec9bdf0b96201fb791ee8e1f5bf1e0dfcd879b4e33dcaa365e96d311fccaca30b024e4ae6f69381e691c81ac716a7afd0fe413259cd9c4e35e17830250e008150dde9b3e364b3535037bb7b3f69e10ad5bb448920c6abc6ed28bb086f15742ca9efc746b557fa8d35811d5e24a3c87a25c2eaacf70200bd2864cb7e016c607f119e0f19dfb4ab83821903b73888b305223c651a372662717756572c9ec3f5ca8e4f651c37ca090b94ba28f0b012d4317703d15f133fd1e87b65e6101b467fa409b11b54d841eddee638de08609e6b0f6f4f8e124049ea1a68767288d61db374c60a1e55c3594102fad6ee7620cb48ecb874a66917e6981774f9c05d641aba65b4ba6ade7699d6dd905e19c82779c6d3e12eeb38adcac55f7ceb22461ca1b3b97953ccb226514f34b60cad34a26212b205e52dc2bbe52457a729b04501d3d14d6d962a453c4a929fa6532b7972ce58b2d6d1879028f7d8031b19595e4b95ca3c7634f83e7828b009fac87ac0cf6eac2d25935e6807b321ab37846bee245d9a1c82c04ab42fadd35ccbcf4bdeb82b0f203e8cd6b4ac4cdd84e91e869cc6bf30d06073d63d8141a4f06960b5757223460b47a3c31b2b9f5383a0711d8a32ae26ec2719cc60dc42a7e0222f2b12b0d1c232630e77c90fcded01b0603b3286a1f0e04d4fd4b543c748875e7e0fc3fd6438366af05ec36b7841d99693f97c65a924656d580e34e8fdda922e7296c412a7780ed432676623051af946b9750baa31fc9ef0070e542fbf074bbd13513c26335fe16d2a885bfd7e66855049934a43ffa8c574b73cc44f4de42336ff1cc7f85f34cbdf97e8778417b519c3bddd33e9729e62298c3455dbd356efc0dcb3b41a3e00adabf62a6aa32239a22dec7338b1b489cb07cd02c1037e65a65127f5ddb26f527665f6f34b843cad78b11972aa14b384e290353eba7c70b5ed6acdbfd12a731881dd5233c1493f5bbf5e8703dbea39d65952dbd67b4b826d7f8a1171f994a934eeb845b3a27ae313c2553f560027be388c5da0b8bc0d79397b965275890ec2872b223de5701a82260675fed21129408b3cc4eecfd89a617eeb9514087815a74da8e4a573afbc4de0385dcc06680d851cea3805cedf31ed9990b93ba19f84dd07d9a4096bcc13c56ce02085678ebbfbde83714b99d1a1cb2bb3333016ee165af62f902763c68c9ed0826226b5bccbd41e948d9446c04a1a53f55e6f0d660b56cd0b35229eefded6a994306e59c3cc08e415d3959b3b9a3ef09bb1fc70119048febacaa4383927b2ac58c5cf0b39a63a2a8badfdf055d65c0d05d33a33a34a2abd99afc870fd7223c50f7b59ec64760c191fec955f45f8c20875b4ed2b3ff1ef6475ad080506f19b9963927234066ce0e7d0694295206f7669f0fa8a0680088ea4cea15d9486dadd3bccdedea0be8b06bc5926ab0fccb7cb7bf7563b18db0d28785757825f3aebc1bec8398513c904625ba3df8e9327da6ad70fc7656fe9b393e9de47ab9379105b12d573a9c8c4896dcec1b915f7f521534a84e0968c21f85a92de9c857b9de193547ca60fe7405878e79f61bb734acc4c2dd17d4d873fcf2417157538405a93414299be3cfe72a8d94f6b3eb1a9fb712ce46b4af0be8a368e6a8e07392b6ddcc37021bf65e29c306c468eb8753da38e74a1f8e295882e141f4a3b988d1d73cd40dad8d9db80f25fff54d2d047e98272b015d0ef010fd4f75fa492f0b4cdd87124fcd7820558d27cedc6daba8028e5320309e5fbaf63c3c44e9b2dbe2c84be529c10e72c690fbfe7b19ccea9a7e9c295e5667a14a5d2217140e131cba8ec9514b6ee2701e0d553558626d0133d5f52f1cc5b8659ff2d04ce731932ff3b4729a18f145a7997ff0627d4c16c56946afb0f8aaf9c7f10b841196a9fcad11b079f8e77f87f6018e19eb3362a7b57a4f49ca5c5a158935c59a0312275e6954ad18d9c8d8ba43aa1069e1603e8cad8a3c53e284e361987603bcdc7e0adf815a4b94898be36005e927934941e79d9415e36bf761c9f0a42a94834056f02ff15ee5a4266a219796d02b26b54e38c7ef6274b6b87bab1b8fb6a190742ae9be65fa716870fa147a1ed625c56e48e8747a3383cb37dbc03684f9ba976eacd08800944fb0159a3c94f6ec2516de52494e1ba0bc1981d340af5948b1770e4625fc227ccbbbeb49df2cacf633718136a081edcc69f8544c01913ae981a6d11eac42fc7203ca2d0fecc178caa66ff96d3d4b14c139f34ace0a927efb4ff7d6d6dd533c62a2bdbc168279731a8e953cb3957d3a640ab3030963542b6b4ad9cf375e03106f6467345c1ae9168ba9a4d2118b093b4528a878b78058cd2d9fc85ac7e3be64b0d9a1420487560709f220ebdf92f3e3615bc264c7bea2cb2218832ba5034995b2dbf7870688c9dde6e12622686863362d078046d7566358135f6962e574d6555f0c55f3831e989f4b435491b3562c6317fe4506c2fd7c65d0bdb7bb8fab2ac57ef636dfac6c00b5d8ace1191e5cbe3e8eb798fe2a9ed131637404968c770ad38de733e01c6d8e4cc9d0770ce8ad8182d8c5531c9bf9aef65bd2e1efab4de9ff5e3d40ec7f96709986f8b01b7fa69f7024a4e9e0d25949346a430033f91279f594cfcefa07cb93bc8118af2a813bc968cb271259859412c38639d51225b3c278386932f0c6ed47fa45c2bcc073d8c5d1d5bd6ee3c91e7e389d52db9a5f49bb3e5acb5f51ab7341cfeac31e53f8cb8bfe5e1a200ec + +# Signature with garbage data "01234567890abcdeff" injected after randomness +Params = SHA2-256_W16_H10 +Msg = 426e562ab69a03a893f56910a2aed2a0618da1e365167749e78beb4997d36dc054f34225797478a5153037d4154a90c88836eab69a7f6783237143fdedbdb6fba8aedfd98d3af16fa293660640163c0936ae072c0d38772013b0bbf97cf44b64c44acb62803a7b2b374da627e47a1135782f09537e873aaf5bb54676bb5195aaddf73b64fb9b32f3054829dc0dc0164e51e9efa8bb5e9daafd97a85f0b3591e8c06232e6e54a3606cdf93a05df506905fb69b7cdecf62145d5d1a97fcf055b69d35c07861bf3532cc9bc78058ef266d8c98dce0af755c84fcefa69468d4a9cee6effedda0e0263a87573eb3e1d9f765083c5fe5e3598caa2874d065360e7f254fe6e3c3acccfe63ab3 +PublicKey = 010000010c453405f86998e392032927cfea7d8163910d073e6876ac3238fb5a71bf4f853c7843609ac24f4f42e6a26626d09f9ae4efffa67e63f426fa959268b99d5fb6 +InvalidSignature = 0000000000000026b6fa65b27c437b4733b101638b66e794fbc71434e86c504045c9e63826080301234567890abcdeff13cb9f1492b422497849c232d261b8e186402303eb5129853c7251d94020179c9408aa788572d9bca24cb5506d8f2cfd43179c6cc90a2fb84e15ed8006ebd99f3d0270ab03ead7cd0b0023252e75d8233d11d663e2977c4b9bfeda813c837361ae99963d0898c793c30ae933ed623feea77f8b99cb900363c7f308261d73b3203c603591b777351b594d2ccb2e08a8b5cacdab4e37e46f48d9ed8881bfae414f90bd5f842782b363bbbbedd802d97b77da22bd2059ec14e8d8f366fd64318e72540a892202fe7cb31fdaaa23a6f7d9ea55dafd2e5b281c3144fdd0c792139c67eefc4ea1aa5493e3cf742a37a3b26dd6818bb424ec3a21ec82e891cd7baf869c5c7c0c6225d3e44871c84292e63e28a8fd88e46513eefa9c7934788c1c17364a99d513465876282cec1d69cb471f7fd409811653c6d449d89ac8ece601a7b02732551969efec7e6e3a5ad6620d14e14a667bc60a8aac1af9f415e3d14ddaa7a54782716256208189d00e3ab612e0726b3f359222f4376a4d09f275eaf2a21a92fb39b0b46822a52beb5b57162d1aff889ccd84606875972164a97ed80a35bd80c04b84b9389e5486adf956ab4350fa609ebeb34e8d95d1737af2125698076d70a0b7e63bc740bb47a552c54acff2b09daeb063f861dfa7bcf4c4d4b12d673e99c83ffe09857c19bd3f1a5999ffae789ac9e365f22f44548f2f3a668c11ee177117b008b9a84a8b26869d95ebd60b6308cdd0299c4e9050ffa19808ec84388075d620311a80f1bb53b26780e68f515c3074395c4efdb1eb4e9aa62d8c5c1050dd4da170f2d5fb4a9b5b0f47c12e10576927315fb8840ca49b412e1b2bf34591b5f2827a8b8d9e69851f58fdd8ec99add99b424a713a9e146b5a208ed085582dc091b24f02576c9a0f14a07391ab8accc34dfff9c04f937231dfe728680803de5d361e9147cbf8447a0a91eb153e09e3414564cc8e464dce04db40763e9d88750a938b215fd398b628522de89327d1723bc475a3e95c132d69381305f4ac6025fc851470e1272564d4ecb608c435bd51df6bf18baa668d831c7f72ac884d817857bf10c673552c9522ca6a9f88ee2ea143fc7f2dd2002e909705b4b316a9642a8c0b2763f7ea0732327cabc070869426e37682b17a54ffb356e4ac47bd265ba5040d10da19e6d8c4415534948685e2fe5d65fc9b18f707b6cc0035206d9dcea18ed9e1e5654e20aa91366253848db46b3dc1bd2c25b464b56f584c67c8c52181bfab96a606a359bfc9787b95466b4d977cb678507d2107cf37d9310b7a486d9ea54fba77c03e58211434c9cc477fa81ccd7145e09aba1fa663989b35880320015530c7300cea6c7c12300db7752d0f292f2289fc894b2eb4c37f7bb7ac1bc25ee449d58fbb88c655ceec74eb2eaf8313b55b2827011021763b1a5bf155120841e7247d64ec9cb4911093dffb646f84167152713e1099d038e0abcb1a2735156216d8b8a4287a83e7df4df597db5985b3503473b50038d45dba22b2a2d28aaf6ff01a3f82df4d3cf1cb8255801970b9be896cb8f376ee4b6a00b625150d021e15adaab08f7241029b39540c9dd812adc7cde7be0e549a48bba4f9783af110cfe2a36ea18f6d9770e5c63b134538d2d6c9325f6c1b694b1a24ce3ec37127707a85a918df93f102c397ff1f813e8a4fe3b6ddbe6667622ba03253d6d1c653ea23c4e73bc302ffba2c76051c5ddb52d8eb5a52a8930093aa5d7c7498d237b9e8dd6c43ab6a5960cf325ad6234f90bfaf87c79aed0fedc9e6f2fe57ea7f5e880b5723a66c1450bc9f64e72f6e4a9721288331b7f000ceeda1399824519e7f3286426c070533375d8576d24de9424b3107037eb3655bcbcf78571265dd738a03fc4955805f41660d85f3c2bca9eee16482aa164559a021515dbaf7141b98d9457977452cfddc5cf0229ce67d965be5a5cebc47df419d4409313d12755c80bef738b9fb50c115bde411f0d14c43cd151db49151de2b9afb6e33ec29ef34a35787297408a2668462489f8e02ea757dfc6104895736af8beab13d699de5cc26555367858e472cef6015f087230ceed8ae2d61688ac3924eb59d9d6eae5d015f794b30b79bbe9cc9e118316acc8be7ab76c47635db57fba78e1fa70b271b1ba0e7584ef271f46df299f9ba1d95e732a7a25ac8c924383517115b262617fdb1c7166347a2af41d7ec9f428358e2b06ee45b16ce7fd4d1ce2325c341f691f75c0dd872af23940b1a3bd02350dd868dda3e5f5e8cba4bd6bcc49fae87b5169632c1518cbe7e7e6a14f36fa9756d71cba466537ee9aba3791266032be762e8a4d4faceec95dc9e0b28ba698c2385c375ac0188054be756357a469d21911056328c54f5c87bc8332c899814c4954abc4fc89a00530c1fb82b0910f560fe981964bf5be98129962346734176b87e6ce3a3884289c8b2ea509976d064dbb340ae792577776297a27611a9289f91ebc059459ecb3b31d606be7e4572876d0c5eebab29e693b795578047f9fa80b67cc2976a49267e5c2e42e1146e077db4bec536797131ecb1fe78e98dd33b49063e2cd4b550c25112cc436c4da4af6e41a2e69724c27eff6c027a5f0e3a20b1aeb10b8b407ba54aa6b3e224c0cc83d2e6c46f33ffae68474a189cf3bfa2b247acc7d1437d15574c35368deec12960f20ef178c77d3297790eecf0d1edc8eb77587773c418a8bead525dd47529e5d0582166a2b8dd5483ff39f2b1d31b2a264317e9583f6ad2fc16b53e874f4862a6ccdf17bd90d6f0519d8d7de7d72ea5e0e2300cd46f2181c261f098ec934679529412d678304ace8ee96edd4ad034ab154dad3877771626ff94a58e2718a18a8fd5420924a9a7972ee3efef1b7e6a61c08b8fa4af48fe9179dcd4efc852160b5bae2837e017e0944b1c0cd1857661fd18c694d463901edf9e753e16cd85bd8d1884c0c271475fe4f01797ea04a1ad691c146e1df60d7681f4a077474e5522c194f597ccd5fa074ff6964c69316deb68a6e3c59e022a0c2fab6c322b84210eaec647c5e6c07f7de89c99179c30431ca3285b76448f7e6ea0d3472655b9fa51036a572ed68b832821715e62b8047a15ed4b6f5a73623b725e2060b70b601bb65c432dd91e153d079f52b2aac7f1597a7e382cae151309bffc7c0f09ebd82c4067f44099d1d844478ce884d92af7205f379e4485d4390e9065488c63a6012f828bd32beddd5d0013ba3ba2045e52f8de951215722c9a5bc09b266e9b15ee01008000226ebf3092e3b4f0181d14cec7a9fae1501d32cac56535aaafcaec5788fac6a9804fad29cdb23b00d01e7b6d9ca3c94ace2f3d3538613d6b539987134c45de4921e915cb5c9663e375d44108207e7cd40a30ae617d8fec462ce546ba290826f947821ea861fe9e81cf6e792767b89fe4f4f775aaca3bd31d3939cf5a7b4395cf84157391dbf78225a1c7dfbd1a563b + +# Signature single byte prepended +Params = SHA2-256_W16_H10 +Msg = 39324feb180aca683d995db187a075a910d0 +PublicKey = 01000001048a2710a8767b85e8854d79bc9633c8e915cea2dcac106e81f9e9c4c6a79d50b972180c8f69f448e5b416158f9f24ae9b6e9a103484ef013f7344c6927ada71 +InvalidSignature = 91000000000000010fb74af4660505cb5bb71305f25f9d1f2f356ec26cce71ea1e5150e3beb541c37c71c200bb585d97ca5d0367334fa9b9c8535ca4595736eee4f35bbd53d9d9e66e1fe2fadac7833bfe3b6cb45c7bd445612ea46f60d29d4b53f21f1dd492bc2d332f63d76bee910791b3b9ac6a737917ec5d3a5fa6290f3ba0355679498721c30430d0983c916ec75b0db1b16ee5e3494b8bfca8d96781d121189e6fed577cdf48baf3d5cd78612d7eb76d5669dc9acd7154a334a762af31055f7941a10efc3512983949ac35abba62ef5d0e210c341b6c70c837dd8ebb7598394ae19878c8a11e38304949b50371709ab0e62f004c164ebf100f99ae80929e92bcd6d2dc16517495643e1ca375eefe7e3e6eef99931da2eb82ead84352fd51364e119af838583eb454db46868a0bbd1ef786abf41f178e94215e94bf95652f68fec88ab3b8eb4651556f9fa877c0459416e6f24b4917c9d97f1315ad7321720034c9bcee34707bfc01b033ce9fd0e75957f364e7a518c9ef061bfc613e39d26c96cc6d2f94516dafa782bc1967771fe14bb28de778dfc3f127f166992bc13e0832e80acde4ee77810a1c44990d2dca56c3b6dfd5c09452de72705df40d96f082030100d9986b9b2819a405bfdebff50ba40efb6206bc96cbe8e9e0f0204c28dce7de7263df38f335223d2af48cb42cb7ec80e5e93894e517194b4103d4ab5e2194e1f7077a8a3a0b1b509c8c48d04b0b1a07714bcf41eb5f8a96f6baf2a54c0d0254643cc71071d9f02be94b1236a6e8ffeccb8c602dc04d135e40374ba493e73479aeddbaa09fbd18a9499dcb49db853b9b39f8dcfada54d2c0c894406edead657c19870d185f0debb9e5e03ae5cd93ff0f60d689a8892994ce4ba65312277ed43259ec9a83c3932332a7c57e75b6eae15f5d0627de0fa9f67640e25fee21b75e376ac95bc1c8a4c6eb8cc11c76f1f22fd7d07d7b35d5316a6de6488eccc16a6ffa4a7d57f4f2ff6c35025bf61d557290412fb74b18b9db50975f4b4f0a0d636fa317b633e4504c7614da510798850ffa1460d0f48f1e29cbf8f5b2e4b2056d915f66f32db958383c650f4fe501cad32f23f1196523eeb6f592c0a563f13539f66ad637f5697e61c5013b8c2c3b4ec350ae3e89005b11cc0e9b43c0e56c9e758b585114282015273e46ad34375ffc4a33ed94eef5e7223da58723a9f8f31338f1d80f45271226e5a5756331838021c7543eb940c25224c04b744bd94bfd62225723e9da77fd76cbe3adf0ee2cbd8b1dd9ab20472bcfbf8d07f606cf35e2cec6ee419bc71702cea32d7e5ab3d029582ad4604795f84879226916fa911d5fd7355bd60f05da7d03915f37d0e7fae4fe2c7da5f218a660194a443192bf3a0685153d20283dd2a4ba581a341d9dde3ef626ffc2f97a59dc5531826531b20b350c7e4166fc417c29d4bf12af09d6e2bb4f8db8519c477246271d9fa06b251c4f9f3d9cb3d98cf083836991e30dacef304d6911075ac1b197acab26902bf2e227d696ade6aa4dfdd35281e7f97f0069e24f1bcd0498514e115233fe93787b745a71853ab7e8ab414585343d848dab5c5607b8e89f379b9bdcd8485d66b7920827ddd4b2b70a4789bb29895af9acecae46a9160270b5518bbfb15a9d647a7cb1ff7bd20c5fa6ad3a36077444b0504b02309e34336f81081562f12dc0dcf93f0d7b4b77954114fe08319c8f912905314e8440039d2c088f778399c7104a01239931d84bb639701d5b93f794d53c713a6f7e6574803c46819851f3b6473736d89684c69a2eac49beaea4e335714bc99f8950d9142c59e3c9e93ad1f74457c28a62e9a445a7bd294aa0ad03fcc4944adc742c743a34fa37d421a32d461f1e31648155001a9f2010057c5274f13b4dfb1e0738e435c125d3d83796d3497a5e860e8ec8501ca976a375cbae0b09537b535645bc6810d7fca54dab6904fd88c6356ed4a3f12a71010db8f85382db284b91bdcf547fd3827dc14b04a0c5b02ad4df7039e779b4124bf0253d25faca04da5c1da7e9d8a1d9e7f7df6bd695df69f3f76ac1c8c3da40d85045d55e463de7d3db33237a4874be6b1ecbb10d7b18df9e979b18e18b5ab05ecb14321c01c59ecf5bb9842ed0b0a683aa7f46f5145371ce01a4dc5c0725054a0b906ea980c687387cbe4052001968482950ef891543f268450fae1b8fdc0d1b6656e252be12084b6377b5bfd3b04c19490beb6211ef877e9f4afffa34e79743509afd8e32d2103b49c39aa637c89ad44c07739294f0e34b2c5c40c3d8a7c36c42c62c6aa85d94544fab9d937ba48a3984aa5a52501e5b01651d0761148c6b4f574ed5513bd8ce35eafd84edbb8993850ecccd7b1ec0c26d6c2e42040d1419225836d25125c77d8d79dacc60b73855850a7152f3cbefcafd7982a6383584c682065234e7b1f414617661e21ab7ecaf6e49bc8a31cd495da2105962c97c29050f8490c7e2f5181aed2da3cd6381ca40ff45c0de62ae6827a95c19076afad17b5c3e29c1962b8a26fcbccbfba07e317ef38b2eb847cf1b2d01350b2338ee6ab2a936f48f0f18b5279362c8839a81381448e709cbfa738559161aafb4f02a0ec9823d0a9584e2441babbd99f7a3d04dc66ec101fc15d975574ae3cff12ae3907853cad7062471913ec86c9a631826c2bc01fa2243ea23823094abc22cd26b8d73db4f7ad847d1a1c27633f0d321a95fe469418963baa65e8140158c68413ac483d1db179da6114326ffd0c8496c78dbf3684daad8587b5fd889a9a78cfa5922e93f6f309f6451c2178befc4e57fc05f04699d01bb272a32d1a888cc7f6f8380e1f736f13e2333d09d96816199588683769786576f8cfd0b7131778c97729a45947da7f4c3564ed27949aa42c2fff70c09b6bf7091a9291cc48dfdbbf13261a55147124915c0ba992472618ef6bbb7e7f12ad5ddd5e89617c63feaf0113c99d548a9f5efd8c366e5b3354c45428b547cbabfae75c11ed91097f56d19422588023333623085ae7bc1c58c539ef0b9561d12d4126541a244944c1fee1d7690f0b4ce7842714f798806f731db6459465d1d5eb8a1b2b8308cbee60d880a5e258ef4dafed37023eeac5dab635fb4fee66519321a67596b2cf5c8e2e1e793ad51d43a65220879b0fb56da650ff8fc0f79f35fbd889bcb103e8b3733b80a6bdb3ec58aeee742bf295b6d6b5e2a34673cf64df71fa4c8a49fe2ec43742e0dbd80eff49d7bd33299e4b6b106ba40adab701dbd84a53e51ac35f1c4eaad4a0ae6b32741bd64c10ebe267a19f84f94467aa1b93a91880a4a607467203e03be604280a49767c8d6c1fb2bf0bde03912396af8d27e97374fa355bc8443e4c128ebdc4b360b7e7eb92f691fa576ab0ca91f781507c1648cc48c8b344a6c6073b4a918ab8a804cbfb731ff93513ee3d430692e7dc16500d471e49bcf87bf16694d5879f16b0ab2fa3c3d824e10482612c0415561744b6b8c547fa1befbdaa1b43c5f162bc5022c45f14eb2f5e0ac + +# Truncated message (1 byte) +Params = SHA2-256_W16_H10 +Msg = 458f4d30f1bd34d306092e2de2924c259c3bf53de876188f3b1fc0b194ef548b3a60f874b7536d0b402b8520e98c8fb722f15c653d1b4fa63df8d891cda1e747f8ab9490b5f0b1b0e9df7f92ef172a5c449d4a10911d765b14221c70f8d7a1346b60e0ab8b6dd00d2792761b74746de071c27a83338b236f592b6ae75ff672848b34a3ca5b2783dad72e7029891c24fb77972bb4a7f0481547e8ba4ca62a0c8443acbe7d815f257ebc8d51e0dbbf1ecdb7e48e31e2ceef7cbca409da63bd +PublicKey = 010000014639bdb1988d68d1e5d8a40f197f8bf5452cca12fe6e802efdffd3aadfc10a30fd60f0911ef2e5c670beea26bb16432f850ba97326f016fd124c504ff2c8f4d0 +InvalidSignature = 00000000000000239a8c3a32baeefea0556a954444367714d5aaec0b6f06177ec591458a1cfc7634e0b13880a079a9903c7163386b98db8c4212dc4441dfa456fe8ee243e7170fc474f15c28d3b63119d97c366dddf7dabf03ed962d19d9f835cd0b2e7e437fa758b1392cb35e7a836443ef670d0aaa12aa5da63313c6a78d48ce25b57baef0b198547118acfab5c54c5ab49249b5d817e5ce232511aed05878e82b4caa11e0f473237338149a0cafcddf92b1576f8a6357afd1f3b7458d348cc1069b34020aba4767bcacabe7a49124e68ba96e4131480ab1151172af53c1b1d6b9964c2b2f94324b155df7a28b45247d0a15f1aa6020a4a67eee2193a54e969de1fafa0a47270583c3f4af5dfe04860fdd532e9b8688f9048db6427bdd8fd2426566602ab534b030be76ebc292bce8e3667df84bccae5653a4600fff0681dbbeb511b4e2bddcf276e70bc1f856c09e486e02820c9085ba3262f080fffdc73da2d3ec73aac1abcf8b1c09d9019538dc176e89c3368ced88eae6d955ba3bd76a5baa5d5037eb80a1dc6e9730713f06c442587d9d33a5c7785414c92632bdd0dab234e3822423a7f091f51be7906b6e69ed81f2c1d400b3c603569136ae589c5808fbe9a4cbe677b378b4a3e7906a336b11f0e6e917cba4b1c6ede0846b0ba4cc61942b8ad408328733f432bfdace672ebc8a123e9034b118c8101b54a703775cd80c1c33db8cffe7bc02a765cd084bd7ce44c63bb544d89e968d752ac9d558b62f4c01c4e557f9b4735900c0435d4a2e230e9b2a2f6e5fd05e5694f3792e1e422a5f8c4ba3f9cbf0c7888d4d57a1c6ae496731da5c6fd0c3c231fd310673af5db29318c92f48cf6177d5b7a6a6e9f77f571573364cce08c6b6b7c8d400c334edf1ced5d28c6527a87e4f5564ba11a7030f90b0538e14e791c2ed7b10e030be90b40103426b6dc612da739a2063e4dbbf876feea7043f6c755e638dc8b637f0cd60862ad20f7c93693d10ce16f9b0a09e6557943532813559ac747b4ebaf9e1e371e4190b06ce4d105222d736f019027768022fb8c691cce42e9493be96fc37b093cba4a25fc895f3d7d9b3a5899010b287a29e18d869adf3248d0b6a23c6e24c02a41aeb42d871761f6c9d3563984b7abb4a0219633ab3fc198181d5cb4814d8fa40d763e6292cbe52b22c7c491788e1040dba0f195f5d36e39f665c6847d5b9c8cd6a39444e302f00e957494191bf7a0e57cfdd2c6571bf30a995b6e756e05a9ae7781d50daa2a98138e5b503316e79c4554e833cc2fe4ed959fe4a19d2f784972a4f6160a78d1f2251e5f398b6006c65a61d68b21301ecc5d5714e8a01f75d40e00cbf2964645b2fe53659ce65e73ebd356f461488437a54f9db408623591379586bc44f6045b0b7425149260d2e5d26be9dbde8fae24dc191e89108b34c8d104a13b73a27cd15ab73b4656f0dc85dd7fde957ab3a63d54f27869af740cacbc78deb09ebbdbed3b22eaee6896892699316a45228497e5241a8137641f1eae8d25074c72f39009875abb2a720eb43cc0672b7c7a9b8c9b9c0b062ee77344a886648d62aaa1293e4ced1ad40a7eeb914d64354dace5d2876b4dfbaf5850f07dc88994fdafaf0c2d6401efb4e3ac75f6112bce3db18c77262e4cc094fe32fa6fda096e95053d8a33a144a5847dd1d67d5db63baee9e952ed20c67e923b70a06d212dd6fe678b9d84b37ee9200e058fc939562e385182fd5495b324c244e4d3d59616bd3731015692058b1cfaf65b8584ccb12574eeacc335f7eb303d84a7ee5852a60993e7bff1ec9f47723bca778262937c90c9f4c651af84b88d66887355882fe915a150d15f39cb1328c808a98f0f78d6f79516ff258cfbc235d733d5837cae4365790e1cf094c2d5d1bbc9d137b1a521dfb1b0f2aafa950c3bae5d4f238e85864c8d3e9d05fb054fad01724979a566a40f936df9606e2d55f4ba513d429800b129508abde28a6443bdbc427a3c21dc00343b84eb3fdc0f32969ce7fe1c8cec262ec7d5a9be6f2d07e788e43eaa05e06f47e3bd49dfc095f2b817dbbc5db9b9eced5e44a9ca7ba17c44c226665a5f97c5697adb1d67066306011f2bce0558ffbc2381b0cd30250087670815c605b3a60d8d1bf9be0bcc8896f6cc77c79f2c821835091d0d0e1b48ee24984b395e728cff8dda73a2cb83c53733cd01aa03c3f6799942a01356e78b5b5c4f9191a07cde6a786b6b7bf288600f19afeb90a4ef5e6ac433e0d59399434139b92c5c6474d28c8028adc76b450722bfe0dd2c6e2b4ff48a8abf5542b9ef75381ee2f39419080f55a26f5fcebeb10e8d979179a27a108866c494dca245b08cfee5a22fa1ff862e01e635cd1192495bf67538c45e0ef8f6b24fa47347eaf4f4ec2c55dd144e0a1ad28bfadda0bc344ec32274d038ad31afde99f94375d0f75638800aa7fd73a84ef4eb4190b1071b16536948336a32234abb17f6758d14cf89b4419ca04e02d64a2f060d9c53a8cd7b0387542bd0d6097739881aa9b6261827f4837366e4a9a47ce78f3c897a65417b94c33fbeeb4fd1b46f1549e84a26236a22e194a6d38502db9723bbd1368c79de84f5b3abffb1264a2a1e3698b3f62e40c22c0c0c653221e301c85de15449226764c493098d3959757dfd4daf6832c062364aa9c32b92e17a433e8f2f00b9ede63115332aee654cebf492f0888d690015e00e06061dddfd5661e28251a9d8e3b135ca8cbf9afb92a66e31d3639f5afe9dbc99157ed09da653b23689e64b87b93bbfccdde12212cded6a16351f2792c62a51cbe7b67ae5a4830252df97ac66aeec95562dd1ee0a004f7483bc171d463f1bd125b4f3f20e5517007e9b84ffb3602178b5e798d9e179fd55881151e13e5e6ba3c7875b49db54e6c19b1321df4eef0c2878665e52005c285333f91025c56752d51f6f7d5f3cadcb1e70c0d5a42fd42d059b164be984147fd546038178faff004aec1c4ef5c1580881a4a48592730f9c6c51759b37c9d12e6fd941f8a0ed1e36484b94478a2051cf953266fcc3ab37b5de4b8e187a67dfcb639f061341b946c09e270ada4dcaa70b16c013348fdecd782f488391c3f400bb44bef747f660ea419d132c2f812a43b8675ed3dc8a54eab3d29a5bdb26899fa4bda297bf4f63400b268d230a91b8c77fc7772d81cc56b163420039ac31c100209cdfe6174b52d8d41d0ccdea6cd45ae2ab8b9f13bcdbcf44495f5dd7ec827213e6460bf65530a2b805761369c95bf7ecd9cad67861b9746f6e39a7ca4428d8327be0c728ce4bce8942984b27c148e15913044e6c106571f7049d5be55f0d9760a14872f6f021e353f6035ca06a4477788ae662275a60c99600590f04873b5768b921b20462ed3ebfb79391c28b5659b82e72225e913516d751c0a638cabba544f589b71ee5259073cbb44835efabccde6578fbd0ee4e79e9b1ef7834656c1ce74f37fba61bb184b56c0e6354b588a558a5d7d1f95abf96732c72f6e110a3e979105c63ba78e03 + +# Message with additional leading zero byte +Params = SHA2-256_W16_H10 +Msg = 00ebcc54f09738db1c5a24e315a7280d4cd8c266ee1024d3b32851fc49b7ce05c2a43eca9bb7d584635eb2ed538d86d773f4bcb87a3df6f595bd1e5b4c8b03a70c7bdea8f441058b133dda4f409f099a9b68b6dfe96de5ac6869ad5aaa9cc8630201c8df17f75202ee3069e5f912a88e0539fb0b04d487949a1f5a4ae192e18c24f1fe24dce1ba1c00c3bcf703a547f336594f87d1d2ca98a9096d4da24725601b1752e7d7f1986d9ea7ebc4caf50169065d05997ea6dc1e6937c1d7aad19682b10b56f8ac4c148122f9e906ac21aa0c3237b41f362cd869e9d25216c466f4d2a885296bcae2f02ea3 +PublicKey = 01000001e9e8f66300e3d663aab7e240665dfd0e5c6701dc1e1820f02170cc0527bbc38cadf2907057362f5c09284945ee2f6852a878517b3444898370de4c7f68e27beb +InvalidSignature = 00000000000000e1c4d25ea7bdd84e7c95bdd1d3479df59f4050e1efac007ec6504ae2129d1c2c9e395de20ae2413476f3178edf23e7fe7d816cb958248ec2994d3a3302fa436648a26886c2745d339e95a199c85595ea4699b378a515f9f4cf14bcc49c5c5693dc3a07c5b3c019da848de6808d1ad430ae98c765fe80fc8486f42846ae1e34021c9f0ee12a97f1d9149e487b53bb95bc51eae5cdcd88976ac845cc3a806140b747f8ae49e43b641a79f6bfd62d101a0a9359f9084eec4e585d58b1e6fd879a075276aa24cb9a9338a7d12102237a4b28ee0308d3f2ac5859b8109cc7b98a58381451409367bf5d2760b8505115261b46dbf1fdb38835052f1cfb07822b8dc21c6312e692bc00d31bd4d3f63bfc9890e6ca5bc4a3f8ee66f44d8298e90f97ef2c433451dd0099fd17395614abdb1e952735c376a8d1b3c6b13d7c843a805e058ba87a9504ecc526e5f87f3945a98b84cb80d55adbd7f6835e3e32a1760b79bee355d59a7484cda1ec3634affc971322d199a189263207ed192b2a97f2a56e241df9bfde52913577f63a99f8ef42686b31a64c5f30e2fb717b4d8769660905b3d57bbf5e6114ee8e4a333bf7da7a44354849d6166c62da0b26e8ac662acdc9eacfd1a82298cd3e1ceecb90fd2fce0c8639cfe768885d1fd3b8de48b4e68daeab8a6a8ec569095a8b6d9bf1f72e0e78859bc7040cc8046ef767ff4ee3429bd6370674395eae75dd016abf7e1065655d77aeb47fc39282a25259e7240a800dcfc9f911578f702f045c531eda7a85e60e26cf109c92ef29ee860b4109d7f153d085b9662ba4632b1f24cd0d8df0342067fb0b7085c79ec30c05cca0bb3ec1f489fc5593194a6100750864e94ca3e6790476d642b1712f4196a191085fd4255bfe94ef581d931f29c8a4b4daf57fc9b91dda3c61e1d00e18f3ab74a2838d767aed7a49ab6463a0b868d5f4c46c6d7f95f531deda2d4db3e9e9c398990dc894a5743bda0556a753b7f6a54ce4188dad5db3357170d98dd687701616e2406db76f13a2a36130e6dd482fb7b991aa98f0426bd5d1a3f7eaf1e499bdc32c2bbc5b06eabffbe05615493916b0f9150ceb70a31670e9c382a789f588023b1b1fddd047f6c3436f382c924a5d7e6ad253a2fe7562f454162c07404db2afe16d57c91d9a185fcb53b76d4c94212243aa596554db71536e6177680c42cd11e61104628ea85ba17458038cea0823410cdf2d98169d2cf7d3cfe8a4cd5841b79b505281ae1288427df488ba17487053dc16ba4f03d027b834cded66eb12ddf4eed57912fa41f04f1055b4a5f9f9578308c7d8f3da60107fa901271ed11b04d94926860a1c8bf116c1edc90f653e4daf52603f6cc221a0ba305344bb551e1c08690efd45541d28f4fb93b6f27faa5152d7db141def2b13d1b02a0f28d92d3064727d42bddc012665fcc4e86aed43d3bcfaa0202099631d5777fa8f80ec287e286057a03630957aa1b76bb670a78312ee249fd7597a71585d30559e6ed65234e8a6aba43c79a2a9a43029234aad79c18e7e21e194e7484eb6f415544c44bf507b907b628f077766c346a06f0cfc737ef182f2effdb32f19057e272ec5c8298385e40895951207c6e4d1f2dd51fe4975d77325f91e38262a3b4653d1784a5bf1a427c76e438d7d5d6fbc08f4ed3d4f1ab0daf4a28d2b32bea5efbdf03c86685aee220eddeda15309b19ad0b73171d80a4f7648107318bfc6dd0f1add53873840a6baa0dd727c064ecc77a7a19e39ab6764fa21cd3f6603e68724f3b0a3478c202a57b7f79c7bcb52c4549546d6c273669a9dac9d8c411b71b7e9d45ec4661d1c9139daf05d0177c64634fcfa6e7e7dba1a5cc4c52fbb34501fb50185776a116df72911f490950075ce6317e3b41addd89a4c16711e3b488a0202baffaf15a00072b6fdd8e78c52a01b91753468049540f2ed76e6333fb80c0d1a49d53859b5b273170aa3b1bc991987c5f9b22732919861a0d9618b34e0dc0f6694b1e5b9bd981a82dc2885ebdf819bca75faf6e51dd9791f963184c407576c04a35281bfed681dbd23a1e53105242d257899721ba6b69d4a612735d1101d3112a9e99e2ca6140c8614ebf3312ae1663b1a539ce4526e3a3baa15cafabc98df07577d88c543ac0236da8e3327f6bc9bf59a4ebd2941accbe6d6890c4df99646ee84a26cb63f80d28b6f4a4f2d14ae159c912bfa9b9222914e47a55b468ee64b1043e62f09a151c195175b153d7356abe67ee54d09f8d5c1a7b384cc6e306e8ff55fdba90f726836ba373cef1d803044fc5e32f8af09f814e9cbfd55f01a942f27236042d11bcc9a09e93e785091b92b03303d69b7c249ab7003a39ceadbb7582a29062994fe936e711269106c0120d34ba05354e2a99af231f938c91b21ca711e86d46091a31465dbf8761985631877af3cfcd05b530124aa955ccd6622ed4b2509c667e2e402c9bce1d5c253a5467174b25759fe8f226f5409dc8de99d71d2628fd597868e5281e7319ad77980b12504cefa058b0dc5bb9027ba5037c7e967bb1467e9e93bb26982267d120dde9256c10e7749afb559f41bbdf322ffd98dfbd3dcfa29946eb3769ae742af4b86039f7512a308b94300b5282a4ab35a02552fc4958e318e92e62d60e9b65a70a239a7f9b67c8e84b15b9e14926d5056cce601a2c3c1dbcbfbaeef241e4f01bd88e48529f5e06d8eb6b2b5316562b30260383aed373b5ff4590c07183470abb34b035ae1164eba7f4c2ba7453a915c5b260b5905d7a6015f18181f61d24e28d0c09eddcb621fad5b6557457d99316a739a635d6d74d1ef5511d14210b4dae8169a7e44ad220fec3e641a20378ebb663758f275480854c51dfc66b1e12f690905c50ee828d1e6368691fe722ee982400c2a0ce5a8dae919e852154e83f586dbf9c8777faf687fc083786c4353a117bbaf000b51beb3683030b0a716f34034c533e6a76a45d45b7e2680911e930a31a69e85516957d2a5a911713dfaf52fa75dfdbcf4af0cc280f6b0e6f2b7835f67146f72555c8bbae0332cc6cb249ef9962fe0966a6e5567c8798963449f5a3d3efceadc005e00de5264d9427c30a6332c0fc45cdf5af855d740904940795eb20c526cad92db3cd76edccfcf6f5b0bb199824f69d4c7e37bfed862f3cfb8182a18ad0b889743482af08728fce463e8960a6f87130096261d7d27a16ef8747ec4146ac91ee3fd1e9823f3158e93870ecf02d7fdb7c4023b054ad2437c051a31efc6b3cdcb8ffe1dab7ec61125410130a94d893a25550a443e2425183abf7c1fa3d12716e26e2bd13ffedaf0b4564b3ccf77498832941f84cdd0c502c985e98726c6351380e41e9adf5a99059c3d5f48d73aa0456eba1847789d87dcd03a9d2f61f2986d3811685fb3ad6587da37d21224d315b5d4a9ad6f34e50872b283255a497c92292fb4aba03eab487c8310d39243fbdc03b6f793be4b8018d1e32b94f73db4be92faa03c96819596137840dff00b4686b92a5ea5c4aa + +# Swapped Msg with Signature +Params = SHA2-256_W16_H16 +Msg = 000000000000138ac97bfc0a0e8acc0ea967ad986c13b015158c36e89f0db2efdb93eafa835f846c1ea5e2a814290a0e3ec227b87038a9a7d886578bf655455af2bc5deaa4343c2f1ad442b19674395970078f5527b0c7e5de092ff91fc9fb1e85e97c20cc6561d71920dea17c9d891fcd7355276b6ae3503aa9fd7d9627535cf8f9520a8ab22fb09c258192ff3ef29456e298515fcb85c87bca1c0610e57f6135f29219e44b2c065d0e57e3746b573593675f69eb2d01f1877b8bb70b5ff8d5760eba97fe16085ad6b59d55ac3b16fe36699c038fc5804cd05cb5d7a1d32527c55faecade1d19ef1231c9d8596afb6e94cdafc6dd30437905b9e347b948f3c896f5ccea6252d17f65f7d52c3816b87b7cd75b421b63457e3d3d41829ed2f86218a9650c10a6ed213019dd085fa67860ecbf14fb93d0c60ce6320a71d79ff9c805523c019a506750f7ee435d68b79858be7bb256c6e0801ae25ef6af04c82c3673b85edfcfaf3dca5fcc0d47b5f485e39834c54f38c703ad3eff0328be9007b40be9aeb367c37d8bbe5ab8e4e2601f27ee408d7f0addf43816f6cce10a8e0d0676a1004384d1d1c2f9948eceb6d18af6b48f6f459a58aa3c83abf42c0d4ec7c681e5343dac6c9ebc68d0bb71ad3b7d9129ed2209c94759dcb204e184a62d58a364a76649791684a299ad14ba90808708ced005246abc9bc8c95a223c3b3408dedd220b7ab4defddb2bfc432ea0beedebc58432b7c667902bf5e355f96e1a055914b393ba72030886711991602fa602100fe50a2474c336903cb6672dd0b2214dac4d94d92fce1563ca122ac3d78411abff02d01f29fc1662d615301836336cdac548654aa2f69a9909f4a326bc85727280dbe160c46ab079c368891e0b143c292b9d6d17f4ff0c6e813aeb65291c97a8692b3e03b6b83791ca481c0671c53b30c69294d5d1e1aac40e02a7571359040d141016a49bae65a7152fecc9fe61208b80b2e85d34aa823b941340ad7bf5226deeb1f2c9da84f132cd649520f2754c171be9b3bb0c2cf530229111c38b768f75ea73a8c0d6d88d7ebdc68fa7c5a57594b2e8763ebc70da77dfb9d8f7beeb5507ee1d32513b7d8d868fad9cddd96b73405b03fc51d429dc90ef4876d328526fff1461b95b4fc77be6fea9005fbf08eae63d7bb432bb6bfa95c4d2b3fdea46c785753b954cb419a36e0a17f8b2e2fd87c715a55c8c809944a75f6127b7c804d44d5ba704313450747bd89e9dca72f585fad5600870a3c68dbdce4ae2f767fc9e2734e1ba109693eb8d428bcb85eb559562c3b934212d37dc337a345d0bc90725ec6f4dd430013318191c711a8b52cb105c096930334323e077cb4d2dd9bffab6568ba51c8f3c311d49acba7c5a908897a90b0dabb3b46d77a22696b38f39d7b469a295a7dcbb40ab479b6b69afc0503e536a2e8cfcfba8dc3b544e9145aed715e9ba1970a3d65df05154f89ab754f56f19b2ae540a3af2052ee163a05312d0fce14e2ddd0d15752f796db87b0a729b263c63c6114f6dbe22c239693e4fcfd44093e9e0451ff80462247ccb8de2f5c52ad60b703972831506979d8c1497e6265eb57e9358afb6489c277be3462a9bb5b5e860d1f7128eabac04b96da4804f51aa9059aa29294b44ead3091548b75de42a965e2f4b95f99b282ed286d5e5b62f099df518003488d0b2244d8401569661584c0bc2dd0046744bd2dd890f3323ddb5bbdcb774085942e40f28991e3fcd4c8c9a2ff698b0d14494c003cd71699d1437cee4f03c45ed997d11c45b3e382bbed0951115e95dc16787b84ce90dced68b0b1df42391baf968527aa19d70e39a03fd2d4085b45d5ff610b518d6f6ab7149a8f4f39cf5c9a65625e337b46200de042e3bb20c3b25d0160b71b9a0b36bb9fc255677a364656618a2b60a3557632afb85cf39e4d79b81c44ca54b849a823dea99adce651c9ff78b00356b3b073f94ad66f38c2437ae8d7104e83ad592504262c43426ec29ecc1b4013d9f70ffd05e6c5f6cc9b2b52c035afed293658a980af628ef134b002059a5c5812da4b7c952c29713045c9e9310aa1d1d3abc0a6ce4cb34f550c81c89d3dce7247f9bd71b43f1330a05aeb653bdb1da03ae2a61b10aeb35804940e84a3dd7f9f277a67fbb548bc41240af787ab5d83277134410125df3df10017e5aaf0130c96ad5a69f5ffa2848f9b44f820c72171792f66975c5bfbd55a7e63bb76fb10cdf0c997a0a7da16f57a64d27aa431747450ff64b3c079912d0fc9b91693b200b72839aa3443b46e87346cd2c6ada4f4375237d4652d23cf17c5f9115b1a46b4e6a0edf563eb0a27fa9d8f0601964ef945f68f03e5fe80c64a6409c73b7f3cc8253a41657149605fa7283cc93a9f6d480ed9573fda182c58b41f042a94b3234743acf26532c873431b2e86548e3bb256d293b1e1a9125bbc0b6bdb90acdb9f3d1a3b1e10026d9b29c9a639603c90c9dacf4d6ad395686c677f0d0407e7e7982b709fec1810be207fa99530cd9b59dea0c7cde870728c86034c98d7d57f3ce01d1fc8494c0cdfd14dcb29d54b091c0056507aec6be2cb10a70d0105eb215e682698dbace3c51df6264a44f61cee352644627b91336c84c7a3a46c3498a667a5b028bf7f4281394d47defbae0130d1424456eeb71c2d10c6f8922bf3f6a53cfc6a1974483e28c7196c0f63934688b693ecdf528898cb3247085684e8e3f60fa07ac053134338db2cbf22bd0992ec1dc5d6d4db19719c65d0e64960f5e1d3e7ad8dbabf80c231f0a629574e4bb2d159990c1c30a502b36c7f213ff8eb6f44fab7787b6e1bae2facb07ac1de9cd6edf223d970172f3aff808cc9e29525fd73c7ce913a3cdfa363b600439f011b73bfbe7c90a84338973f87810c8472687454b2b3570bf5359ea1a17fcb749febed9a0f2662d4ab5484472678e719c7d75fb4afc224f8efd256e9b7df7c7a67c1c31537aa4c1855b7337d348c36c4fdf734ebca52bf662a491344ad1b07052170581f8d79c65d416390b7f9bd7a518413a307ef24b0ac54c792aba01d571d366587dd500c03ab14d2e89d1ec80d5de656dbb9981f18686e0804887e4457c2381f371f844d7e3a8452e05e07076e3ed25b87da0ad17a7b76b66f3df617fc5d138fc969e282b59e0beb26f198df5580bebf223c18e18c7d74ce940cce29c74cf805f76f01773be550cf4ee824537e81b362ea4953831ec89893a68812ffe9fbc059380d050dbd882cec0fee2a2ea67fcedcd63ade0293dbbb3a779a5e0d4ab66618216a2e2f34f4510c8e74dcdd04d9a40d7ff0ca2084901a9315fd220fc06bf6e6dc7d56d5b2ef60871eb9740c0b5f8d37ddd64094fedc1c6a1ed616cc2ea27006ca77a3fc75ebdbffe00ed1117a427f6aded45034c1a9553ed0c77c8baa6a354c37f70ed8e510427e342e60a61120169fb721a1ab8ff9d0e6df41c1ab12061d1915ba8e453b74c17e3a7d1942bd5d82e47eb1c4fe1da1c9816250bd4d3347db49bdac18b19b6b3d54dd2a3dc049526df05e70173bae29b96dee388902a0ffc83b383781e3924de31b645c19c736bad29d0342b31aa2c0b76fb3985a127875424285e05d65c2ec481128a28090b27812c48f94a313641fef783c19099ee1bbd00e2c1122e899cfc09e3b438535a726bc1b4b4468c6a1698f271284f84ee204d9cd7d176afc5616724fd66be6526a6415055f94750dea3f32d190c0a680da47ffc024af592b7f8b3221aabb38603df507f699f158cc2a6ed7735e793f0a6dd5ce4cc1231ff67b3c96e +PublicKey = 02000002a417b6b239692d6d4fcbe225f5a8068c7aa947970c21402751953083f06741692cb5f30a388dd81517c600189a5662d1e008434bff3369890757a5df7963ddf7 +InvalidSignature = ebcc54f09738db1c5a24e315a7280d4cd8c266ee1024d3b32851fc49b7ce05c2a43eca9bb7d584635eb2ed538d86d773f4bcb87a3df6f595bd1e5b4c8b03a70c7bdea8f441058b133dda4f409f099a9b68b6dfe96de5ac6869ad5aaa9cc8630201c8df17f75202ee3069e5f912a88e0539fb0b04d487949a1f5a4ae192e18c24f1fe24dce1ba1c00c3bcf703a547f336594f87d1d2ca98a9096d4da24725601b1752e7d7f1986d9ea7ebc4caf50169065d05997ea6dc1e6937c1d7aad19682b10b56f8ac4c148122f9e906ac21aa0c3237b41f362cd869e9d25216c466f4d2a885296bcae2f02ea3 + +# Signature single byte appended +Params = SHA2-256_W16_H16 +Msg = a04306956ac18dfdcd1226d5cd0b49614ebb0a43166292616ae3463a383a2bf7683fef62805a746ed4770bca969cd2940b3576ed9f2c496a69b7b0a111722e8895a30708eab39059b66eade86c9b4fe838eec9418a1a1bcad3515274525c9e35e35a3a6719c2f4ec3c32b8cc6a796c6fc83b911acb55dd876220d436aa38128ad61e +PublicKey = 020000024f2120345df148ec61e9d30a2f5f570d82bb92caa63cc6c0bfa07fcdf9d257b005149f9d6db23142def5dad7b612162c30b0dd83f0df5dcff7ad7a18ffdbcacf +InvalidSignature = 0000000000004d81c671c3daa405940205fdfcf32b33ad6a144ae4e5d76aba72ad0996a53cf514b4ab2afbb21412036f2fff7303e975ab4da19e8f762938c290d985a75534b9fdf3c311ce468112ae6293da8829a3a34e7fd9ef6425882ee9e9c73b9e2d5e9d232c35584c1a844b0f6e68ca5a1ae006238671835b8946095e1c5209e8dbd895ae3cdca826ec9e9c79212b6940f786067195796fff210646daf38779359f9f2506868d0b665a98b87322078e9c6e3e1f8a9b9dc39961298e93cd8250f9f3500861adfa7bf39a3998827d0c0f1daf417a228deec393dc6b9390279fd028aba281f13e7c98487dbcc1704a5ede5b7dfc2fda2837d7a9fa20f943349b2c7cd7fcf1384ceaa2e6988f20d67282340c594dbac56e45f8a4bba477a05a5e7bc984fd47f39d625a40b6346e92e47ed825c8b982fe498ae7ebac5219e69cbb8dea9cf6f86f08637f2c02b086613c2205997b85db0a9b114325d12d21a2abf8d75d3ce3deef73c40ff738df01146e02f8f5387cd85aaeda11d1b4825cea475db99946079e95908b13ed751076da9a2e07a7fa0fb435b5a17243a684405a2675fe417a0f276faa502bab765259b6676a8f646d1bebe346baddf0080608f4ee03267f7d6c24222da7d0f4c0bcb9dad4644ba92803ffa60b5c21177c3a6d658e0db62f3351f24e39c2610cf7965ba065df68f8b2c2b9da67e039207b8401db24cf3e7d783da3faa05ba55381407c88ac0325d4c26960498fda42dbd62722820eea01d2dffbbf43311df4e1e72a9f901c913e66d7752481a2e6e5dbb35661671956b2a7f9188f704333995bcb37bbc1b9e274dde28a77d7a2cc059cbb59bb124438bb21c829240da0ff342151eea30ec9e90bdae6932312fe8fd34afd7c7d0ef6449462c240ecf89376b5b564f96ef1cbccbb95495fd572cda1e79b225c7a1c3f31b8542b99165995ba6c6275643aa9bc72ec20bf72a7996662b7d06291828c6b837620884c36eb6c7a5210eb8d8d411b755599c5f8b30a07fe6049979b2002ce942c1664f5ac0962c17ce89788760578055e1ba45ce845945e013aaf9135f63b8c8e3b0b3b0f3350f2b6b91733c377d5bb186bb14e199fe052b7d89f2351442025554cc012798d4481c61ac23cd2fa2d20c84ebf53d7dd26fbeba9d590d45462fa3084ae379e50ef5aae0975e11c75e7ca24142c10897684ddd5836760a9e4a4130ade5fcc30ba1343df9dfbcaae81288dcd4b335b9b5b49e76866d840d81a7bfca9007479a2033ccefe7166eae4449e106f232e33f8d3e8640186875e0cd2903136f898e848cdbcebbc1490c89aa181b7c700529aa1759f4b2270c61f95b609d662772f3597c9d328c8ff31ec1da88fb949a7f86cc4c8fc3dc490ef9a97c57aebbf221cee1d520380959d40d625c15e3a90e3a2027c931eece26d0a40f524a2b7145ab6b79d70ee927a0d13453689dd2c53dfbaaeee5c00d07bd5093a1cf638e1b1d846ed73aeaae9a73bebb49e8d6bbe937a5601c89ccf35b8914db8b4a61854c4026a134886551b2f2eda58e80e0a6cafc30aeca92f95039ab8e1b350896be3dbc23b334709512a7727f4f9cfe7b5c448dc795d52f03ba0e40a2e081987a22d88d59bb6f69d5ce22b7dd93b55ad8874105efb1099111c244a17be1cb70a019cf97117f2f91cdeff87ca13c5ea4eda4322427455abf4ecd2353e81ab683a8ecc45cc732f29b71d60db9bd36e39012eb8245fa010d269c9c8b387c6701d522139270caf47128ae3538357e388569ccb4c7cd03a9ea3a0ce120adb60ec40d620f3754a903edd1a071304897ce461d79e84657df80c1d0bc70a7686508c5b32bc93fc17a96e232178f297b38cd2142f41c83c285f96ba4bba5d64dfc0d73a6d811b812f5c175d6dfb8375ef0600971169aab1021d23c2d3881f5c852fd3d352a4eed22ced26554cda94802b5d5167e9f23e63a4a7e470ffe26f74374de52b929465e2877b7bd24c1c7d14a97fa53c47510ed59922073f61b33bf111e4443e11f32ed582e9f9672bda1c444dda1bc3862fe7562c1fa3afdfe143dd3dbe68b429819904e2c930b01efad92aaa603d6c601c2b812d0674a0079ea92671ef523c56b7c3fa6fc8a4a1cf3e6dab3403294bea25c0bedf529c97927fc0388f9b56a1d9ad73196988fe5877c0bc42782644c141f79711c53473422c8274d07253baea137be2b9818ce87aac5b09bf7529119e24be1be2a5cb787cea8c366dc04a70181f0e5a5b4502238cd6b5d7256eb73cbc3dfaa85d5bca3769e14e5641b248e019a7ad973add46ddc8ef0a83a3a5923cebd79ce1d9fc8a6afe17c599355575eb2a35ad5352f8606f927dd6c562a49b836dd372b7153be0515d1b211324d7330ff836e0021546f7d9421b4f55db2b88d1f5d3087a2d177905321ac499170ae211c1d2aca9db23b71302ac57a43b0c44bbbfd936ed9e885afccacb6ee70b303cdb44049290a0c10037996fb0aa5124f15b6722ef69387c3c5c51f428ac0c8a17e78a6f1295c9d8dde55e98ca4d75c52e8241b862c7fe6f37cafb781d3046e0dd0fb7c883abac276432865f43a9ec1711e58ff8aaec489420e00c5fe607e9a6489ef2f59a095f2e7c65c8c59afe0f68d65150882af419f1a52b852a0d61e1b54453958af7628af7536ab2b23ca72ba3032dd1ae411fc3b7a2d182caf1b4da556a4b092b8f8b47d94b9595c6da93ddfe5477dc9ec1476ecbe6049b0a4c5d967ad15495ccaedba70d590768473962a98b49bba61b0eef39076847a5066c1a41b3d68948e63b0aaf69b62609cbea2b7338321a3ca9d8eda2a27ced4318af6e4f76449dbeefa1b905634e5679a5d37d5eeda321bcde68da74c27210158fc7ca6958920a71e3ff181b9d5abef9ee3a19863efa593a77ddd98e7c4d445397e0b0425d5dadda6d788db82974c7a54ff5b225bd47003140f049ffb7c27aa274dbc19b95df270fd88e1509df494a54fcf8b29239cae7886b89ce877e2f186618aaf319149e1ab55d8225b4f1144b34a11554ebfff93b27ca67505b3231d15fb05e1264c404ecbbd9be055c1edfbf516845333e04d0abbd2ec24f6c61d7ab76ff39945cefe745d8ae42767008c6066cbb853616b59872361669d3778d512dbc67f379f2b924ee783beab3609b1e9866c41f27d7ec877f19916a9ed5eeadc014a9e35450e073fdeb5f539609d5c4130bcea26356f5b9d28caa0bc8f55e18b019b40097a8951977f09bdd20276b4bea47e6274645c9664441c63d38da09e3db6f0f1bb9401df3ec54746e8209ba3258cad99d164920f24cf590a7daae6d78c05f08129de76cdbd7eec6c6ecf56a6533d6284476ba14b3a8585f3252357496e3f49ba2ca3bc4fad7f3cdf89a8b4067a4870c848a6a6d401e3b470b95acd21222f7f340f7ac03bbf4f93f1c9d6c38cc2de245b54edd9aedd4677999c33c6b246342205d6b67ebeeef4a67538416f15853696b1533705f9363c3e21fe6f67e0138efae5db722cf9761afbba5a6ac803c3da38d6c71ed874cd1748782babcc260347cb59808c7e13112651d7d30d7eff9a67e7a452c61ce9af456402205aa66c973d0fec242124be20327e3d6a8e8f1cfaad5058ec693b10716ea9e6bd08eb8e0c696a97dba7d3dc2a0f6922da4d9d811c0292b8c5d8dacc5ad4ddc80c3959ab41bda4dcaafe4e5264f303e28c1828988c9b4cf92291d2628802ba47e17e5d695a7fa59c5f5cc7b88d66272751187b0cb4892f6f1e9a27003404957890f74d6c4152ee09999b26bba5e976913a6252dbf3b69cd510a + +# Signature with leaf index out of bounds +Params = SHA2-512_W16_H10 +Msg = 0a78eba54b3915e3958e149e13d1c2736380ce64d8b47465f7d3838428f44d808f3d90d6270ca46308e6e786e7543012cac5 +PublicKey = 0400000428c1a1df6a140fb2dbad85522c970b7cc38532a377c8027af308ab2bf6c2f41f3e4bfc0994ddb375347c5b809b7feacc5ddda69f2b4190702701cf7a37866a44f11a8dcc20bf5123d4c6e17672ce2fc2a8ef19132b9715ba78b26b3e92700d7a50ee5368fc483a0224b1e200108e580149a25e96f49fbf06ac58b2871c1ab55d +InvalidSignature = fffffffffffffffff5ac9203e5950aab07dac74840e119f1d96bac3f98d478c26612e386419fc50fd811ca28393f668275809d5469c35272031a721236fbcf1a8706d7340d9296a4b6d44eba3c795b57aac5a38f6cb77ce9a3cde1c4190fbd6c4e3dc0f4a50da9e16f498e336937c2ad5625094be9e2b075c37e5ccda030f5551608207b5b6439571e17805867c3a05c7e848956508aaba58f2b3f384ac574734c065290f008684c7ff4ca6ea4758a828c24a6d5c83a61a816c7c0f4cedfdc06afb327b9f8c427206b995941cdfcb10afbfe46c1f2afe6824aa52af293d694f13343301a632507bcdd811bad6de2dce4bdf3e1233cd298320c54f7f8de956c2e1061557685259ace41e7afffc3e4097d8500d775f8658c734f32dc570ddcabcbb2d7dd503cbcb8609272a834a4e1b9329d6743744642a71baddfa620804880ef38e1c7ecd4f6fc8bc7990ecc32c3e277ee96d6178dd8d4ed32eafe21a199c4a44f272e53593a28f9dae21444b937d130663a84df9c819fbfde1f6409894bffac3e146e76d5e5d993ecb829a2fe95ba4b5d149fb6ad4accd7cad26a65d5984fd2fc138d7095d5a45866ceead598bec050ba130ed732e18908628e420588e7890cf789b5445b6b044a3a97a9e031ff72d2ba129fca8e05f94db41fb7ccb76d638becede1d4693ee04bcb308d4ec91d15a89addd5b3bf0cb894e5fe4176f30afe57378ba22098531a23feabe793b86fb865890048b9ebcfddad7d6ec044f32300a4e0d5703695ab431a01f51cb46313b981b7c153df0ad74c1a0212eaddea6d39e29f5f77af329ac6074b81a05970550c7ee2480bea1fb8b116d5dd558eac2601b564a8d806269082962b7c5af5323e764bccff98ae0b9ae7b82462dfa6764bb95ee7b85b37e2e6827a4e15de48d53897eaec929a9e738fe9bae3a01788d78ec654b9256c4a7e001f51df7cdb120431b6a3d08726cc4f8b839587970d582fbdadce2f558950c5bfa1c6d1b3ef3ced14edacc1cc762307e79366c4a12f70b8579dc78e85a7b7e4fb8c79f3bce1f933c254a444ff6eda9ad1cb015d3bbd66e1300a7acd5b7ab214e38ef631ceaee08ebc215ddda57e53887a9a0db742156c01391b8ea170d71a9349c9657a480ff4dc086535383eeef205bd3cdfebd4620174f2b53afbfd204810bbfac7c4a38775307923abf298a20eea3d5ce4edd2d71a768363320d3cea5ff94ed1262ebc94769b261cb757770db5c3f3aeecd6f4299fb557ad6e39540375f4d8fe3a95708a7a24046e819dccb0b20ccc1d29ce6f125a97b29a31a67623347de832db0ac4f984d554e9a3d0510ff1b7da764fe317145c0cdf37723e061ca50f507751633bdd9358fd3eb964793462f9c331fc88ded05954133c7b8c097e1bcff4ccc6c5808fe0f3cd0a70452aa0b28cf59fb6d12de71724135d395959b3bce04f190103e25257d2fe62b5debfd2aa4c59c09af4f12a6bfa501e2d631597afe08ed866ed0633d50eb89fe049659130ff8e4be69ada6596a2222a4caeef80b7a3afce5f7941d6a15bfa6727e3e96f757d154fe5df37402a7efb1d973ce618d81c513788805d6cd633b940895fd35952ffe05fba60c1859905b0052f097b0ba66d540de92f7135fe8ea6cbeb8eef6d136fb381b77ed0b52e39e3013e8c6146ea363d75c93c15ea8c4955e2157cec998ca1015bb74c4b4bfca81de1313b25eccb75ea29042ce87ea49b559a8fb33f4d55de51cea0e0dca433ed9f2f53c1e50054a6109c71135d3b7d4b8b5956b6d872acd51c65a92fb5addc9ad7151841ed07d925bcbbc55b19c5132f3f61c150818655ce63f80b9a04111fc78090c81210377f7c79ed58b06f5acf3ce52c08d853bd9161feae7cbaa767029df05b5dbe6a70d8ada2230125fb636175bdea19b06e6b1e97d63e329cb5d4cb6fe090509ffe747603de2fa9e5d59e01c5b6ae5919e0dbc387ba2d0745ab5065087d88c01e4d63a0b1a315e8f1de8338c5d53887e0b075acfae39242c8199e67c043012075b76a0991fefb0593d844b688e3db7d428d2f5b105750ef0ceb02e66a4618a58f7c005ed50b5cd496c130c81dac1dab80c01741b89705684da7b04cffbc79bdb1f65f66f85ba3ad8c454ccde11ae1497986b221d0618a61f3d5dd4e30728400e20e685344203cb19ccd32aadba6d0f9d2d193cabeae3db54f39a4bcaa041ad62c0ff71bc9fb47a1e125c728bece5e42f2ae107bd6aebdb48cdbf93df1aabd8ce323c92b888ce337a77f1323c0f5117e78376957dee1442d8145a395ce03074aa96227a5d904807f8a2446898b12c005956c62f71d548fc69a2a94b37d1a844bc78e67d616d6fb95e5b1fd71e175c6f5cf605bb480028f18c62fa40e63c99d498b1cf6abd8afb64a8efc21510cd2da4033c24848a8b144900f0b14c8cf0d83913943468b62b3911f4003fe056a5d6a69f1a4ad303df2b448808765ff5d5d1c6c08293637098a5d1986a896197c75467bbfb5baf672334e4173b452b4bd866a4347f709cf27738f4ebccb2ffaa01622ff586af5888c6e74a7e652d5053f9d62a6ce83c00de639f0386a1fd5c088c2a27d7d0168b465efed4ff0cb10116b46647fea4c8a963749f09b17af5e4b696424d316c1b2447790567565ddb40ba653d21b4d5ef75674d10bb5174fe64853231f8ef586fc2d8c2eb45ee4f448ba35d07914e8f1b15ed7fd81ae39a4c6a740278a1195dbe93ec5ac979b18e1730519ebbc5061040175ac67a558f27c4df2deaec1554e7582c10eda9660e62ff0b199a138627478b64d10fb7fd6bdba58e9d7e1e5a103c1fe381a07d9f6194df8ddfb16eb21be5d7cf4649f9f6481c0c4eb6f1d2f393cb00be4516c9ce7acb195c846a54b09b8ab61abd37413d47b3c5fd9dbce5a3c1c621594586fda8f65c9e98c0247aa9f0622ca60062677120326ddf8d4394e1ac69d2c0e71e05767554cf8b72f480afe1daf918e3617fbf0a5a9873254f44db298c1285aee31c02abc07562f6beaf18ef3f55303d780e8f4e6d7bb5f5ea19e182bd5e978a2d85f5ea667acb089a1531a27efa2121107a3cb540c2b3df3dd0186b4c7a461743fabc41b2fb2b83ddf10b86b190544ff962763ed95eb8403e297e6c6952a8b752794eb768f6ee9dc3492da26d1cabb526a74e19f6cd756a236ab2152f299a1450f443eefbf460a6e61c548a082b4b66ad4781fe0c3ecfd769478b5144c2c85e67d1b076cf2c9a7f01d24c4ad7c8fde46bac54c454bf4dbe3234f25c461cfa39f8363f889d0f70eb87c64263d2711252e26a3519fb2a353e29d5ee35d3c59071c6c16f399734782e7cba6ee48f4be9192526ddff4724f5bb187dec5bc8a4f231b43451dc1272425cdc2aea7f190f7353890cff338aa855675a41e770635b29b585bbc4856d782bde9ffaa3c7eefdf23f4f1c77dc8093280262c5e9b251cc77e2bb09897fbb030df7445634ac96ffadcc3e8beb39a917b6d3bf5b82db6a49939cbdadc6ed026622ec146a5e9e6fefdc7bbef6e81442f38b3e23fea44913ad74c8e2395d75afe767d79ce4df0f819e62dc825a65ed3cc18d085528122400e848ea91d89565e638b835a660b267e21148359e3640737ec8b5db48df5d7075ca3cf6380a433bce3fa6c14aa2ad50bcc312b4c2ea85a32abd397e94102eaea46372cefbaaceb3588eb9a39e07b50948d15b3f45837bf50175ce6dd8c97cea265e7f2cf9800df64dcae8960ea69655a3434e173911f807b8ac9067b4b88b41a8e5b8c6ad14a273ecd8933912ad72e331aae56104dc2d292d0617d73b6cfeb15be064fbdfdc2477db2b711d7f44f630aed237f2639c6b7147d5f616d826e06f19ad1ff441fc08920f9dc58ab203d1396ba3721e469e179e84f4d497119a38e2530b48f9369d646afe47c5af35ed97f2a5f6d4c8fd1864eb052ce1b504d7a6149fcf208e683803394b36dc916ed33017c06379b5659b5b55b07f4d0226c6a0d3e327df9f577a15ea6c4640c81d703e133697e59cb5c25187414a62e49b4905f09346130430226dcf420a0b77952b6fde64a3a9bb4a5ee7a360895015de13dd8704b321b566c4928f743f808d9369c834e44bebf69740013d06edb3b364db3e0e671a342a15f3301debf259d36510fc5e54ac622a97f69fa27c8ab60f7559249f0d1901e6562e3ec90f47397840a4124ccbce534bf2317eae8eb87e7b298ac736306322f3b719f66553888ddfd8890d94947d95b0ecc0345882949495db5e622cd8c75acced4191931748bb0021c2fc0c1d2ae78bb0553adfb54688f9a55fa13d79bd308881e7c74a0cd8d6df40dc64e9967f097f661935fe2f6a878e5068b9d340de26f96817230fb7b02d797eb33261b5079271b8aa01c62bede5170cada87aa5a0dea2962828b24d4ccf50ab6628c6f49ec87e1b0ac23087fbf46c5d812b04bb5cb6c4db34a33f244aaf04863c257fd3396d140b6ee150b718cb0a04223461e8763aba49bcc36c1a4aea4f7ace802156f79414c5692fa1772dfb92c2537e4fb76d7e793701e1f375498e022c106074e920085fe36cd2d0bb5afcca570f3745af380db115ed3a77db8de5640a1f013359545baea153771f6bc17b9bbf4aee4596badcd41ed88b6a65dc575f23b14d25830b2f211d44f3d0c55829ae90cecef31fcc74818e1f9ab01c3ff1dc8c4cf8123f1b5f7e1591f8339f092e68b18f80f5c1a4f08d6bb4e69d9be64e29a7595d294ca39f7961f18d3c9aa5fad7c4e58f282c9041c1e83b701524a2366ede95695aa847ec3061fe1aa682703cfb23b98389ab411d51bd2d2ffdb10c126c84465630812b1c9aab0ef69aee36b5b7ecc671a9b5d15073c539d4bf95b58d891b3d9987d5f725df7b3a23de94fbc04e0c297ea68e1469f24cd0f1d752216a143386170bb385921f483af13041a41bcd35ae62b8f7c319170bd7c00096fd53c3b7bf6d94d36a58925e043c1ae395e19abf0074b6ee1968eafeb4e2870565f140762ca2cfce313568a70a2f764a302e0022396206bc8c8a26fa6486d31e6102ba7a736e102642f8fe67fcfd590e67fff2332118e1e5bf11c81a591bc61ffabcab92c32a374ab4973e993d621c90091b534b54692d570616b56a284f15eeeb1b614ee62c51f5f613bc9d2a8b73e60297061938af302ecc41d5e10537d05a46a6430c45910b7c7d83088e8ec9287824bfbcffd4b211f13c78bcec804026fb64be874cb0dd2545f2f2db9510e5acd669b1dbd72c3d6003270018330f01915fc8a2e235b53d0eb6a7164825e577fb8b83be560b619c2b7f48ce3c9628f1a46be1aad07eb60f136fdbd101797dc502d93b69466abed48bbe9941c7c9acbc0fdbf4042374eaa48d71f5f2a0b4d2d83abd6ec35cc27ac6d4861cb1facc1039c848407bf1d05a32c92de515e107c8c56d2c10397082bdf2603e378111ac47e89635a18b940d5b26699dc230b1d291a900ebed88fca93858083b00426726fa1b1a55a79b2679f23c95103a6410f72e2be9d7cf0079c4277ec3af9879c486084bba39201710f8aaf36eafdb09ac5f02721b11fcfe4ecc37e390b92829f87616d66447a3f347abe95e6726143307f1035d65a86053ef328e9dd5b0d202d916ae27b87eb2ce40a263efb2e96a9a1076417ede3a0ed0d87eba90ca20c13666d952b2aa691539617f9c9b9697bcc6479538980be10933b7efb412fce4918c9e40acec5d03c7005666e109b6d71188340ac04ee34f6f6e21246d04ec5b4940aae55992931ab2680844f6efaaedcd6ea318d68c796c5a7c7a5bb95477eb7ed1ae1c8fdef5799aacf70abbb661ffd38cec01512873cb46a236dc1b15575b17fe96f5910f13a38046dce04b6dbf561e74da08167a90270578cf9c6e2b25bdd8ab9991f9e67f7458b5b7e25debae569d4d7b92742aef6d2fe4d5c975e2fea65a1f69a35bed901a272e80ed3c47d62fe03412a4183c9f434bd73c6ab55b3fd8d158f69754a4b62e1a35584d334f923075184ed1c4edc300778722156d31d526edd08886a233afcbdefd834ff5c4a69c46cb497b4de1f1728f47a9f485ca932b03de01319a8a30da2f947ff789001b88fc3a99ee2716ffa33e13f70fb7fdff7bbe8b582f531d34fd4e38562f6a7bb2095b1fba5085df75067175d0f0a5516681cc6f7a4fd606eb3894092f01eae1ed0bc9fb47cd2249e0e9823a34f75e1cd1d0fb8067ec268253fa441a330c898b8b34157c5c7d5f03e206a84754b97357f8f0bb2a3a2953b9af466b30f0fc9505fd501094f5664a1b412756290bb52e903ad293f9bd6a3dc2e93397f00272fd80f6443b4f163cbcfd3ce45f980008e67626a8f16e85cd19d708673f2f53c9808079f8295aa7e4ed81fcf55d798d27a3b4ec6a0cedf928e84c249fb7ffba2b178b7af022dfa7fc7da30ce8e89efbc421f76561596e8b748a2936f47c2cf2dacfb0d29fa6d00a38b5a3ab997e1b074bc0f97ace5c02745e9173992c2090b6b6445f6e30b3237ff1ede569d54bfaec221691a04c0f67ff364bc729f7b6a97b0d502b7453b79959a000c2549692ad00b7b84abaf7aeb96431e97816b4a3e38d4cf14d0370066cbf604522a7cf6fed1fc41dd7f17e9acf10222deb71b673ad6111f1dfe68ace5fb1e605b21c573672f9ef67697fdee53df86c29e78b1567cd3fe9fb9d72733c44ffda8fa8a1eb8128a810f820ba7bba095630f1ff095ce1b3015008bec186892b40882610222a8d6a72fc1e62633304d7da45a4177bfcedc0acac9ad8112ccebefbfd0de18d9843bc46bf9b9428cda4b6e5a597c2fb87669f0875cca2a23c1d056315cbbc0aa61b9fc1d92e6da4f53d3e5f81ac1728d170ed65df1014d53137545aff96d0d6e97d55f850d19b455a54c771baa5b3e7d6a539db90c96ed018a9fc331d5e6398810f5231dc131a859e560fcf7ee7131d346c3c830ad12ed11fc6a79d859f9c67686f42180f7c02fda9c412384082e696dedff5e66c1ea58b5605ad828b8755bac6e8c4c0c338ad55079a2d52e0754970da7d0b2e55a0ac1c5c9961be6c13b224d2c4d392cbc4bdb5fc4c692951de1c852f0742dc6803c79ce36f8ba0774256ec72086f9236705106744a0773828ec31cbbf45aee787472ba46b609a2e283c567e7fe4096e5136df474da71fe1cc47d71b0140e2461bbc951d2bf027605ad2bff06d3febbb0f93045794e8fa3ca1f1bb5fdea3b326601bbb5b9544a5ec6ec8e7d3d97c9e9d51d6542b911e05b641d16e167362f899bb39430348d1bf3d9434368aac4fe58324b2283bf6fecb1f0ad0671dd24dfb76a4062ecc55de86980a737676b75b6d52444c4b753551001f457156e8439742597f68a9c102b50e8cc95a12e238ca8e53f4f69a0e9423f00ee5b1d629ddfa0416f895fd625dcfa6de9fb120d859752c79a34e5c333cc550424ece39c16f0f991c566da873425a2d21ff4e5891c76d52c82ccdd6d6309c9654678ceac2822e3c3a1c1e578093b75fb6945d4a813ad95b1f787a1ed15648b0e72592c55430602acaa8c3ef895de3e943522f16701a3d83306c972a45dd8ff840d58555bc1163ce1fdf4e2fc4891ebc326cb4e1e076e6c3958b6006db959c0ae5c3f29ba1060aaf5e2a76b79a17cd5c2ded2bbf9720bd3f57c0fa4e17ce44edf7a6ca609d38cd14c93df6eff9f021c59735edc8371a15e9b2f01b3a15cad582332a82ce565816290287f14140ae4634d44c95795ec41746a5fd49d03cdaa6061d0da4c8d6d3b1b88520d3785eb395bfc4076f36ede6c48009e764f7bc504c51d67eea63e2747d37911056fce85601344abb7d44e10f2e33db9f24fd006b1b5fb85ef40306d91f76473e32ebb21c07ea28dd6340795ebdd9e0b89e414724c6a080847ab58315fc248e35230b6a0b524ee6c66db078a06c8f6d1fe198a2bd2d413211256823e4ffc71b427e6da72e0a9132eaf1767e5fff6207ea6524af61264a98b526f996acbfad9de4d4707630dc6a9cc66f492ad6baf7bdf6bde64fceb8f0558d212fa80a4b291501e0a7e3e8261d4532f170d2b18746758f40c6abad72f14ba9f353cfceedb38a21b71115193b94d1f25ace589cb5ccccd9568c8a0df113b4bbd3e8b466e407b3c4f04a83d61191fc8fb6ae628e7063063b865d64b92ec9a52fc20fe447cd05f5a1612e4ee51a0c2837c79439a257d429fb3d2b80022aa428b5c54bc21a662856d7e594dd31ceb6e133d0ece8c96631877deecdafdb49ccf6dc42ade7d0d67f408017a898a34d39bc70aac71cd0b5f03e0a434f604bc5ad01c96ea8dfd68ac734c99afda91c4b1aa167342f58eb961bba19cd7aeb44844a1ae4f5c0c49a167fce79e3375a32a2106699ee71608ad83a8bafe5ff0c1e78e038cbf5cc9ef97dbce194252d7785a1b460b5844b732e01fe9fd25c18869f4a54d543759bc72b28fd08ae39e7185590e4ecb19d5592b88cf94491d494af55ce827305338a3a641ee88ebf3c609cceed6c3790335e710d5db0501244e639599066775f8da3f74bba3ec250010d3e286221f0ef24805a59b60b82fdda02de11f6207fa7e4569bb133bba887854093eb222d387b8df1eecd693b2aa33a8d5add284529df94f4290b23506bf8ea428abd75dbac8e8d477c84699ccc49e69f5e2da4d4e646d86c0072f5f23df06d7e4999cfb8f94831cfffe0ba58e29917368e660678ddb2c0838cb9e984ffde0b2150037f14c59c4f3113f79d9b3ec04446e72599722d785cb4afcee57cc3092b51759a1b0e6f820d63052ad8dc42222ae7fb5281f7372309ab5078430cfec29eec3232bbd0c96a1932294f1813ba5eb1fbcb07b8d3f6405dc67a27620c371f8ce7bdc4fb71d5cb82382c8a2f072861ed39a6590d46394cef9b7a0e69cc88c7d13291d19a30e779f2fc17b2d2530e9fa3e96866d8d68dcb93a08fb5c0a013b4a21180b410308f7d57e5a8f4b3bac76e171dc79e0dc94a479b24d5ed9f59641b9940b22002c55a19dc3e38050d1f730b5142c7794966d08959a7dd7973a607aa7c93ae22d2033dadfaf19d815a7beb098381f24aae31293b6ec0ba16c56b9eb760e085800336cb2f27db7cae1d19a8b1bd036d8c88fac5a474319ec8fbca74b0b3d97a4ea7401e7832807d0a61efa0da541ff5ae186e7b6f2d377129bdd59eae400b0525ffd9849524ff50a2127ebd5f186c8541eaeaa8c69d267c9fd3046c7a9ad967bd0600fb5451ab9886a4fa28f9cf9fac97d9902fd881a9b4aa6d1dd98959f07996c7043aa4b1aa0d8212d48320346c40581c78030ea53127ab84cf380291a488311b62e5308997a24d355cac1734678eb57da1b1ddd3423da0b9d9d2d3f2a591fe762d617273b41245195f2c3a869e69292187f9f79351ef8e4a71e124cf600496b17cdd0ac0afe25ac557beebae1737d775a402ce47f45d9cad6a3f94ac8c8936accb4e6829a8e1e630b5b0ac140cb544ddd13d237ea7dc497ed65b7ce6e7129834cfb9248ab1cf312f8cc714ecf9936da1d3f0cc58b725fefa0c3d1a3c739197a1c858623382138a784ac78f688dc6f051409ce4d2b815a829e1e21f5f190b9ba404502243f8ef0bf8fb802dbac61424a1ff78d5043d283c72b74fa082e4ee5795625f98f37753783d94eef1953ec803e350039e55c95d55d008b6f24b841b066abbd60e1f12f9817becf186f9c1664b2b24783da440c3ec4714ae0d933638eadd4b511f7f9475f593225e98888bf19da87df80dab2f50dfcb000fd090ff1313823eedecaf340815ce7aa193c9ed615982bf1c63bc7f512d3efa742a9238541f653bd33dba9f7390b1e1c6a44f27afe1ce358188baaeacd26f3105e7340bf8e11853a7d3fa38f19cd1a0a9ba51cd6042d83273300eeb93f69e90c930d24c811fb9c5a00ceeb5beddc77c04b0989077eeb9dde8e5c2a68777d3de68e2193f6631def4fe870430a83557dd3bf946da40070cdff11ceb530e64c3f2fcb1e3262a92ac954342082fa1343ab3092bbee2cd90904777d8de48fa373047d3ccbfc661c95c235a3bbec6fc97b77ec41760e984c7c6057a4bdd8792f7ecf4fb4afbf8581b02fb4b5b0cc9a4c5442adb7b41e3c50a4580ebf07a3758cb916c2b68c169ba33d463e3600a9e74701a80f79b338d07484d33f582355540abee28421a28e6a021d438974da7aa9addc9197a6b5a2816a6c737a76724c8f29995d5832049728b10f93beefd3cce2822421638d5057ffd5f76494e9da30a771862a46da73ce937f2c97759135edfc334b144cf145e67ad8c891277311c6ec836173dce759b3624072fd57604b05120b25a0ab0f6f575edd6198993f0f3dc7bfbf0bd8d85ee517d56c7f276295a54225087958a0c5fc3c5461ac585faa4e3fbed28ab62abb0f41a4c0682c48631dd256a5d53787654f7c30c65b4abe9f2bbc87c5cd072d9f0bdaf0cff35145f6d961876e1a877ff72f00b43c609f10cdd0ee2d5c6e72b15632516dc7e594aa2eace2bc96d1af0016c0452f94c09f4f4e814cab5e9ec02eab4e79863cd83dca3a186bf85d3a3efcc0724dd2c4d902765358c8a93dcd691d89a5ea4915f17fd7ba07518db5863fd4abfb77f22b1f7f8aeaa44353f09cbe1577cab93e196b63eb754ada4a03d441f312b5e697f870c4ac4f57b34a483c7564c101e18b059e75e31161dccf5d9237ce30655437371f1a4f7144e2458e7a3dd6e3e5e84b803602126da169d468006eca4e2bc4ea8aca95a404db783273544c5edb4c5bfd8144da01204043d20ced7788f92b7624144251bdc165ea2913875dbc9a52ff3a0bc78d3fd45477a4d7fc733ed051ffab9bdf092a72681e8275dc23e1ae75aa10b7a53eddaa6afdec7418e7c8d194660e330981eaf192d658e8158a9f6e393af49d483b7cd31b15f187a33d05c4dc210bd85b235d214dd99c72eaeb3fc7c27271b8b9fcd220cd65a54338b8a423b4aa2cb0f624db290862d6496ad4d01f3b1ddb8300040a8bc30c495f9ef29e6652d34190b3d880b0eb1fa7741fc99939dcc857fe9eb2b6a16beed65675bd36aff9baf21b589ce7f586dad83908a1769d14e46a79e4c1c269beec7d71d668ccf2abee3fd4c40f597859317b1e313d5afe5ae3156746792672fa72fbbbacf5046a5d5c8457d804762a064ebacf5e7586adc901852caf5b57c31ef6fd95a4918729da784880fe7ce3eb1f53e8f8d9a067cd0de01ca19ace027d2a45e4dbb19509711503ad9d1a990576fb22c708bed316c6f451a5bbd81e56c0a8a49709baa607a05a4994a61778c3815ecd084cec0b7aac578e1faf816a83c2034cff34710986769c4ddf9723a205ed6da3dae1046583bdcba760c366e8920d3531d0481808001a23ae1a4d87895aa6577a6ebb7f760c3cee416e86834340544af0a55548e56babf8394134bad34051d204c9cee52bfb5837fda4be57b119dbb0612ab84176b97835328c473ac7adf338eac01a963531fa603fd87230e306615b61b1bc5b52e4c2766d3d573f0b115e65b87d3f88386100875792865fe9d256d6455992f5d3754b921dbf68585e2086479c2b37735a795666adbc868f27f73bb852f75499a6d0d3969c8038e83116f65f8b1cb9315b774760acf51df77585ec33150a6ca041cad36d6df2505c596aa74f66cf3f05e76862d612f3b980483be2cba46815e6bfb920959d2cf2ea6eb5627964201553b67878c023af9e464b46c79626b68943cfb160938288f17084f745f414a8fc39ed1b49a67e89b867193203327c93e8639aaa8cfbe6cf11e0e10b29ae8d78ca3b99bd40f7f79bb23e097f83ab2ac90981237e586bb2b845d1d09472147c9d16128dd53f18dde484bba186ff0c37ca1993c233697812da990a1bb86dc0e7e91dd886d5e83348aaab768908f4c86e9b165a599350c121e3f1533a887e8e378e1d21ab41d73d365dd90cd5adc03b26aef70337642e745caf4926d5e2ffae783010346f3bbb4db8e9389c32388d1b7bc2a049d6c3684c996dbf657557c5a29f7402d5cb7d66c7e3e180aa76e42241939c7c2ded432d81849e9f90d9c35a17e0f964f82574aa57e8067fe08f17b97ecddecb6fb40112f26c8803627148611cf84e5e22f18987f6b9c5ba05cdfac750762d1bdc3272f343aa965f151045259535c0b9554fb5335ac52eda1d116453ad7300ad33099aa8d180d0987db56a632fb7e8592f9281d52338257dfe7decb1db462159a99c2056c2f1aed7be6ca51140158694ea8a3279369b650a5a50cb9beb0cb6064fd6a04d3c824102d24c6943f4c3109cb83364228c5bfbdc5d7f52ba14760b2fec71a25775545ccbf9d50a18e6befb3d4894b9c609d85bdb7ce1a3495bf5056f3eec4122d9e1d369d0873dff107629f83a49b65a130d8f9a89e869007dc54524de570bbbb314dfdc47d3782277c1659ffa9cee942ab385dc295228e7c04d78a8a4fba23fac85ff51785c2b6e90b3143d3ca7c8080e3a5458e0925a30f2875bf8c4727bd792c913824080ce0555b704b7f59f87cda1bee5e470187db82627001dd02bb45f19830b90ddc5983a1ca4106379f17fc6fabee4eef9a32097b530f07c88fcd327965a9f576b9d309ba5842b619d93e741899c0406cb470822f3dd83b06996b0b4652e5cd8e96b894bcdfbd4dee2a36b98de2a74de309047cc107ced576780a13a6aea1ac445255bd93e5a3db5770a4b6ba317ac7b59b21a04c3c283270e5f33e7ebb08795840bb4e468c11339372127b04545422f015e846ee7aa0d0ec10055e0d4cdf96011efda62fad5c1297380d90e2b374524854b2776f5a5a068b85014222cbab9c1a2ae9b7ad45f37b75af732a7a1725126fd91fd0025c + +# Zero byte instead of empty message +Params = SHA2-512_W16_H10 +Msg = 00 +PublicKey = 04000004723e42717aa94e533e94dc253c264f8320f1c9a4eb69f1d576d7cd0def698cdff86a38b2d3208269892a07f40424fdc31d082873098b044240aacb9de97dc7f62cc783ea008361a066632df01263da7bba38feeb0a013fa60c84c23eefc21218cca425f89fadf8047ced8f3c5b7bdd71cc81a4185fe8e55fe9592412565d94ae +InvalidSignature = 0000000000000151f67e5bcc86c193fee650dec0213ac7c7ecff87b5126026ceabb908f6c67156b3e5c04274b20b794a775b211858f7ddc2de11d381e15d1b54c626748ca5508adc770c56375f9bf3257532c812742d10f29b2787300afed9410cd511f506ee07627d4e57b6ec3cc6b5d221dc7b4bf7e455a9a5567ffa6bccefc650c01168460400f59c4a9aa4faf699791911ba3b77d7e025b03c941703b5ac4e65f9c38892e686d3d616eca0e83c2986984deb9ddb6c5ad5f7c1ec30b00369d11a09013a189e3a32cae13950a158a154f853f5ca8e0176fa15b3be60d9872ec61589fd7e79bbb984fc80395e3db90d0926268b87c1915a8fcf8d4d170a6b39e1e98e0521810dbd522fcc9d16fb71fa148038edf73299d8920e58031e61006de20f34a5f611409e2cc2ac58a3f776be20015bf4645965df3ac0f0cf33bc98e26d8098f64b09a811d08002c89b31aac2135cd776ed68af86cb74dd9625734d54948b4c4dd54f356a89128166a8cecf7aaadebcc977366339b3f5ccbab34c2cddd308d5f3128f3b0adc86ba2c528e54abc914b8bf729b39391bf2822c42515544c3e5b8ecd891271ea2549fe1dbc1e81c52b1187d8dae103a9a10c7f0ad29f8bea19d20b334e0715815ba93946d7d8fcf4bdfa21ee12ce9477303063d6becda8f67cff841967f038030456ee2931c3dc1495eb2b5a09e9d20993df647cdd099a91fc4ececf49ccac0f1f48901b50861e5e00b575a42bdfe239e71ba9ab1c6e8d2e4dec31e35ed03990e3ad9c25c09c296724be3c284777c14415585ccb25fb2241786406969e66a5fd2b5048e5a0885f786268fc4e5d42b960d28cf8af132bbebc3141d6f348d6caaf91a773ddaae1ff81e42ab7d1bda05b04688ea575b867a71f1de345fac2e49b0cc968ba147bdb4f2d04290ff61bdb44ed50fd174f2daa82e8ecf25a2eec8156ca23e2373d9b42aee4e823f56f49ebd2145ccaf698c9c9f3e6d98eb82e182b117ee3cc9b9aa25400c1d36468879271925fcf4e7ce2da2fa25bea5f0cdec06cbe1695137292baa801df2589a76250853ed38ec3901b705789d5da97174c41d65e9e1599fbba92ec319049cc3c46990399cce61185a1913dadb7217bc3d136b70d039b04498ef0ae8b99f3c87e6aeed31264bd60117b8228fdaeffa81b5f797203a85a53ee9ed262d0a929bd4bac59fa063c722e267c872dcc3ee40d524c5c874761757adaaa5c4279fc4f2306ceea7a1d90622c65400a4fd7b63ab7a31bfb7980e2f826ff2e55086d025ca3591874feaa77115b08513044f08ea42a58775ca206ae94b5894717a7ceef74b8b7667110539674fa35437ab19cded9a70eb47aa8661cc8753b692b9b28a63b259568555dccbe9fb5bc8da88c6039e98b5108f0fc7b7e1fa01581bb017a8498316444f6becc67fadea24bf4a4ec109f75ba9337d0f4636343623f6007759c86322485d0df246cf7950d968498a1b216e464513aaf926294e451c8eb64db569203c8da3a4459437a87dd0ea69a51695449624823c70f9822ae836b5dbecb81a011f80d904430041f9223275670cdd844536908e84c52f712428f97c964315b8b7046e1063c93bd03f49044009ad3790a686d6cddbada09964743f869288354a6089aedb6947fa36d8642d0ddee2fb251bc575de47498b5bd637aaa101f16028fee71c0dccc1501ce7362c1434def8608c33c58018ed45de6a347055de9fb3e405a52c0bdf9c38e5f7c05e08ecd93ced193eec43348dbf773970341c508fdb459612d0fffeb859fb32ae5aa91a223e7e2152d994fc8ef5a6ddff1cb405b7d68758739680184ae7ebbb542c30306a01460e15f1203df5e8be2283b02b4eac29566dee4e9027d7321bf1dfab438a7a3e448a32a2b642092015dd7a10df4da440a5822f3e055d4f16bf9635f53c73373421f1cd4bb7d6c90e21f6852f86cdf0ac07d54d1e767ccafdf4c928af8a0e8ff641f6e01b08b63118070ca7ee93be62d836ed0159965f3bb0948f861d32d1d5b2d784164b7d4197d12dc8b33cd327b141cee9a7e6fe7b1c988de6d95e220d97e51081ba5444efc93ec0a2fe9d85b3078e81585f8f07f131185e046640e6e358928e4cd5525bbbb30d499e3367220a85c9b32da336abb6abe52879c8b58effb502f054a6349ff331b92e2445495db43d947ea19aba70966e6e00aaebadc3d3704edca8eac8be6b8466a48b2853ee1df65dc5820fdb54f8e684bac04a2ec9088c32a77f6ad94891b1fdf60f58ab73d285229053ebe116b3d17fdb128ae5e63bb520d004b3a5d6b9dd8e709f87f9922c29d0aa6d97fa38ec05144160aa0082ffa226afb9af9ad0f4eecde4c4927e05b3a384b65a17918d1fb904c321bd50071051f81ecaf39bb2b5f242522130309e672f6ca17c3310ae9315e81a20f3a3e71509f2f2b2c191628ccf2d36ad203274f5f07f0be74fc996d9e66e44931d68200a69ad8653139fbc63eb01dcff9b2943af61deb8a487163979da0321cf0142ec1f2358993c1e095878b725d1eace5419904c304b47ba41147c15631fde91d15066cfade3f631564e9a956b4ae8a991e4380574403d0c54801f16cf4a07622772e1705c3d9d85e6b03441d61df6fc5742db31c720b1ef3f01144031ca746611cfa4541b70da9fa4ac99c8e0bb74e336b71155c6635fc4939036bb24a894720d05521bdcc538886d70c190fe6a85fb024d1d227620a9b0122138bc7ce4cb4882deee2dff20d6ed21dc69a32ed4084406cf12160efe04282b16028c1ab44dc941ea5850431d63ea5fc95a261a9be1742d9a225acf06d98a21bea1a25ef963aea9ef94747155f56318097493fb8aa56ad8888bdecbd8f2c4db70df2f0b327d9f365d3eee3e0bce43bda075b6d1c49b4bbcf64856cf755ba2ff49a81e4420b008e0af588cc29883bfb2b2c9dc88ed9195d7c2c5ffa2ff469d4046df75b3d104c5e3082b50218e953ce792d3ae1d60d7f87bf3eea49db03fba8b6de87286dc4aecdfaf61642053ca4e2888401ce552de7a271522df1816aa5e6f7c2bfc7b16a518248112de48f2a33ae6bb4aaeb60fc9672d772323bf891bc1830b5f5bd761a538b820fbb5f696d45f47d92eb8939e22ccd054bbe40ab0e62e2cb908959a915d0a0bcdfcea997dfd4f76fbcd9ee579d449fce74afe77831b061c9311e4885dd0f1cd44a80752b554478476daf9a87f5587ede870c0ba65c0442b439d4559fbd3064626ac330848520db0f7dc05f1289003a59906b1b5d4c7e7d0e566427f6eff71660325681c78d62db4f8160111a766f826e3e01401e0ba4283039f5f535b943f34730a740640ba21dd08d50fdd8138b8b6e864a76d9eb19e5381b06e877830bf6b25f7e8295f21c2616afb6bf6193aa5d5a1d2898d9157846a5bc18aa43c3b4506769f01fd74bff3c9fa736b968c0366399055720e3151a25575e07151b58787e03187260bfe2a8ac1cea234c64b06a269e5ab99dd16ca4e069f0b4fa94223e4bcbc545f1be42b9c0d12ca9aa1941de9ea4412e20ed5a26383e756df6f29fcf6bc94aee0f1029737b2fadc7a4a2fef8d8ae2d8db6d74ca9fa8c0706f56198312ac511d7da9c1f3b2179fc9cf19cde023e68342346096ae83aed09266bc60381c11cb60f93ba66a4e13c59622a5fc8afe0570e5b3685e7e3d9c4f1691737afc507f5c6e34fc99eae4824fa5f6cfe5bc569cace343b0c3f804a6a2534f4242aaa72d6a0fd049bc72fcbeff105017766b1c6ff6e4f70bdcf05c1470560d7d7695c2652addae34c30cd27f2ae9df28ec3140850539f2639f064b58cfaf6cd53702c7b24dfb66fcd6d9cbe3d3c972413e22f0b7a55fb80cd699d932d3f824c5c78854be174427671c171e270a6d55fde6d551bf898c2e448605ec285e7b87d177b9d2823d00031ef843c2cfa70368d9c3ad058389acc7004535c849892ce27df5905b12ab3d1f6348aff6cf7e6af9e9c8967b3a6ee1b76aea364d5360d35c546a69a09838ac62b6eeac47c799de6b2891d62590da7801bfdc37ee9ae4cd046792334ea0fd9dd53e66afbc3e9dab141f2eddd06597a96bc7375e4b31f7cb23f6c94e58a1a99337d057d2d620ac0c67d9991f09381264ebcc356e9b18c74438b86ad74bd11b4ce0ca45176bd086855bf3f47d0aad4f3b40ec25d56512d7a9b66a85d35c28ca31053806208ba89948d665f199aa29f09743942f175d385b3331885492824d8c6bbeed9e15b2e90bf6078159a2245980cd44c86d034d8033b1f7ff8a9b7b531b5af06b96bcd984a8bd9a8aa1d8462e11b7d602bf95dcf7d8b89c5e95edc3b8ddd3cd4d4e77a7a4f855105aeaff13ea4d90af9321e6bd0c9dd7eb117ad704233706766f4b8a086a45f0adad71114a2ecec8da9d529dbef499114158c52db75da05bb40b03aab7b324c3310950f5af4aa795c9cfd8c0f5efdf7431b2f9babd99ab5db3cea19d7ddbf8ee9bdf8869050cce2456137767577aa6b053733ad76c3841562a5166948b6aa7fe52179abfcdc222b72b1a5a508a36d0c22eb61a6b6726bd5d96eae7880a602e8b2ac170c759f53cb0db941d8971a6d53f482a2da52821125d72a49f529808f466a19db77ed61fe0cac8c69db73aff5c987e3fbb278756f437ee4be3bc07b9b05a27279cde08243f7bdd6b9ffb52685ba6a3aa8a740cf58ffe5533e6ea1b0a2faeac15373f8aa0037bac3d62bff276f6bf56c7b9cddb9c77536db4c794823bcc4751717407187008f3900ecb66672782efd557d76721c251df5b2f18c7d627325b2ac709e60958f443ee73da901b261c8ae47f8741b2a904157f86dcd549ca97cce97c5a8b2d0f420861bd72601920f4a3c0727ccc1ac231e31a16b0bc6d0e48732d107a0a032e5ca7baac66bcea0208e5c753928b30f643a4ae5fb4125ff8da4a96a9b7e6b18c8ea34b0b3476457686c7158f21a901ff7c7017d6fa7d45d92a933a3953e444ea8f92d3de46fffe40f12850d9d04a248811d78b1c0a9e66bddf2d53d7595743525c6045da59debfe4df68f72610fb70103f7c005a52597a4cefd1551de4ed2a4e312fb9a8ed167811d922a74f2ddbc61fdf9099683483095d9abf3040e9018baa0f6c2c133f6faa0d11e122fdf2fde9303fd81a54f6fddfa14f294aef4bd0f057763e1418b213cf690e4ba2c440416b05063529cc9952eecea7d86f5233cacb12203ea2d9084a7e2fa06b11bfdedecab8f08e64a82db5760a3b534c886d33a95c9935aedd8382d5574d29dfa2cc1d6baecaa966e990bb3b1afe54ec6239f87c2fb83e075e20737e66599a0d9f86c6cf295a4e370a9f26dd266a5008df6c8a3ffe49339876ec0e95996d1cba8f483a90b9956136bb3b87a881f6f04371be878ab1e42ad6ee217e06455a8b32d3c283c73bf3eefc925f401820492ccdc609efc4ff020a4a172a12318ebc23259e45ed43ffb23f26f0a84e5647a6450ca98d4a3d70770f34458719aee82604fa76286ffcc106ada4505e14df3fa808cab5cf04124c9577f942e31f8552434731e84f8fd32df374e9072b9c437056ec3e18b7e4277b1ca13a3fe33a170b3b79ee3c04ac400f9202540430eae9598194f9639d1fdebb030f09c41770b117a3b79e3d56ee26275e30ea7c853352fc979b657701ddb48cd4411abb070c45841c1353df255070faf4d017b5b3984aa99a5ab935eb1afa3cfccb6fc119ed93a619432f1fb4538735672bdf088d9304279695d1d522afd1406f31aa56da3ba3578d5853e20324417c8b6c8fd14d27721ccf9af449dfea191bbae67ef0773f86a296d69c8006b0073fa666eab0f3dccad6ae15870b6f7858f011c1462dbe19fdfeee78ddc259eceb6a4b5936d6b276d7716ff9046aa13e4884b729a2ea4a3a057378cc8f2e2f35beaec2e8a572bda07a60e2b7be8422d4f0db640deb3e72500b54beb77dae0efccec6b426c4934bcc77691968b627a32ac36a66cbb135f14e61caff3de6328b2b743784cb6f6ccd83ad0f3ad8745351de2391890b7989b6bc5d0a1367a7be0ae5782ae785587fdcd33cbeec53a23be6a32d85048c781d1c3c8d226d63ecb34b02fd5f6946ae746e6e7816eff865e2afb833a0204eb15c6d7dde1603f358cd864c68f814ca7ec218f3b32d98275a3cc0d35cdb19b74151190ea88b78cbbf1f399a404362f5f4f68de79d97fb9944edd6f5d99462b1065be338d08f726bcc5e4301729f1c890ece611aad9c197a60b3f4a0619ec3a02bbba1da3528a55560dfef0787a9f6bde732f49455b2a569f98fc6a97ffc95f50dd80a8a8f9214b84de228f22483259183062f146ffa8465e695723d87e5234f4aa2fea956bd23d1bdad156d5d21bd8ec52acf2297728438b81bbc9b98bb193c299b27b54fbbaa8dddc56eb985fed2746c499f48704a526272fe39aff50e4a464482dd4667b60daf645348528d251ec21c9094160853954150d29dd7460381e2db431d81cfb60e3c9e7928f71a5742ade78b5267630695818f4e825b9ed89f2cd36e293e5f53777d15668037ce314a46129dcb35c060817641da7d58450c1c23021d513c157e98137918fb51b31190ce4c37361a2532a59a70130e5e1b3b9fde586e3c3307ad6d85b99079004af09a1ce49b0ea440bc1b3c4388eaf3f7eedde77749fd4c812c8b3f0babb8c4cff0e4bba595c4aa992bc0fe0049901aac99d42c6055f07f8840d1d99e6b340f0b3b4a5a2a46401ea8689bf0fd4ba79c5c4bbdcb1be986ad84d0467c781222807071b5fcb744248a403a5f5c3e8e1bc14ec914783ed85a6f363c479adb9700c3d9e5f4cbaec921880157b559d1920018449a19a739320f0ef6a9e0c058fb56dcccdc2014ad9a07da3952f3b928103a72d36d5ca0a50ea31976cd2978a610d4c5cc7978407bcd66fd0c198902b321297719f9a865acf3c7118e3ed1b1b253d9f7403f91934d54575c4688c5ee57d95fdd30d2db56b2d88dd9e94076c83551170f532edf8f8cbb40d5a40b5a9d36baba718bbe04f2be8e14dc00e75f46af8f4581813334793fd3ba67dee1acbc957763b5d33fc819ba0569680c6809fc51586d1779ebcb411cd3d8a2662cc643672eb313db2e026a953c0c717d60036711aa6fd7c9104364862ea8cc92cd5915eecd7148bfab9422d1259b9c4e1acb7ce285c05c5a2482b7615819c6b671bd23cb8f9c0b0dce85a4e1def8aec6ada6de0a13e282ea1663eaba2725b43f3374bb12550664bde554a741005845e54538a069143fc51716b6c86e1f302e0ad398e8d7085a99c9a0d1ee9aa420f2c12a391507938d33c61aa4b01b486123c1f1eadbe826c54a18725ca91c6fc9c23af9064a7ce016431ee13ebac710aa64010add3259e26420bd98b7edcfd8a322efb0febd8205f794ec4f950066f3da7513e553c90817029a1d6c187ec98b8447c0fe570e94de5aac48f9f939823a2d05b1b54c38f0578807e39879ebf355ccd2944532bd1fe580b211dcd625f72bff2a7a87bcf58df0b707ddbf1d8b1e5c1ea8543a4a185ebd3b8a8a4ba95ca225dd56dd3b65077c667b027bdba05037adb7a05c84565d52944b6582a92214227acecf08b7d08035e789eb625d64e2a1be7abc6ff229021d8cb9adf51cdfade36a90251cc0398ec885ad5b2fddb3acd2ed6c2a1b3e49fbfc8d3255625b4d370d13405079fb7465c08346598898a4beb2452c5f1252001ec0527cc1382e22eed8e05b6e15c68a29e82ee453b4dbeae2785c2a2e99d4e6f59bfa7a3933d7ea31b51ba9f3c4394f8d512f7532f2ff6ec3cf2e19214b7c56686915ac7723fe5b1bfd6c2db0f33f1d1a19f64148de1a35cbcc35d0f5f391e2546b60875e3bfdc7a17d9183ffe2bcd3ea0b0fdb1f7576cb4dcfc72c2289d789dfc1ab2e1e201d9037c5837d29e2e7f463d38e2347880b28482410ad4cd3e16a9379f1f9f5655f58144b2b64b3a152e22a2d86970e2e48f0cab890aa35e5d525fc8eff69a6e604243c442552813a36ff8c02f616b6fbdddb12f11226b0d6215c6b12c24ce1705055f0130177b0825443f83516f04eac4a2eb4ad1b1aaf440369dc68b415d75f0bd7dbc7c202346d041007372d306e696432e1fbeb0f9b2f46f5a32304190c42a2bafe6ea874049e1deb9204ff75c0c02303742f1fa663923b112b7c9d0e4253c47ad0f42a6e5cee1e8b3d0a68ff7916104f12a4d541617ed532ac6b23aa11478fdeb89fc47dd54047ef07061818f65c74a49b3bddba80d75f9925bd7ddf957dd3955e225994c3f68dc2b43783f7405a40f9f334e15fdf0c38b3405422616801d216594e29cf511ff93a68782a9a70b64a5eab625a84f059378ae83488221e92485294331d49cf721ccc13881f137a1307d2bdfdcdf8d9d5f54df79d94bcf1c43c992713ddd1dcc57b4b882b15ee3abd95094b0a0f4b41c9ee09344daa828c27eb35a75876b1066a847f7568d525e9697b6df997711d80f0bef21f20a274534c71798e9bb8b49fb312a72713bf7ae75124c7b806a86621c9e4c44ad36ab4d012072f158cb50b4f5d8d280a124f0c389570c536280926813047e6bda039da168795f11b47b0f213cf68606834745adc0f5ee9679bb2b174a55a137588eceb551186397c76b9610913fa15dcb63af8a94ea3c7179e3cdccd14ca8a6cb62f371e828a40cecb85fae7effb920101d7a69805e78b80e6efc2e7d753b0c41e0e25d82b5b3730dc9eb906ee821026588d360d3f442c2138181fac35eddbb80b1545dcd37cb8f61f77ded5f1900bdf66c634cc559c3a7a9ee3883f9ef52e8a5bd2b736d8629459f163e5db22231049670cf573f057ffc68e6dbd14c69a14e8a6948d79cbe4fdd498462c87b114e118e5baed38457cc63454b39fc806dcfe4796cce15146cfa181f73a8aebb4be2e337027c299c9d1677916b212c989d2c65de6ba9595a5e1b39c2db54783f453678c3b53317e9923a3faf49c18929a6b3a67eab4b2b4d99a91bc00a559f347e8a3034e2afbb555fb2814e7fd6b7936f0b1f3c59c8702ee26c20cfef4c9b637620d6132fcbaecfe51ce69fc6bf570663b4865e5f44aeb64e8ef8d76ec02702711ea4fc45c396cc316c7d7b2565386be7d15a7752e5e6ac86edc3286cb9a8a176cd4a3cfeaae32c419325fd0fab70b20a4eaba575116ba19b6cbea24f2c66d5857014a13c24cba39ec138031d99818a55ba96ebfbdf887b2fa673766dec195c8ef40c4462761c3f6a189bdff740e7a4764cea79c9409d770eabe106cf89d80f9e0e2df54b1000a258bb76316d72dd62ea5fe61904f5a3926e06590a3beeb1f151a1a7549496f143eb9b2a533d87801bec30558a40962390b53daa92487bced399dd14ee95435e22d398a2c54e5f93c1912c3ea85e66979cb4e52a874603d1b379e9e21586c15beeb2d56f52cf68b2d969cb65f1729c49f6d88fe37680fabfd9e7a8ebb453181143a252ae3255b4514aac281c051c2e580781111351d74e3c9ce062424c77cea04cf73225594ea040297e2168592e92212fadbdb8ac59677f47c902bae96f2b9b492b9c28143ce40b02a423ccbd4ad223b621a24e7ebbf0111357859f8019db5b918b68d2ec16eed4677e18f093b65223b2fea6725a4e9cc256c9f3049f3f954a1c748a9e74c1d7a824f35999855a0ac29e7a0759807091e76388d880e4bc68350d315cc1a6e257d5c202a28be11225a045ae6cc5ba665ecbd158bd4f6fed480454729da235a4ef12bf7292f1e70fdefb1a455a921ab96f8d9b9709c9e6b261b3855202c3b00c275d500c495caf741700b31796e74721226eaa521dba7f89d1222c8a9bb7945c5a8e607087928c35724fe7ed9c2031db90dd911e20b1f37c196ee1ac1134e8203fc6c413b100133bfcbe32556b6beff916c588b1f628a8d786a5244c84913a355c2ea4c7601551f9b2ae7be5fe9b7d649dd56d1b147be0bf0397f614e3b8ccfc14fbd92bc70c14a727bb4902442da50da4f281b62115cc651d848d8be209fc2890d4fd54736f6007bee269176fa7d276c18f1ec4fb11fcb22d523884fedba151653847bd441ea61f27aa14a44507b6630a3cda16a6857c24d164d86c2439cedcdceca93fe5d824648e1f4b85eb962a002faca2289ad63a7e689b470b2e68a0359d5f7b28d415c2eacf00e2dbe78de6d18cfcac9d05f540d8826b083928c23d49c162877f5e0e1790d9e815915412b84b5632f1ab2740d3bb290ce0e3b6504e2b7e1fe5c878c15fc0893c8a28808cc8999c9bf809fe604fdd6bafa25dfa0b0c87b9f5f6981b30507f9d0708115d918a20d2aafdccb65bb92a55055ff86b5feeb65ed01cc1e00000dbf2592d15f7e629c52a10ce47f2d3f67d7550e01f13d3e6e10f3fac7d4500979d051e0efdbf77384d0af8b4ef1e8977edac80e38d6db0952d2dc5307221f704a004d71bd55f726fe654e06afe8ef6870e0122abdc14be2cdc7e97083aa523f530a685fc262ac7ce920ff2cde572fd9f1e1043ccd942f6bc5165f3b1ee9be1380255bbc4e0192e44d74f926259c8859ffe53de6f9368832d5affa70fa6f11c369c3e112d4919b9106b84e396778d2c5ca76f63cce105ef1a11ede6e1407a1a3d79df74e13b31260aaca9652b836237b17b7cc31479a49794c7f31426adc7098c33456555db7582149843b5fe10c9d296bd11c239089ae8b67651d33d9041144867def1b941b8c529b56bce508bb1808f25b7f32c3da2b232cb16918cfb85f55fbd8536f5011384b3a5692b79232e12a5981079a224b144ea606f7f3ee86fae85547832f6166fae54f2d964540277caeb5b72894538c9767958e7e1f08303d2947b8b8507f56e0c7c2280d965057f7b034c974dfac96b72da04d0d5c8fc5e58d4268a0004cc53f4c99f0b76612a0c1d0e8396ce7eb3e0dcb04f7b056fd917a41b125c80fb0e29daa8c3d5b3fc62269fe603870f2bc7c23e31451f2a5920d6de576caf1107d55f7d673d015ff965942688d5fdeb2ac18b85068950188eca27b2c6d4e6d241a21077f3993e169743a1921e28a52783b2cde7bc52e41147731d1e5dd739252410579dd9450f83e34db8461efc617b46520276f6fa1e43d03cb957c7004f15b2ecb6ea8fec8979ee908653c109804d2b96e96dac3f8f8cf0e33518fed93235452108071c2ac763d036c8445145f86d46b9213840ae39fd1fa8204967decdfe0ff40f6076676e6af1c88c1899c4a613e7e0ed165be20734a0382c3f9fd81128840e6ae16b2af211055841b7495a3d74bf24f518006e9e619d364b4766f77f88ad27053bc738868ef60902dd58f3ca6d69e42ec3cbf7e6f6e08ae3b759d8d1db7bf9f0cc3c3e2f948d8d63dacb4d2ac5146073352868a441f62b5de88fb92438a5cd92f85f299eea2e35c2bb1551c0b32cf078b6bc23b3a7d6dc3cf55e9650028513c014642a1815f9f16e37d58361859b0bafc5c659b389c76e63f50ab29dde31919dde0a30ac9151e25b6d0a14472f8add99c8e748d4417b19ad9f45366ddf4da2d0a0564e4a550510f8e3cd34359868698784a45cfe3c38807350f86940a9883cdf6fe707e33e1c27ca02c13d948ff3da682952afa6388861c63108754affbd8a6d7988f733d1df67534b867cf6d0c12a04ac3cb8b74ff00a6c7af8968b64b8821b149eba0e5db216d6231707e433e769fe59329b6451f231472d855ef485cd99035f77c7fa66ab172e2f03699690fec47d1478242c5bed8209f049d6f0aeef819274b46009fa61a7e39ad8c2164245e2bcb24534e66d55d18984b5539bbe70bedb33f111ce6229c5df8f8a1d424bd14fc78ff4a69e5dfde098dbc3346cafbf8beaa32e233d3c80a36526f09cefd1e825177439133e0c7ff74934e871401f7ea13a49f9596921ddfc437b1ce9eaa6d429ced30b1b235ada656d63d912fe42ca4bcc9d9d3d80dcb372a913444e43afd79d09bab30a5327b5c5453900676dee657c467cd8b3e018ef4008c3b3519e7a447fd6bbab66cbc87cc625a71362f3cdd9b0864948f5cc8a6c39d60965f2f4e32812b0067ee78dcc88516654d64194ef6a68e84ee4f9e97e73ab3922416f20bd9b3e6f8c7141c0709bb999664059f2dd348487e6a2f754a399f7b489078d60020d66d493e988fc772c6372c4e8e46fd4143c245140ea42575274b29d8607aa0d2abd67da273e02bdfa0cf2598b912770eca56342fd321d0d2b82778a0b1beedc291b93d9056b864343a6977081824578dfcfb26ed1d448e2abddcd8294da8729165216278a0da14758c404b4cfd1b10635bee4d090b82b2ca286e1eef03ffe6b46b4967bacb11ff3b2a2d5a7e1766e4bca1856bcc9da9fcf605d7ef0ac1154830008fbfac48481f02e8c959256a3992dd9af8f7aece9377f663bcaddb3cb192dae381f9157bee4dfbe47dbfec033543bb60242cc492e276b5f222ad07dd7bdb60f6539739788f544385baff6fc98e3895b79295eea664dfdc4aa3955808ed031635e18a138c08244fd419cdc1d99e0132d9d6b57d46c1b47b78771eab89a14a13878e7c173c3b503850d0186fe25cea61b126fc124499b5b0f2980262b02972d8889567bb072a9a28e94bd58b6c23e5bac13655a54d574f375e8df6fa57150436ed6f258566c5f61c9aa503741515135a177e594e41c060ac0f9e94682c9020be9991b0abb2c393fc1f50b9d84f30c4f7e5d53b01e933ccf10b4a82a33d694c61902132be6f10ec65dc617a0c05f7a58963350539cbed113a8a863848705d736db7aab7ddeed21dd09620ffa7fe438fbeb5c9aaf88d2820681005d028c17e601a8e53bd969e6c0f960257e468a7ef3cc03d049962102aea8fb38e49cd193a + +# 16-bytes truncated at the beginning of the signature +Params = SHA2-512_W16_H10 +Msg = 426e562ab69a03a893f56910a2aed2a0618da1e365167749e78beb4997d36dc054f34225797478a5153037d4154a90c88836eab69a7f6783237143fdedbdb6fba8aedfd98d3af16fa293660640163c0936ae072c0d38772013b0bbf97cf44b64c44acb62803a7b2b374da627e47a1135782f09537e873aaf5bb54676bb5195aaddf73b64fb9b32f3054829dc0dc0164e51e9efa8bb5e9daafd97a85f0b3591e8c06232e6e54a3606cdf93a05df506905fb69b7cdecf62145d5d1a97fcf055b69d35c07861bf3532cc9bc78058ef266d8c98dce0af755c84fcefa69468d4a9cee6effedda0e0263a87573eb3e1d9f765083c5fe5e3598caa2874d065360e7f254fe6e3c3acccfe63ab3 +PublicKey = 04000004e0489566fe62275cf1be38b809f0f959717848a76d26b2392793bc6523fc57aa78b3ebbeb74462990eaf2e2fb89f988b804ef9a3155641347124f7728040c1ef60bf55b84746d9b9232f0221a3ef11728bf25e797985607c06432ea5b4122574923583e7127424b4304d01f90de74e2c81aca71e6721805b70e9c77fa19c5c0f +InvalidSignature = d6a25d3dddd6a2989053aa5c2f721c26367d3ab387bb9e9061d29b1a6e075544752d02c5f3520ab586870b57fab6186dd83f0a42d6b0f24222d910d56291a3623295e4c1ba3720039b34f4ab37d44cbc1c5add15d1f23b6a75ab03d156b3de75c5aef881f179e340a41a4f22c04b2e1661fa3bbb9e2fafe88a4449f812c2a3bb3ed477756f52af37e5d32afa3936c0d04e44067b155e02bb56b91e82f6a43c249ab14b15208def1df7895dffab75b619320b8295221f13daf941577a5d6885e70bcf305f1160fbf98c120ba2d7d008af4145cba4ceb34727c8044eea1e3999304bfb0a67cc1f666b3ad02d708b8293d228622800dabc11daa45e4ab36777bf26f322d36ff39e335470e14bac1ed89af042aaa352cf7b970ac1f4682663de659bdf9f82b765a3e54914238db38e60f02a7bdf821a328203f5f04e4725485c475b34c82ca912b8cf599217a6675f5d06990869f6bad4dc1efb7569fe073fe6c5c14d6fcadf4ea3b0922344c78ad88efa956a0530c009d09384b42d98fbd9436f7702dd27d658635fe93e973896f4166fcddc4ba7ca33e1baf65b286008d8e3b60ac0d67e73f9b253567135c82cf0c61c2482306889c67b4f59fa7bde1797517a033db19d9c62e3f384e20b7e396977d155d42e89cf60dd9162d319cab44f208d1b68284b3ca968de4bfc14f596302e0999a053b51675f56debe6fc8871636cdd4e33c25d4b5d04d5cff32016dc8840466efb32a89cc6cc69224d2d7943e6c16f1fba7fd3c31546589013366e07e2a92057072b9eddb8787c14969bcc68bfe70a7a1988d692cf97401ece6af0842c62d2ef9f7796308e6b225ff2e07010d579cd5386543c8784ce0a900ae5747cf1e065c06b32b93cc441becc114a16b1bce74aa41742f0bf764b5e7e162120f9794b9552ed5481b10b42d1f6fe584afc11880ab5d0e8ea2208f0ca584937224dd1667ffe768fc7ba92b20b1efb18de523780ef43a305f04f5c58d41fb7ffd58f363a601f878232f9acf72a18aeb38c568db1433aefb3f1d4251e80f709db46496eacec4cdec4a79a81632e689f9034e0715ef83c57b10306728ab74e003bbaa9d394440963744a5c4d32b851faaf4524539eccdfc5bcce0bba998485b281c74cb644683471e899102ec0fe703abf4d6a96637c5b7af308eb29eba6e513f68869e2fc17bb0a56922cfb681a4e59ea5263749d8ecbb55830442a7d96b7e29d6d57ea0d178e09760d6ca390988d150f9a4272c95b37a930949f7feb3e920933be8ef4d7e1826724b059dffa0345960ec7a1fedd00d6106dac2a14c0f6901ee2cebedc837d01a50375bb4a5b96d710d161555871e765f09b7d5cb1dc448fed3a79946d0191059687517ccdb916bc3bdf4af2994b857d40dbf82072a2288d9b02497ba40381631e944c83c8ae887a18266f41dcc13a421d44f5f62f8215c29d00f5179dc79143e7a67d32a9acd0565c53eb409f1de25b12347999e19087e1618cd58cde72b4fcabc8e2a1226918943f7ca51ee6eab71a542a69b7459c36b1e5cdeb90417d82dc8b2126f8fcb9d2e5cdb7069ff4ff71b6b13903f82ba5d912fcaa2a7abd113ae9e15568f44d4594de4af889b48dc5d0ee13180e528e61e7ee20303891bd8b1d253f17e1644f63d965c4c845c720cb67d2db964bbf07118279ca62cd6e99967d98e43e8b61b6030b6ae8c4b56b1d3970b7bf2d6244028efe0fe9d44a2f5bd06fe6ecc4ea416a11ba0864dac3404442eeda8ec65c84bb407136d6baf8a344f026699aa6930b07d22ea6accf4d52bb5ddece533b900d548b4b215579d125f83f70414af742e7149585b5ac5733d8a7612bcee1b28c57ee92b755400da62c78488008598f5a1ca065c52ace67666658e069cbce1f4dd8b7f24a78643d5632efcf6103466a9f122c17a083ca24c77df9759ddef4cd26147472218173555265691f507cbb887fe968fab43defbf8816fb6917c4b5ac41aaa7e5d8162e7eb541c83cc0613e64976578b9143d90976f9f1d88ed0a11e27293a3ef50ccddb05c0c2760c664b153289ba16270b724ec7f1de23f799324b83529532be4dd0f57e0077b023f1c66778bf55b4fa308f6a0ce9e797b0a23b0d44694176959fde0973bb871bbaf2e6ee2a851e48ece311006fda85b93b67f171bc7f438617c583306429635c68b48e7da1e2cd45511ea1e33fa18be2121d7b9acf802de6153a198c47c17e90b79865f23ebcaae0ff7e72b521dec7331b19e1a03ff1c86018a0e51942bc544a8a17af0bdedf7759de574414cddec79b0eaa7b5430393faa2ed76ba8e3d375f99ba1d34e3268e764607596f043bfa0c5c99adab33c27172a79b09c0fa3a7922d6ba7da2d8a5521226bc2eed48ab0b5f8c22f717b8f4d5d9d7120fc63cf87d706eb5eb112f3da2818c252ccddad01b004ad2ef9340179cb9311e67ca701e43db4d80c05f97b19c577696d15a2c157561119bdbe7d6c870d181a4fcee8527306414d23a97fce96908ef888dfc5f4049dfbe556f1a0b7b95df1ac71b6ec8bdbb1dcdc7f2309e912b754db515c04724d095e03bd550cbf703c2327d9e5c05c36fe8379b17b48d706160c3d2ccab168ccc62fe693cfb5f8f6b61bea6279208f6b3bc625e8077601ac48099f52563384a703b5e59c4dffd76c545e9c4ceeb840bc3742decb7b89d7ffe83d28ea3fcdf3b6499071a5b7cbe9d7e7ec9658207d6776668827e51adb24d3eefd82327ed1e92958ed8a56f188619a84854a2606504dc99ccba19db669311d90728e2b77e1d49518613a1f411c9f3e521a1b98c5aeabaec4497e1b77043b8b4b73f150d75e2ca5f6955b39987d6e302710b7d304c882fd4cea70194e7529d69a7c796720a358128c4d0cc27e24597cebdc88888b682c3e8d106137e172a358a525af16e138f36be2807b3f2e39638b48e16d3969245d9a6e9d8f8c98864360c0cfbc952c4c2aaa5ddc6da39a168797d9daf608bc1b5f99fd1c5677b2e8623d462b275d59da70a17d844a58008e39cc28e1c68a82f5ed064c27190a0422e06fa2023bb482cf930da4e2186f36f84836ad8e05cb233d9270da650f0b6eed1fec2a325116d1fd7092ef286d1ddacca7194d58ded1e9a68fcca7f33c1389c4441dd79e4831693a31b44c1efeea4ab80506beb5a001ab9d79a69e9a273439809bc8e899f53e69c5030999902c75905c2d1d195089fc0f6d54796fda1a4a4ce6bd172779c8af7e96b3eaa2b0e89d45fd9bb76456808db64fcad5af835fbe7b32d49f25ad94eda04c0c5cb887855979b255e1c9ce219dc19e6eddcf8c1606bd6cb17d44344491be6d5f7b915abea22c58bc413c4b3a4fa332cd3853a6e4b0d8e873cff42c177825c19f89c86bc4ef87d62a620a546e13c0727311601fcdc1f53f8a1b246885b5dd46c369b1760613517be65eb15d52b5a686a5bbb360197e99f3e27c45952ac8cc7c9bda76e9fdca0c9878ce3b1e2dcbb1f98ef97c5c7349b99b8eb2f994b5065b1f7211622164b3d6e776bc3c6ba02232c72b8b867f44e9ec56c6ed4151e3a1eaef761ac780f8ded2c3d02c01b9712987c3faaea2735998a9a46fcfd759138cc5375370ed411179e4cff1ad70841a95fb67461287059ed1f6f648f87446011e8df22fad689a9cfbdcc2c2b200ccd4b97ce4ca0eb810c7ab2452e8ae80327936710098945f082319f4007442c33b6b6fac9eeb030daab3bac1ca739930672bed258775100e3b5e78cc6c3f68fa671b92d4c59115ca1fd63680603290965d2e9e0b80d71cda7a0c54a26355901be67240490063cba6bac155944541b1fe61f80fda432ae594b011210eab5f1693b381592cf00fe3a5d531a99229a9aca6fe483e420f05d35f83bdf44ce7a3937c4c305bd5dabc904f9fe18d69109804c1d7532490098a10f7770d6af409e79f270bfc367d433dc8385c4ab5a6b4315da582a03665f773a131336fa4ce0cc3774988aac20dde501cd5bbbe532b73f997886ce61801e32e96b18810bf91a122b87a761e3c2055536c0e7de1e76e5a0aa6c23aa3e6dcec3bfb6bd857d5a581030075ae769eb035da51764aa456e128f98b2283dd8005e69522c59dad1ff4825ac0803c07618a2472e4f49d60221894b1ff7aecab4aad583d34f5ca22e07eef17b887045c0120082a5f19bed42ecc6b37cd4c7344fb4a28881cd35e12cc51806bac64d8650fd09e4a3e2f8382b1972faa1bddb020a5f7fa28d3d0329b4b17d1cb35a63bac727f3a68aa11cfae20f6d91d2785a987ef5710236a81d3072c259b7e1ef16037fc65b16aa52ec7e5bf6c75137aa1a104d8a0633a287ea5a0439118d39828626673804e0d4585f80c0c943016d6fd2757124c24affde304f08db26d0d26ffb1be3138087cf2d4b3e6f1b9f565c89675a5ac0d0c9dd67d7ca721f2fe5ca0c33c3ce383fac07271591c553ed58f871882b366888feb705a439b928313e7784d6f2e0a82f1186bce81220c02b33429ea1e132841507f89ea9d9c9c0bc3470f583ef98f594df22e01887bcf5c72879ed6f7e941c5a7f7f6eebb14e9d93f8181d948aa985a2ad7acea770372d472380ed8449a8e190ef8b83e7f28f1b030f8aa32e1d32154aaf1361b4f3761f2c342a75dd3ee3b1a2c56ba2e8e29309e03241baf6c6361e7c0ce74ee62be26a0b65d8e7d2db1692b719efdfbdbd3125d3b682173049cd823ad5c6f3037d990610d09e91dc3cd8653d584048ad15729bca2ab95589ad8a3ecdb3a39c655decf7643ba0f0c1931d40ddaeb1db2c7f25dccffd218e906fb70034100552979208ec9d195fc6e1f82290e3bcb8ca1248589857d56c091b64c234a9f431d6aba8f107bf34fcc469989858acfb05e3f81c8dc5ae918e6d79f10aae4718abbe4f4ee46fc069d9665dd3dadbead13e11f8020e5cefb1fdce489e3c9d904fbe252e62ba1d20f42ceaa7849b9dd8525847c493a1e0d7780bdbc7c3d2a0adb5aad6753a82c51d5e6a1078345396d885ba6a598d6f20a10f85c50d0daa2e9298d3339f7387e87cda9a174ffd1231e9c606ab533407af9580e6d7d8119a4d8543e1cb034701dc760af5582c8ecd957a0cbca0a08507b693decf0ee820d4ad7f3ece1e50f6c78edffe1f36f96a6f75eb6f1066e281a5df1bce4c666f2f82565949b85d6fb15cbb705e5633770b05dfa1f1a7073dc80aae196a0617a8ed7cdc579517da20497e78ad417cd7c2555c44e7f474a453e86422c8b8d337c2e5dc57042868f7d849b5304aa3c77d7b6a4e3d17aa8abaf6ebc6ed118ee882aac7bcef65a6fa226464946b440589b9fc898735b526c7d43a61353066c291b1f647a2d48721eff17923a717632f3ca6d036dbed516466758fb1bd24fe68f795920ce8890270a4c81e47575e5cd028cda1267c55ca7e940f5caa093174d234b4bc42486eed721597c8646e7a1efc28a12fe16327e0f0906eaf63ec96cd1989eea01f0d33ffac2d30f69633b1bc09ac124ab5de0b6b1d20f33154afdd0921be529d34b44fe3d0f21d0d606b960d396943ab9ab232a2dc06e2c62979b651a576699d7d11c0b9af36ff227c5d26026d6c10b88018db9d918bed7c2018c56d7f5b1efbba0673d4fee1e6bed58bc5eafe9c64308fc8e5bc8e1e8cb7e64ce9ccd453d3eee007c3cd1bd2f1ad925c25e201cc882615875d1d4f7cb2191738fe1cdc6ecbcb460f6853baf553838f6a98c639e74419c14e1635df72bc92f0af3de1b0573409436fa9a1aac72b1d39d373b58d7acbecca53f4e1506b65f67a6e866bba1db321af830b9b32e430874ee0fe9477ba414fee56311f1dc88dee950713b4fe4d4b88ee6d8d2ba9103b9bc509b3c1e783bd63b086ab6e2cd5043d530771d70f10efec1adbcfb2b4a587f675868ff1d6f890e9d919aec545cbef839b2ee18d1fd5ab41cd626fd9cfae6c3648fb139adacf53c7dbe4b87943d2c265675a9212ec58125b11d610b7e89f8f30146fa279d1778386d4b63c4ec51604fb4e190aa28e7ec67b005ec3a704ddde52e8286e6e50710dc6c852b05dc9e26de7c36a657cb156be1cdba5d0daa93e13311e16f03e55263257b17aad42bfadeae48fda3191fe6e2fefbfecc5f8d18786db5d8e92219339bf9707d495fb0780132193a4b45a5f3658738c29e29e73c123f2c7bb6c8cb7679f497ab4610a913720f143b548c31d899ab6fd043fa4f253beb76c325a3eaed7fabb732494404ac91f8f3a3e0f8ef636af82aa24175d96e5c34c75da7f08ca7ab86833e9dc4794b878e7bcc46a545bd9e8e4ef4e77d1bb44b6242b62109fc5be2bb7205449c7c03f96db8bb5062833134bd4a5cd41130e3e597458a733c39eef57e80effc56073e3a61ed253b9ec4b004e92aa6a35cc6e89d05b6e98a082f6e5a9bb6a65c0a04bbd7de5773bc7fc9e22f677059cb8a793333d9a92522b390b1d5c4fe1fd01c42d5a93ad1db681f705141ac0c5028b2837357bbbc9b296acb37e24bc4c00b4c4bd22a285057d3a4c7823a494894474275807df1aa882841c4c2c11d2e8648ebe3fd23676c9579af5954cb84e2c2c61c0859a80ac0cd9f0300ec5c7b306c7b42193c45dd19c1cf41833b07fbd97a6d470c5f8464a1e18b695ee545cd70692f52db47d240d21ad270365fef9cd3f65645c37ce360d2ba7692de5b1cbf24ca21af52948bdf67bafde3e0f04689574defb3392d49189a5643779d0fab7719244ae884cbb9246acbaf4abea24cb0b989974732f8f1f2b8e3512a829a1949fc78675b0209c1cfd4f0158770f307eb46c8f21231c4990dbafaec4b1025da3ec8c5e9f00bd1681ab9a400f5ed9c95836aaae26590498d118a5fecf5e142262eca9f9a95113db960615834ef5cf19c5dd99ee2ca71565bc89a001b69134f6a0c48f0ff922642db1fc5ee2b8940d1e2082398dbaffcad8ac72a9e221dc21004a71f25fcaa2145e85717f3e0ba14ad4896a0b64bedcfa97ab65061e20e5d9d3b9fe1a2a6b147af4a4d184d1b4989ad1dfcd2cbe6f6d0d226784d66f203325b56084131ed232c3d6880b6e20f690f0454d104c5d146d49d96255d7368ad408110d4ad193dffea62b31aa87c99e78ee8800d35d6aa3fd1a3d387d7b405f4e96b35e751adb327b787ec45f3660548d73a0c850484298209180e58714941bc9ac22a57b0ed36475756bd20e74a0993f7e2025954d057b6d91683819749bc14eb114c7ccb265f050789be65ba25016959f3b02f15a975956eafc82a94d9f0583442641603a9e0c8c54b378676264d630ed2942f266da3fe03eecea3aeeea9c079a9bcc42168737216a4bcfcb91c243b20e39e0b7b863eba52fc4aabb209084ba4557b041369389b5b0238a3b281b2e470c2e68945cfe567a95b859173ca4f040bfe7fb9e8a1377eaf42db813a90e1c87bc89ee182c66ae069db6a3e4a9bf50ed7e7e667ebf58e1f9a78e89d9a5b354907eab1f44acf9319509bc0e622b733683873dc4ca94720ba5b9ae975fc0db98460ed394b3a496090e2fe4e2f5653d119f73ad8b870be993bbedeb17f63ca389d9d489c4c3556b75a20eedf2196a4c32715cd5a44687e15896b6e57e98c00145a557db6d4921f3e359e2f2e1c2e5605039dde023e1d590e1e7bcb2612ff140ba4f9dada6cf9e986b2503429efb0f951d90f91a1e52574eb07ce33b32c79b2041483f700a5848943f000cf6c8163eeaa9c7b7c7891217990e98f0ef9b918d71a4e9fe7446582291eaa551389c4a96ee0e535dadd03064930bd6b10df255c61d7712ca5213822fd3f0c57f8fb62b16d5c4968658e23e5761de1d4e7094ec3c7048253bdcaca2a26220fce863f09f482933b7c2ec44c1c8f322064eecb8d0db01123f143790fb461d0810e910283a91d878ff5a8f37b7876241ae5c7920bfed5f27ff681010c79c32b17139a43e1d8da2e173f7350e8e8c5014d89ed638f8d665788e58b6f6725ffeff06a328464ba578e3a863833d531f645b69b613db2c012e311779dfb4ef870b0f2724ff860ab1f03a0bb6d5d22ebd36433583ba2a75725c1e7aba62bc19a1c4c2c1a33920885d0439cb81cc3e1e2620ecace778dd230debf7709d1bc96b8cce40a55ad288fc403a8ca24dc8a2865f80a8e12e8fa1aaeda7baa31d707e8cc51f980509cf6b38b180dfb007fdaaa66389ea171b42cf35cc52555880b2ee10ee48de9da10765a68e727e5b1b5ba30080a257b2435aede11f0534276bba83caa13d6dcfdb04cc1669ffe0d4afdd398613ccec2ab75082ba3d9031fe54d4aadb9662c1875b489ec0732877bc80e6e76b9019bba2519a0b2d7e8e1ca393d0cdda3d30c4ab92b2c2bac792c9126be26d413fc73c2c357ec18761538317a9dbfec3497cf385aac74deda7874e474138e2f0fdb55927ede8dfa856988a3a123e172c8415cbc50eb2eef3025ea7407a5c7a92038b35e960405fbb0a4d6500fb63d53da9cb2513d4f4c8917645caf44f0f288cbe513717b95d9ce6465dfe0fe725b510f7ef08d7a6531dfd29bf4f8e664d09b10e8af9cab0bec3dcec90cc77e6e8d0949cb8280fdaa12b9c7670f2160273756ff9915d175d72f6a894968c2db527f19bd385169b68cef67b59a0cb52889bb7d62188970c47c4adcae129163afa3c59d7c5575bf371e8b8dbcf6dfd0e3cf560dc1224ebebdd2c7b88973815b0f719833a214c5cebaddea500b2eb17267eb4c328b6eb798cbd6264a0e6e75e641ed140727e0e8d45b90fd96056b18898d5963d0e121b691b0cfad3a90833f2bcee7908de73a08eeaa074f1d259ec25fdad9d4e255e133d2aa535531044540318e8951bf91e75313f68f07a031a01d907dfac1e2589ded9f610805077ff06784ac9aeea5e35835cd5d7fc02413fdf37e197b6573fc033c9986475bd5a0b4a3bb6ef5c81bca8b7cc42721b00cb4e515c8c1d71ed966aeb23b3ea6df5c60db56918549ab132f8632777511e9d16ce9ee2aecdd33c5642cbe17e4194fdbbd25b2a95e021ad5ac12da4711d1d26e4affab3dc95c698265ac38d87c2c50bc5d52ff85642347d5bcf41bbbd5da72cea586d39a4fa84ab23888c4f615e69fd1467f6564fb1281997b4a73ca775d2b37a17cd0f12766b20f08b54e26decef0e7fdac6360367bbc9d911a000356beb56bf6a6185502f05e1f449c6a6e5c0f96a53e419e18f56e7ce42f51687a241ac30503a621340739e351649630dff0de6cbf1d69d6527b7f9d9ffaba16d03c0eeb7adbc77641bdbcd749a376fa24369786175c90f014f0e776641838ca7dd95a6b117d76f309b90796e9bd7869d712c5e967dd54b18f1e7b5e9ac5f8ea9efa7f5ff53fa5196bd8eb4453b12914acc08e6cb5cf7509be4202ff4c649c0c89a98b026afc0630678b564e1b101cafb597812ce46eb7305ab545210706fa751de811621870519c84562152c0ac671cfdf26ff697b5a664bb96ca6127e1825d7e4e184772e173beddd96894ff30279d549b3138e94e7b175c4b61c40cc8373cbd7dd69529e4dfc274a1e4dab8da1ce31ab62472a884bd8cc37fc679a44540fcd7d779175fd16cf20cd75e00e4fb2ee78b38054c2db9de96a709285314557eb9cbc87325159a19193a1feae9551544b23984e3c99eea2b2d2f820c04772b9f201451345f12d94759acd637facc8a603490cf7ba9b81109f32be63c199c8b1eb86d400498c71976e55865da2e3e9c7dad11c4c406fdc05e7895f9c7a02a6778a50c696e270455fbe0f364a33a9a2834d26166757450597db60e69f5bb8103ddcd0a0b341f07b7156930915b2a3622a50ae6ac4c748ac61e42f9f63062417d4a0e81a255ec2942a985184389c2abf0a9fb8c07494ff2571297331cf7b20d4bc8772cbbb13c9ecfceeeec8715d07a1e40248e1b8ea66c28c532c098c82ccc44a2a38e1fc9142497c16afc71f33e8930ee2dbf20a9287b67951682fc70ac8294fe3564e3846518d8ab49aaa532be98e5d6801392965173bc3af16b32e779bf697f1401a7e3b904bb75f46efb37a722631374852bb6c0480a557054c208098c6ce2fedc009886877ac03ad7847dcbc72dc63c56b260aa4ef96d5ecd5a401096b536bc9677afcbb9a7c3e88e52a20c31ff91032c2e77c25c50ba945fb959b7cb335a56ac80b2bdf39f3ac0b6ea62b2064175acd4b48f1ff1ff3397ae45b10d9cecb4af13f62e936e99a2c63e8a82d39eca12c70d48a055d3d75b1cfe214f1d52337f728f292cd090d0347bce37982072c7fbeb19d90e296113d57449098e1a14f97b9e778eaed52f6ad246f9e7700d03752d998a30da79e88d1c41cbd9e17a9ac8bc594ec6df18ed3e92e9055acaba9c23e861bb0f062261cd5991cf1fce6277fcb6112759e91a9f8db28be64276b1880d62e547b21d37a7506504fe4d8871421e0f18e9dbf09828d84b25e54872499915207da35c75db761bcf9abc08c43d094268324beb1114f959878b26346db2ad1d6762789fbcf4e8e4df4b22b7ccce6d8651fbb8ade9fb2ff6972bc43cd35151b395f580d0ca72b15488fca95c8dea9d1cabe3526b6c81e47be3e71a1e881aa238e6ba16cecbeeb26b4659861e93364091a27e2b744aa4a8e9e042897e0eba5814deee7c92ef6e56fecd1b352a36db1d7d964f71756057e107932316ef898660ca6becb54b264136ed9dd96c164fa2b0d0353c2de931e4654adf398797cb3914704964a5f80920cb2e5eeccc5b0808afbfd7d10c06d819095717e0737b57a4c553d8e546d8b59cd8cce4155a51a0450a336a422925ce07a8d3ed100bb403b2adc0289fe8c8bb68ae7d787028a049e5be3228df76849257d331b80539a5c5e6e8cdfcbc8ef519c54ef69b7e72c346794ef4492cf63d0616f46e5789fd93b74bdf59b4890ac002717bc9289e4772c30ca7f32ec4ce709d5b399c6b9f70a65ac9c214c80933a316a8d862eb426c20d733945faaf66f60b3d5c2f61161d7534f8aff8f10056876412ce1c728ba404abadde6cc6b9139ae5dbbb2a91e006e4b81440b694e38af04789b8a87d414064d9549a3930afc92de402da097c43b2a42e180b6d2683d2ce116079405ffee3a105741c4d814c29f7b2760bc8084a3ef5ef38c22aa33dd5affcd4f2bfa52b74ebcb8115d94e7ca5de6b799e9fcced1919d6526d5e3e941a8b4cf41249e7a9d4ac19130ab1ef5d548c9087f97550693072745f006e56055e1295be9cbbdc1d000624dbd73cd26d9a32653518b82bba9d5e456d9459af39d921a6685e583990307a0d73e25986ccf65fab2842f808737ea5b429e3b65b9d5b1fe16b254f5be3e9d2ea0064f72d19a1079b664dc920f1af64c4081c144104ae3c0e165ad1ebbc7dd0c602dc105e9b8c1564b6b9859051359ff06c924e72e223bbb2cf35eb8ebaf6be430cba136cad0c5c0c446d01dac1c50f42a3dd878576ff3e1680b295ea1b6826d947c09d47a9ef2a31ffccfe5c2175ebfa54f79f52500e61ea3cb81d7d7a20bbe1ad50fe28fdc2cc94ceef86f30653deb48f2a00fad4dda234fab52558c6e9471e9a3e0e19363d3fc4b55883a046ce5bebdd04165357622a4be1c0f8a6a098a673b8348b04f57101b942cde9b415dbe9a53f2a5fc9440a17e943ee0326d37d7bcb8e78de21c9a766163ce434e324f39ceb77e1fd7d465ec8f9436be23343d8171c2c2fd1aa1db2b5364ebfc8e9794d7def75ece29247b748d4932c34af5deab05120cc15c2c07f336cc2304ece900b662a843a093bce6165a6dc1eabe3dd9cfd89b5df3bc2b4476da102b28ce5870b4cc5da56e0625272dc59248ca23c0d214b23924bf52a5c049609a3d8a76b165178b7a28f693c2d25bf0516b77fcba8fa5066d90ce36f91a4117e824b8ae2c00c07fac39f1860a8ce4728262bcefc9478708ac56fbce701752f8d2b1b86266120a60a026344a39a149eb8425ab5aa713392ac350299f749834c83f43b03c1b8a6cca42423e596f47b235555150368512762505e2fd895df3ae3ecc9b10678c63be2400bd5183a4482ea11062a38e31c35184f941d3340b686d0c1f454af5bec22808bfede6643b6324e9b24bd3819498e7afddb1d9ee0e54ef739a109c20730e53a30cc340678c402b30ae65f713606b11cc19866ba363e02f447cb50269765323e4e11d5acab8869fc83195f44d9e3f25d3d850816cfbc0c2f8d61c53b337e8536eca9d128c10e86787a4a2b5a542bd3946627759d8e6e24d79bbcb0c52b1852ee6e9871ae05e650e52b86785768935dc3a090b6ea7c05807eed7307319b8d6ae30936a1057aa4489268e32e9c9dde148179b1096ef65d98e77d31bd5a31e2f33e56367185ed216a525e093d39bd55b4b98c65c523e536828aecfafe94e2b138ad46c63915fbf4184d29c8a985216ee2a66e3ff5d2a2b78d1905c789a38c88bd58278656b29baad318a56c83cce39f6e64644e2cb783870a7d631a26f816895fa714d12828ba765ccabdc32c2631c12bd71077b8c3355a2e9fdd834bde2a6d3a715565ec4308c615a76c97715d17de8aaa1f530fb6d1dd73388dd127ff660125369ce5d43d9705a1bd3c353e9074bb259ea89a85d7d4a1088e7d8c6aae24add459a2768b71ac0ef6b4ea90923635a8a6c278cf33a2da3f0f5c6f4acfab5d94cb1080b588ebb8f0025671f912d5954f3f5af9ff395ef3ed1ee8a9f005dfbf2badde64b18f76c47f770512bb76a43719756e7756ea23141e92e5d9733411539bf9ed2091d97a02e86025c61635efde32d7f7a6b57a757fc69bdc8a2ff483b772f94e4ed19b8b090960e3ea13c2cafffe9673107a16ddd183235b3497e77b4c84aea236bdcf0b9cff4b + +# 16-bytes truncated at the end of the signature +Params = SHA2-512_W16_H10 +Msg = 39324feb180aca683d995db187a075a910d0 +PublicKey = 04000004c6f1c4a0ec9da6b8dec50a8f2257076771f62a1d425d5de0d02cc74db052973e388ac5b7609960ebf06dbd7354ad549e2e926cf5142c8054aae28ce3a84934730c54894ecdc72cd8d94f02376e47fdfe399339ed29ef21a881fe52571c2a1878c5b89f67d59e48b44ee2f1d2e67af73f7d733148d3ed9808db53151c08098808 +InvalidSignature = 00000000000000c0df5786b75efda083b9dd7e2e6679d9a692fc9ddd9df1449a92b51183c9983a0062d6c0aa75e3ef4e3ab419ae836999bcf760af96d2a6ed76526472304af6b1aea28f99a669d6d2a5a056366fd64653aa594f43dd455145dca520aef953cef40f48e0fc0200f2b16f595d12f0c634b3d9cd19fc4130386bcb65ec364cad9eb1caccccde41d6dc833c938a0ee7739aebaa2e61b51f830399616c041904c4fbfc9a8a0c05f462cf1777a42847934f29a56322592982304333a9e5844b4b9329e1803e0e621fc00ad87773ee299092c427362d7bcbfd8ff2661d1188223d180b7f623fa860bf4615737319e44120fc73ae6165c09223f38465cd8b806014e652a6029c079af6201591fe6083ce5016f017276b07e2dcc73ab850c7eacbb7f6242d843f4dc792c04d9a9b78d01208445e058d687937bbfb68103115e6fc30de23cd4796d150ad5c641330ca01d2e21e43876eb6cc93d13986e7ca06bf41dffdf641daaf18a8d82e9f3d64ce239689c5b65c9287054a2c09c02300bfe0e457df33223104d8f4d4ebc78a217aff34515cf383f490af54b5b2e1a8dfd6bcc13f73232e208d7f31b27c0fd80500f4afa796a07974b05601dec5884816c198692ade50678678297f308f68952961cdd05f8383e14d2106dab433e10e2262bb5da8883be45150f08cbf22985e5f0f4af32618833e83ad3bad6127447a907595e910295cf0a18a9e621a9e8d2a9cebf833b1545e88341fe8ae69a251d97c93105770d1df5feb1a22a3d5814738e984f1738ecb6671128541d57b4abf7ea288300b6e3877ede053e56d020cbe3630b960ee6431d990376c9ab52dcfccb9e41d589b7e1f0ed33c23bb04f093994a5e854351f13343ece396ee5c47bbba29827a4cca9d534c82adfe44f16c0ccf252b7678b30b5580f238c94b38388d82a32eb6642c90b6a80596dc789ecc616b45beb99768ea8f921cbdbe65151ba6d45f8d47cf035aee3fc405c73d4349d7003fc1be1e8cbaf3d989488a9d26f3c338afaca5b69e8b69dbc02240a040186446e99bcdab020940cdb26582289173f783332b91af818c0a894b44582b3df078315137ead02faa0bbf58f59574816acf9fa8d8c3692badf2a792b26e1480c9f88472a793a61d8ae13e6be27114224f08c42633b146c09dab1906e7fe1758ff70c9abb6d3829ffebfcd2aac39c0165546660113a76b2926db58ab7b0c60dc62404003e809ab9c0ec98338d520334310ef5cd90770dbdab6bd3992360ed82f77208a325e48edb9f0fbe384a67d0aa90711a40413f6406378332be5d3b1f4961be34e9a1c0e8acd9d3da5e3f8d16d5259bfb6a3a64c81caf09af84a93aeadf7ff811129af03e91036e25efc493d0dfc475ede2ff0af7d881d15c0c946a784a366f79a0f6ce84b81094d7c9c91edd95c427e154667b199baa75c2c4fb20a870978071b10c1f2bbb363dad6cf85a0a7fe744c45f0f48f41f7383773c5db11a8098a09788e1a6d44380b067cbfa6c97a13d222c26858db57704b3e835312f9d73256e4382d4afa4b057fb4b633abde992482ab668c93218ad158de54c988d42ce14439496a76ae85d6937aba5d2227153e57b455bde7763b5937eff31cad5495420d873c654b9fe53b4fd4dac88d8f28aeb37d026c826051a6fb09347ef1e77d45e9c5b4ba7a3d4287de414b64c362007984cb12e86daec949d80ec759c704d538d4104197cfc90181bf9bbe1febca4c5ec6924356a9ab08bed86c79fa2cd2a1af25778dafa4c3ecfefdcf9b853d5d932395041af43274b7b588a76c4b4d0281f4fce84a765a0e6cddf19aac246fef7d9f05b068800e1cdb7e56fb247a41d7e6eae8629cdb60bb90db107b0a5bba92991acaf174a886f9db445793aea458a9771eebcc095a2c103b87a28b4674ac7f918f25811c0744a94cbfe25d17925b46c9d03a41bcfebc108536e04c5c5a4a6e0f62fa46a58e3188babb0fbc1816356860840b907e86be1c8507ae49534c738c3edf0fd733a17cfa10c33a2c1ac96515c327fba89d6df90116830bc639f0a6220482c4f8a8526cd5894eebb60dfd8946ef2312ce7473f6960af8e44928d8a93a55e86e90991baf25a2245cf7adbf092393f64470807da6cf190b53c03e34e07d0e61a8257a4bec169db7b527d30ed28e763724c43488d0e7fbc0c1ebab8a1a978d959bdebe6edefb5a329f1e83b75186377711d2c4d1d5facabe282f4e52a450c8fd82d9f17407275299c82d7d7eba00f81f4234c252ec53c20039789601d7d793774484ba847c383e31997c658e35df746f09f6be1742c6eb248c310a292167b025c57179c629aa2218308d53c4c6f3996eadca5af50b875022bfcf4cf5a39aca5f70e94ac917fe2e06fb7b2f8e615986aaa63fa7a5707ca4bbca076746a3ed7bc83d4dd38b1560ad79103939b946e946dc2c5f4d1a5c446b17086d3dc2c4208f101b3a1d54ce425c18a47e358107a92d47f2658ca08efc5b14b5082ff64c9a6ad2122ffb7294b07de4fbedf0ae9fcc91ccd3faf58b19fb65dbd9c99a013c066ca4d2454261aa689fb629cfa15eaadf1326ea10f848d47a62c6ce13ec4f3bb74cee950c50840f140dd3783e3832402e323d262735c64b9791000546cea6baf5f48d48205fe1884966674fd0f50f3181b4b7d554ef549cc3c0213efa0032190baebb354bb0efef23e93df84a0766d780a9d3427fe89a5eb97c2dc897d53c2c42b2b2382468011ac3eabba6abe615da76ffbf5f9f6e8d79b4ebefe2e0dc0d98886b0a4bbe0a4f423eba75196e2c0f865f243ed2dd354f6decc61085ebd85590573950cfdc05c4fb4e65725f7a3127f06cf11d18c845b469ff8f8fb3ccb77b64ff153e4877248c938c241758b5ebd137dfa5da9704a1c68f46401ea02911b26faf1a705539cc93bb7dfb700e651f531e1a885997d8f7b3eab0f1f1061afa1c9707f3942201884965061ed0e496c6b3e88b4ee1f94eab798fd956187d9b16e4b7652dc073e96c3e21790cc2bc4b931bf2cd1be8aaadd9b87cd1a408fb6bae152f217f949abf1834b75fd266741385f5b7d4f39a157f90f68a1182411f99afb12b2c01605f7b77bdd2b1461eeb887a43ee25f00903ef0fbbdce566e2342c73aaea57c7d535b712f26d854af896453ad2203e3710d4153f9495e7cca2c74669b4c65acb80f3c21c3343dec6c33cf9f200ee0f516893d609ecc2356dd27bda41282451a10b211cc6e0df885bc122a8bb89695363498928473436e2a3327d00ccb9ccb3a341254d6819fee74c28643042db58e2b8dec613171c3df6bc3cf99ba1fa5447eb1952cf26c2429ad5f619181af5e45e3c1c38c65546087ddf08c7dd17c2152af18f3d8703637cdb275a444c3eebe632ed7d8eeb913c2f9bafc7163c74b3b3d400ef4273b6831c1b9a862f0e2ad839cf5f2af4b5b49bdbd245b5063b1a85717c6c0702d56d8acb19cf6601678ee5656510b4c9e9ef2a1865fb9b077fd46bb0e7e105cc99c964487cc88cf90b90b9c2f291ed7f9c111e5e53d8f359ee590e66ae84eba25b7f07253df37adbffeb4bcc9fb58a18b4ad0cbdc081d6ce76f031ca3818652a520f6da4b354d1bc339b48a5239ba26efa3299f39ea5e120118484524d504fea423662aaf94e4dad556d84b8e83723e263b0e79ee788d396b5a82ab190255ed91a6081953728629cd193fc1f0f873634ab0fb4e399d0c22a358af7b7718a450ac0871cc013e60b4741eef19ff2663a3d9286c31f1e7a9ce2e4a56e6cbc6b97a2ff0fc3f35df4cd0221871d0e81bf1987cebc98ac5d24ee3b594931f8c9078495713287e0317615cbcd7de0409500fc9137cae3ed1c4f2d29b94f786f7227cf93064a4adddb0714b760839b0516d5e4e2bdb7be5226e5006da9a50b534ce26b20b990937c355f7c88ce878be4162c7efd9fee223417266324176a935ddf9389aa50aa286be9427fa72e7cad49fd2b9396d94b90dc1ea6334349a3e63c1e2b3543373b4ac1613d69b1209a1cd0fdd7e4a83231f6c047ddbe016e3736d44e44939f97b80b24db21a3836d2d024bbb169396cb72bc718246dd9015a9be6c0d5b69b4b2858c91dfe0223820419d16c38e4cc6db1617ac3dd8006162f7d32f667edee86017e08841084ba2d0c16537c1f1b91120d33e69842863670d95ebc411d6c4acf939742e4a1b40f75fada79cf3e2ba2fca020599d3dfa38393e0e5d203fac4460111348acb20ec49e881e75fdf9d4d136a265e85031b660a0ac32feb940a2a9f31899371fe410d03b15fb1cf3c033ffee1aab995feb1f65d89f63dc368b10abf94971f9e5a09ad8aa313ff4446e61daa5544bd035af8a74f4e537b99c2a999fda2cfc6ec2acf7b3a30babd21efda80f507d82d207e1c7dadcb480e6b1d3da782ac4d937abdc7e8ac664ed439ac0ae32ad263f2d323ffa40fded187798361f91c5de3a82bd6a15a58bb6f8d2505f6451b3b7983e16796878c440334333e3e4bc2752cbb9d1ff25a2178fba2c9c350f807ce1662ed76ce432153c2124d65e4e24480008dc164b5d443488374db25a105c1ce0bc774e4e90e11a21d2d0ee8d602cc1d24a47ebb275c1f1a7e2af74fac36f314de810e3514aa55daf1ca33c5c16c0109c89a8d5c08b1bd0d33e14b6a6b7969c4f4d51a8a8c56cfec45c0e41e8aad9c5f1764b2835114be4a84c52d2bb4d44e1707f53fa1a32658206af10879cc087be2e6807041172ffdfd36d9d65130a7346ca524f522f2393bb4d1622f5f411ac4d6a51078db127c8e7a1e4dfa5e71744462d53f24997206d9e3fc7dd3b7ab5087f80ce43438bed21665608d80e7f3ddfe8070b9edf9aa579eb2abcfee3ce50b75d4ae1a9405356fe847a8e7a533cab88805014ed0e0ab23cea6d210caaecc67f8773de52761454b5b809f0c2d4c9a6a42ee8a7b89e882289978b420e1501b62aa14b38605d469b96dd5190e0ebc040acf98fcf99097b6eb63c7db6286119ff972103baa871243cfe6f1af078e83d098db54fbbe591332a0bcdbce93dc5fa43761cc2ff58df0faf06e05a77ac179576f19584f8302c6d46376600ec95ffc1ba250256f47d0398865d2b35ddd426369a2bd7847490cdbb7283e6f005a437b1c94cf621bda720e2a1186231614838ed9b8c8004260d903b38d5a9171a75ae1791a20cb74c151f199f9b26438856e26c596c3255062649aead524854d3329e59cb4dda727e7e7de528cd45c2fb6865a2e520541002fe7a13c07b57926ebdfc1105d2e7b9b34451d3030b340db7b894d56afc04e5bbff89d1e5df0c85db8c58063c8cbefa79c19a1004763d14a87e7eb53d4973ae3d3b666980e1d1a394ae80183b82db3b8a7eb3aef13a47fc2c00f2848ba71fb8593048f00417a3edbd9993bc1be70ba95679e942178fd04f4e35ec407811f328468564e62a4dd36389c8d51d3f1d325d5a1ad42eb1296daba99bd8a011d6d421cd43901ab6cf4378bc433aee88d2a646a914bdacb343ec552327a333b319ae526224c35d430b1de7380f4b79a1c8d8df3bc58a6669792d341aa065fe44c56533ff8de6dfc543ae0e7b968d81bb667eab77708717597c5e672216126c1dabf0928763f92fcfb437d3c3d84d58bdec1de6ee54267e94e2888f95e1da82a4ab03595ffb8954719104b1b77667a73c60c4f053e2a1e91663888c8d7d888e2ac924334b6390e4e2b46cf5d021126c9f5346b8d7fd90e097c9620d6d883846247665d67fa42a0ec32d7a1b2bc2dd3cc005d754118d0c904cdd21a8329c588c43749589e333aecc84e3aeb5b1ad1bd0aa1dcd62fb909ceab2d2b537c1a86231e1e442c3d245d98ed6c8a0ef67f682418480882b4aca46f62cd7253a02ec620da88d4029acdffd00969de852306b3fa9f13e8b60d14b0ffa4eda019e94310603f39b8b511c02006aff618549413a2def9a7f14624b9ce5d8222219f04872d34408008536694dd600b1d7eb471297565086d485a8747affa7e3db4472911932c82836a311554ab11e475aaee390ee06643455254a313d21d93353c28429655da2da97d2001621ac5aee44751d85be1b03be85bf96bf8c51e789d65a0fb3bde01a74f851a9d982c4df360a4962867fcb3e38e1ab39dcc7f286912dd0659ce7542d5a371b96fb8a14086daebff0365740576742609a207cac1642eb81044e0e795b2ab27c4c6b12d8188f1cb71476aa13d645a0049b0118e00af7bbf532d6d4fd77be6ac32d33a6cbb1f7ab5dae87dabe60e13527cb907e8c94e82940dcb8c51498abc5c9ad9d7dbd371bdfa1fe16fa3b59ae87e0337bd58807e935b21d9a5c359514cb4927a61fd6e53a96920012fedcf54863dca7b5f4a21973e95371beba0c04821bc1582df24404bd890d5d9b4fa1d75e569164d6923b34c400882653cfa04686d86eef23307dc6820efdd7fa1b516fcccf5f39fe653a902bc29e897f2177499fd5104da5f191872d4f9d67c7f2dde632e1703d4710757a04b4b66ebbae71fb698ff31ea470ee4f08e739f25f950d4ec788c898b01e8ab3cca06f1c88954f46f8b03c73c00877846134374f1feec122217b6cfe249d37509d98532dbfc8efd7c0e59713254182a7e91a7e54f82fcabf3a7f57bc2005c316897b42f444adec7b8b5cb328e24a2e5af4460f8f2e63ed071353672d9d3447fc24a665778b24560b11f3836491d3ca59d5f128762e60390478dc8efeb0adf070be2ce00036af5f107388372866ca133c9f043411dc6adcd50d82db736a963b5b1e325a907c785c874f3943fabcf083143c5b45e41e237db1ebac9f692ea796440526c1017b8872e0f707defa236b3b85b156ea03c4ac67d5d31b07e6ec8357b381dcd72e073d2dc6f5c243e76ff6dd39c2970b651320430ba1f0cdca344337f1f5adb8b662b09c9137ab117b02337637823a28c7b98be1c49480fc940936ea2c45c14c6c42d755a26b630e911b0708a0349389bf78c107961eced7ceecf6634d89dd87de1990cd9e9f6ac54796f434685aee4e23529809a226937233a88f9a794cb6ab9ff1e0a2eedb788bb1d2be90223d9a1c9282e322281ee4571c01811ca5f719eca414ce681da416ad7e4eef39ffdfbb00a8ddacd47112ad498e366c79dc1588401635c10e9fc33b06c536066407d978ae893bf7145896bfb375dd9eb9ba470153af55fe9069bb62f2dc1af9e06d1cf408f1a0e867589e31226c31a923555bb30b3d1acae70bb64ebd52500210c0a8971d178452a192957bc44f7266e2bb06dc25372a0e56c388d948376e577916cc5372f3b51c6638475e68f8699f42fe1425f41f4a384a351fb01978479965f1a9337652fa683c5d50cb8887a999e6f2fef0f2f4b2d4ac2aa2bcdce39a40695f984bb3873c92a81e3cb45c2f0f2b23d04b85ee2084178a529f52436bfaae97a106d46ef2c1f8d0fd3652111ad1fe32d851bfaad5fc00ae9ac2f497a12189903349cb9ccb85611ecf3280abd5b9b89dba7734a99a01414294350c170b839c4025e221cd1a3411da7665d7056d4d76afb1c66faa9a5cb454fe4737d878c4b074bdcd1cf21c156dda35bd82860ce184d13f366ca6b63d5db3138b2f016e7bc68a7cefb1dc5476a8a7182f6032518f256abc3770d30bf5534cb21d2131e175be8ebbe3c41bcfdc8623cba60c0e365a9015f3a8921a328e3c632961625379cbc3e5bef77638b24284c0776b10793e25ad80292d91c09fc7e09a46659b767eef51fb5e244e44f873d256c911e51be0214638247cd365986711852c1104f2b535cbe0a98c4a15e13ac3e1fb85f0d65e8e9f2344a9e7da048833a872b2b2b0204c11b9658181c2922114adb14f5596a3e1ed236ad5b768eb800fec9233cae252950109e69287c6abaa5e6c436346071bb022a18f12123a287162618389fbd2fd744aac2c70a28e48e7176bf8ae9f197728b4c02730d261b88e85193d5fc1185c4acd2a68a1051747f09e50a4eee41c2a91e438801147838467be6226783507d04484a1ce270974e5a5b01d87dfcdde7c33b709cc29d972def7ddf1ef09d78ba661866b018fd94828dbe73c99fad9379f77a5b0ab6a2f5f7d2e0c8d22ca5397966e4c4ed919c34823cf2d48c233358d6f62ea39639e6248b29000e65148d51a25270688a49bfe81d4ef49dd31223c8654b23f252aa7e5955b9d873fc3e4d44f5fc9fd54dca7d076ed162494ea5f5e2844116fa282e45b23b5e19a123a18af26e9b868592e4f883aa808f10f45e606809282be0c9c5967cf5a9bb73861bc7c03f5783758d78e1376348dd4b1117572b035c554f62a7596ada2c618228fae88e0a02247328c17b7cfb155ea43945df38ef01b9f71d9dd8c77f79a3eb7de2fe495fe34adc87b6a8a05394097f3d546b0f35ddae9bc1f9a00b03c31294882e5e95b1fb59009a19c4c8a2694d64909358b63c0967e81495f959f5a750368800aa37f3ec356975d70807ec914ecc3faa918b409b9f23aca1b626bd87c14ae420960f109831e5252c4747b676c1fe911cdbcff2c99264e27945f35d9b025c19323b055090ff73415d685009c4f9168b357d5d0d84be70663cdaaadb3b080a06f8444cd903fc03ae9f31d736d37c9fc659c6bdba5f9e067bf51b5b0446a55412003a0976c8e55e7f2bca46fcd432752fb22a9ca57a9d1d0d1c01aa54df2caecad322ad3558babbc7f83586f026cb0d2c2caaa4f30131e0c1cd86d16bfc7adaac5a5518d62279e96088205cb1754fa782e261c810161e762e80fd6b739140c1e7d17f5a1d99557c2a57422a70eef93e18e7e0077c9a62db9841aa43b8125802df17618b5725bc22c9014ccd180b6f12cf81e6eacf14b718c1c54196c25d0e9355a2bb7d8cbb5f3fd59ea85c58b7b2e3336dd3828e1320ddf1c0b8cecbbb7765714fb585f789c656302e23c0be9e6bd95a3e9c2d572374183b04a718be98117c48865d702736434fc9880f82bb8741066c0524ce5cdd6ce98670e6964e0ca74428c9461b8b06a87fecb4ed5117d02b2464495223fff1e3f15ff8a060a38f68980b88bef37abd1fb52e1bf1f62e98f00bd9f8c82305db6d8c53545d99d664514343718e859ed690b5953a1471778867dc39390343a1ea7b404f59c52a5100c3a656152abd3cf5c9c7847c73f107c76101ba73ddeae3db5f8adaebcbd75717ebf4a23584324537f7ca90154a7ff16ad08f43b9628a7533ffb8dc46cd9c54488310062f4a2cdfe21bf6e2384264a0767cd9afdf5fdf100aff043f80fc947599de8d260cc63191b2b23d8c31aefc0e54a737fee01c14287687e6411dfe33f05509f8609ada563124bbf2366af0994a2330ae0e43b79f4acfe34c0047eaa9852f31ca33623ff88a741f8279b1526a7d74eb5231a7da41195be627c1d742eac564bdfddaf1937d8d9055025582a4d50938996a755235ca54db2e6ded8251f5f3b0019868ed40ad94ebd6f79d7bef0c4eb1397d9f13f151d2eb381c8b283575f005fc954fa4fc98581389b1003c7ac0fcf3528ca2930afbc62a4a9379a2b78e1eafa856cb1c79bea862cd694a84e9f705bda7b0272352fb9c0654376fa74e15b761a126c26c25c8263ca5547d6ceb3eb1e3ea2a1caad9dbf375a268d35690333558f560ee4247c0fa74eaf2fdb13558457c98a975e9b59108efef9b73572198b04333608c39e2ab9d91c0dcf77a48c2bad7f81498492f4095e2d081f01d2e1d3460d5dee28dca7e5c8a8657405a529c1a3dcdc41e32dfef9aafe452150b3c65a4cab886dfdab954409ae0995c6720684df12d2f9839d77a2a63d03e43573dd707fa557a49c4c69ad2a10351b8486af52ddc8976c2529b6460b935e1cf500537a7fabb7803bc458633590c007fd0450c75433c08f5c883f87ea531fe04a2c7cc198e5a5babf79251e283b5531d49ac19ffd858351384c00e09cb1700ae9efc6a75ca84238b1a7a01ceca21f4794393a699dcad05939d2b9d7fdcb709df662f62fda282611daf27b8647d788a75fa799c5d3c59908b6b7866409ac6ad90d1e00b170f8e3538d593828d78d8e53b6f1f2f85343cdb82276e4eaf4178461c442a05af5623d887d53ea78340d0a41c036cccc3fd0613f48ca07afddcbb5d464b85ca5b3abd6353ddb93ec1983371bec700f9f8f8b39f7a23f0d3a0fa53657f4b36313fc9fd90e1e7cf70231e6651a1eeb6a17b2006e108996e79a72e9c0ae7b291aac85613491d3de568974a3562aadc3837a2ba7a71a4f7e7f77098afbbd25de4efec2e8f532dee6f67cf6d7929c8516d0c15cdcd3258f4676866804a3b71b62ad9c5b787f505309682fe07727afa4c0e12d79fb48c5dfb876fb56634aef00cc1cb18e2419e9cf62dbd238b6c58734ff57a0ab93c6568f7b20214875f4aadf9db20f6997d2d3cc644ccb326ffad1e37671dcd6c3a8a90337261692443bef3a9791ee242b0dfd90e9a8b709c3c4200e857fafb8b767b8fc0aa9094e5ff52b6a094a802f4bfcb8727b52ea59ed3c9fa24cd8deaa21d5383ec41041842e1b57733d50550c69e44ed42a571e6efda26c4df48db280b3c372e6af0af0d8ee6cd8ed1de7855fa16ba18c58c0a2a35da02c7cd6bf4088b00cdd33e97d81bf9369e882cb9d9dcfc9c810d6ea80b347a3f9a4ad0b3dcafbdc3e2072e21eb019c08c954a9aa6a83838e277e9150cd0b683c66fa6d8af41e79245554bd28adfb4ff2204705344cb1e43bff8e3e5332e6d21fc73b86ea5e755c282b0e9e69aab6644d5b154c41112754c9f92d802edb36cdc82ff5dcc1c9ca830377b1762e53e2c2dd3e8b7d52f66a9c06b80b567281401bb02bae6b38414c8c050541784a9d9098900b6e624d0e55869a5a4a1fee8af088e462b28ccb644ab8f200f54b2126741c02ed11fbca7863ee5d5b225f5d712ea42e3bead7f82eb6279f395c4f6cbd2c363cf5944d72483088784aa9bfbe696f3954d3a3bb8ee94a0082f7e95c5f96534e07d5e029d97d3ac2d9059be913c7acf86a60b344106865514d93ce18b9c8c70ce61e0a23ab3a1a9e599826748fac49eee3849385d3cb1b55a50dcc90ddbbebce800b710ed07f3bf18c9c7de9e4cf503763a284b10d111f223efcb629d0f15fbeed75e5d82f4ffeb749c4e729a5687f6699b98bff1d6b401524a515a0a08db1315ca4d7ad50eea2e85047ac510930885858735d69fd2726a8cd7a4382cc1b0c197ee9638d8e3e7c8d8dec2649dcfcb1709fc31a43abb0deeae416ad79bc81f92aecd373a66963b959859d9d68add61a94ab9cfe69fb3a77fee9d3761a281fbd26d99e900d71be6e24b32df5abcfa2c6061dac5a36e140f3ed2078019202cbf55737530eb1b901749e8a0059d2c3fc2ee43590052862b943718aec0f9e320d61e9c575d8fb842f9ff703fc113e14471e91631f9b28553425d08b715ad0de30336c13312c2be4c57db09a7bfeba69bbb2f8d7f0fb1ad5127f28daa09a6607a6fc32c348fb7a62970661f2d7dfd08787ac2e94359a05c3a10e9d7e3c7e860c4f3a6b1a856d404b32e45a97b50633a179de6c282fbf378e0d28eb8af6b6c9df1a2fc598526cc17e65a1c8fce1768ca818f0a76b01178c23e28b154caaa14f67093a709ee4a3552506f0cea326a02e9de04aa0aa8459278f51818fd833e81908b52ff0c9ca51650f0c7031e85791eefc3963cc33e51d3b4f2eb612df5e805e127a97e9dba7599266dc2fdcaf248cbb6cbaf1e2f1ea5b938cea82694494da297b75bf134782e47d5f30ea1fa2ede1247bf10f15d8cda3564ee0702bff99f63e4df90156c9ea355927e9c955bb0f0dc36df031a37309d3c53bb1c921c1762de6e5f4d69edf9dbdb9d448a105a9175ab91a62359d25f2f336e0c2cfd645776a023a6d1cb68074a28aef88ff4b0b764e29d16c6f6ff67152eaa8a6281a875b108ede904e998afd9a0d714a7dd67aecd48c277e9273bee76f6ea2510b56dcf4443e75cdd3c5880e9bb7ae91bf821bef7fba1ba1989ab81e905848d0cdba38760b43d1f26d8cf25967cf14d0bdb678d29112cef63a68052c7a07701b63c229fee5e95dc7f829be47327503ddfa12e4454bf1a0365e9479951b5445480a3edd34b831f8559d6df8246b4c4cda9bdc1350267d77be3af3e6dbdd1816177cc46586d18bff669a144176f378284197cb6a055cc99b72ad56b087dd4c7d3396c0e67d88edb5f70f2ab5716594f2e375bf560b28ddc5a671f7d1e82136101bfc77fc2e7281b5f95b0419eda0ddf9409ae71be71ad2cc05d99ce8ff4e72ae4c263edfe38bf77096aa94d4a042d71a79ab4d0b1e28e7ce3ad2ea12a73c6ebc4d34688f41a698c1fcddc4de928c08c296a77c352528dccf63775b9d1c0fd0a0fb4ef7c960ee38842d20eea9eb7ec85cda3d1a390d1f3b20ca91956cb83d6722641511805523de7210af52ec39142a14c217ddc222b46412e45ce536e5a57923044a81127ad0245f8b4cc21e38db74c30d9f37b9ab121d31828374d28cf244f8daaa6e9438ce65eb02f959740bd4bf34fac6d1084a5786bf1dad36148d84d80e099d5aff0f8550e0127e887d00a03ed97b251e25593518fdb942e33ec0959a0718ec564f8eb0296aa4b6dc80298829c4bffc525b90cf45fb9ddd0035eee6448d58c78f84f9707f02254e719b61cce7423f90c92995c0845b5962532203ef6927f3e0931470b98ec685e67cfb8ef002c5438b0b5be7adf8c28bcb03808b23914df6f70d528fe54c4c78b71da022388a55075b4acdff3206e4f0da0387bc64e5d02dac894500f2ea2c794599763f45c12683499cd5494ec9e60030c58bd2931332abfee6f211 + +# 64-bytes truncated at the beginning of the signature +Params = SHA2-512_W16_H10 +Msg = 458f4d30f1bd34d306092e2de2924c259c3bf53de876188f3b1fc0b194ef548b3a60f874b7536d0b402b8520e98c8fb722f15c653d1b4fa63df8d891cda1e747f8ab9490b5f0b1b0e9df7f92ef172a5c449d4a10911d765b14221c70f8d7a1346b60e0ab8b6dd00d2792761b74746de071c27a83338b236f592b6ae75ff672848b34a3ca5b2783dad72e7029891c24fb77972bb4a7f0481547e8ba4ca62a0c8443acbe7d815f257ebc8d51e0dbbf1ecdb7e48e31e2ceef7cbca409da63bd3b +PublicKey = 040000045bb39f35e3d6eb179e794406aafa4263e48bab718d4611b4015916ef6d5dd8ed7077b47688f2681377a857851510fc3068211ec47530cdc8312bbfe8a79e703446f7062d2370674cd9c9693a1a5a3522a58d896ce1b8ab5cfd54f9fed660ae881c602767e4064c28654d310c246ac81be08d63d3fef18ce14f709f4bba4cd1c3 +InvalidSignature = 337dc76590697ccd0057117e8bc6f02fbd449d32489e62acd33b39db3a434966e56c6691e1153e5979d34c1c8721cfdb2063d0b7e1f8233d806e8f43b5ed85776eef2eecd39a9bb694788f56ec2fd76b76768d199175b1afca2461ec3f78e75a82041498c97751cbb17833b9d5c6585c02ad9740dbfa116d4a23ac3ac8c61558d07cda28d8ed384731132ada6edaec61dce4a49a95f9631d2c939884667c53a93dee86936917998a9cb6f53ff4c7a1961e6adacdcd5c0ced786763029bfe83f3ef331650f28a50a57a3212d46f3f5ea8cbb0a988a56df939759c57255e4f2333f4c1d520a3bc28d653fa17faf9620b43cf685974c7edcc1fd449253f05b72df6beaabfbe1d0768ec9054c06ad81a5fa970533357b4ff31cc09424a0a9f84769eac84e926b7c27c9e9529991426162c519b228da850455aaadffe0b9e0c39a979f04b5b7bab9f0bce9dbf29d3b21d88efa777055106dec99b151141476a3f25e31a6286e60452239454b79a587dfca7f90c58fae43cf70723b00b7d7be439a2030f928905ebc00e0fbb51ad359c6d15f4a234b4c03c67aaa0da80d5a5c92fcaa1ff400cfcc5f33dba605f18bdd4b24cc7487205ffc09f8824ced32fe1fbb322dff67e76be3adb07b948fb20f5d16743131587422f7b76faf9fbe334df3fdeaaab55c3c4a8e4a5be37447ac7f400fb447a3c41758829726da5e34cc95e1f68559c62e1253b41cdf2546a12855b9ff68a4aeb017bc509084e047a26c8cfafae5708ea22f7e899df8b1a65965a17aa5cab23f327fe19469ade3dab6fdbf9726f1b4962695bfe953c85f9df2ac95a8ed1afc11b735146e0be9a5edf0aebeee5bb9934ebe680a90e7faf0b67391cd05cfc8b2e101d515059f915932e8c378c1d0f1390e01b4548b0bdabe7962174dca5200da0e2285939baaa44f4066a722a2eb1ad2b20d07ac1cd1008b73303de77a3ca6ec4ebf6ba885fa73d9f4e35f6352293c99a3cb2977a2862027e3e591c21a94de6b54197cb3b89f860aefaac45a8cbe19dfd0867e0814db4b93385cf23451bc06c555ba8712409f8b27fadd998b2be7047fa7898e7b97510887feb9effea20e9afea0ffb4817d247b7c1a89db45962f0cc45f034a617e0fbb4bc757aaa2187a524b55299ef9dd478e9aac7753d1a1f8ebe3a5c5d63aa6294e19beae3599394dbeafadfc2e5273373fa9bf7c63b085ff0c0dffa2a5389991097543190f2db1ccd8070fef96319ac525b626b4bf71c94171691411e2e24446e9d34ad0edfd74c8389cc30214a991a8ca0e332f47994ade1574c61ec6a80d503798aa1be016e073517bc18de6de5990d3ef32823e5a3b855584825799a77fc4255d372f488423966f48d656cd48c5fd762b29217e871eed3626b7315bb5693bbe5cf392ac777153cc6e43a206b0c4056f8af3cec156f919479cffb871a5d3683294ec53185c381ce27a046db8c919977629a8baf4422df5a8fc8ee5ac543166bc90830031e087f1bafdeb28d5e61cef22ede425aa37b36e69f0620c10f59e43e418396c75c76f8fc45a446df885acf0b524f5eb8332f42f090f2eca44607817cff8c5e4a3f7dd2f76dd2d46ebb4fc53cdfd503f774e8787f2027ef52a9f61c2a452e056da63a1dafd1f5b811fa2c6c13b98ff1a2e33d1f98f518f5742ff7f1a55ceb6c1c7d88d75e2fed8803f57323afdac726cde3637678b1f07d306f69b563f632e666353f8eb30d262ef37128d508c1697809374da92700884f8998c2fdfce787ac43ea3ce1d104c176586895569e822acd4fd9aac446f07008ae484f3cf651f317b095ed53dfed390bacb9196abc2ca11f80159477689b37a3e2ab086121de585de54669e4c5538e28539dde74e13ee67e9683210bd214665d72c0a38ddb1e7d788e8f53494e980540be0d0e53810f988a4ee3e76040ea77a7a93a0005c03a3af7d9b5cef92cdeb695208b6a73868259d4a27ea99c5b979b8453fab9fb6433fa80b18c7ccb89b91d71688648d85417779b61d5069ab018e65748462aa99eb62f0738efed8f8f47657c911f9b7581760f57257ee6c3b594555981dde23a534abf3c9cdbb34e7528b9d110d9d380898ab8fd43fc273c6bee9f162369eb60cee21c14f0fb6a2834a2014ab1d7baf95a97a4b04352eb888699c2feb9bb208b638aeb7d87cce6935465669d2a6a4a7cb21ee4b2013b001077c2536a2d93f717ef17a4a4084172a73ad818bd0aed021c464e5926fef1c0f96f383ed8895a1d45b5067048ce2479af1b2c2f236e39a845055ff31384fc71abab1362d20442f12cd34e4b05d38160084d14f08dbd10ce2049cf92d5b0fd67cde9d3c6488754424315055f86310016427b9cd11f71187c84a4e228a93eac1082fc15c405e1ae2a9ebd9c194691c3b0af8203b34cd7d9def76bea31c3a6f0947263ca4281e86dfbfcc9d946dbe164b7961e1705bf5910a27777735ceb9d01a335d3ba21b6e9984d8c0ea62ee6b46f84407675702361b6fe7fcdcd559ec5be24c6d44dd95f64c690c5cb960b9e05a3757450ce3fac04fe3fa847be281b36b1f246c8280c75043df96e61b63c2346b664a691172cb9e6c81bd12d179993adba9e54e6a88f6a52474608483ee049b7a4aff9ce79e727bbf31087f53c3758289aef24e5a40ef7eee4ddd7a133a98064cf7b2c42af1101955164c7e15656dce6cf23090a2a0496f9d35410425193551dfab9857fc52c3cb30c4785d6fa6781bd4daac2895f9c925176dea1ec695fb546d612ff132e4e9371798973bd112a3ad2394a640adb1754f199659f78525742eba53bcaa706880f866a5eb8d4181eac8a5f604389b020ca8215233a84b586a0d05cb805b9350506a6a634a7d18e18bd46c0534b6f93e8d15e2212ffbb474fe732b3551dd8dcbfe1a4ad4b55acf4b66f1276d14136846dc2ab168c9e71ca3fae7562d6bb64bf5f9abdc0bcfcaa7cc636f214455094304aef06c9e770994f1752387204275ca1ddf7292d5c88818fe562c453e9570d13b6b131c9241967b96f7f7c07e5701b7678c8ad4421eed405d84992f4a5b59320710beed5656493357c74c85f332b196829ecc9561640adaa80cf63ed0b4614c9a79112c6ff1dffcc8540371fb7db87431ebffc81960301e7e52861878ff91eb2c7b3fbc584b76062bee2ba3f15b121ec210c9dc23dcde1b3154f2c1bbb360fb542ca27bbe401c2741309bb67616d70475c629f5896b2eb7c47cdbbe0f3f655d5cc386585a2317e3d9d8bcd9ef933bcf5b567f43b705fe0eb782d6fd12df2ac858754ca98c3424625c5fad8cb9159374f91b86b00751c5d468f5cdd238c6f0eeaff02e5ba08a969e95e7e219032d4fb4fb55e85e66d02d6501b52558e94f07a9397a049ee32cf6485bd8023c303e32b601365001309b5c915ee65b1863602a04f3c8f16cf079a3f9ce098b4e580c13fd9cebbb9855b3a95ab55c4bbcfecd52ef6e3b1ee32ea1f3085c0dfb4e2db2e55bd9093368fe4eccfce75d886a20d1796352b122f4a2893ebea1301f4ae7c1feb3e52a475f1c7abff7d1d3c2f93f31a50050d4ae22faa17e23fcf05ad51e07ab351bb36f16e59ccee445c02f2c533f5a8ed47e2d7f3d8ea438be1ecc8f85b7d900cfc73c24efe5584532b6f084b82e8cd27e170b4412e1b4659ded789adbf540809370a3f69506cb20860ddd473986e097c041061276495118a561e5f4433e4038150b8a883b5068dfc47d6770eaa1b3c676e55cd27c31d53927b7ba5997a09aea85b12a2ebf3210e4963573f091d27dffe6ca80ec9bd7a76c93d0af5200b236d9aed99dd5ceb5ffd7c0a456220126e574be8747e624e2268699c75e242020165c1f0eaf13993fc946f263b64d5f2c32f678bd87bfb3495595cc2f5d29f1a8b262ba67a54e605d17690263501f75ee0037dc27d991e99656a12b3b1647301ab42caa55c1156d169f3e86bfa9a4a585ba1a47285ef9c7facf7912efb082fe5ded7fa79f0d55b649b131d1a2ecd8d14bb36110f7dfd12e98c49d8af54cb8964c9b0940840860e931f92efca95793dce8908160f576e5965e0c0a3a26a7de738a21d33e374248ce8b688830f9fe24ae945be5917d3292cf0040b4b201758187aeabaf62b8a589dc1b1caef5657fc0900941287a9ec2287e5ef21f084a9b7a4a6dadef02aaf6a44a4c49562a99d7001e02e0f0a94a079035eed72267d47fa1fae6a01ed29b71458bf78d9a6b2d16a38d21788d66cd156f2366f65c72e3e98af014e5fed656eeaab499c5dd17e5623214462c768a5475413fdbbe4480fe097c9a5c98ef03ac4e2796e210c44673e001d50d4b6eef595988379f4cb166208c8d4a96ba32782a033676c7cb8472487ab712a8e95a2ddea02aee656bdba407d163ef94d608d065caa38783f154e880c6173a7e8bad0c4cc922048824777e297810f3223e12d58a8c1cd173591c51e89e800a0309e79618a1eb6e133a54a385881d1446fddc11d50f829cb6ac44830e3e1a32a19adbf3da914b967b3031d8363895b55ae96f27a691a3a3b581ba31d78fff30aea611c2858212b346dc060d9b48fff440268314803e0733e6da6fa388804f6200eb4b906536ecb06b91c52943c8d39a5ca21e49dd7934cc22c8e3ba3d2021c386597cd9cfbd98ce03b0f7e9462dd3382df7d7885e8a882585e90338266bd37befccf023a80e470dae59c7cb05167df66a7f18e7ad9f526413299ed0fba845d12e7c713295172877cee5c8c3a8f7dccc13e8aed7b5a651f4e07990dfb22b36a55fd70f3acbce3833c7fad10cd5ecfa5d1976629ea2af9392c0227bf79ee93a97b1a62ca5ab5becd12a261500ab9ad509dc85d603be8f83304467fb37040cf3126a58619f2923feab2e9763e2bf0702fa1602062398a12b2f0771fbc21903f0ca2a06e47eae6a482e96520f45f08620f12923d2d1a2ec6a03d0dd7bf0386a07473788c59afe9935734a08918cf99baf858e9efc726837bceeba99aa3f85e128b4e86b665e2037e7953ade885ef52ab30054a2beb5b2b2bd712d10461dbbb7c85f154884500dd75248e867b539199048c1cf070f3c5a6f9e0e6d620c9b82a6693ab7c7f2546e2cc733849e56b96ae07cbd9ff1c5f34c8ce0c1e573c34fa0fe134df4758f919ffbe186019b9317894e52f05028eaf72cd5b00595ed452823b105da41fba411e002041be9738169bec02fbf0872fd6759fb1e103d3ea1fd3b95bbb1f0d0c1f5813461de670fefb188d1b6427a6f71fe51282995fd0eec2203e56790b4f7b24161c91b20ad2aa4ad81c4415a285bd3cdb72ba7571ddc41f52edec69a4e2424fe0b912a1b036d2d5c25774988a70c4906a22aab6e1dee335c24a30bccc397ddb109f6a2afecb503e48b9f3d634b611c2cb2e9d9b6951cf5c358643d4c52351d4057a828cd0ee3e0b4ea167973e495c7bd8d026c1dd0b5a0a541636480bc17d87f4e0fa38b62f706b93eb08b53ad02e583a2feee4032119fa62d027188e51712acdf25274fa5421925fd57d06db061c347eebd5052296dee2ada0e94f016d8bb51d4b2b858141c563dfd65b120baa9331efc70012522530651bca6530fee63978e2cf17f6eb3e034a4a2d84d9d3ce48c2bac6c8d558879bb1bfadb95bd7d1e18361c7e5ade4e96add3bd2d80af07a9c192e14ee769555ea59980a3f5fc81e5a7276492babc636072d58118b031ccba0f47907ab318fcd84213c575205ca379ff9c069e9c2d744749dc8d1ea5eb48d456a2b80d4fb2e45b5e14b6e23aaa3390299bd96b1481998ded9dd8a793883298ff81a9e4c9db2517c4a26b6d5f5f2b82eb60e9be3005a2f264aa38cd6b371b8dc84875a2af76253149a5a99c2a7ba4d087052bc39798cf8314362bdf0da1e35a0c47a8d745822f0a8a1b65034adea3a4210b81ff5ba1e69e523bb8a42b4b239744a143b4f84d19130ece3a1de8dcc00db9c99d70be5419077e7f7d94419be137ba6b1992aceeebfb3f22dfa802c4f0a2feeaa084276a4b2e92793a3cd6d4cdcc81e8ebbfea80de8feac03051becf7c2429d32bdf4f4138eb3d2d25f44fbc5c4ad09c485f008200991baf8d71c77a91f4f0b16d24bfb006198cb6fa251f3ff81ea49d382b32d6378ce29d69ab6666fb18bb8feae485f5ca165551342327ae7b5e6225c0009f1eaa1ff52d0f569d869a12a857badd31c2e95664d37060272c2f99021b4ababb6e1d1819f7864439dfea6181515f917d7a36bf6bad24bf0022419028a5561f79ef9b6ad628883ad47afad06b74ac2117d6d6e9dc3f90a7f39b269a634c0fac54fa57c2858f82f6105d6c8a667f0cebce7e4daa9551c114946079ceabde02327b0dae4765bb85d36f68865b502e51a5d73f26cf93a989d793aa983bca22d85b66415fd4c47afdc00688ee8aa8ee8e7f6daf3e1333182df5e15fc92c6634beac5d379e105353abe95cd94b9dd78f8e9053a6f22c5eee753d9555d7f3ca9703104e0210f37b613faf14693f2a0a1b3421a3346a15925987b415700319871a1fbe3886264a4bbe26a0c8ce684baab298005811153fa43e31228592ab453393112ab70431b072ed3a879258894417e07dcf551b973a984ff58447d052f625616bdc68d2b3a74ced1569ca163a74ddc92b6a9cc0e56db5f3c68f2b168569ba00180dfa373205a168dd8e6186ee12a023939ca86a262b7ec4ca44092fb5c9547036d1fd5217778d1e18c46e38ca4794aa4200b34f195bbbd403604408f20f236b8bad7f5d3398b902c9d746e0e36a214c428ef08705c1c5c94ab8e53d95456eccb7b4df8b9861572c90afcf7ee08a1b18a06935dce20516e0d4c96122ebc7fed04cf0e38121a9c58d46492bf44a313a60dbde7ccbed3878b988e214c36acd5a1423d1cd17d8aeaf85701d422fe80d817696677f3e9c983015ffea16e7272b643067afefc80ecd47dd36330511f7e913fe6dc85b928771f9eb9537e66cb314483a95e20c18236355fa923604083e5cbf7ec4980cd4d45bce16371599fa07bc670068a07d850a41040175faf19712f6c3abb2936a8954e6fea6bb9524526bd40b38a89219f6d7f4256f50822896b979ce7942af93fbd9c68b6458471a24886f3c8a04120c9d822f96d37070fd5526307a411080d176710fd314b2857249b7e8ed647702098d32d106383873d0bf1a991bf7fd1259fbc42db23ead04577baa69f581aeaa0cda554863284f2d2f8c48b2fedff9cb6c5d664d023c2851e3e3b4dd57a6e157a3fd23a743dfb9fe8a98a14f9d015ae39dc94e595f9de7a307e146fdaaec07e6c015e8340d7f51b6868d91c95f706fc43357aad49fd9fd760d4f2d3cdf40277979581078712c3899d866329875a430ec3f1a404b6700c34b6a2f5c9a76c04f4a15b81c0627e52e7a25f5173a55e0d205bb202e17b7bd2707a95f2a2eb3af7cca45f34eb304e6fc861fd2546b0b2633c618c93a8c795ecbda77732599f22265210ebbbd9c1a5b3396007371a90466af10dcac9a63e6ffd64a79d6574726fda302c22d39c5f6bf906e754833678a4936b5c9538b08f51cc3c821bea7bbfb3cd7658d5695882e50af651c0804597cbee291df898788734929d3cb54cf932cac041adedbd380787b975113d8aa653e5002e3d7718047b93cb676ba415eb764eb60916bd1695463ea62cbe89a29a76c36d157305b5ce41d994e296d7a3c0fa5ffc3e25ebc96a8eea8f6c116d692a0714ae730d6a3643ff7c5e4bf6ae59615b9c639cfadbb042314188af5f023cfd8e1b1d11b4db7fea19018b5fb9948b14453f07d155905f72af38d47c46f50bba8d33869c27f15a3ed686f7c5eead632b2b4c6b18531d4a1cdf5421a5ffcdce3affcf98bb9ec1050b26ca4c25fed72bce0264fd9cb8c1907a7a9322c13e0c23542782c61463009a89cc18c9af3190778821b09295d162fe6f8d5fafa863dad6b2c3dce2704e011f77a2926d45b5d2ab5dbaf071137ae030856244565fbac03431af2486fc0de0423fe7c7bf815b644fa61205371527f2b9ff3898a7958b9f589adf19639a5ed498df42938a3a5233ea903f1d9f16caf0f0c56248ce591ccd408eea487abf6e3dea0e14ebeb316078f65ab5ac9233f1195ff3ee81535f32d46dcdc922111fb18d5db4f8e48906aba74a6dbda0729eab89aa2d1741417e7695f8b41d2364802d6ae85b5994e6b86cf1c3b0043e47d264657a784308944c7a12ad941f6a5610b77956504821a6a32e36a2a559855cc2a14c85d582e3f737a4966a9d11e6158a6d22ce0ada2af9258ef2f239086d4cf7d6a0aee93b0008e7e1f634eb0c887dad4fa2930a216feaf393a122ba4c59604270fe5dd6fd1bd52d032c17d47f9b3d615645217ba1dd793ea1ce26005ddce32c54a591929a3b5c87f937fae9a8ea24ee2bf4a4a28c1b106246641c50901ba552676e17222af71caa362b2eeaf344670bf8e2c9ecbd3e63fd141d57bae44a56aac385c064ef148b34dc953212f7053bcf145d2d99bd46d86db8c37adc4ebfe10ae362ee1bb52daab9d480ec70e5ed8238d82b7dcf67c3b4c6da6a6703c171610098bf7727799dc98f0dff00b12942cb6e002a4b636dcf536172379b62e56190639c02b5ea057301f64fe595801b1e3e7694cd1816a9d7054c94cd6ddd0378bf7e6400404b08c481c13147f4018af2b678c68524a4ab3aff2eafe3ee56b6f77079a3d2a989c3d2d3300ec253ac6d01a39912d422e06044e4963b105409969e9efe1a838d3189b133b0e3fdf087edd6be7a2ddb3fbbb15fbf2247cb69d8aeead1d2fd31c365b340df99d7529fc9de3dced79160b6f3e2b99b9b4833d1d5d0db62823bf274ca4162ce78be4cd055a2592611df11e815216c35464e3cba0283066a50385ce79dd4daf718b51fd0f7727171633dd899f32193f214f5ac4e0e344e7dadf6a88f8ef8c77e56039eabaadc163dbb3c4661072d8d76fca7896933a2a3caa7769c0436a066280f686fdd487f527e843836b096b07842171ac8847e05cdedbf1543979dab41f3b835ed2774c7b66fa0e85b66ea48e2b3859f8b7392e68faa282cd096c1cf4fa11d37876a17e6cc393a3964392066c416574fde7e26697f4c79a221cf0096272acf3c35ab0d131ad66a5fd61571508f4a568def5236c32990ae797b8a1baa340852bf6ef0dabca30457bc2ef2b0860b6c57b7516b393e244e3b386a574441c7dae74c46ac7de23f92d5d7e1c114a5aff9e5c1eed9ec4a85179f357203a270a5a8ec45ac69afb0087d2f1df9d6e0504c854e9daac88d34c2865bb5ad9f92eea783d5023e0391d6e3a4d9e353b615099baed36caf38f5d20aedd8581f924c9676081b173c8c2108b49a22a26b5687bea4377bc81344048d6579b103478446b80e9c301109835708900ca2269c75c553e550046aac3a631b06d7526cb3bf1b0d525516394ad190dbe8bdaa64562b928fed6967c1357fd4ef50bb138df23cc4af2d5440aaf1abee8368a72a3f81dc8e52d21cb9fb1d430508b870ce989bd6b881d61b5a5a639344e5e399fbc3d3ad2d289f3e7a073665719037db445c6f356aa78e260eeaf904ae2862315e634d38df4a99ed8173e55fbe1c002ec582291ea47cfbef7c6977b26f27bca606fb97697df51fcacdc56dd66df757241c001380c9ad33a898326b78bf69dd7a84c0603dac0e4c13597de85d4e4e8adb5f30a8e04496d8bc27289214d7919c5d3b3d65ab3e1176ee4ae7c876ebc50a93630d02a1ad99ca1249983769386f10754512d457ad3f2694cc44c4d6e5119cb5e9218c5c46d3010a52f9e046167e947620bee9d8e5842b59f0647fef3c386f6a66aeae5390bf68b494b99e803722948fe4594d3f6eba638ab2c882b1f8955e0652a6eb474d01f4374d1c1a0b93408b186cc4e06500e05a6433f9880f38e2e92b775ddedf09a36515b8cb20b5afe0afd1c5f14219203516c7bbb71eb28de27c34e48287c17cc5b2cb73801702c50b77ba3d9f598d33a299cc9a6a9ad5a6b56df34ce04bd858a13ee8a4df9efc44d4fb2f00ad3d339dcdc0f1e2d558c627bdf2f98993a63ca870793436a62a5fd848542f8a88a112ad5c1bf1224837df76443c764faf698ece6d95b3ec9cf720fe16cfe638ce13da7ddcee27f7590da56d41f956995250e921de607ec848cee53b566ed8a0c393e33a9e7bdc6e82308a833ec6c007a0e038098af02b8e152d66c351f3a1e1e9d822d7a3e08cfd1e3d2ff795aafc2c996f142cb246c27e9d33202b844ba24bf5d43c0449b7c1d2028c9225055a68e6c672abc07a0d8bc87cbf49f282fc92fda4509dc15e144a73d1696b746262ae492a3eb627efcee49a131c00f8736c78b0c012bf5bdf024acdde8f7995a2926e09a6937d1866608305c7b3916dd62ee791c905cca08235384d6a2f9dc08a288e34b258fb839b0f35f8389f8b8223f0185a490392c378341d6ff323124ce9588674b01c5b6973629002bb22beef27bebb67ad2fe92ac581d62273061594b70143ea00af9ed45d2845d70e6748550c258b86281750c16929edd44ee2d024151b51ed6531a186d5e81f44681fb05142694ca411895b935fab4a2f5c3443d53d126117e4102fe1625abac37d4035edfba23994aa72434f58dcdaba82d5f074a6a1fcaaac3a96411584ac189a2aa734f6deb09b3b11cc6b1a2f8a5943fdd7711155274d20981f207efc73e96b54897e29963e8790420ac6fab39e827605ffcd5368a00b6905bb9706fc6f936fc3610800e6149622e9d5b47c866afc9a46462404d890b938352fb8f56f6a8cc3ac91b2b2e55e3d86a8dbb7d888570d8e44ee090a3b29615bd1ccd63c81ae85247c70f8a09dc007ac02091c29521ea6b0e2fbe94f04a23000a0efd06e10632c6f87a92f7ce7f5f96827ef8955b22e7522d16f2f7359310f8ca6e6aeb9a5fc75c8c67f3a9cbd5192fff150eada6a9d2c9b75f897d19daa8ea79627ada0a23b7513f4e40f78448b8af073dd89284b1a8b9f2d30b00f437739eb28fe255df6fc9e085590515ec9112eef88ccf53352f15ab6aa2d6de2f41fcc1322230d50a2560339dce5f40a74f4cca7ea1288bddfa7de4b75c2dc8de8baf75e2f14eea64dc5ba28e1d42760e4d9242413ac12752663a5a278b046d651dcb0a1df1f100a22d624b3b38d0686733c052b797541d18860ce2028dea013c2384763de7b9de49dc4adb9ae1f12b3c395a8d5e05bc4226483fd548cea98013c419c4716fbdb89853264ab7d493c679b5605490a6350e7107eb6dd8b836bbf522436c50dc713259cf0dcb477e4964dc2a6785cb88b60e6d4720c92b4a05ecb16fe4ac34cc2b934af7d854ceb15f159acdd96b93746bc4a4aac6296cb3b861fa1c97b2aa531d26647be9dbf7db8d83b2826a07a291ddeca0dd2421ab6f32a090c99611dca7c15853b05e7ee8889d9b8d9e13f8b49d27f5b742aa0aed3dcc75d3a7cd54ffca10a33b4a1c0b05702a1ce7f953734edcf97afd4273c1e86394cb916a8f0977665981e5cab2444587894b21afb38f59adee62ff362505e7b56a9cc57b03e111520ec69843788e323be064caf0f0131d825869a01c17711c4678a6bec8a90a2f71249cc573231e4eec95aca6a872c010d9fbc9a9737293ab8a92e3f364660e878196db8c92716e52530c0ca64f4b40f4fb4470fcbfb9e5136b8f21f7dabfb6f784a548cf95a9ec583c985fc8c0b24e33ada091780a0f17a8a5c2bb35c523c73512ef0401b90ec5bd1bb0378e603e3c518b122f527ae14b5be12a459c7e3ed53f5ae026657ca277160ab838a500163ee492233be7f5079573e035b9758095357da31c35393a9415ec53f54165ad4b573b82676e7f21a1469b530f86310580423bd74dfe18a448b205ed790fe6cd9c3054e6e71ba4d00944d4b8bf78607ac0be6fc7e2f622e4ef3a3feca91cc850f14332fc0174f98fd920c24a402538b141304aa45ae4c7a4bbc7a34bbfeaf30183fe7482c309745e2e8ced8a9c66bd8d88f397f8e7a3c530ae373daec53be6237defcedae88c747acb772fa76a38299898eeaa020221e62c033df058c099d77e0eb6051bd60f1f6ef58775a1d171df901c501206c79c49aa866f660ea854e1b0ebbcda51c652829777e4b89749fe280c171a8e3d90b3cdd6d5baace1edc2731e15cc906995bf56e3f4b8a83176b2d63f13a5c20107a3c3acb3ba78fa0952ee3eef2afaa003c1e1fc2f04d44df1cef9eb3459d53bef0b8635f7b680be5cac976285bfe4782aa3e9bf270a2cbd15663b918a7c6f3940c56d35750bc4317eb85d4f8be13bf64015b5a7a2370b2ebcbec42d9b55f76f7ae9704ce5bcfb218987ea1ff4888876561e5c2f87c923996a63f49b076f34f92a4edc03df5bbb3785b3522f0e7e154f17bf070f8e67e048dcedf9eb93a7d2a61d61e87899720571e12bf2b7ccabcc9e2a05b51ae75cb837238275c354d84211539052775d41f212028f707c02a92bf91cb311bf3cdd78e65ad1a9630aa54acdadae284bf4f69467c6102ac56d878d6de1b81be1dfbb55d246731619547f83af9e537ea6e2594e27a4752f18376a3e26e9664118351a371c54725e37b3c26c76996a8128c924928389922ea4fe150939c2994ae9d12291cb96bfb1f240c3ce850c4d3b2984847c65c2f245d5af5fc47667187e446be13f887040738b9a6b179d804236fb3904d5e28782ba46dc43da7b2f5648ae8e6a1ea38024f45586ccc5150c10af8d3f6a8820bbd0bc6f1cf01762041a6d44e + +# 64-bytes truncated at the end of the signature +Params = SHA2-512_W16_H10 +Msg = ebcc54f09738db1c5a24e315a7280d4cd8c266ee1024d3b32851fc49b7ce05c2a43eca9bb7d584635eb2ed538d86d773f4bcb87a3df6f595bd1e5b4c8b03a70c7bdea8f441058b133dda4f409f099a9b68b6dfe96de5ac6869ad5aaa9cc8630201c8df17f75202ee3069e5f912a88e0539fb0b04d487949a1f5a4ae192e18c24f1fe24dce1ba1c00c3bcf703a547f336594f87d1d2ca98a9096d4da24725601b1752e7d7f1986d9ea7ebc4caf50169065d05997ea6dc1e6937c1d7aad19682b10b56f8ac4c148122f9e906ac21aa0c3237b41f362cd869e9d25216c466f4d2a885296bcae2f02ea3 +PublicKey = 040000044da2eadc44f6074409a26a94763a16c54a11fdaf30ac47c1034347bfe794faa66cc421c16b1812520afb172b46fe304ee0a24c046ac6c9cd55bc1f409d67784356c888e90faf52e030b0384ed42b9f865e0fbf4ce8bbce5f4b9453251fd63021516a2c37b2451c8cbdd9223e9b8a479ba0bba4fd98c7af4977411d1c5b8f242b +InvalidSignature = 00000000000000cdc66644e6b2036493a6b9862fd1dd831a7cbe89881595a290773cb3a9109fb2a3e48e64efd67fa76d87d78dbbf31cae1cea9aefe4a92fba0a3c85fb2ed695a6947948be330e635b575afed1f1c0663fbc4077ff11f96133cdadd0c1b2a56b2c7f4a638cd423c9df05177e5ec0ae3fce296214fe3167be8019722d28d47610e14ac37e817c619affedb45458be53ea98b0e9d0497d4f24238a6c14dc34b14150312e60c6adb86fec2b9f91a28bf5c113f415dff010168106d5bad820fb13a9605848abcc8e792d42be478b17a25df54c80752417cc585c23263a5a07d7b6d01309b57f6d1b84c01d9c92225ee51bd8fc302924ba9912722cc6c03745d9deb8a20f1d94d0cc2cb481ccdc5e14e7b8731662f9b436286c201c75d7475ecb6a3d5737f37a99a8f0f81c2bdc9a4a64980d4a7c6fcbf96177034a7e676c39eec70cb5cf68af0d06741b215ce5e42133a5fb4298478b49356a2370130c3a4805e568353fb8ffbce7b5bb8d26619181350fc14061b4aa3987121d88eb9cb7883be879409a7eb4d22b7dfcb7e8fff459191dff018b1a51edd7638ad30350bc7e3c53b0869c0b8a8e72cc4628f8a780d008b8d51ae1c8b6ecef9781a2dc18f3092d8ad8441443a5dc8be8b61821ce17ffcda9b1fa7ebb80fa387af05de0066ea7b89cc241493f44314decbf8e37de6e85d129f5f16bde1e652b4f9c83e08db4df42c63af0e99d3cae0a317a42438e470b9364bab1529a2e4244266215ece38c300f742d51801c1f916cf0bd25324d17cdcc624b88a269733f95c3e298c5b9dfcf8e52fe754b3fec1b962bf63d94010e3365158a03031bcda14f4510f6b9da67539e845410f054d7bcb27583971f6477914d1596a6ff69d57f32ba81579aae44447e4edd538d69a25ddff1645948e88f8bc5a2bb1ca7324de52c7c6834bb0b3e00e6e62451d00dc49658a54dc751244c9aeff57c64968b8cf469da169604739b82925802dbf242b26e6cada879cf05f822ffe0b275d9f9dae873fa8d47caccf9081d1a6124987bd646f0a595ffb2021606b4815f391b28f69d7aebef515cb4ec4a9938566c5e6daac2cee5b52d7712203238f5f2eeb1d6acbabe74341cae9789f23034e15bb55bf1af6064b01d328cb910650f1dff9c619eacea55dabc611c996ea80628d4bfd5da7af249348648c74f9332cf8254e4a392a4f5728a3476d26c0c85a699f02b7019dc4d3d7d07edc1d045b16c965e58fdb1a44b6b293917d09283985ec91eac80868c58c9190f9bad8f1cb71bcaf6d694878cc4599acb63cc7a8a3c0b899ca476a6e66b08ce3d6ad044494866136d15edbd457c510ff3279dd65c524e6338b386921d0cddb77fc295eeb76db626f91fb52b9f498e787eddae3e359120a31c9d8c0c7c2b110c9cc67ea361e8c8755bb4255b7f9b25fbb3f8b13a03a28a590987cd850a42558fb1f36a1c459a34815c14b25f2b18e543a6f87f9b68ceb11f68312ea345ec396dcfe7a856a3c0b9dd58021e8acc85dd87bc2cb599b698f933f10205f41288e751ac6914da8f5d8e623c403ab73f2fd454760050bc491de3cf1cd05f89d8ff1099d3a337e0b72593828bfaac912a3b3373233a64807e325e6993feec72525b58edd9fe19cf0c7db1ed0a9e01e00be38d6ee57dcfc76d5c79d5957a4e7cb0e7d5340e6b439e09ccbd3039e3e04cc650246c65fd4e8a11847098479035e37b0f7d56dec38b4e27094c20c4d8fe69753c7894c95c5e2e94a05fa08897e50ebf363f9ed388ac0448d610f7c328c109c674c4896fad2a2e908b601d56393bfb6f82d3300a8ce3fe3e8462afb6e28b14a33126461ec379161bf8d0c80c6859c640dd822837cdbbaa5bb9a12fa87bb1c5fe494062e7c4a774165968b00800e3c7d5dab5f509d4c2b5ba8dde9cae5c45ecf2f65c09ec03a4343d008c6207b424210d6e5e524edc8822050892e0723b401de0c9c96aa6e00028585b549733fcea2dbe53a29e9b05e7efcb0e0c4168248a1c8cc814e5fd5f089ad0f6ea42bd59da3715ed7bb3e359346df81ef27e22ac528c4f28517cffb218a746a63f725b2dd898534ff0619f34f563d5d0acfdb64087775a9548b7a92af8c440bf3f1620e05c0e922fd162ddb7ec2f7a3e3c00958a6c9446eef2efa39fca109e0542c7f4884337c2fd6f1519db0f1e6f55a3e3c0912ec95c95597968cd5cba15d37c1a515e5171df315f86dd7fce85b7095993455435cbf1b7859ed2f7ed00e1b7c51b03f694cc4385ead00f9866f4b5be6eaf89857061bce00e7c3d6cc4dcb819975723afa241e5c4ddcb1dc85f1a254541ed44c50bf18a3fcc5cced4bc118d9c8c16064bc75e2527350b5a387e8c7da3fba6eb2566c2aee9a6d0838dc25a471c827a0327718c4627c49dbaca0f758b0b55d65d45dbdc9f1357b5d7cd924d0b87d98a36309937bea0654de1f004b502e4215f64c7154605b1541640661436c1b322ea9c3a1dec3b071cf1777c83471459312eec907c25e8bb01dcfee7b5517799e9ba7045d71b751803355ed1312e36e8186293a64cbb6004f70420f61675921436fbc4daf8eece0553d1ff1657c8b1d7010b13451fa76f15041763a2ad5b03399166a195b6cde5dadefe4780c4166e19d5cf32fee12a931af0559e2d7b6568188eedf073f46c4ee305c362ab853680ab411e3712479c0f569305175aad6cb2d27bb23a4d7afe59779299a2de424b5404efa0d989c172f24414a1f4050d09c6adeba8391f434a9e5cb9e7673fbdac88842c80f975e3d0682d802880da43830091cdead07c8a229f8c36be7fef8ab5f327011d09c0871ef9621f33ec2d657792090c9b2e010b1fe831bd21eb9ca3b1ec306c8850dda66ba288bd04f75711cb35438262e52bcc1b2dfccf0ee901a489626187a53736dcb6f369ae0d62630f0be0e89dd2c99632f0a16c1cf8e757d3b349782750823723cc9b8f2dad9476c66b84cd0b0a3757b2d5c19cfe22909a2d5bee3f35ccedacff6ac84c6f6a6103368a896ba0b0dfc909906fc4db3308d533edeba3e41785202d6130a404abb550a70734247822837bb046bd3606322059d5dcfd64636ea400db05709df6dca7e53ee4de7a72d7157a8fd5b510b10b5491c96cd9f8335c9d29bd26d3eb85bee8607fd6e225dbe921148eef4f2dcffbf3df9c23cad3c9d3a844b5dc50e508e7c5467bde4bddbb9febf9b6893c5af177c63f233f26861b892f087f1a3e1e8dcf4c63c96208d58e15be0a4c97372eccdf9bbe5d2e6a8453ef8b5becd3e9d80ea178da41b71505a1e061f62a2fce5b98d7b3f0e60df40af718184fe95799b7d223647481fdc8e935f5b6e5194c664ec5ce511fdc0cf7f2b4698f4a8ff28898e22fd065a304c0a3d87f22fb9d00229837ddde77ec139e5a5c1d9c980418108218475cadbe8c6c1d12e678a386066cc8500694f3a4d653c3795bca21e0002af3001b1102a265c9e0542547a6a9551534741c106833fb06e9001dfa7f1477c5e953cfff0b9d5cc62ccd1cc3e31cfa6e0f793140745acc352182eb8f8ceefe3d894174dbc5b84f18d509c4efd67cf7b54ee14aeb19fe250a0d528b8b3fc45be15df83e703ffedf8842374c769e20f3cc726ef72fe638209901a850e247de81dd701d3f0a3015019094e4efdb93c88501c67483523f5e6ad3cffd3aeff92a32046bc626cfb770f4b4aa96274c874a04f3d3ada8840b347c0d654523f2429b1dfc3c4a4b248a629a6d2f3c54b9f9c378bb78f3a893e7976a17a1324478e0f4afe4a844658556fb0e0bb43f4ec40a487fc2b81cda868addbfc90a01633d14b37ad7a538fe8754563ebbf1ffe78fa42f19d7c3000b8b5dbf07da1a1ea8986871d2b0782a758f08a8ccad827f4a727dceec9a8f08c00b3a7483d2d4b1548a337dacb584a00e2fa48a39b98057b217cfcc8c336fcdd1a0fa64fbe2616ccb4b30bed4367d5be10f0214e957f49dffbd748643dff0bff82b36be9e4a595087370a017892f199d1771ad03f47b812364db98e3d4f903c9d2a565bb4d34fdb663c2c998152f8c24077c5fac831f44b2ab992517839a3d02504fced82fe1518c7cecc14339f63789533914fa8b22900fa49d9e09c5fab76613a3c3bfc4a493919077f511daa4349186019878bf861ec87b5dec2da1fbcd27eebf73c561273bbbe7566cc569581eba345b8cafad9af39d09101c575af01206a41cea5d274ec2f38dd4b900d1ad52b1a76e0fcb369757efacb11765c50f00de5577c074874e30e79081069c465d69d14723346ed695bcf7c0dd2c91da97e52c11693009ca8a0495f5b266af0e2f6e4cc2cb23347d9f1a3bfbb6d88ed4d978f9e1ee3ca3cd2808fd3ba8f317741bd26694ee77564cf113f72910f5fd4cac8a95012d201265c1a22cd65b35aa8698e7882c698e12af6ee2c361a54e37ce61a37933638621acf93cd5e5b1307b971fd63419751560bae2875b01b4d81e208e4312ba84abdddc9be1c2810fd9a45adcdbfc6b4d6f05b3c96c1f6740b397d94e6c242799b4a5ec897c923522da8f3a4e3f9f570736dfcc94c254caa40ae78ff890852903602fbe3445c5d639e3e6eb60b636d026ef69d77b9ded38578ac8e6961e518c3545bd35733ff292d11c829ae62f5410b05a5bea7ce471adf17414997b458909431175d4eed27d9185a52dcfbabfd751571c4e771555f813e000dad6e2d2ba678de33f6358f9967519e2f6b81314b20cf0f2bd12f4748fadd8477841c8f4853d048428c0772c8fc54bc367ca8c66e7cafc184b47e90ff39b94a47a359af3605478677ce76151821a302c050a6d3e3c888265addd47358a9e434a2cab093311968536074b4f7040536c0d8a1c16f416749725b0c0d0a6d33b33183bca00a819439490d2b8b2dc350ede67cf7f9474bbae433d62c01c7368286dfe23c56de7d6f5e2a6d40bff1f5fba287d1657079caa155fe272f05e59be52f40dadc6a04520b1a3f2f725ebc870b3709776e1c2e90ea07c3d0fc649605741875b30f459ce5c4f1a630546985bd601986fabe7a50855f0a2138b0f27e9077f82edcb7a38edd8e08f3d5cea07ea16ad5a94ceedaeef4beea3a5b7777d617adf34e6cc806b5ae19b89c0ea05775ebfa3caf3fc9a66f1cb4a6c3d8a586f6c6b6d9139c3383d4eb71176c74032768459f4f14e55af18c92950dcc9ba8706f04a4ad6c5bd95c4c7d2e1001be6106dcedb231a6fb45edf99c48b245a745081680adf530325cd7725f6eed745a62e0d72e396387ad08916dd6ba2cb29e0e6e19e3d0b0db15626ed6210d9f73dc8d6f64ccdb038036b942d4bdb3aa184411a8eb5a3e8453adf0486cc543affb2aaf649a8acf3fcdaddd3af1670563bf41941434612b9bcf87bbecdb2cfc11a992aefca95bf3433413f28ed7b7094307d9a1ccfc2e0c80f29a5f8680230ce157adc8a5540d705a1481909b1f808131410eb2af9ec49baa47360f64ed5094caa7f6d99ef6e824512cdba288088064ce19998ce5d04704b7815a923a797fe82d054f27052a73214a9402d325528564193ad158f426cefd8ee672684ecca6402025b023c27e454ab2d1d877080ef8491d6653b93e872472c0a0d78ff7c5d2c24c9e22c52caa3544fa67d226f75305fb26306c0334fa76698ebe35eac1589e012b5b327cd27ba2d54ae4b3d10ac714efd3265a99f7857d3e06a150ff914af05e9ec559bf875e3852fdc2476bae0f16924a08a0d795e2b299b18d80de1d0623985279df55003b0b39f095a54cf7c59acb0e5c4c5d8c3f2d3504ab35ed028153a4fcf7b35edf6a14bc5dce6cf440a0abf6bae3fab6b2690ba95b57a3e3a7c11841948a3563abbbed3f4231f7aee56a9edb1b7fa00e2fdcacee53ef5e0518b1a64b8c644c7e7d4160772b9818a716ac51daa51b40b8d4c757e711f9a5780c3ddd2eb245d52a10b919620135164eda0077d1b2fc77121b24015a482448cb15bc2c8884bdb021a546f990fdb7221f0b2553cde17fa3625a923af7ca9e7775bd4f3547e0db288a42a57c9968dbfdeae5f50794a2b83ae5a38bdd35c5f0464c956ce15fee79bd78c3f6fe1b78e6f93197b8b81e47b5e61439243fe4f49fa4594fbe7365888658b66ba5658e9a85d012f4a2e8fa23731b049f060d7a3ffba8d3a76ca428fcfe8680ca41c85519977754564b4a8b8877750d35057999a32ce4b49615324ea341a550d1a959545de870c4346276131bbb34bffa2a021ce628d2e0ba681953ae1e7f3d5be3503a652e101b9ef92c0f111bb66ca48408dab0279f890595b66f131c3a66857a32c6d79f193f046f8d23a40fb7d14fd0abd3f9861d17a301467b2bbdbc9658c548f27f85dce47cf37694544f6bcbe9d744a629941bd4127931a1cc0ce2a45fa112232b41e44cd51e81a0142ab607acde2c46f22c33869573ca278f1735841cbbc6d0a33b0b297bb5e2f1b7ac428a2702fb22c9c25b428542775751e1584a23158b762ffaa2b1222466ed67fe3cdcb15901695f538104f465d3f80a5b02602db226e33ff90a6e98f886fafa2b0408cacf4d9f3c60bed7e9ca65e4ed471bef062fd05ea0af0ce71d44a4669f0d7a06612d08da467de5951283b827fd0c8f89ec447c17acfa1c8143ec95c3a3528ae5650233c3b1d456874ade0f5bc992f866d169d94db1bd9f6e5be75173d39dd8fb6d16d423b1d176987d95aa3eefc22fc405a396185eecb33be9bb5a268a4431f7c65a8282113e1622f5387f0947f48dfb040b4ccdfed0e05ed8bf8953691feab906c8c485fb7f9453fcd2e83b46e63fd303b9cbe5e360260abe08e1ea80180c422fe9c5b7ad583e34f0346a8f0ec60fe2420220acbd1580adf5dad00ca740aa9cd6d13bc8f9411e3ca7d8ca2f7f433917a2e695a3a252549eb46581a5eafa8a7dbb0ba52c1ebc13c27eada465e5b7d2ee4f903c405514e3a1a743870e375e7ffd0cd7f8d363372fe7a7ced99e81fc6d8241369332aff8618a4b5dd93c78ef161889aefc9f00bab636fdbdaacbb346065473357eefcc22ad80fbb716319c09e6ca49eec1db4534ef843f4b5c074872ae0dd1cf40bd688aa50e7ede36714b4bc7bec58ba4cfc90bc426c3cabc5d61ab09af54356e63abbcc0f38051c5b5b2b6916f83ffa85c16be956a0c52a2e0aab4281774a6f07f51f07f8ac6e45fd09a74bc3c3d6dc90ae1a4d6e0e314a8ff0beac6754a831599d163e261783d6d6676493a49961759c8a1f2f4d75b1afd5b284fc17900506eaacbb55d2423d0681d3359b2d4f93568355669dc1ac1b4d448e4cbcf056dbf5bef853d5ab141c701563a59e92e0b8242735692e1d5c970c56c69c688e0432b3be7a978b04c66f4619f786c85f5e8c6973376fb71d517cd8d4490c8d29e531887dd12424f226b150edadd9ac9c3f4d9306a6e6cb1171dcdbefaf372334dac85a662328ce559c4efb712e89451dea0ea5e81f9c10df059f047dca3d492fac248b3f9d642ef2c88d8cfc9e08cad1526a19d31f48a19d8b85146d5c5c02414c676f2dd99b1c7fa5357a7e4fe6c2cdb8d56b3df4b162fc9ebf3c0878b377d6d1ec12a7bbda618ca8578ddbcfaaa732e6304e6c3ba0b3dbcc2dda4dd907ce7f54d2f08a9983ddbc569afee65ff285e6cccd897be6f8d00a09729c103b9a89a90530e99b02e872f0ec3890ab2c5da0fd2a1d1a2c8578268eb9f82d27afde19aa7fcc20061429c7c8b3df33507b114614abf5b13216556386d265bac1e31fe9b4d33065a7556124564b6ac833e2bbbf9754605882c46326dd06e5807653e05ff3c09afb90dd7f4f05a020d0940d4dc014a199a3a6265c9c73129b4160f010153b1674b1b44d409b53df6d5fa6d7c66cb6b0db3fb47ae3295ec8e1fbf2193c15701360d50991666b4f4d6fc2dbe177a19fc0c0bbd190e9004c95b0536a16bd242f92dfb39b073ccb85302cd25a882ab8af9fd03f88ddaf5be5fdc0978dedf93c20c44eeab0a6d5e80baefeeb5477c50593dd2ca201600187926c06305d16ab51020e152b6282309c1b7a1249655f6d795349334ed68596ed0b54f593b9e43bd3a1ccb6440a3bbed4575632b5abeb481b02b9f9212f72488673cce5a0e7126975f55ae6cc2b0fc6e9f369baba02ddb61ea3d141826537d3e6ecd3e49f8bb78d70e03bb3b4bdc05958e399e59d9a5f8b4ce20a36cbf6938a60386efbb80c6f091513eda66c4244356fe8d936da81ae24a0eb9ea73d2ad6e7fc3ce3d28de4bf5cf9880e360cc916229f7a099f7635e588de0a03e1d9f534ed0e690c36e860800919083081a58a8e09ab5353bd250184a768a97c6d3796726605dbdfab9d9f8f60489456400f5004ed5b217dae117ee78b1bc66aadd580c8e2d9eff3b1dd5f18416eb5ce35ebc005bca100398bdbc8af236f8c60193c035c98e4351b0e128cca88d1afa09683460f9c06c9c8c5b47b676a55de813d7bd1d33718bf5cc79056cc18951349037fdbcafbdb206c02a37d492991bd59c19c27dfff48406aa0d8aa6f7a95e006459db6c3a116d159fa8e503fa8e7af312081844003f5dc0e35eeb30969950e8a4d5efd581022977cc3aecbdfec4cda1359a344a9f49760e66f0d72060a87278404eec7d156a3080ccab95d7815f7a2db0dc825698fd614d58d58c3b5aa1d9cb02b139fb6f36d91c35eb0c063265ab6ff8ceecc21d2eee70ebb3333cd51e20729d73d82fd5ea57b290f868acdfc6068f92923bb9682fab5530404b744e8d6106c74cc97d5187387533d87a987bc1e58827de8b5c2cd3e42c76d471d3b5190e63672d7d2a363fdffa337160d3b3e864300848fd5a9f5182a27d4348d8300c7c4d7273afd38beedf77d99335a070cad4d3cc444166223c6134950684c88e3e9b075f6edcf2067971ac522620ec56d5e8870e90a4333ffc2fb99395c620217e08cc89f05d66e70ad9a31b63d2bf30e622e22a5409a5a87c1b4917be31217029dde5dc34ed751a9c55f31b8807a7ee45ff044edff3103d22a4c98c65467e79ef1afeb8899167220a2e3ceebe8a62aa2dd1e865596baff1645085bea4475b5f9e13cea212cdcffc8de0225e92e6c78c793ee0fa5e93ddba5360fcf127b8cb656221ca0e8082aa3c8085cbd5315a6fab768b45cd53936a5dc8596798f62897ecf17e5a1b4206118a5503a2bf5246bb52776b5d16ee7f1c105297f17172f884bb8b0b754a824eb2a8bf6b41b110423d995f98079983beb53fc3e54e4805d5f3c0f6ceefbc63075fbfe98ea46bb98b40162672f220cefb2f20aefeea6b4d391d8446dbad7f71d31704140a6683d06e5d287bfeb58b217da123bea40eaa8ae4bdcd2a9247e3bcea686f46928fd9479231c7d6c6fc093f23d846d060b5c3b5a14219b2a60abf5c10229651038b1fece589402972fddba9e196d8d0c43caa155572486a9e0f68711f43647f633aaefb2f00f4324d1419689170741bb9f77ed78bece87b1cda282a6f8d1c98105c2b29622fcf3b695c6874c49649a7f7d02081343a7a068969f773fa5cdb56ab660bb83ece1ef8371fb5c884362de28c19c2afdc06bf794621e1799c232a5512fb778af8e2ba57648a78eb86c72e0740af7cb344eaa26a6153f2617bb727a43d54c0d2135a772ae8e2811c460f7d1366a3d7bce4200b386b59189eb03afbb99a066a0fa9f1d56676de71b830048fd9e83b975a0a7abaf59e7cfb8c8027003788677ac1e2bae5643417a98a97f8a4332082578ca33ed9b249e31a611c12e92555a78586657501e0807c053250725d1226f97e4bd202d681fd62cf362c24dbf5dfe810f9b5761bac7708c0ce0804ee9c0760c693c09e57f01e3bf00004e327b27055b513e7916432d60e6e145d0f6ca450e3b56790959b5f056ac6fffc5ba94b142886c906fd7d55fab57fb21b56f218ea6cc197338dbc1ecd4b12e5c859cafd662fb21158f2ebefc46decfebaf72191ca7d3f947d249f6d532dde042d0698ec69b14b9119473943b32a24c66aa598f2b1853eb3db1906e5b5ae55e45f25aa5ae91a4174b88e47814f9b42c1e1ccb50d08513c32f929ebbf5dee3086eed021634cd764357bb92e9c54138671042ea645771ca04681a20e47184d32d3b7196f8515294b4b5036aae40bbabed2521090ef2776bbb588db40cf87d2f793e37b1784f969d1d3464a8d345064ff93fafc2bd69226cc428a96b635fd196d7279b2ba8e3636da01136249282750382dec109d9475f31863b271f30c02283fe7ec52da5da35ff8e6a6a0d23272a152947fd78c647b039be563cab92ab92d272208205db179f64d50e582eca8c57f2c5532ea79c46c636ede3be9f89de06c529c7d9dcb53f755328f0110d6e610df186747b3241521706010eabc51d381688f910e9b7257bd08a48b4eef1f504fecad7498f7a70a38c99270d7b30a816a045f4cdf9f22fba819688db24b6f80f4025e2f80c8c873d7fdc825d64c4fea22ab8f2ad1c30771f52450c5efc7228c19cbaf364224ef08cec41b415a72dd7349fef8b7d443c9516378e43ac319ace045191550906bafb81c8db299d97ab8b7eb3934be5c97f4704dc69811c25a7439d8bd1449316014026d31121840bf77f4e4dbeac0858807d06c5d6ccfe8a1f13f43b2a827d520bf9c01cbd8c3867b31004b4f3c16fe47c3de5cce39aefbcbde7417e2258ed9c9dbfb311ecf8f32b07c238536b5c26f6a9a705a6095688f4fc101f4b2cfe6cac2d62f9d4d692ea9c7ccf008e7b55940ecacfdaae4d14ce202518f6d2a26ffd5f38273a7758c79aea636231002238c45c01d09d70c77d59e54c24e6ad40d74f87b2c7bf1d1428d43c562c83b9f15328f53058645b465269141ecf27a303da78a345a46d828f39ea6820daa816113f16c7d117c1b3e008b52a847b33d99513a4eb9f5163c20df7ffd52521699f4c63e3fe9ce30b66546562f9fd611db3c7a0e3a4131a8062b1ed4b35d2e378bad82848c77f3d815aa78ee05dcc2af8c5d7c7b0d4562e538c745033db7ce77efb13d8e8bd8cf65dbee1c9cd372c4484d49edeaad6e63a34432053a0f424208ff39eee274f885da3eee67ce4bf87e645ffc49004e2b96a944849110d3d6b65a5d942107c147879fbf29f5febcd4a8209b6aafcd962367e272c5208efeb073e057930d9ee8c40760349daa28556a227f12589b619d5b5950c063813666de676217e6a5cc07d52a5d75b8f16aa9e993805090a195095f8510757c4f4e1d8bdcab3d59360bd51ca71a8714a1ea64e98169f0b10d633bf3f88c2dc076b29d9269ac445c88ff3a37c3f054b453141ed437ac5126fcad57b39a6e304d3a9ba36500ac717b3c8972ea35116510486f7b729641b96515eeda1ac0395263a0dc609eb94141a3cd885af18dc40873487fab912b9213748ccd8a75721c2d99b59ac4a33581d0cd58db1859a5ddeeaea68296177b168267b0c2854365f6e1cbb1094e86e11efd4b1afe1dc7e45df91f93f1ca18b027f66583cbaef4e86d1a486d6746b788e3567bde098712796b3e88a4121f31bcb66fc38e5e97a68d645bf460cb1dc51d07c7db0a1b7ea10d6314c9e8297328326e6fec03b390c433bab11ccefc691c91af7c9f66d131393cbe8f897389e9d5948148cc1fec3231fdb82b4deeeac382cff54bac9c39966db22c65da1f289b81874697a514c617a9cf97ec499c7f0ae1b69a23ac42a64414fb6de6cea5796c7e47e30427092d62b737aedc2b27eced46fb65526e4a59f4aa4c7b617f6837e78515b3d49e9e322d3b37a9b536233c6c2e36cbbb209514c0f5a48bc08a82023913df121a7565efb7971daf76e2ecee4b9efe20a43332afbecd0ca2964a68cd0eb4d9b28593dd5f87d31d4889739d0a29f0c25d77cc15cd658313bf37e0edf56a3f4691e83b9dee3ab39a0bb3bb7756b63d733fe01dc5cba2507236a8a16a857044fd982e7f74a1cf22da944f16d0f2478a3fd142688a036dd17ad3e616ff3b34fb2bf6cddd317405d72fe0c8d0e2a4999cec92a126d95ee4b6a2f2007c3c4e2f1ba08b61ef898b5a5f70cb88de5dea08ebec0122b1749a5c5fc86498465651fcb95a064a399c76adfc3f6d20dc3c3ffae3fb5cf21dbc4245a1761d6bd7af1dd70a7996c97332655d595867e5a11a82f8baba05e6cc510e8f5ad0de4957b68878f0e2360de667c3bc6dec4f5c3c66b2058a18c1501d372d5f3aed73ace6959e5abfefc680c3f1389761b880fe263f43471a0bd86a5560963182dd5ea7e1027d0984ccd402419f94e88fa616fbde26dc527ddfbd9c955a120415a9bf5c5d64f56d5a40b4083b8ba126549a2c14af1925bb6d56f9cd2f0cac0deaff1351962ec8901744b60434d452968b08de03dd7aa3d9e857528e3f29979b540cfa7663eb7ed7e89fd004d28bca536a2bba9b7de613493bb115f138530dbfb57f8f35657e93e1c3f8ae9e14ff8e537c9bc631647d36ee203f3a6692761b6cc973a2f1fbb5f45621228ee71d38a64cad7477e38074ee0cd5890fcb21c20fa767ac1bbc6d7bce563949d6e8198ec5c26add1ba3245bd5f59b456a8f68c72d175c17bc37275c44219f1070ba3800bd46eb93e453f3031f86d7aaf2393da6965e8cf0715eecdeea81dbc7ff6eeae6dce708e2eb36325e1b0160205f801d6859b662802b7bbb78e69e81c10757fa16a8850906efed5f6e8a80c93f17adad3667bf305d873e3acba66f1d8bcb4c19830b8d916a4cfeb7d52e95b1267c46109d5223a0c3eb53341a8621ae4ccd35e2b0232fada0b4dab6a2ca9f7fb29075f9b98bc2e264c006ed8384e9c7e5afce5bb7cd612bb177 + +# Missing bytes at random position inside signature +Params = SHA2-512_W16_H16 +Msg = 9c3792b7dbe44815abb6853ca4a6ff3f8645a18c18feabbf287360e8705e133450c30b648b810e04c781ba47aff2a6466fa1 +PublicKey = 0500000548534fdaef9a69681a9f5d66113c2edad09fea503494a0c1283da33d4a026bf0eff8844cf9c9db1165d4311456efaea753a25a806c59bdf2967b0b9dbe1b365b97225867edee40937297b7113ffbd6d2ebbc1fcd7c73c4470f9c953228034be7f4e458548d986876e0ca4ae8ca623e0304693112ed87e532f50c53766d7ec744 +InvalidSignature = 0000000000000000a81db3d579d02e7ea70da829633d06b8b519e8c31f350b40e40d0f8b3ada979ccfad677a50f37190b1aef7feee2edf9e1573eae272a6fccc5ce5cdf5849f36b65b7714119fa64020735d6999144681c53d8c4c46350d4e2ac13b6b452ea0c71dbf87dd078381808dcc284579bfa2f61189a98f1cf0dacb43b1809e29ff477052484790f86bd83ea13078e427a4b3bc1912d80d6527f477dcd03eb2e746279548c3e77e14e809be17e53989d13d447f39c35429610ab4abd0d7124e86f3ec2d8f254516e1d428a8379ab521425f6cced7dd1eb8a5f9787300e3db7ee3a4853d8bb6d0f157e23bf1b196009f1f823d51c8a7f07057a0eb5a5b2cc0009e4bc347657a0e68eb5d5f1629771ceb38c546f1647dc2c5ffbb5b5fe8db0d792b70dc66eff8e7e9dd41cd8eb58a1f379e80f8b4e4a2dfc97d42596a8aab3b62f3e22249fbb2a1c96e04ea8fd4e8c6dda9ca17d4cdaff1f34490699b2431f68699ccf5ac167cfc539b282314defd314c8ab1ad5ea31a24562dd9dc24c1e8ac4a281a8e81cbf0080be054f79e483f6396add11fcd9625a92d486b5a489b456ba365b7ec9ba9cc2ecbd855b10a2e1c4c9ad8dcd92fa443ce19215134261c803b314a5756f999204bef434445d705717848e7ddb15022894d11a8b981feaaae53a5bb63f34aa2c687d7d1555ff18cdef42db12f511b9e6dbdf1e68114284d0cebe9abbb649ea4a44a54613b4b4505c72e48845bf9c2f0fd29bd000fb76324206593e30e0c9c799e1964a0eeda1c85331e4dac28e8fa757f0de53c03ff95d5c9a241e9fb600ffbb4be5b01ead9deec3ed202a4ee37cc3b5fda3246aeab9aef3cefb33b1cc09203d5843eeb26fbe101fede80196d702b3be44c1ded67a36974c4d29f3b7972fde29fc9647b40862bb0ce044b919949fc6b7d764c148919fad3981c82e553fdfd4515cbd5d79f1f2e84d1334b6d5a3aab292e7c61ab53f780e50e16e76e94dd754d6a9061a0d1bfd5b1bd0c3cbd48e4b364a240012e2b41f06726d06fdd0feae26fe99a9034461aae912f86c5ef619687ba664c649d1eb2d00d566a41c1ea957bce9f30f271d226f3ae274c5c74f7d6f5b180a6815d5243adaa4c8d70470a113b05ff884705bb08ffef9aa198330115a7aeeb7d4f4fc33aa41727b373451ce64c96be94a18147d24db2c6a886508dbd057ee3db4b0e701747bf9c3cdc29e753866cb4bae2507c4a1d04fde262bce2df457f6c3c143b3c309d27cc801372a3d91caa5ea66f1b3880006f3117e5ac949a0002d0787bcdd8b645988bfb7a091d29b5e14a5f94131c4440bca740bbde347591ff608e47907cc3abb5298df5870d040bb7fb25cb4717ab70bab920f61b796f664f727983cb607981021ff8dd413b4c05d61fbb007b04fb11ec15224e08e7ba68f503165654cdbcff73a237979104c76e23a7cc4319aa3bca89a85dfac92f1391a0ae88194078322e304ea63cbd23e47f587cf2b6d14aec8556d2132e495679f507c0e509a2664778529c90df15ff64dfa9066e5b35f6a56b121536cee38fe79689a4e0ef6c800453446240041ec9ff0c80ab6645116fa56bc2d83ce4a673534341f1382d9ba183e261f6fbede51e80064b9b572f74a8a3b1924334a2a42b96854bd7b369849791199643f4c932bc2f6c6c66761ff8b16d4a97d98d25ab0bf52a65fb9ff78cc5d5717565f7017615bf31c5ae0b392dac5d77ec8f00ec9167344d544386c502a108952f7e4a5558ff90086c93546ca8ac47a59e8381921f926244a4475add05aad6c9cbc591c08568e3bf29433be12e5db7a2d21bc2695726c3284622ca6f9f31d4630720df84922f65d348c347f572966f33a07956aa99f3ce911797f1a72410bbf1a054e26b41d12fcdb654d6a4cc44176b95a6612fd6151207824cd911087dc33e4d36083a1749ab80f54a3a4be53f99f6662ca08b9e8b990e96d68f6d5c34684c7a0ecbd6bc3950014cfba21f4341c90f2dd92e7b3cc91b49d106d79a7011c05f954a842898c7ee8093c30254a158072853b4114f2f29f729260dcb2c95624df372f20128d28bb6db616242fcf47f4af6619c97f473965eccce9ecad12835d02119b6342277cce576313898ab0926926eb5ce333235be327d8c32b2dad1367f0ca6d8b7b888a28904dcac29752114c6976d8b795b5e7f63a45cfef5a4a74ef0a05bda6eca580f53090e9da1a22a6f8f735e1aa7a110df386e84ab19e6535a3c88ac08cc2180ab2db818fafa5f8923af4ea7810819dda855548b38919afb4cc485be356c19c2f52f8c3100abcdc5eed21280eee97972116c2d5bbaa0b28fc8bc29332a16a162116478a2330adf569041529d4259fbd16b822bf0fe7a88136c6bf7ec42b97961bb5b3ec7913c2b5f0a7dc3b3d48c634f71d523a0423cc0fb9b5ed97bbc87bb0bd575efb6376d34a04656f6616dcd27473b2fca02e953cab112cf03778ee55b17ad7ac011357db62ecb1e8d984569daf6f8ec6f0169c85f91fd4f1d8043e087caef768008db76f3fa7bf71a77eda2d59b5bdb126cc2f7b493d3472d16771699513abcb67cb409bb4e55cbc91798129e67cfca8e8753964e06bd401cc84332f6b4a2f4a11e9b0b69c740c693da4f57d3dd01de5fbd7c8531ba92e6db6ac3756b8141ac7c4d6c2a7a56962d73a4cd2c2a99d32eb8b686e855e4a6bb81a9475f50c92e20521a8476d16c6e541e1e20c9434bc5c30917e6c38b46ab70688248c840bd21557b0b9021c0484be233990664a488a8c83f5974616eefa4b8e5dffd1bdc1e52877bc64be764533889087f45bed5b1b3af61d688ef19e7edbeb06d06b62fbfe8ed8288174eb6471b8e14b255d4229a0d38977fc29e8bd7bfac0c50d67413caca61848fb66051d4d1542a840be31f13e7b94ba2835018f3235a4c5330bca7acf33d001f1c1790c6f7e17235566ed1cbe4fa443e97afed8f45579414753ef9936ccddedfb8104cfb01a215c505470d08bf7c51923430a86d205ce7dfd7168eebac14e06770eaf3d3ca0467199b49dc6b3d44b948053aa41e76fafba5990184bd79954f377f15c03dc723aeb096bf01b52ded9b55cb906bbe5460a3f215f1c82d6794529f6f989c43cb8ac784755307f06be57ef40a5a0909cde8052a696bc82d49ec1fa23b294a2adb2ee089b8f05f9815345baaf5416fdcc92de0e872ddde805d3d1c372a0be080ee1207df3af44c300cff6747f3278e6e7152afba8f8a384410518abf49a02acd5e75413cf1541cb2d2f994165cf0ce1e5711fa68820fd20ce2135c73f078891fe247cdbe1fceb027157052d810e8fdbced090c2a872092279ceb51bca1858382029e24a79b5ceb6f600d56e20fb8bb6a5345b05af81cdbc3ccadb0a0288887959e27b76ea9d6540fa239e9ee6639d69bce1d1c24e2eaec854c5c6f88550900853b8a20ba320b20ce2a4e52d6c06f5a5304009292d1271920a002e8f155c25faad942f946e73233467a57209006b85de0d999f3d1a2f5368cf8ab2aa2495fd84a5f15feea730e83d6a02088663a40dfcb42a778182a987198a82aa8bb4a6e567a6c4f518a548f09a0b7b88892b8a532d7606cd99469266954d829c9cc6229301e7fe29df8279c80a3849949171a9f7cd6bf16b0732167f7e50e16487dccabb6a840c9301f5b8494eced792ead419d8518129f2891cf82dc3670a223e6a852c23ca3b5d59de31dbd02c41144b55ed6dd3da83126160c70991c1ce1907b749d52c1f54e47e058820e0256b0d764b9d8ce7eb0822258916fe6673734873027069e88a1b1a381152b98104e247cfd6d0f53c93ced76b09c0fc90a302b70597c69dd7deb44c6fab0cb0f86d4f133be09ee9aa7700c59f356071aa537e2b4dd1f8629ce859daa6de7e3a526c32f13ffe1932342673ec46651afe0860b5a862fae0ad07f8ddafb575a08d8dc22cfa7dc02b4a39b5acfb567b14410f65f546295f7438571989d570dd2d74c4399834b383073c087d549ff7ed20748e6205caa5ac109ffdaf9d796234bb2e432142c2a4034ae3b2e23ca31589c69c2140315b2acf4cdc4c039b74f4950585c095e5c116fd977c3734b018aed0934660d5ba77ecf004779e98b8ee6d08afcdff2730fa29b916d76f56a8f1b1a7b5594ba9a596566e131e322db66a86794c7c50b852ab998de87101aa898e872778d1e89cef914254f34cef71a8a4d040c9c4fc59ebafb5893769307352cfd3290d33f88a0259ce7b13d419bd9024a4973d200918eb3d797e36296a7c8f090efba5b0bc091f42e4c8322cdc4686206bcd5097300b0c8be1c669e36aa4ab471673245e97d4dd7cf1832d97bc50aa0c95b2a70337e5d5352c125ff6a93f23c49e30dad607ecd09d385f02281f8096866bee091d6854cc9baae88b3850e89cdb4b7ac31d2e34b9b94a1ea4ef522eb4fca616a6d0e405ec66d805d47a2dba451e0445336597c5e9c401357240cfbbc52419af02de1b466bc11f54f06cdc8a188e396de2822d81b1fe0d8d5863460076f897783e22595c77af21f4d92d887a06f8b8bdcc4637d883164eb9861bda4fd029a6d62281bed64cbba0ec888f4208a8165f0926b111ccb19328eb77e130e5f121c19192e9bf30fcb5b0fe6fdd5fc9a2444681ccbbc7ef90a764a2162ecd04a40f19c996bbccd775fe22e18753b84f7ad0210c666e259dacf0913a84e40b576b6963a920e1011f7bf112112d9e8f8b45aa7d1c4b0bf783c2bec8b0a046a2ee210b83971a5064ffcd3069c68b6ffb9cc1af1602272bf78c8b0d9439da4adaff62c2bfe98aa824866892e18ec8714b90740ff656b737754b3a17de7a4977ecde040b6a09d5814bd118b2fa41ad59cc42ba91239724883d2f4f11f987a567a0f06c3768a1f40cc63af089b8f2875bc51c9f8a9f51459ef1256fb04e99de4496f310935538ed5d71c2f57fd7942f5acf02c8a46e2d7f9a3a9634c978747af34dddf5d55b14bdece796e142c36d9e018c3b6bcb246ecd6a213a200dbf8e20f677e4eadc15d52f3efa7d71a524216c2721d36f869842e616d4cfdc941c9c35215d43587fa9a4e2de1d492152a846b4eae7048e582d9c1483a00ed05a3d760b212112b9a43d7e865db13d9deb7fd21f44f8410e8dae31b92dea76e35e46cf9f4d60cbe3394ef5b8cff9ab999c22ca5790acc85a73d2527ee1280e280b4ad1872a0c96daed19fcd34a2ca811439767633377248dd864d6d4f15978c1a80c064653475c3d963a0a9289463a53614b4cf1adfe11809ea7a86e3eb75707de21415d8243cd8278bd01677537c06823751543719d679b6de3c4c1ad4cfe90bafc64ed98037e4ed4e049aa24c9a79a076078d8ccbfb68355b1e09474c39ea131a494471158dafa481305a173aae647b44caac8557a5eceaa1d1b615e9c8d85f7944e3ef43acda5db385ad96130f36e5866aa34851c3661d968d7eb081bcb6d8a49ddb440aae3bb5df2348a6becb536f57b0c6f443efc14f5d532781a2c4c3593b67860e0f5fb502ca98669dd7f2c587e1b224a89b36be1d3e4484bcab0848c18da4ee0d3acb1dfc260c5e0aa4891ac420a102bbdcd8ff1fc7c870b5dadb3e5ad574559f98c762ccd84667f3f98e3479eb179fd55073ceeb240a1651e8aedc862f3221319f89a60825b0bee85e24cf7c3f70bbf30e9c11318a506d77f66c5af89c45ff79a8305b5375ca1470c5c8facb0d8a94d063ab9aa51f90bf7c05e73a95ec4ab22ba7b8079e95e8b264bd7808cf4a3d5d19c606f57976b2430df6bcc1356ec474a9622059a27b71401b40bea00a0432177fa4a475fcff466e7b32159b8020181fcec752dff4edcab8975ca02df5b19cd5be284c6faff49c083ceea2080966f8fd726443217a77c61994f5a2d0d00d0a36b84c1ebe3e8361dc4383fc9b7369fc6ecbb9bd493194e2080e3158489e26364540774eb27bf76ba947939ade728a2bf41978b620b404d23cfe617e68834d248dda64656e9831fc69662248fe4ac45a7795735599c947f64220c901d08ba910a819388051990abf9170d8bae9e466ca21002249436d0e99cc3630c67fc66b22f4334a0c9af37b1754266c41f980b645af08bdb0534a4a5b44babe0214599ccfa19e60a45274cf77ae2555e4788f844189edd7a1286102980478be4dbece968ec8820dc5e65822ee0be8133eb385fba4b13b0f000d5540ad494ad909deba698b57a3a06774289ab606126b894a3eb734ca951db52fecfc60c8c77b675462024c4fc9e477bfaf655c0ea0b3054708992874af01928fdff60355f4d68c398e2f5ddeaa1e31a30c71a6d4d994ebe35bd3ada54cd054572a9bffa393db3f5361693ce086000f5aec47143b5fc71e07b57c8b9eabc0e553a81ad4f3434d43e581dfd3d2f97770064050ca2405c8b228b3875a873f1e0023e710e877646dbec955b662d9f773c83291395e02c63e7f95a3182b2f79ca1de64690b559ef42e89dbaca1c3f496c89e50ecdd6d8713e3a334a396afeb32b93b77607cc785cc4e073afcf9298763c7fbd39742c0352f95442fef723a19370b9a6d95770b236bfe0601efd1abfc294dcadb5c426ff243d4d87f4fe0d63e9974b5cb7db16bfa0648dcfa40db08a8c9b5a977e77d42d8e92f8ddcfd737854c3eac3bf2130cfcc55a11c66c4c88b66531dbda65f9eb43e7601c5ed5b436d319843c1082e094ba32dacbbae0bf389ce6a0227b7241900c93d172c45a162f4ce04c33c6cbc66f327e839b75afce0bb6a551edb14a36c7836ed8fa7e53c4a4be420104d3dda680e8052ca0135fb49fbaf3769ab0a98f35ece987fdedbed44d5079f67dc417102787edec3d3409a1af8afdade0742ce44a0e16e545abd5a4bc7a243faadc4ddfaf0160402023be5b70943cc3d6bf3e8d90225bcc38d404e7f7ebe13233ddf596f99b3a6bef2a1e4ff992b79b3f8d40a70f81f9895f90dc0d4ada740339bbf4b1161594fd84a4242e527ee1f5cb1eb2ae4625d25716d843fd2d43ac037c977ef02e13603cc0525e3a9fef6c8918b656c712a0c15e1c85632cf82cbc62bb8fc1289c52d5d9bbedeae976c5c94f473d4c0c2f8069e59faf28144a7dbc2762814a8b743f29f4f9548bfa1072c85f6c6d20c4c7624ca3d44a8a244c4b31c239ba8316b79f14617224d8820d9e399734277d6af11bb8eb8a720802a34a7a8bf1e63d4f1b738c40081101ede33595797f8f85b29c61b6de3920cdae6c29d61e6b1c76d99cc957f6f83bc71583bab6e512278427e843e2676cdd7969310ae2e5470c296adba20cbda05e2fb8d66431f67a6530172541fcecc3912d37a24c72d107edcf56160968d843cbbb9708359a651e80cea4f08d5be9967fe2ba5474c45cb9733f89da671f35e7499d25929462c3259c03ade5a7e721f604eaa9b6724391df5f78c196014229750061415290324a2e74d228a45c54c3c7b1d58130473c00677305ed8157dc58488e4949ef1886f0c8b0d5b6f66a60c6c630e7dc6aadd837d7ab4b358dc98b1af8175e1d58d585b935214c827f6481896fae4a664cbd2a983ab519c873904cc7665d5a2dd06e1f683f487397dd2373646181d934d7a8e58615d2ecad395aa9963f1efe28d3b36433a8f2eaf421b41ed2c01c67ef9af9ecb7424cec77cbb77665a7d5094d991cfed3eaade828c6306532819cb95e5ecdfb09a811f034c5f5aabf60843478d1d4cf2e65f1c795117d3b82c909f8879e3b2a59a735ec92c3597d944c1bf7085663fa6cbfc65b85e5b4ddcc7eac3305e43b5e4114f0e6a4d3fcd2a90f3c098372f4caffe47942e19a318ab5934d4197920117c98607ac44ff649d9ddf1820a5acc785ca8d464272deea06139f901661fa26ca05dbf7b6e02af4c006eeb54343981cf577b8b07b361d4a1fb24f427eabd7f75027e8d2a29b9b7ed09f9ec9a365cc6803d46f41dd7fe04268a9f01414da085599acf79087b553c6f5376c0586ccf952c8ecd8f2ee1a87cfbd8b16d8f50b7171986a717ce3affbd1400770d638cbd939eefb865799539a22d83df754380815fdcf1719877d0d5d1ae6a60c07a9a79724d3128d160da19a642e1463d3445c1c753eca33496f1737d72c897e8d9a969f081b85af4b01f761a325d50fc4b9fb12be0bda8ee8501c764c1444630fb7bc4ff8468ef9186fa84dc523b8df869acd4ab1e161da772c580c4c5aea8ba2e3c7d1662ffbbadce700682e0ec923c04bdbb9f9b3dd4238a673c94897240b77cba013e8c1f7fc8b54883cedd90c57ff1c3c37018b190f37539f344e2480dc4bf5c2095e78034266003dddc0d68a6496e867ffc1e282aea39dec5658e56220098b908fc9b26a843a7830807d110674a28ccf42af52101a4479b9ac985e2ff51c68ee688d2a0cacb74300e9d096243fd592f3c75043f18ac83e73c69e28434b147e67fe133019b6e61bac00773d2fd7343fb37654db16743a66a4e710f722cc269e51a9fa9c485612688ede36282c769f5851077c49902e5201cf27a96dec325a850261d84421ae30544163dffef655d2f176b7e27df684ec63136a94896d0254c65c83b2138c603ead8b91311e1cc8302d2545fab9be8f9daee593a9269c834dfb5d3d0a25221b42dc88026c9d945fb0dabe5847a9d5863362ddadc8d37247cab3eb5df002ae7d4dc8c9538294dffbeba83712be0453621e3d29b1f5dd639ec0b084e5d4913045f769f8c8f63bef18cc32ceb3aa4f89416c179c211410322e77baa098a2b9e65ce3b919ed7a1e0a4fae8ad912282277bf0b7814f6d0b96af437496c32c1ce4793f44ddcdb5066cc69abf469a59736dd13c519d909a316377e2a277d231aa782f6202a96164508190182bae2f8ffbdf8fc52b38ecc5621567fe41e112992ef1bc589d928b2b04e4a25d30f90426ea4a06cbbb520969ccff7db7ab65a82fee7a2d73f15ad9ba601ef2aaddde07a0d356828fd8628e0226b65c1543c35997922ee7b040402621423563edc35a7655fa15f5a19510b1c00c487d40cc8599b2bd2357def4188321d5f35eca0e37aa607066bcde252197e7b43f7c81b2c503a0a65f6dbb3e5552539ff5eb7350b79a224a61095e714c3663b859c1de079a9e364676b82417d191e179022e0e0461feec3eded5de0d099752aff176bb8aab5106bdb37b229e9161f0e5fb333a9ff3e929ef4ac4a8f5e7fc21559b62db9c2d695f45e12db7517715cb0b45c039b573214b802e8922f2d7b167339da1b227386b4ddd4405956139927752bb03142c62870e9e88d1581f68c05d2defe2472067849e6c05e26b456ef5d1733a2cdbc6eabf96645dd185d4c86883138421045f656e1f96b687e9d8fa08c31eb3bd6ebd0ae315ad7d5af30486de49465b0c7808730f723fa5aabc69a02896ec93e9991c8b0791d146a3c6c2afe76246ce53968001f107538253f96a2f9264d3018461fe4023ad2338b54d94cf2fdbc929220ca4d07aafa470bdaca1d0e3eda22a769977f92591a252c9bd6dadb1626e4e0a3c06e11bded0efdb8d1a91d15e85a0444b3ccaa9e634682d915d195221750b40365fd16a3a20fb59b377dd0bf84bed889a3fe04a1fcf2b280a1d1de7ca60b09219dd2f727bb4758657ddf1aeea4bbc224a002de8a3fbc96613c77c3d6618033679236ff7025e6e8c30aeaee9c653b7569541997823ed77e4b3554c6b09c4156d7e148292b5f0dffe7311f64dd6a0bd7f7b9e12bf147abe80198b65b642a4d0a73881fe94868adf80bbe0ab202462c211d7060341533807158bf4be27ddb0c6de4412291abe05bbe386192c176a8e0f6ebaaafb754b34ae61b4091f8259b0b3463b57bebfa0f30612cf5f87ea2459997ec4530435f85071ff8df34bfd4e35902d72bb07eaf877dd01f8d87d09a5311c42fa58f1fa78cd8923f6c16cb4d1cc9b7148e7349971f502b56ded92721efdba2333720133bc55efdfa8c65195f5273387cd211deb209bf95e15a0364de578e210b29710cac1bec9b0d9dbac27c348575c7dc46d62396a01d8a359f3a1283f235bbc1ab50e5a3fc811045b69c4d553272ac4f4c380d1172026eba0ff93a41f41a49353e6da0becf5f5eb6fb4d4973c75ea8e9798b6b8b219ac2a16ec33547ade945651b61529f3dfc7c8a2355349b97d3154563597df4b5a0f23c41be2d744368c1a44da11ee3723f3dbff81fddcc3b3598db2777594c49e4a706baac715eb7fdbc0540951b0e2a0c424f2d6ad3b530a6067adf6a0b460734f4c2f8ce49e7d2a4267521499bb796527f575c13e35bf014af5c34ea8b4e8eb7124af2bc4c4fe24fa1810e38415d92a96c027ba0e95a8a9d38ca934c26c92f7f5ae6e88f8d5d428da49dbb3b880062b0b3401ea8e12cf16293a5300c4ae724dd61ada9e3c85e9295fce3cba23826966696bacc452eef907123bc6e425d2d84a3b67986e9bffcfc1046971a2c7a9980526e5a6dbb74a287e7b30af6c2c47c19c797dbde95c93ae42a39f79e065cf12d4baa222b0f6a9f463529b555fa04db85e321d641f35a7474a36944068b5fec7cb5de9383a4b2ba91c4471f3d30d08da0b58351ce602a3af717ef04851e5c1d387f4d85c503fe37afcaba5c85fcad2d2339efa4c4be1c492f0fc24fa87dd84c72bd6be21aab181dc4894ae4efa10c5a0ee0846b3a64f8cf37894f92bead6146a9af17417e92c3942bf2a8200b2542a3923785dec68cb56e807f437b4fe235edfc5a3ec0f5cfa1816665345b68efaecd113292c8c338f04914cff0d57cde578d490a188290398a42a4ebbca83e00f522134e1ae6c544e2cb362e5dc924bae68ed2aa287d836909baf59a03a05041d3df37ae67d3d4f716956a4ce1958fd265fbd902935865579ec4c4bf3c47a9a2967622e807043da2601b73a8f41c02335d208ed654d064278df787cc617b963984bc896f73664cc5ae1e096c9cfce22b90800f50ff81450202a24402211abceb75935e5c57a4bdec067081f3482b2d1c96f92953c7854f77e2a9bf2d72430d8f0ec4b4fc92c508833604152bcafb08f0f2d1c992655ceee8c56fd1abfad44e6f5d222d14a3683dbb12ea41bc4482b4932b456cbb46f13cc3cc3c5a8d4ba7b5b5df405ce8899ed5643244b87d94b5c169f23cc47d7b8ccbf63a23aa3e8193a83a38753256524f2e57fea09024cc1ca350e7028eac07202e01174a05fd0467b4b11b5c175e63d1a9b568c2222bf369ebe7915144c697af28b4c8efc9daa641947db2b141d6f90909d80f109f8aaac7c2602e74da5a6236e14b65b2d4d28684e57cfe9a512c9bb580012ebc8c2f903ff4e1c8023bcc1db741d431e6fe357e310bd08eccce449315209c866f62450d0862b9cdb6f3d5f50dcef4fae765016509c0a281b2f3539453be33d365a51e12f4f862a221b0ca61721d642c4dac4a2dee2f2e89b0b80ccf1cc040996738097922ed11347400b2cf4720a71e79f051df55dbfd499af949793f86fbfce35b36958a400fc3edb7f9365f5a40543943ea2e07570b03706a02d8313f939909a450d23d86ef29ed8bee439979cf66c9f21684378610ea5acc483af0ad57bf69c0c05f77e897f2d733e099301f1fb7967a99c827f1b184d84b7e10cad835eec04786e3d517442459bb46f5a2b13b0437eeb33d59c9d266bed4dda209baede3a4ebc43be90f59ebf409d6a0b273cda7f6236dacb4d1fb6a26187e0a722bb326e6f46e43494d01c0ee7dc083f048753e39d7f10e889daaffef5b82f86ded803cebaa685f04f03fa0d63af65a18d27f5683a47fc066719014db74dd9773c38071d60b22e7a36610dc85a3d9920b36cc8c2ce80a1c5dc5a128197641d6424e6329ebeb3e504d3d13b57ca9d664fdf337cc6ef4778ab4b7f7f1e35d36cc856a6495e9fd3f7ca924c5302defe7d686a5a290145e16e2ed69ef68af8ae246a44a212f8946916b44c307523ecf5a1b77ba5209983b793ed9c67b9b019bc703661f350407b8f75053837d247f773819b71d79f08aa44c4240b1c5b651e3d0aa013211910ab905bc074571c1baad4d91bb27e3bcb66ae18cffdebd41e7423c6bcb1fea8527b6dcce68d98980e88ec99fee8c15c93b5d40e6a28b613dcc0e909e5f508075f45ce86936683964ce09d11ea5c622861af155e0f135fa7cd02d8e7b60928b9064668e7c5ef82c5584eb2d14c1b136b3432b595831476b0933d88a9555fad85e16140d56d80e43e99110f5b1962df2c4f8d054b210d18ddbab46c6603a35bfaff0cd91fdb944e9e7cf6987f8c610ea0545ef2907596944edf0782a8703b3dee0135fcace7cf1aa95bc85bc681eb17db1ea184755ed0849c1a6501ff11c397c3a4fcb936a8aa3a93c5d0a7c93a547e7f6fefe067a078f9c610fa471efe34d3841757211afdb72fafbdc1ba5ff1e912c8c799a8ddcadf740c69e2f1384a055cece7f399554bd1574966d851b6a9bce4ec87d019217bf7a904b276913cd378a1e9aa9e4989a8d2eaa90d1546b2316705c70c6e60717b7ffa29c1d5468a831458491324ff72abfa1a49f4c7c8b65699212634d9aef0d72ec5d1d68f7efac39fd5a90f1f16e5e065cc9a7516d8e98f5a03b3689ee4dc242bcaea93f68eb6abe484af999e9e71c00b50cda6c9a5c99ef0cb213e62b29c9682c09bd85574c821b35fd0b8026071102eb873d1f5174abdcb51824009ec00d7b3a11c4ec50cf2fef187811c8249ec9a51bcea86526e04d18d53c4f7b76753157c9b397e56be0772e91ef8019b1c27fa32b651f3060de60728901600cf3658d8b1a568fff9497fdd453d212db6af057a2c3ce541c6eb0a3b9eb54f23e3ba2ebdc60b14fd075581718e94078465250e62d08a86e8962969eca5eb60b634629b714db09b4e896112a6bdae09f5abcba13e2bc94f0f919b2f3324cb9e3d8e1cd638bc9951f94eb0ee99fe37b94c0b4eadfeabdbe771d839cd8118e2e02d5619043aca99e00d6be9861e800846ef6f1759ee8790be87570fe5ad8c396ea9285f12885e7c2d6bd77db5ffd63dd23366945198fd5acd244491c139141589cf8e60d9a6e202cdfe05375ef0220a74a7f71162408886e6c630eed0ef549e6b76c10636596ecb48e01c55f409a93f80fec2cfad8fa9c86d68208eb69d2468fe8cc048c6e4c0c3ed2b690a2f2374a8803d99b3be00def168d3dc6a95e110dc68cef7ef98c1d139532c4257aa8bc181d1c10d8aeb2b5ef8122764660e6da083ef1a7d6794d0c0e0b72b520f35b6b064ddbd371d04150927a736052a47f5a7235f6820b7be2d4fcb3e916cd78efecc34bcb0e72166aeebc06800890011011482e010689734362141f923eab1f500e87ce1d6edcd459f71b973b9a8003611e3e105f6839fcee911feae99875fb225f69f987472012 + +# Garbage bytes added at random position inside signature +Params = SHA2-512_W16_H16 +Msg = da3142f27eaf1aa3f28a755a4f1e2327e8702761e4e5d597ceb6b880776d228461ce5da7f9c4d1f78a3cbe10b31a58f34aff39144dbfbeeac0fd81d92580a555dbe40476c745b1c0b5a5a095551eefce0611acf6e2ef2af882d6fd180d0d90d16116f00ff8a16a28104c02f8809e2a8f1ceeebdede768f93857bf00388cdd5919154031a5d57f5168a019e2bb41146c9c3b2498696e7e68b76b70e580cd0e3a32102370c95ad19a68f231124aa4a0f64f75aa73d00b7cb11b57bf957bb2bf43c6e667d41c7f45155fc4512dacdd168e982f8c557c76b92aadcf5c31f4314da4f7024c116912e549e0b55b66560ec924e52aa01b8ed607e7dd6e8998494efff3f836335a4cf8be7802b82a6197e4395f8e14847b2edd59bc3b25547af166a9fb459dc287d39888df3a6b2e4eff2daa86e73a497a900900226223ba058de997fc37e1dbac9f14672988306 +PublicKey = 05000005f52727df94950dd68ef359f9f12b18757d423b3dd544f222dc9273cebd23aa705609d32f4a467c066b577e0fda4dc544bc0f1150b0c9f6fa647b2bf5a4456594691e7369495bfb858b7f4802d34bdbdf4a1eafa35f64cf163c6d9f96a180a0370b405212562a67a275118a219ad088b0540d3e11f8aa79884c084e622ccc446c +InvalidSignature = 00000000000077c19178e908300b5bfe5103ecf766cb6a83c8d36b10ca696e012d43bec5f29aa46193a842eed614cb28ff7157ee1ae4b3e1ab2ebd0853508858078c12269f9269f57d6875a43edaa64dfb845b725da189f30f6c9507048cb163d0c2b3754aa32e8b6fd7248427137bea99ebecce527148b5b045a7d78a30a1fab2c7ab3d95f0ae3aea7104efa54f695443e33c257b7c64a1cb9fde8b8347ed774da89ab076366a273ec98d0cf4de2a2f2f21a0fa04090ed63e4cd3e18241d82f68954f9fb30e3dc880d3cad8952b301a15faccf280e1271950cbb311505e889f5de661af293cceff5003e96729d541ba8b803605d517bbf38b748a09571d8e4843348d8900f12b9cab3b87a96e9e7942a483a1c6a479cfe5bc04fc671ef62fab4875ef7930253313aec96fbdfaf66e80be9b6e954fb65f61c782816b079beea302b14079845eb0f390b757f94e61d116092d3d39ee06da2d512ca141c221a78394c18e5cfb5d8269b8b083507224376c24210acaebb00a7d5bcdb5be082bd70b537be53b9b07649fe31ec0698d033bb3d471bf7218909cb20ada231c7709413349e72a301bf43eebca5fda1bf4c9e50daea3c582870b5525c89a2d9a4b9f714c10867161237e492e9809e7a6fc1a86b39c1f9879a1a6515205417c8405711cd4e361ac5bf158ae7ecfa43fa409d157dc541cf6afb4fc7e7ff4b515a9346e84e641003ef6e9e46c6a700432aae33517bb4cf22fb4ee1391ff74e414db7932dce20f0890ce0a182854a96fb0ccd1237a7ea40e0fb5ac1fd578610cadc2cd3d8ec2d518e794773174f99afa7b8a2e440e2f7e7dd92a034041b6a25c2c826b9e9ec4c7b194da9a50e16729a95f5912ddbb25e36ba8ca71449dd4a6e15964c9f34fcc35bccaca657dea8ffcf74ff618e1acac0ca005719e77d46db19edabc151be8f5fa9c9525e35053b7e718372369902cd8f4a371dfb79b5eef4d1723984e7975f6ba61eca7eb4a33fccc804fe687d3c12c459b42dd9294b6f48842fff434624fc7674ec4affda193575ba4dcb088ab3e34ba42618805a2d9ab1ed6ac10eeeedadebf8cb862f34f3a0c0017823927f119d1d3df780c4cb8795867cbfe3d5f79701dfd67fc357b0317b1bf9131c8242c7cec12adfd948c50b815f38119629e29e1ed7ae068d6c8a1985b617a8011f16381e66db5864bfc08ecd839a2a7b406597ab1abaf68285fc2ba689174d12c4234e3c663c79704553dfdd33b45e83ff128bd64c535c54dfa3264d7156c7560a558810e432138597273fe1a397f8411c9e106f1cd5fd7a4f10dc0338bb432d7e1ff9aeae54236ed85b4d19d921c657abb0d07aff3ce1897c5af6f812c58e085f80c4d9af8d565e83b0e00e1eed67d8efecf41954695441e53b7567fe3320f030e2d72f20fe4ced5f779584f84f0aa78eef4d679d1e48d1ca2a5b09757436767701bb4119028437a28dcd2d76526c9e6d070254e740831c328ac9e3044efb3110d738eb5989445a6ca2a1cf3b1a2e50e79af40972770c2ff1ac978107a96b3f666ca3fba772ee3fe3146ba8e6ef925b4f3e92cea57eed023f7dc83fc91cbe1aac204cabc144b304fa4dd46267f632421192beaabd5bc91db162b3e10e12affdf5c1465df05a384028d3a559d61e4498731fbc94170fad0ba17f0e703b3cfd43cda50ca477cdb04196f618f5703231eac64cd84b031b367351b9c6a04a64290678ddaae54b09a6ca9183b7c2b7d7fb00e056bed1404de223e18b4c9be322eaf22ed03f65f9b8a81c770402a4f149521d31732b0073131be837ee54b926ac9100fc4cc7580382c92856e1c7de47f3ca282ea22b246b7eb02e927f8f854afd96a3f392c07751e2929988e2c7197502f90492d236fd69317a49998101588d507df186dcc9c35c33462e99a0ef0122adc5debe9ed71b6c94b629bc9b49141e816b311462f9cd192268952871b511c9981df810f421f790a4435e9031138ce1e51f3113a9cc0fb1b4154c3280c3551532d161a3c994dcca6a45386ac3cc9e230438968c54237f21659c8e6c84e10c4344a2e3e02745e1ef5ec16ca68fed3bd006ae604963ca2e8e4142c4d4034fac1031159d2fd069f9f547984f2a78234757fa1c66ae3d3d6322f7401251ea8892b4020d0191ee265ed53ca7ba1a2c2b031060b15cd284e74a98f727d8a156d10a7be3ff9222506b76894b632d9cb2f84763b9fc52917b9ae6d4c68cba1345d64e1817f17db438e0ed406c4efbe11ad7cedc718e63177ee4b220f772a28aec73b376f2c9541952ba61b705c123bcf4909d9a4084fe23f889560f4a32604fb5a55d6f171f5daccf91ad1b0806aba1d061003394a8855dd3161069ce26ad159ec5da593d09d530c53d98cdbb8cc77dd3f3934dac7c7b4775bbebac379acfc4027475d2c48cc1d0484eb978cfbfe2c70300dfbb15fc5c2b9afbe4c38fef20cd3b230023dec401a23275cf1410c4bf217e21fa382e9a47ac5ebca7da7d2e9d16a8402f0aa04742b89a3d2c820d87844068b9dae642912642246e7a0a385c03735752aded0a3baa15d8bb5b573f7c89bbca5c19c92ddab7988f0d5dddf68e968eced2839c6bd9c562e55fbab91001bff4140802823f4335788f8e04a4d192a904c670ce3ded5325a3d72b1a131c5d8aabd1ab7a95aa6efdf4db2a4b135b34696bd0f4397913a527b8f597380cb9d31b163cbb5c848032556d0053c5ed2001dd581067090ab254c5c002029863aadbcfde22ec26521dccaff6432b8f806a5bdbc81490ac882885b1e0475fe399ca72c35ba3d202d79a0ecf2a6b70790ba32e97a2daddd015baecfd1f7820545305eb299bf23865642d9d7bc1654dc73159710ee7b2d4f1abf278690fb8e72cb4d65207d590e9dcb9e97a9dc273e5857ef054af2f405f4d1b78e6186fb715f86998ce5f1190e2873b41b457566e00a9b9da0e46b7fd53ca75ce89e419af946230923c39d6cda075a07c0961b70a57047ac6884a651f5b324bf50467f6c55b142d3db058b8842a1d04d4d7b5ae4b47448a6a2c22ba56f90d4b8ae2bebfb7f7bbcbd5ab52228e8cd22574650082e8c0803d3e3a95179444184ca47a2840d08bab97c9e9ae649319fecc5e6b88e4cfe30c3d3cc759e84256d2134f0befdfad900aeaf9558f4cb5b2966855aa14958c43bab5d60cc1ac35b40a5c079c241e5fc09d040760a79a4c5aa32a0fd673fd4b598bb125ad7b30cec8eab0edc180d65c13e8c7ea618f4bb21af82e504566fb891cace40f5a732aa1029c8fe3f67e2a360afa22315430377bf8f3074daa7ac8d694df16e999681e484cc30faa4e3f02410fc8f0c171f3361d07df0daf2ea3104b9688bf3fa18718e58aa179461228d26380c0e8680b89da2e01ce9293564f08ec306c602d0ecc4e7a96add0155f69f32a1c4ed96ba80f2b5060959d4469145b8561285333b82c09dd1ea36e2baf7917a68ee16fb7e1e8ccb2f4972a74ab4131cdd8941ace4f36c1243300ccf7cebfeac1c93feb9745bea4234d450832b572a7e19eebf5f9ced91ed0ddc56cb51b355aa1251f855a991ea0a8ebc564b08161da1520b3fce1c99d0efb01ae05cbd3b81336c518fa6c21aba3b31c258e11a8890ddf88382251c1399b3b589d4f05107454936850cb10e3114379c32860dda72f9a1f3a0b93969cf03e8b5fcdc25d85141789c52f4539f0f33e0bf147343cd3015e17fe3704c9cde2f8814825fe434dd22cf4696cdd007190376a0897fb732de974b8cb7179a923f817c0257068e0072f5eb371321307abf6b2943f282ab7a3d5db3aeb793a9a5b60f1b41bfde8198b37fbafd967c588660c2c6ca70b0070972320425ee89d1116c97270aa8558226744cc6c2ad35bff5a6a09c2a71a26ca48f0cd4fdc4c12c636fba061a0fc3e3664eb98052f142fade40db598249e96b4b15c06932f738d0909b5990118976c58f64b7159cd3e38a259a0cb84616398e916134bb8e8a40f3ee8e021cf0851e1f9e9988263fe8a7fc9f49d9eed7c9e6ee27b52773c67fbb8b1128f3bc1b19a0121a8a1c9ea3789f7b1943f539e8f32b7c01067fc29f84136af273a0afd85e72858f95dd24e32d92a693f6a0a9a844c83cd8a7cd20fb154f70d5fdc58427282a348f65f982f0cb03ab8e102c6fd0c6869505e299b27e30f41fc95297b91433efe03e0b29cf53efe4fee9db6243e26d90014e9898a1e6df47e4f91667cec3a8ce33a5b66c9e334f2f430f021f9f0e9acc250387c3680f2a8f49545290d7b4c2d5748e6fc8387bf0a3df318866483d00e88c2b2c4022ac0a6c31319792a7fc0a54f69711cec8f61f2c9497278dbee2a74770eb1753c0092317126e9e6a38c14184486823636cf8461e55bbb6151104a55d91c97ce5810b86ebe1d70cfca517c54050cdc8d4a036781cb508ebf5b893193bf19cb88f0a580ec382c32f78086a62aeb370aa2e30d2ce593421809d092e241bab4d43b5945aac05741c8c7dcb38c798f54742b829421fa91c804a5197828f71ec276822bec7193a93a738f588fb807cab864c4d331a7bf1913144713561bc5cba2b89c7a498964b7efc780b1cfa08b20e4a54b663fbbbc57cd1f0e187818f6e272c3563d8470275433d0a0a270ff6692df977a1f71246b18fc87a08cf41bcf221e6b99d2a0d7483b869f8b5a80009847c25e3d7be4c03d4908ef562cf541e5ea38e61a2aad5a759fc2bc8d536ea4cc0306343295e5446b951f399633e0603a26022111fcd19cc88fce9984a577fe1753309ac4ce8fd7e33d113890fc1ba3d1eb88f6c7b47c74a7a274d8f59058215ae3b6a81726ff33061cfee05f64a860a6f80743b30dfb9ebe99be83fc5e7848e52efcf23b0cde37e3f3a6328d8dfb14eccae3f28e4280fb8f2a1b152f5407ff72b2ec919efc69269873e0cc2173a542a7a9987c27520528f8eecdad69e0798fec4ec2aebec1083c263c83c0ee2926eaae98926de222f6e7cb79344df8e199c9b2a8e1e5376863850b1f6fe6666cb529be4cd078eac355eb74a110d9d1b650f52f775d4d3aea474c2ecb13fe03d203b45952b7e701480e484df8fd1dd1094002baeb1684802c40762119d5a90da377bf8c32139fb60436bc6095d1084275b4e730e65015e4630bb7d8c515f4e5bef7a6804e200a6f7dec41f5c2f02a5929f15c52fc9df1295f8363f4c5b456cc0159dce58ea22549daa697a5305c35db191c5d9c78280397b7c8040010d039321e56242f99da9ad4f03fdf52525ef8873a6a9d5ab509a177853416e7c073070ca9340b08b015bc0d137ac920a17f34a9e8b9ef2a2f878844ca29ff247e04de9ebd40bd3ce9b0da58e7edd663c140b2a66994404bfbc91b8d4239686b80230d7706643f5a06503b3272e7da98ebd459baf85382d0164262facd6fdcf3f5acd6bd9799c5acfc8ab776c260a781ef9f0908b5c532958b4ce0aff1bd3ad66bde76eae1d3a23cf67e089f98315c84ffe60a36aa80db22a0dfd49f02164f7c273ee88e7e64a011505140c33ce73c8459787b0a3d2b32021fc04d1257882e8afa3f5d0cded2341cc0d618e30c42e9668fb72b6d479a86b91beb13078040e3f4fd8db835917f161dcf559bbb83b667084e5f31216d979c5a826756e3ccd410581cd60427059e3c65f335033729d99e19cb379ff064284da6b224ea668c1755a932805b9ade999b6f6169965ef95c3f6b4ac5547f2fe26ee35aaf409e5caeefb5008b8a5db89d8a6921ab4283a47fcbf315b9259d1323416ac941ebb6a50106e18d7e98ae980de70b7cc9e12812b982049ad76f2650b314a1531fca69a91af535b4b3a5c71c17f939daa0e411cd7ae7ed6d94731d51750cf3595a2b4bc1ba6483e814fe321be8c3885bd0219395c7dd4c65a16ecb0f1c254336e6ebca97849b63b8130089ed00a91633ea93fe522105d84188af00a25415b715bfa1b9a201a6c8a8311c40c8d1ee22f9b4d0b6d61fefe37e7e8bf8a26ded7c371d016d8b82e4fa803eb5b6e7ba5a23e905ced559d836e8cec459f2445bf8b44edf511c10a481641f56a42e7a0c1d5a848333d82fbf5d733c8138a8a42de0ef85a4941f4949dbb7a079ad1810cc367bf01265dc0b8a09e03ca87f32cc29690d5c22f9a6eaef312f1c302a4220caffa68639c7301ee398f327ba225204a5717d75b8a346721984459df6d00b54cc73793a1d89a78407c7acf80e0d9258e7b72b40d5fad963cef0cde9dd06aa8caf9f0ddea56ebe6c29345dc9b3df3fcc09cdcac28943127600ca3c7c40d58e4364668315c7b29d55f7d959788d6a61b504a4861bc8faa43fb082c6e266c37946a92bb8c6dd3f6393fe68ce3d89d099a314a4de0f17773439295b8a1c4ed73daaf082d4a9e307f1ccf5a9e79466f3ae888af4b9b8d19317b10990951663ca596c9cf063a5983ab3d5c03174b7dbab8f66e49bd78c888ca4a5385bbaa4eb14c6086fbf168b2041cac2f239e466f06c4ab84bd267b770289f590371b36c5fcd60257d57b747cf5220e593ffd0e3e002109e3f06c1c3783ea0f2a44c002286a3d5fd68472ed54a00faf2927ef4e4ba91e16d84030aee5d125c301e0d56c0c3665106c40a30f2d5c836e3259bf3e0b10dbbc7b74cb46141a7b14e95f4fc30ff3a5fadd10da97c099ddf07a9bf87d3599f26be7c83ae65dff87226b45edccd02dea93406aedcd4df8800f9fb14a6c30884c3b73954ed02173242b5176beaad1a8740979eac10d46d3b64e4a2dab5bd4979b095be64d51661eec5b7abddc29e29896cfee2c4b58f6a092f8d6cda954d979c46cadac5ea6b64bdd10734229300d5320aac414862acfb760d1af6ff30f2517ce820218a7b9f28423a477b73d220f5d69b949e78e98254d02460f65c21660cc5b44155acdb0891a28429fc37053d7f2341fb6a60f58e744874e1379ac1f8f44b5d5afd848aaaf16b1acb67a8267959fa7bb63e13fbd9f58b5adcd7dd88ee4bdf3522c517f29b43e581ecf8e890604336de77350df1e7381a0c2241bc954624345e8acef45b97a06f8eeb9d7827a1820651be6aedac0199de93aad5db3bc387524fb73c3db1bfc2a48800adb3d2467a7261760e79d63540112d6cf3429d82fb49f35ef8e31a73fee72ba850f55d1322492303ab7162126bdef2167a3ab60d861d5cb95b7e690739fa690fba186ff812f2778d9757ae581bbcb794fad1ede2c12435083355c271fdbd0fb32c6b585896481d3756a046454f5d2170e7a4d7d0a92ad40fc213a228761317cac028d8c1049992ab1dc11b921656fdcad2bd83306c0606f969069fc50c61bd1549d8090b64cc0bc901d954a74afcf61bfe961a6fc848e67bb40c4b11fb0c139150b074cbfb6e85d0a0e5cc4586dff56a497ab93f6d841b4a0b3855c9798cac78128c4e44e4934c398fedd3fc6cbc095790a54434a4e53e80a414416ae48145dd0180c6a69dd8a7e92e36b871a0f9779e556aede7b5a6ce884de03a5edac26f598c355edb52a7274c1cf1411801521bfd514b6fb7435447ce49dac59e8f8e12973a53ebccf4bdc910b823127ee1c85d008d89e16cd576bde6deb1f044bc69faad3e7870a4477abb1e0ce41623e17ed86a7ff0fbd6eb6f430b88a2f84fa7086ff7a4c938317d4a617a5c1a0f88f13b2274a3a34d6403cd4c37897ede10ecc1889b286b47e1766fb1fb743ee5c2e3055534a3e77f63498a24aab02285d70229ec8e9b14936adbe600c12aa1db42665d94ae73e474ea6447e138df9bdbbf09f490d9d8b760c73be81239619fdf0825c1dff0471d697f3e1c2654c8503b3790e51dbb01feef1ef0a79970eb1496d584e4794a5ddb308a42ffc4200a20f89c07c482c4f6de0599af622b6ef0ed7e05fa310ae5c4b2023386e0e488094b6f8d0cce00c2089bab155c77d7985ec15cf8f8a3edb484091b79a78290b5e526fa6aa7b5e6784a53fe56f311ba0d5c44b4a57c1651bc55a35eef56907ebbe667ff3b6768e47e69ecd18dc2a8eb2c16a5d1a02e52e592a3382806eee092ff0b3a7b4f01f74b5203f50380cdb00295fd603431990dce26892ef72ff0be487ed16d4bab02f3f1c74c605b149164888e91f41a98ff7a9d0df16825332ee6eccf76617851db00bea4f13fd4815bff3a91219ab28fd3d86bad2502797646fa4304818c533efd655b135f41c181e3f112ab3232ba1b2e9bcc45f1379fda4c2a1520629ed65b16a9e2e4a4ba53ea6010690ad9a5c7a9603e1a83305f5c818116dd14e2d45c67e1431111b76ccb2a88fb96930c45477fd75c42d80f3abd34a8e98e57b5bfe99d56c9ad4716a751ea30fc113d7f9586121a7e8a90d69a03fcad9b213935216f7c278e47d50c615d4ae44fd9013aef76981c992a54a80c621926377bdb398ac588aee4a4e549d73c82252d1441bd3648969bf8f6cbc685bf8899bad38342e57c228419495fe907fa8933ed2d8b6e9fef5fcfcbdaf096753a8798ce5439a144bf1f841891dbb433fbf68e4f390d4ca4d2099860e1303dc9344afa42ba78fb549c46cb2443b995fddabeb2a50959d01ea72b9cdc9616dae1439ade6cd2daa756366b92aeb59d2fac3dcc6baaf5ce56a0ba9ed1915abbceef0865e0702004f465c04868e3a23bef7837fa4ec2a49244671d6c3a74b79907d717c4d7b1a22552372f7544c5d28aaa744286962a92e4b1f562dab8d66b4b2e2eb24b624165076616756c6a0c7c4005572adde58817613a98c164ce6ab120237ed61aae80c2ae148c9b3124581e39b1573a303666866516e18fdcbc76a8a0b241a2a6293d12e124e8d78349d2a51019a825f365e19282708e8f0cd0e57f5d9c526dfe1a0ba3fa2aff43f4eb18054b3b5ab2c6a776b213450871df08257ca6ce754285f9890a990a57e37018298d574ee0a85a215255a1bf82158dfd520353fb052ea0765941855c4b74b2eea79917efd7c5f98431e86bd8f9f19e4c45d6ba0e9ee7c2e19a4bf71a2875705e0af19ec6770b5ff80ac66470d70fc8ab2b3fd08e7bb8c9c2c952ca62afd08f6c55893f89085bdb22455b342c5cb6e9d0c3871825f5a923c0628704812c6acfe3b7bef10c93a6b7541d4cde3570c470c07db0043b5ff76c3e07d6e8620a9385bf15713e10bb87d76ec249fe4057a2bfe789500dc4981784d75c078dcff27306c0598c85380d2d8e0154f5b9cdc5789ce0f26a57b3a0e04c1e1bc91b8060692436eff266f7ad73538df445f8b5078467d05962e63b8ef3f3be29869ada3f523d7b43cf7dfcf627058c79b44a5f986e700379b27a43c7e1a28dd2766eb5eff00967477c73a119c25a0b8a881aa31c260946786c4833431e110a8528fbd90dfbc41da66af2f73e0a20e0d241c04df7791bbba8b686c23dfcdf233831c6959f79cddda6cdac622c3c226c55ac44e0c73243a39c7f3b6a8b41eeb59fecb63c17f538df15ec3c4676b42b0da94075d50c61dabef577dac4198834a0a87fcaec3348a79510d4b9c777ac550eb3eb3b72ef73d948b40979fc82919c776e1535cb8f55cab19ccfd407a998c16034fc7c3dfaf27a5a397cbc91177746bf11f5a78725f3f8b2af45f973b276d79b19a5b7f4d2ec3958c519ae58ba4bcf6485fa9f58c850569896cf9b6cda7cae64dcf025d4778e329a2a9e4c5a5febe74304a73924c1bdadc57a8b1719d76854d2dcb9af0f0c308a87226b95baefabb68141eb075891b1303974f70718fd48cdf4d2fca1ebe412e30faa21511257b5f82f57e1b3b337131507f66fdbd5a36db41097722f401557f5fae06d043cd712de1669217d22ebaf8c1373c9b56ff6d2f2c459bc1483616478c3a1dfe6b9cb769b482483350cbdc353e8eb90d09a480b8368af8255322a1c7d552d034060468bdcb49b29461ae69564ab9d1b128386a50d46b39b843936333cc3638947a0dc16f69baa84a78e34db481d1233646fdbdae2c595b1bea7c738cc3a89f133de26c567480bdef6a250b97ece65702242d34498b11237f5d24b7afcb3a2f9d0262535570dce2ee24c84ff0cef7cd2da67533afcbe6304f8ddcec62f649bf032d711db5db00c4ab67801480f178ed31c44e2eecf8b59f9346add7134fc616482d6c100421466e528d0e152455aac759d8d928e375d78878afde24ae811c62f5230902910cc53692c5ecc3e57829a2b35fc662aa279118977804af2c8ed0c6f7cf523673f4df80accb72888b13af57628e218f88634d789a77b4dcaf19de5a79b656b9269a75cf146804a89582d71acbc4836987b7ea527d94bf2c856816a8c5053c8acbabd74c0f54bac15f4013344fe90d04a5306b4bd68bcc87945858c4e18580574b900940e72da33c4502841db30a85234a30c2a33761ead6101d9aee7e41b59d984492c2db06ac89727a47afb49a732f571e4527c583b74bcfde94533b3b1ba3442d0bb961979364cca21816002665a65bdbdf0bd7704a5df040644dc392af1a0be5ee7f1b2bb73592f02ab0361ecb9ba22a149c9d850aa0ff0bf0d77144eda9b3f7b5d42afb3b108e068816e4bb71df3b2eab4a84c413316f05010aa0471aa128128dc0b4aedebe3cbb50dcf9c756b5675aee1ad45a72ab627c041f565cda0676ab1bb53c67b4b13703945751769db5386697bb39759f7c5a0c4fa3b7bc729f9652574ecafc97a2feb12d9edd39a893f754e380fbf84be1c4676e284cc34a6b1925ea85b52a6cf4a7ba67a0946d40505905eadd437d6b860b04689822e5078adcc5aef0e18528d4ed6431c9a73d978135c1d27bdb0c454526448700f963e4dca830467c0f8cab060ed1065d6c21b9c8550bea9920b74484617d053b4dc65f86467e9e845a09c04afec58591700af994e26da470834c184ff0ccc61a2b22886bcd52acd3eb7e715a78a3366a75b65bb36d20b63fe134ddcb0c15b366797360c046e4639e377ee4155da0e0f1b427c79fbf442fba4c4c15140472ce9be21703681dcbb9297e02f00b53e5d896a4e993a45f07532e4389c70b3f2185a594ce85286a1bdddba4236bdf07cfced5a2a13a27b1f7b21e86e19c0fc76d163a07b68d3c04823d5498eac0fc0dc708c7242abcb7435151e7883fd6a559f56696ada57ba47bf608c1bbbd96555fffbc2ac6159901e73e320c3e422c17bba66ac9b4ca48770f0a8c3eaea066f25bb1213d1780c37c0e4f5e1dd14814bba49a27d05a9dca82af6d2c54e455c0304c3559f23555d7a668ae5780ebc68ed3422b78ff6a3087ac370d047d8339998971d9b07d1f73d7af384857772767c396cc8880fe2bbdce3f133b7070db2a8e02cf6379c5ca0ad6469de6508c5e8aac41ea1e13ee9005fd8007304d10836d625b9d7179ac58787e55d7f73cce7c2b0c6ac834a16c9f17d6e1344a5e975c08358032aaf18c45b5bc3bd6c5288c5c9c73c1a763335d8e6815de04730ccd0e7070bcf7cb92f1aa6b549a6a8350c685125dd1a1c0f1aa1cfcf7a81e6500fb1567e46bf192d8a17a7edc6056fb682f40c11e6c6828978e9449dd45968835bdcdafcd296f2e201814b225cee02491b851c1306e32958e65366c6daaf3933f738f44e9367baa80fbbb561365ad8d5fa49540863e83e222be0db3b725681f6c046031189e229b20450071a00c5a39925345b92e04e7b84b0c3f6e9c4c67e4a2b701287bdbfac8c3a130f07ede6dce7f985008dfc1c5d10ed7a768990e5641b4206726b03030a7d14fa4d49d25b03ff9c9a8bb2ac7a9ab4a534b4bb60aebfba3f9a513886006f5564f90eda29bad8cf78395a3fd89615d9012b624d7bbe6f3424294c7a243dd604e19de387695666a00457ab729b89b0bd29f8a417c56e04c9d266f940b545f8d2e04eb4a227fa3d2a119c3407fada28487a5fae09a2764fa228f884c06d9fcc395dc6992cb2941dc545db2f40066deadbeefc0ffee5782fa1ade2a419cdddccef795b44cbdef290444e968c5b1da3f405209dab85a02b36445c21d286de4e1ea3033303eb522f28c3e0846c2f428f25933e67b71b324c9fda8db626a2954d81474d39ebd380f0fe46fca52002f4012aad7eeb657fb8b8b17e2f353f6e83a09ae80271f378a542585621f62ddfd6c5f44cf2eebcdfd1feaf610b0f9650696b4c9f464c3f0e1d792784b24a65d5b7cf1787aa172b11ed4b83001d5dedf65f8ff00b68d2fe9318cf2da23c232fe51c8009701ece2a3777dce46af9399b81a8fc655e81eac797eac705d5ff14ebc29af7366b8c932ad54c0ee0d5a66474225643435bd9e7854b2df2e881a9384cba3470d6355905f8e62f8ae11786c3064ea353d4a24432a294be6a36f85093991c1c6081b60aedcf561d816e64e3026504f7e7a3db302f9aeee209cfa7d877c247e78300988c7377c0c674c20c420b6dcca75b31702da6ed57192991bf2ef54a93d531f0ff35b9ae4375174cb781ec600163bc9fe4fe36c352765ec0ab1a2c5a7405e3a303f7ba575e54a7c304a1a560a05d1bf3829571b439101221563871442e9db42da2e7afa285da8fb7aee89e0e8c10c4a8a3a39bd612f77413f9d42d504cbd3a4f36a67b23900876101e4c87fefe4dafba236c80fc67305e7ee368f101501a49d984c29ba222b0fc1c39c0a88eed9e0d804db580639b94c2b96d8e238425ed9dba2395fd206eda00816b377c72cb131301658b437fe9352c2b91aa3076a18f8873601a38cb41b38b5adbdecc06f62c7c6e850699af1537a3e6c9fd1eacbc32a1b0da1182c57ac9de12f8c07c2bb11aafac3c5739fa729297fd87fd4000c91c70452c9695a3b0a3e124495887da93c9827d00d5648ffe37ee72a636f2dbffcee65c984910852553c376b3a51836237a61ced8774bca2fef758de5e948bda7231b1c3f6ebfb214d813dad7fcbe31e149302967cc9f49acf4d94851d8ebdebdab2c23c4cdf35623fade9f39483403fc41138f270b0c4976fd5ac6a5abe842ecb94ec4c5d21638d8f6f22646963d6c27042b1881072260677dd5ce97e7b6e95c773db37b3896b587ba93e36e0ba86bd21765bd0ae1706bf1d75947ba39fb5d50d7efa0d6684e121b4415468677ad227d1b984e96bf394c62e2da0912a750453fb908df69c045b65fb762146dd52cbc94cad3727e543b647047592d326e1f3584b141822fb9a272025eef72c9b7fe623ef4223e47fd240a9340ab44baed2b79afd7a1de021745666156664653e189ac8564093065772caaf2904a50cd68d7401c9245881e5cda580f333f04cebf61da25ae38d5c6331350adbbaabaa59273b85c5f66f47fd84f10a068815be14426c18f474b5cd688492b1a437af153cf945f612eeb37e024afeac1838ab34bbc043ea1d94f277adc8b7f987557179805d0c2dc8cfab286464679c29a9199dd6dd8af663fb3cd2b734a43613b13b7d3cb23b7c73454c6a0dff05f252fc + +# Shifted signature +Params = SHAKE128_W16_H10 +Msg = a2a50241278f92c8ad617c84331ea21c60e92afcf0e48a714ebb75d0120a9d8dd0556840e3acca6c9a86451a0d5be95c2a25ba8331e8ad9d842a1440e90509ffca5ae64ce06a8f5b65dd852b69e8b88735022f520da3e29d99dbab904646d8bf58d3344048f279aeb1669f3277f0ebbbfac2267c2b9ac8b989695974adcb35eff3aedb675eb76339cca31d6a975a2bcb9b37d4e9d89631543df3c970b141c039059a8a7e648c814403cb7c3ab0051c051d1973c8738e6b6539f676b8af827bb3f33ff12bf0b063bded6591818100f70cd396ae573280acfa713675d233c6fd0d2289b7d2f1de03363414bff3f6f4042275b7baf15e3996f75a61b22a583666e0341143560554ba15d889cfd9a589c0b7dd7865a3ae70e40dfa0e0fe35887d2951740728f874caad076fd0b0e8ca4e98b3a02aeffac91a906e3282bf7c5956c96d242aa1135f897a4059c5c85aefedebd17955b8189df68dbc7997ac06c9af18f993fe44e438cdcf2543018028ac893a362c1dd47e155dac60f90050c03031aa8eebb8479c4007fea897e272b049b451183cd9eba34a451c0e1ae3432185ac0b4 +PublicKey = 07000007843b9e633148cb60f2d1a1e61781fafadc60ec779ab380cb5786103d1df5ffc06295d661c824c288844dfdf149f6f0e2578472ca14f920332a45ec6d2351c789 +InvalidSignature = 00000000000013ec7ac6768468ecbcc6e97f798b87c2f7c293de4f01671a417bad924274d81b8f809b1b1c6f9135fd261451c2d107b18a330bd8830e7dbbb95ec6ee84806e414297f5421d17207dcfeaf51f0ff571bb2d53d3f2d943167b8b0f8747e1bab2720421633a36edb43e7689fc54278c814ed6d2597f00706c811c9dee96205df8504e08ef6faf3a2b407f5903c1bcbd01ebb53979db58c8ce9cdc01192879bc555b2f4d6d512b2003b59ffaf0272d93e4f2ca935bb3d4d8d1354119b7b78f7fa706ae09b3ab31fa7c60baeacfed0490a37977a78e2619b7c65d643704c1dba3c4fad4e069fc4e09054c9ab5b8699b4702c5a5ca223db6bc5385337d375bb98fddeca4f7911f7094a04804b00b7adf64701a7126de09dc5c1cb388d170e69d656cb87b54c56b3ea5052333cce09262571dfd28c119074a05c29b392a53945d210f12f82b3b41cf8725f95ff66f0cb3976c58d5a63314cb6ebb47a484d4c9bfce983d4cb38964e33636318547a76f06dbb7d1e81585305c2b02e5fd05432789a622ac48fad9b2b51b82796ddcbd11ead95880d2d121a5f8f197345b5deffde18157322748791e9efc37a4e5fb692878ccaaa454a78c0a9c0957859be5e235865d0e1093c711f14515578dd05f1ece412bf9fc3c1b6497109dfb80d7e2b6a72223ae63fa046790ccc5bdf29ad42f6fae5100b3e5065d2e006986bb3ae386d6618f7840f4322dca4931786d44525db4f05143855e00d19df2f64f00277a0c68f7ffd2039e95da1f299bca91691a823796e5d31625f91d971517ca7173d83bd529a812466e5d6a7c952cb5b474663738a3b6ca45b9e8dba2a9fca7dcd43f452eaab5cb2f70b6cd773430e4ad47b4ed35ffd25857979f581d6b686d06c68d67355364cfa5941c9eb38eb3a4fc0d62da574765c0223cdf284c9d92000f812755fa0ab8c45fc0c8bf4c851b75c4a37261a313846d0c440a44c0d107018e4a40cb7dcff02bdf56c110a2a89d7fb6bad20959ad4f58065c8192331e6e53ad29bb953e6fd1544ab589e87d1e9fc65d7f74df42585d6eaa7b9e189b638c09684eeaf92cc55eb62cb3d1b839a7e82bc1b2a70e9be6ab2a8b54c6af9017494357f5c2699f83c0da7020862ad1eda0ca89e6df9d2735fdbc86ddc6668828970b7e5c41b3c29abc98708499bdfd0330618376d474d6d1a00abcb68c5b31af5cae2461e2a0cc77de4cd7d6c0e6bff57eaa68e92d5a5f3dc73cb00f05b707d8aa7b45a74836b6b31e521cb09f21e51faa422492fb532548b58b0bde2bd70b116f3cb57f10d1bc9b90b6bc2578efed3be054d83b2cd7bc5b543399a6d2f1e6136f60b14cd83ad5a1dbb95a6900e18c1cb5e4c861b8376f0274ce7d8a09772ee28d1ac9e350f43f1aa03673244799982831b8098a0913ec3fe1e8637b6d64f44014545f4ec819c9976a025eea0ec70ca951888fc327859200872a53aec05c6cb05689a5c1c5e7d4089e8725dfb35820a922b0f4c931e0afdeaa964f16871888cba2eddef045fb4686c7e68705fe2eefd915c2ce5332b07684a05c64339995a9c2a534f061eadbf304b4a960da13b0bf1214970dc7e128b413f2b5ade9f07d60050cd4fb80ec9184148321a2b4c1bdd4afd3ff0811eb3538f370a40afdba2fc0a49836f87a5b89f33d8f56682a2b7d93fc26af6334c214663297848ea1caf0545defa45384a0a40f848da8e7f00e67d45eb19907060159d8d24c193dbe181bd7a9424a2c324f667f3775ae65a38b4822fe45157bce58bb6ec053f1e62ec305f58edf65b8ba65eb699f644b939e1b8d1d793bccaa7069b540c477cfc777a060a59cfd75049ff664d29f5b5acf98a4f62333f53b4e36bc5bca9a34ba1353f339a4f616eda67cc353848bee1f05082e565a45045631f351f4ff79cb0e54d202f4c7eb200189a07f571ed1d1320177511b9bdfc78c8b193223765871838dd753869bf2f6b1fdfbd38ad22d0096d0253674e888cda4d59da85d8689ce8fa1df7091258a8d31d0f4b1ab93431df16f494ef9500bc67960ce8d7978bd01f69c28b0e399cb86da7ddcd6686c19cc0bd065ff140a7f80d6ca65c7f850433f32ba844917d29408f8976913f2051bdf248b6a5444659de8caa4186d83b4c35a5f6d27f2661f55d0bff294b1e42160cf806fe3609c977f80895648479e6cbf6ea7df90ce382e1ba75ee84189222d88931b4dd9e7b10146aeeaf3879edb88f63bd45c10ca89b5c138cbe943219be2ba031a0d19d4dc0904a313c0e0f1ba55857073d22075396b7f64ac3ab80be8c8784ede8c731b58effe553ec6c2b360cc2f58d35279b556bcc374b7fafb110f7f5c146ffacca865cb899d4cda89503c6aa89e988b5ccba02fab904dce1006919ca6d1f76dd43757015ce89fda63029f830c883b4f26b176b852560cc29796016b9575f7cbd92ac111a02b530a05291100eca3cbab7799705274b7d68d1ace37a2e369a53ae97eac8d6a8117c8b2e1092784c75cfcfe317f5b76603b174f96bfa4af30b45a1ed51b66e8e1527d30241b5c3662218634c986e1f0dbd6bf781c0493f1da0b0695272c4a6e380c7540522e1bd2fbb937783e16e9e362d6411135eba92ddb19beb2be8c3d02bc681b6be71bded538eab94e165ca4a9b1058c60bf2101b8c845e19950120868d7eb82b1f27d311713d75a081c9038dcd6111727799b10660d3938f51e6d6f712db47d43c6b352d3a1a9d38742e33bc82bbc114bdc74cf7abd6e985ee56b7ad7e031b183003ea83b06592983feb28698b130e3d4432d5323a2530cb36f0890ee0d39e39755dd88d77963b835a02517994b5150be9f9b2e6e4851fc95f62d5723da8357ec0a85dcc994363399c130f7894a551509f03069df36535ad267f70392389d368e26e58a27aceeb01581d78772fe3c18ffa75f53424405f50fd89cd2b073d9ed5ef4dd5974944478deeeb292f11e57fecbf5dc87d67abc0b72cda0aae13ebd5f63a72a5e6a4fdef06447b5c37b578662bafee3ba96dc4976b8ea15e2fc8204d18e71dc2897916ed32d7339c90a334c8fbc5923f3f9d93340493f56a4071217a1e0736f22c07e6cbf43a806965e350183a399f074a849b9d29739372295981d5e9ce2b1ee58881e86653faa4e4207da8876c4912e5e5fa239d071a3157a5b469409c0aa5f09b6e82f388d407cc53ef61d89e8c05b0a06ad218625027b1423913062c53db0ec3db27661c2590af1dee65e3f754daa02244f9c5c0b52aa6582c773a389404ad816d49cfdc8d8c46245d42273bd1ea5fcf6bdb0add91ac359d3b58142591bddef621dbce853604ed68265d1af725be14e08c1bec4a808e08c8ecd730392f97aa7211be8147966a61ce78547fe042f4ff16220693533c800fa35c544fe91d2d3bffcf8ed19a1bf29164885879a568b70ae8b5a4a5e2071e0d0de1c4c9da32cc6bd9b7624c55e0c54f2d7fe12308f20c7d4e4e2ebbfa0b22ee9b671c125cd2afca3cd6bae0dee3bb762c12140573441d9e4bec8919340 + +# 0xff instead of empty message +Params = SHAKE128_W16_H16 +Msg = ff +PublicKey = 08000008eb5c1ced2a8acc48d44c38763d13d17930ad07691572b3a47c5592c90f8a06e4a42660ce1d5972a7e617be182e21d03e990c13f0c3105464393d5fdd958bd983 +InvalidSignature = 000000000000125a24464197533c07bfdb3997618a7ad7c7ec5a4661c56a32a68105337b5f4e496b715be5d6fee41b17a8f2df37e90404272f4be57f828951d416162b949ee89f0ae3228be7ce31fff02b305c9864742e5c8c141465b0fd651b618b40833cb2b9a5fe1dcd998d3dde37af018d185c18fee7fa9c1a97699dc3e4a662a560c61d82682d2f0a89ae6fadf8c436c32e65f11d7dd9ea0a001dbea9f07d97f8e59ed94b0482bcea699858c48c81ce2eed54eb423f5b7123d6fb01dbcd4a45a9910e362f80384a05c104cd444c3b79c50f25b8fdd21abab6087383b7e61f55370983f1962847ff4369cf5063347abedd701cf2491ed5304ac2be20b23f6bda3afd298b2d1b8615d879d0b5e71c495c8ecf1747e46b8dea29a0242473cb5c5bc0542933eaafddfde7dcc92d1ff41b1fa7062893af4b3c230d7c1cd0a05011c7695b259e8b3d229b0616979ac4bda2859a9c003838fabfcabfce3d84621e027a643692844269cd9d5499aca3c2d243025acac0c87b83ff72cbba13e5a07e7bbe0c31cd5e154aa15417a8cd95ad2b42613b3a0e74c1bb7d42af60a2cbf7ad3798d5a60115871163c7147fdf149b291b89d119c04214cd6913e00e0953c55bf094df5682bbfccdf0b1a476af094929e7a05bbce1a221286bcbf50d5f4952b6b591eb8017bbf8cfab70d200a02e9e265953f22c5086c576f9f3f5bdceb6f3b508e13411ee14e5bbe5836b19eb9d7eca74b56b6fa28b4e52d6f08345c0b7e7d27afce847598cd5cc07c3cda08b422b1cda4b617cc03b2869461f10af14162725da1d5d21831f2d769bbed8937d50f2d26822580285feb537372aac72a59839c72d2a76fa59e56dea60e5f9315ca8361e5701a64a528127a5824e2bff9eea76e3912ea83ecd5c49c1c30ded8506defb3ddabce544e57430ecf12d3c5860b9a8515d9d0c7096cc116a044cf4c2b8ed1b79962f0d5aebb56a40829119f91036c63aec99edb99aced6f3b14d96e42deed40310757bf839dd37adbc7903ff4d39e924311b89b30ec2ce3fb0816c016a4ea65a0942af004fd90ed5ad8c10213bba25cf2b4947fd93334413776133ea9b8263107632b53f1707ebf6a672558562d864ee065ce29288f0fc4825dd0d6ff57b2ab87208ed98593513ea1d0bcdea24772b61b927a2ddc72b36cdc4fb62cd8a42e5a7ed74c87aff91ee12ffd8e6abfd9d131dbe9364ff924bc3c229942066cbb651a6e02d561754fe573f4d0dbe56f85599c7e8d7b61fb03f8b30a6f4876c7e60bed3c94c353892e6875634b73e1f518fb0f02d3a9b8022d1076ff72be08e3d8be47a0e15d4477cf33616530f5abb9d034f77959727cd7a17e028c96ecdf0692fbdb3bc4b4d33403f42a0803034fbca578f05ba0751bfb37b57841ed208d2928c3ab83be8d5815bce372f57a779ff353e09458a74cb07326cc144a2e679553427b992640504e27629e42d5d56f461f5a53dd04f0d157f7b2f5ed8f1dfe82642febde172e092d40f24b2bfe409764d077426704f3a26aec5cad13227d1dddd8a397fa76378e7b0586fa9e854347c2022986fedc90c8b21cd4c7c837c42cb79172e795e08d3f760305000e2869a7e26a8609d8bc1a00e9da3534eeb28ba2ae9e48b23bbe87535ad87d114b5f48d25b42609063422db51d093bf66d261a827e1d92d9960b44a551a2c798c60a282a052e6b3a9f3168865f8ccc1e70bae61afc2308e95381dd0f60880206916fd65efbb6ca8d96375559c0811b7cd0d8e2f9032f0317e7148a1903d60922ab0fb76218fd53214a77988c8ae782e55118f73c04c7c554b12df149ebdfd454162b145231d8e92dab7d4cac77bba933f0af94e79a178f3da1a6471786407290ea357453e459857582be19e9c212c3c02e98b6c8e2d44149b569e32005882e38772155ea3e9a85967fea82759b2caca4b49838b44e4837d9441e047f6cd29131c46b27e33418641865c6bdf0495ab575724c500d8120316618da58dcede4791ced4dd4ef7d54dca21dd5373242bf918715838dff41b25d8eb203ea39842c29567ad3883bee174a2f5e3b1eafe1a363e262c4ea834590a64860efe4828907bddcfacc077aeb18d831a7aed79d75832d277508caf5d9bb52f8061a5f5303798376282084a9a94d058bc1bbd6ef59e7a7e72b2a8f503252185d71b787e38bcc6b8e4682691e1d35d322925b9ec954f0931d34406b34200256cad97fbb0b61f9ff02e9f3dd1ac926c5ab17291bd1229a50fd9910b01bc9e3c1a436ea29cdee2cb2e97dc5abc4f77a23d546912aa4d37a88e3d041730faae2cad76aec0b999580cd90934e3253c6890362d4efc6d9f22e94bba1ce853e6cac39e712a5d7777e89ae119b98eaf07fa601ca64e902d4cc3abb32c0543032b93a21fc372d355d98894e85eb0c3af24b102bb5134dfc736c43b34ad6f4bf51fd7bb1bd2f22dd3b7b6b721b62a62967e8a7324da6fc04e2dad5a22df90e0585e99ba6e80a32aa64f170896ce25160e163ef5811451a5ea293ac69f119d273608dd07855281a6277afd92f7ad522958333525973ae31620f3a9331c180082030ea5a4dd45c72944709d36117feec0d5e84fd4e6992daae3043782cc4dfa967a490e99be5b0f4fda47d0990509086b59264e29b4c8d6b0b2af6ec6e1fe82127345a205369e24df2bbf3b33802fcd5f98b532c26286d12ff6fe22c822915d7858709faf4c40b73f9cbeec75d7d64de40b5e87092d93ceb9d56fd8066e1872900dd7277043f733f8c670549de95382e0dea7c3d14841f8ab91ba1fb65246aded467420341890500e68c0c8f2c5d9f51cc1c7837832ffc0a397432f2fd2a1d8bd168d9b5cd6fa7dcdfa8422a1f170b7ffd594c441d88e18e427ed148a8127232b3a9c95bad1ec87f92d65d375c087e4d8761628111642455855f9f56dcd3bf56f77610eb0dc82a6fb287af66a0e848066e1eab783a5a48c70d91e12e8d1bb85f96b02b051b054cabbfd3f8055ffe0c4f79391a571c1ad300f65d1c3ce3b1bdc5882b74b65c1efd43e2fff5c7e649e5b259643cf05efa5510256f8faa64b1e518608a15b26e0e2be2dc4a8d4d77b899bb2c11c2abace3d2bbf5203bf6f42ba66429dc5e5c6f3ecb7cf461d83bae957880dbe952e6277be81a0a7ebd50152bfaddc6d89f8fb68309e94aefc4ae17c2ce5e2817df569f54bc573833145d602913d5124491271cccab45894765902542d3601cc315ff9ed90e01eda465dff20ce3e64df1b257da8a018daf7f716f9cad6eed91e3a31a0577189bd1ef1306fa3af59a8a24baa4941b26c6f04012015f61bbb7e9764e663f8d65bec08411e0b481cfdd7418dedd600227e81aa972964c553d90821e11282ff85dca924fb0d9f160ea72948be55fecd321586a12015f30b5d1556401c5ba0d36651a9a44feb28d4c1b946fab0b9b093825a2d746fcaaa11d95a585e4bd576df37444bac2a4d5c56934df0f66d132910875e59fa398594a062c6bd4d30515c890cefe82ef54d25c5f0e2cc7958ea3623a089f232cd3087fda9c73cf327aabc520db9b73045c6c21f0b6ee1943803c65c401e56af434bf43d0b49e50ff50adaa0502dc0f58cc05c9935d1509d59456538d06a8e937c67fe2ad972a801f1e1aab080e42b23e73b90e6625780318deabd4a05c4fff38bbe6be01fbf9b6723af26f34b06bcd165ce250d8f8b8f00919179961de5e4c03e252d0f000df8def3d44299ad5f1c8f158c9987491a524d091d47127ab11e2d9867a4eb1531eef93238db87d1b125ddd86d9ead8320 + +# Empty signature +Params = SHAKE128_W16_H20 +Msg = +PublicKey = 09000009cfc05b12d6049d4e95bd5ac29c8f7f41bcc09a65c89bf695383560451ce52e31e7bcd7956f662181d3acd7184b66e0590c8962aeeb37665744b41a61251c5a83 +InvalidSignature = + +# Replaced Msg with Signature +Params = SHAKE128_W16_H20 +Msg = 000000000001d1f26d26aa5903013f34ee25652c4b0bbcead8c72bc5e480b9f9ffd740689d0340ef0d9b3b52d41bfb5f53a6054d63ebd9cff5a3efc4d09dcc35f56806a0b6ce490ca923578f759e8790c04fac2a99fcc57fa8dfb8e575b477dad0696cc3cc13f6e6c274cce4763ad86b102ea2a57d25fd06dd7fb3346e9b47b11203afc733ea22a0287e073636d51889a8d94736536853a9ab3d3e21921b83953aa6e931ac88907bd5783831d4154cd8aa8f639b17bc49b2775d3598f60953502e91bf0f87e607c7c81677a3debd50d9acb43b8971c288a4fb935ab3a61b16025d0a433c47d126fc156ea7ef03397dbadfba937b98af36abe868d291ec7364afff24836ca4dc40481adb0c9b80da9d55f30168e4a553df56990d19f5a783823ffa717e46cc10d2d97e2e9a9ed9926a9b81758af5aab76ee68b8777a48cd70d6793478450c53d839ce688cbbcdec81e39ff60698c8f03b68be6c0e8c4b7eee93c7bd692e0f5ab4b8f40f1e0a2fd51d59e96a53d0c856cded47d844452220d1738d18e6425ffff109ad607b1fefca857c06de47f01a4e73b3815f7af332fd8cac5739d2e87c3a13ea1f58f21c13edea8c2175f6414aa8d56915530a31fc4856e1c11ec4d8ec38b231b08f6e4b759aaf19234515560e46485730fb1cec39f4185eda8f52b0a0e558bad3ea89ca728dc279228f3b5a6807aaf598397f6fffddfb22444b6f184875e0e5748a0c1b4454e16ed0d56c46dc12d436cc52b1d2aa67e20bac07f1a778eb6ca433bce5de95ef031aeb46d2b196cbc249f6e1f0585708c3142c0930025a50ab1d6f20dbdacdfd688d87e0b93d2d3705d0a66844ce14441b571fa52b0267f8969e5173551b599f041288d014bf465f41260617f9cb48ba22c60050530d9eed172cc99f90969fb3760ef2e9cac8952fedcffe800a807695865e746451d9f94465cf0655168bee150f89a9c58160d487b9185afe720c9d6c2dc07dab62bfc60fb80dbd7717177c31141930c97485ab9b374eeec4ece18f0d88fcdc47ca8da6d82df33ac46a86c89e31b7f5e0f04c64bc88c7631b08e857b8c39a215852d7cf780243ce568657f062878132578e338969bd3fee092bcd72865c9a6cd5921ad50796dd89ac76deda9f2547c448d534fde5b90c6c412662c7e5e3c74b0853f1eaae3c060b274eea70474fa5dc1858eee6aa2e8de2448b6555e7f081ad6c0f4c82d0ce6bdabc24261b6a6ea3c808d3da1469c02650af48c12a1551977c7fc625e8a6f10e60a99f4fb46c8e31203b79241e94d1750603e5974246b067e806ea466f2c0eda1f92875e3f7fef0408c37229d2a4c0d4257e41ffb2a67c842aced6e21fbf1a937dbb7deabf150777013b0e81b3055ad3158be38e6c7c79d03dc18815fd7712205567c204f54b1fdf7ac9808359a65838056a757d05443ee6cafb23e6244e5d4026ea968ba772ecf1b16a0b6f1a6e0252a4c04eb9ffcb88aaec9ff687b8b4ef4c984d31b572b61fa4265df6b0e37e5187805ae496b9b1d0a1d62e22c31b628ae6a922ca2b0cfae097f86496cfd294f6ef704b0c94cc13195d149692ae4698e9c3d7bce35535f305dd7ab39f474eb497a1ad65865a915431b645a7fd62ccebf9aa7d0df5ca034a99a368746b8d86db8f0d3aafdb0f07ab8d59159dee81f916cd227ff3530628601ae8942be49287e6259cc701b8eb83353226fe523dfeb789dd3a4a4dd93a48e431700a7203208b6ee0984f7176f8d151f1cf79b36fe767b560b7c07fb553cdf928c940563522e04fa46bdb3cb5ac4067c0288932f674571439e570ea2eb05239289535586b7bc355c9f92c3fe4a1f5785a9ec5c1b1e1577e842dd93bebcc510c5c8f36a402f40476900b7a80f9f71bcf51a90a4d868f477d7458ccfb8902b13ba9556fdd553cced8138b5e470fa473ed0cc0e6b208111f21b48252673713c0ae86ef982fb184dca2f018a9328d2a0bd37a28ea2e73d65a2e30c4f659317348d8f7c488ff4d53b2feb71b88b228f5946015658239a64fdb93004118c0f193f12ad608ac2e245346ad9c89fe43f7316f377291c5f9d2b5476c3bcdfe76faedf3a6b8eb52e0234f09c2f285bb10259c9f4162a74ff0605fb91bd2d4dcd3f120b25ba288354f6721b479d4308354f751aea35fe4951622e9e84fafd3f5f6046c877caeaff15685a73c1e9dbfa435bf6301f2bb899f88564e1549beee24c6be52b2d89aa2710f02e6bd00260121d0c88a7dc8fc7e6b8e0740d4ddf8a325a5fa78bf95874fa22aa44006b6bfd5e84605b78ff0190a1d78d38150baaea990184dc39f29df4b3c3cfd613b3ec06a414c0f639f604da82303cfe9522a54969a6cc6278a6d10130f32a6d1ab2313a803d6986d6e849cff1b8fc997172eb57f06e18179debfe4c8c79f572fd9d56f26b35241e9bcc375a5ffee6ecf61a5d446b37b2ad964905d64a8622e8201e1a53d098269f1d7598d5c915061dc2a5870c08dbd29e01472921fc37927c0e79443384b71ed2eb8abf4d0e980749c34578984fed9fb7419896572e4f93facefd3c81081e4d10c0011340a4a5fa68f9aff536059c89ce03689759255e0e5687ea911ae065dc14c2526416d25a08e2f8c76e2bfe01b7ab932174b57b237bbed5ba768b5c5c61718f87f7040767e4fa57f8c311fe6394fbf8c73662ae4d490a1410dffc87eb6e902c311916c63e111e28ae36ed264b69e459bf6710993aaa178c8158fce5df529036d3bfb21c62c3d1a6ac350126fa9405eca2230363367dca0a1dd49667355ba434cd55131c03674f3a37f88d4210294e6dc346bf159ac2f28443d11396b4df1f2d033491e5a89baf50b12cf87caa33e51a132b91a0f60bb9d58f29d337e8213e4aa5afe0c8dd712a270a96f9cf681026c2f00c5454e0fa6bd2034c39a872b2fea98b1b822b73faba81df9d141eb13822ebdf270764aa350fdf3cd9a40a77c2e25c1e7a653dafee4c19f08adebe387afd250e0da4024c2fb4539e78f62b8deba0bffbbbef3ef09b9cc3196d51ebf00414c461f059abad380343cf5a303735520253561bb6ed2f6a8542cb64a1af0a4361653550c4b1559c80354fc761020b10e12726dc626d46bddab669f6015d83b097287f3ad7486249a00ff88cef0c2c1920839b6e0bf45b467d2fec088719b12af58065aafa997072cce3fae6c6b2d27bf9ecae46d915d3dbfced5b5906b346810ca8fd9006b4b80b2bbad9ce9a7287ec0c0de3875543471f46e08ddd8222de2a3075783e0c315f09e3f01ea6b2a155cba8a0a9bf41c816f32d9792034b1461a4e3df1331a461bd67ceb89bd8585c31c7fcb2395092bc1c81929a1baa836709f0a1480256f088fb10916203bf1caab7feccb2a72b0bda774125fc1a891b88f2cbb99b054b1670dbf81010b418a263bd170e2db3fb2bf0acef94c11831086d297de6fe4154013e07e58c36fe0c1478ef04d8e4c00df9e48ef6baff31210d014c79e021c9ec55c8c4300ee359cf01754bbf707e7af4d908e0043df9140f1107886e35df1e89c44603693bf39c6eb1ba0074db62d698751d96887e60eea12a31609bef808e8ffcfc4614c3e6622270f8bfea08cd81aa7d7e993d9eaf5ff3b039ef5681a15f9a3777fda9d0669a1e097d55e6f98ff37ac08e93c0c0036179bb60a9a9e4b644b7860daf75f248feac6c093e492665b563e277a32f1e3d20927d0380a0ee3448c22015acbd644ee6e1705393fc7b1191de5d56a076b7b7ee2060b870f6689b0e31162974a7560fe139a0e104187ee4024621726935b0b85d6f5e5e05b65c963a69cf5ec3146570452771befc72fd30ecec2eca69250805484125a58684c92dd5421b57b4130cf52785f3868f656c8ca498f3d301013be5270a634a17ba4096ed142e0ab7e1efc30f9e797636797709d7b6d7876c130899f2d8694bc6cfafd38960eabd6f690e79ad445201bdb8d4da828d0970eb0bd7bb8494a4c8 +PublicKey = 09000009739e954dd6737ce9b7e71b7169afeaf1230a09892455a8e8b4149877fb3c1061ae8f7d135816276cbd8b3540f7efe80c9d91b37d0303b9c8d748576f62b391f9 +InvalidSignature = 000000000001d1f26d26aa5903013f34ee25652c4b0bbcead8c72bc5e480b9f9ffd740689d0340ef0d9b3b52d41bfb5f53a6054d63ebd9cff5a3efc4d09dcc35f56806a0b6ce490ca923578f759e8790c04fac2a99fcc57fa8dfb8e575b477dad0696cc3cc13f6e6c274cce4763ad86b102ea2a57d25fd06dd7fb3346e9b47b11203afc733ea22a0287e073636d51889a8d94736536853a9ab3d3e21921b83953aa6e931ac88907bd5783831d4154cd8aa8f639b17bc49b2775d3598f60953502e91bf0f87e607c7c81677a3debd50d9acb43b8971c288a4fb935ab3a61b16025d0a433c47d126fc156ea7ef03397dbadfba937b98af36abe868d291ec7364afff24836ca4dc40481adb0c9b80da9d55f30168e4a553df56990d19f5a783823ffa717e46cc10d2d97e2e9a9ed9926a9b81758af5aab76ee68b8777a48cd70d6793478450c53d839ce688cbbcdec81e39ff60698c8f03b68be6c0e8c4b7eee93c7bd692e0f5ab4b8f40f1e0a2fd51d59e96a53d0c856cded47d844452220d1738d18e6425ffff109ad607b1fefca857c06de47f01a4e73b3815f7af332fd8cac5739d2e87c3a13ea1f58f21c13edea8c2175f6414aa8d56915530a31fc4856e1c11ec4d8ec38b231b08f6e4b759aaf19234515560e46485730fb1cec39f4185eda8f52b0a0e558bad3ea89ca728dc279228f3b5a6807aaf598397f6fffddfb22444b6f184875e0e5748a0c1b4454e16ed0d56c46dc12d436cc52b1d2aa67e20bac07f1a778eb6ca433bce5de95ef031aeb46d2b196cbc249f6e1f0585708c3142c0930025a50ab1d6f20dbdacdfd688d87e0b93d2d3705d0a66844ce14441b571fa52b0267f8969e5173551b599f041288d014bf465f41260617f9cb48ba22c60050530d9eed172cc99f90969fb3760ef2e9cac8952fedcffe800a807695865e746451d9f94465cf0655168bee150f89a9c58160d487b9185afe720c9d6c2dc07dab62bfc60fb80dbd7717177c31141930c97485ab9b374eeec4ece18f0d88fcdc47ca8da6d82df33ac46a86c89e31b7f5e0f04c64bc88c7631b08e857b8c39a215852d7cf780243ce568657f062878132578e338969bd3fee092bcd72865c9a6cd5921ad50796dd89ac76deda9f2547c448d534fde5b90c6c412662c7e5e3c74b0853f1eaae3c060b274eea70474fa5dc1858eee6aa2e8de2448b6555e7f081ad6c0f4c82d0ce6bdabc24261b6a6ea3c808d3da1469c02650af48c12a1551977c7fc625e8a6f10e60a99f4fb46c8e31203b79241e94d1750603e5974246b067e806ea466f2c0eda1f92875e3f7fef0408c37229d2a4c0d4257e41ffb2a67c842aced6e21fbf1a937dbb7deabf150777013b0e81b3055ad3158be38e6c7c79d03dc18815fd7712205567c204f54b1fdf7ac9808359a65838056a757d05443ee6cafb23e6244e5d4026ea968ba772ecf1b16a0b6f1a6e0252a4c04eb9ffcb88aaec9ff687b8b4ef4c984d31b572b61fa4265df6b0e37e5187805ae496b9b1d0a1d62e22c31b628ae6a922ca2b0cfae097f86496cfd294f6ef704b0c94cc13195d149692ae4698e9c3d7bce35535f305dd7ab39f474eb497a1ad65865a915431b645a7fd62ccebf9aa7d0df5ca034a99a368746b8d86db8f0d3aafdb0f07ab8d59159dee81f916cd227ff3530628601ae8942be49287e6259cc701b8eb83353226fe523dfeb789dd3a4a4dd93a48e431700a7203208b6ee0984f7176f8d151f1cf79b36fe767b560b7c07fb553cdf928c940563522e04fa46bdb3cb5ac4067c0288932f674571439e570ea2eb05239289535586b7bc355c9f92c3fe4a1f5785a9ec5c1b1e1577e842dd93bebcc510c5c8f36a402f40476900b7a80f9f71bcf51a90a4d868f477d7458ccfb8902b13ba9556fdd553cced8138b5e470fa473ed0cc0e6b208111f21b48252673713c0ae86ef982fb184dca2f018a9328d2a0bd37a28ea2e73d65a2e30c4f659317348d8f7c488ff4d53b2feb71b88b228f5946015658239a64fdb93004118c0f193f12ad608ac2e245346ad9c89fe43f7316f377291c5f9d2b5476c3bcdfe76faedf3a6b8eb52e0234f09c2f285bb10259c9f4162a74ff0605fb91bd2d4dcd3f120b25ba288354f6721b479d4308354f751aea35fe4951622e9e84fafd3f5f6046c877caeaff15685a73c1e9dbfa435bf6301f2bb899f88564e1549beee24c6be52b2d89aa2710f02e6bd00260121d0c88a7dc8fc7e6b8e0740d4ddf8a325a5fa78bf95874fa22aa44006b6bfd5e84605b78ff0190a1d78d38150baaea990184dc39f29df4b3c3cfd613b3ec06a414c0f639f604da82303cfe9522a54969a6cc6278a6d10130f32a6d1ab2313a803d6986d6e849cff1b8fc997172eb57f06e18179debfe4c8c79f572fd9d56f26b35241e9bcc375a5ffee6ecf61a5d446b37b2ad964905d64a8622e8201e1a53d098269f1d7598d5c915061dc2a5870c08dbd29e01472921fc37927c0e79443384b71ed2eb8abf4d0e980749c34578984fed9fb7419896572e4f93facefd3c81081e4d10c0011340a4a5fa68f9aff536059c89ce03689759255e0e5687ea911ae065dc14c2526416d25a08e2f8c76e2bfe01b7ab932174b57b237bbed5ba768b5c5c61718f87f7040767e4fa57f8c311fe6394fbf8c73662ae4d490a1410dffc87eb6e902c311916c63e111e28ae36ed264b69e459bf6710993aaa178c8158fce5df529036d3bfb21c62c3d1a6ac350126fa9405eca2230363367dca0a1dd49667355ba434cd55131c03674f3a37f88d4210294e6dc346bf159ac2f28443d11396b4df1f2d033491e5a89baf50b12cf87caa33e51a132b91a0f60bb9d58f29d337e8213e4aa5afe0c8dd712a270a96f9cf681026c2f00c5454e0fa6bd2034c39a872b2fea98b1b822b73faba81df9d141eb13822ebdf270764aa350fdf3cd9a40a77c2e25c1e7a653dafee4c19f08adebe387afd250e0da4024c2fb4539e78f62b8deba0bffbbbef3ef09b9cc3196d51ebf00414c461f059abad380343cf5a303735520253561bb6ed2f6a8542cb64a1af0a4361653550c4b1559c80354fc761020b10e12726dc626d46bddab669f6015d83b097287f3ad7486249a00ff88cef0c2c1920839b6e0bf45b467d2fec088719b12af58065aafa997072cce3fae6c6b2d27bf9ecae46d915d3dbfced5b5906b346810ca8fd9006b4b80b2bbad9ce9a7287ec0c0de3875543471f46e08ddd8222de2a3075783e0c315f09e3f01ea6b2a155cba8a0a9bf41c816f32d9792034b1461a4e3df1331a461bd67ceb89bd8585c31c7fcb2395092bc1c81929a1baa836709f0a1480256f088fb10916203bf1caab7feccb2a72b0bda774125fc1a891b88f2cbb99b054b1670dbf81010b418a263bd170e2db3fb2bf0acef94c11831086d297de6fe4154013e07e58c36fe0c1478ef04d8e4c00df9e48ef6baff31210d014c79e021c9ec55c8c4300ee359cf01754bbf707e7af4d908e0043df9140f1107886e35df1e89c44603693bf39c6eb1ba0074db62d698751d96887e60eea12a31609bef808e8ffcfc4614c3e6622270f8bfea08cd81aa7d7e993d9eaf5ff3b039ef5681a15f9a3777fda9d0669a1e097d55e6f98ff37ac08e93c0c0036179bb60a9a9e4b644b7860daf75f248feac6c093e492665b563e277a32f1e3d20927d0380a0ee3448c22015acbd644ee6e1705393fc7b1191de5d56a076b7b7ee2060b870f6689b0e31162974a7560fe139a0e104187ee4024621726935b0b85d6f5e5e05b65c963a69cf5ec3146570452771befc72fd30ecec2eca69250805484125a58684c92dd5421b57b4130cf52785f3868f656c8ca498f3d301013be5270a634a17ba4096ed142e0ab7e1efc30f9e797636797709d7b6d7876c130899f2d8694bc6cfafd38960eabd6f690e79ad445201bdb8d4da828d0970eb0bd7bb8494a4c8 + +# Replaced Signature with Public Key +Params = SHAKE256_W16_H10 +Msg = a84ac56687bde5e2d8382fd88e343a128dcc899a02ce38126675fe2a3bfd6c2ad8adf8d092ed6f7951e042f8fc60a366e191c44f3fd3d77c8dd23505273cbac651a48ff067f90af5d467c4ac525872c4140e82358591a1daf8a7bf6716a6fea003d128ae6cf80a30bc06f6057702f97133de52648641a4f8dde73ca365bdcfc6c4bc3bdec3258b61f23105ebb52ca189c7ba30fc24f0752c66c00331c28e53aa16219a85c90658c615e20ce175028b6fc01dc0aa1ae9d92f5f8fb4212c6e4e0dea138c2cfa3f79495188eda3c2405e66b410c19617e4b5a2651e086b834182a0821b5794a7c417d7084a876fc7618c96172eeb972a5f323a924b6f0530daa8898f9907fcaad6ed374590d38fbc65de46f26bd8aa70bcb59b0119bfac482a1c10b415 +PublicKey = 0a00000aee0d4c904559c13a9495a2848437bdd5181f86b81ea069907d14b1c8bfdb29e103ffc674eb1b9756c22e1178c39abc1d6039c6e9837ab212c400132cbad36f8e8d9b0475156c34478db5b273c1070822883aeb07e55a235f4784f8a83bfc4a7f6ba56a9bef635c6b855469e0beb150a26403efa385db9d1bf96dc208b4c8f52f +InvalidSignature = 0a00000aee0d4c904559c13a9495a2848437bdd5181f86b81ea069907d14b1c8bfdb29e103ffc674eb1b9756c22e1178c39abc1d6039c6e9837ab212c400132cbad36f8e8d9b0475156c34478db5b273c1070822883aeb07e55a235f4784f8a83bfc4a7f6ba56a9bef635c6b855469e0beb150a26403efa385db9d1bf96dc208b4c8f52f + +# Use arbitrary message instead of empty message +Params = SHAKE256_W16_H20 +Msg = c0ffeeb047 +PublicKey = 0c00000c51544a5f352653430cd7baf816d6c2bf8889b556ab69270a9eaf8981a05d1a5340a60c096904643a3fe5a7418294796ce452b83ca9206f2a854f7f4678a92a5bb3c196c4c85bc1a7a8847eeae9725617755557c8f10522933f79ec8461dd792d8b5712140598d3027e5de2ae79975e6a2b36a46383792a9980652b4fcc28e5c5 +InvalidSignature = 0000000000002ee19973fac1f51067e9f8203202d7183432b8144af2ced132452b8815e2980e9224f0f99d1ac21a0723d098ab065b06ea55cb41edd88c368f10e78b2513ddc37df57e0dfa9bbb30a3d79e986e2acbdebbb879c3911e75423b816a1cb421dee63f612b1544acea2dd2f1ca240ae751816ccf0ad702603dbf7938035312a705cf7cea8b87e21cf08eec23d361d506a6dcf55d57d09dbc47c012edbfbcda31441bf54dc150b58a02a1ee2bf44140a82ed1b33b13def8988a5b9aa95658a72f9091e3308e39e292186a0f13e51a32ba69659d81c0939169fa07ab9fa12cfed3246340e2d7dde77e5400998788a47dd6431c6dd15a7bc7f4d3fdd0aeb61dd3d6550c4295800cb23e1c6dad768b0880c7e3d462ea5599b2124c7f68b2256de2f9283ba126e2835b305e88a685852a36a843827ba91a3ed9af9580f917286b62970926aa94a80b6551ad36d8ec46173b5e705adcd6aa6524382be08ada69b8ec8ef729795e80a6695826033901743425bed68546e637e919acb20448b9f684148c8e9572ebba61039640b82d1414e81d4943dbeb3ec56a79ac790d0a4b188b67676d85c458b4a76dfbe2ce7464b14ed5f25552f9e8dea774478ab417dea6dd5e72b613a772ac0be9c31cda1f4e7e4ded44cbd9f9019d533a3ed9a7d2d053dc36f913a4f772c399ed3c5eb533ccaf9da1711db7873997db8b50afb9c2dd8d374c282b13e02415f46c3ede66e58469e4c769b170dd8fccdc40b7d2ac2483da939eb4df751b5f37eb11a64eb7565bdf89e59ecc526e94b6d0342ae292fd4f0ec4acf9fe89dd41dbbdaea87687ea1c38bf3721ffded1636f0c09b9627d45961454670a632dc4a83db48acbddf53099f1912ef5fc1c999dfa3b8e15f66d0a5fb75567d3c9c495c3ffd02ac5686317ceb142aa1cda0ceddd81902ed9a4dcb372fff369b6727afcdb3b4c6fa1eb17f340aef2010f490843fb25707c64ebd5117269d5aba150f197e2c3e01e93ef3bc45067051bab62a208b2ff6bd6966049bfcbe0f57824d8fc27491405e6950249836fa7ce55128a8d752faf7ea0a1645ff0bca1a4b4f851a0a82efbf5a6f2c1e5dd78c9b757c1bed85c2c9b5328465cc7d65258abf5bd6186e5dc1d80e65f5c5466d1159bb4db411775c585d199214a771fc3f1161b34c300f43bc069b0c949b08d63c483ee3833b837d3159b867aad3b7f517b5d058bb7178dd4e9215c84a975e597d501515662e0ab279424da6412f9dee49a000802cfe9d7410197f8125936c9435d1a92a93b85979e8278a2fc1d3685adad4ac5a0b199ca8155e3b156211d6765a5e2fbf5bec793507d650c84757280496a996df3c0a5c4dc66d0ac4b4a687a864da17f43a0b49c5ff6db502ac4cc087274ce125d7e432a30c28a66d61e2b46a5828e1e25eec9bdaf21a31c2c5d172d002d7d14f3a6cbbe14801973d8b8331a920dd419abfa6697b4aaa2f242c23f58ce2ccaff6d16c7ff0d870304079866fd358818fc3e4d174ee15581c9dff7d95e7f8b7e6288d6e6220227a585be5f743fa441f9248b2b6f3541a85448a55f4bf8691facd68f9c1f3a70dfd73195d2ac885c6f8d155735cbf8591efc86562344f580074cbed95ae910660766b193bb8e554e6235582871756fe263c61489b87d95b16597786731d33e0ba81803858af91060d66c7d932ea1b98e90e4327ca5d3adb8864f9969e04f41aae948d08ee69ea5085a2901eeecb62fe5c4df11d6af90896c7a5c622dfeeb2c1b3a0cc5c1aabc2df77f64311bddf5149d8d2c0fe5cb52c4bca221822006c74fb6e2afba83ee465044efb20d7e9694d9ceaf4977da4636af38a75bf6deab0aa06d0904421ed8ef58d20319e3a0ab600566b0a1cf8e93259d47e12b9845216dce879aa3cb4b0dd417e6e4e346ffe3aef87cb3941cf853bc7747e90c99474b06e30c8fd8f0619f7c236775736cc5ab9a31ac003915123fd3f0c91d7c1e963b31b733bbe61564b9b2565929a001c97c7eda664bb97a4a9f052ef1462c246dd8c3492b80067835b7cb6d3f18858fdc9b458d095b6ffc7f5542a3df99514124629d91614a555d478932b8e7cb6ca5eb50be80f7f42575dc8d218511935203a40b9106095b2f53225272cf784d39cf5a333e5679584d5a15e1f9817f450e56ba1f7d0be13700951b4e94a8df56dcd6dfed5aa1a0f0f61a0487fd23421903246ff2a5241826ebde16d56790c01f1485304d711285c01dff11943bc92fa38520bfd72dabb92700f7062edcd5c2557a1b15c0b872c0ef8718e55f13a1455e1add258591ffb2083b0c38611fa3779a313a58c25fd07a5d09424526e9db2df35b7b78acb44846e564116cc84258e5bfce04057a16503da8da57ef6643e2422b492786685fc790238a375651a3dc2afde18ab6a002f46127e5a9695b3fed953c826acb22f22acdd181f004425efb165bef2e7dc32e1701e8fdc67166da3a896f25610d345c9a007b54ea0dba45e1bd1d502946d69ab51b4ae88c8d6ba794a8129b3220c31ab3aba2c9fbd69e6f3549b0f0344045a7bc2e41b4f9ce8a8fc776463d120dab1184681e37c5578c78fbeaacd68d73cbdcd57970221c18a9c91e3a35a7d5ba246f590f04a6f4defb02fd4e8d55b68c132e0fb47c80663b548bd0585f68124dc8b1a9a1c066a7b7c25be1ddb1f8ead957a650782dd3d7c47723def2e681b887c9085934d7c66cd32e3ef359dabd54a700dfda2219e553145f58b2c65b226eea195463b0837748307fc1789f72d496962c6a5e4f2bda13edb599bf524b684c92512b9f9d3a17b03d31b53f184b9ac0fad8c09adea331f642c3ea5eb2a06cb593f69081362ab8dd817c2e8694823fb3c61244c5230a77b67ce3adb4eacd19d5d9c059b9df2b81dfd0f23c9a2c18f6a9c29afe54290a57a2e5330d0bed868fd1c0cda9cee56dd91aba6b302c147b5e044835ff6ed268b18ae7de49d18054e01940638fe583e3ee134d8dceba0bbe7fc86d1bae8334c1c9e8a21a8ed72990bef9142e8fef51e92904b05f44e3cf7d7595caaf35f90faae14b5fc650020d471a2fb149bcea9923aae0de6428ebc79ee588a97328b4a27c92e8248c0d1c22c48b3070ca35aa247d354fefe7b936c23aed09a69ada8c39cd63c563ec0d6a30ccc4b740b0320b89d35c658e810993002561a2ac56db9968193acec2a39bf3bd515798403c8f55fe5e958d6ac24cae11abfca31ede31fdd9e81ae21ceb85f59864165b95dc2e091c88c488ed48aa1154960508ee214899c665b2100c07d11f4db150134db58d8a027db100e3bf554679684e2e023c97dfe523279f6bad9a43c59add304c9a49f166919318062f4dbab185cac7b06df0a51b3a57dc9a0541ebe67b23b5208e524c9e5d42ae3b27723ba0a9b9c88724927757cec48efee3d264d16d8a65b01e10853ad7fbccccc6c21c8cf10586248a5fbc1496977bca08f5ff23aa3756b3909933d64dea4ff8092ab880521df11a937921a07caab6e38fe758cf3cf92961b923864ff23f1778f2ff96349c6c83956a2b27cf715300b4deadb26e2ee75d7a1ede1c9e82f955c1b897b383b256f78aa52f5be437e5bf5b2fe7101bd26a8fb143afb6e7bf52d3b720fe99ccf49857d265f1d0bbecf3722a3ad940a287cff6e9a9f9ae9cf32573ef6e7756a70842b622d0a587c9c21663f7203df90ed93e230d8ff142eda60c501478c8a12b5ea6e3acad2d641ea55cbd1a9252ecd341912795e47660b1b71a546ff8338e755e67f859b742f9c725a41d3c6e16f9225df7066d250ee44adb0b24a5fb936a58ac4efef41f5815ec8209c08533d60e08d07b0fa470e50260d3ab0e97d754dc60e32a7d83495f770948e67bd06417678bd7b9c9678d1c6106d434522aae177b938cbb5b860f4d93983f260460d63985c056c8e4e4440089aba9110f6dd2a985fb01d810fc47244712c9a8af325aefa17ea6365c9d0eb60d3a112c09983621a3a20b9dbc2d0f471fd2bf29e38fde6050cb569735ac8195cb41089e2ea1afb1216ad527a1781265256051e770b35fb026bcf397006171f8f65fcf22921d14eef738bcf7033796e920dfa180b746a1199c134287c0fbeb78ebd233c7cc4e2df6a735df5fcf24a0963ffaf8a8b42f048fda71c3115177c4ed592575f09d75be760556cd6e078a189d602cf5dd29cdc8120d09355b3cb868b079dfb5f75959aaab26ffaf43afae9168d946eab4b8baee31d1b947a0a927d016bd325f4c4a27f8a424ee504b9cb54a6910889d94d96535e1fbe932213c1d6d57e78085aaf9079607ac1f7d90b62e9b115cea8c407c1744688ec308a819e73373cdf565e2d80962bf047fb8a649fcaf00d7079d91d32aa1dd21215a31a70c7d68ae81eeba0923fea7f00963446d1e9f4ad5001cef11fcb3fa1b35120dbbbed77717ab2dc5fb0c09d6687efcbcad35c6d209b66f8635513141075f1ce1341a2cb6f177a5aa3307b5e430557616673cdfd324b6abc6756de23f1be055a6b01008704cfaab86f84e75f3dc3b05803811998cfe157700c7d5d3a130626d70c0b26b5699fb7ab33e9f7f9d97d7214e760c0224c283a064bc66df57c33bbef7ce829b9ae8a136b3225a3b96ade941e980f1946da477ebe040bdac8e7be031a0eee83695c6f7f181aef8165a599b7c9258d29273cbec0eb1caea11132d0fe49c9cf93e5e4da54dfef13a8b2f0f062b3c0b24b682b1c0c43f2cd5b25792afac91ab34a0c73356ff8d323c6f7d4649e80c8a9411a48d3c8ae2482bec69e198f353664ae9fd7efb46329e92fc4b042f17af6756592ce76e97addc3c360b6b91fbc712a436410c24ba7fbc67968528ea4b9a1af6dc82a2665276556d538cf97cfa25e42a691e92adaf1d5791b91323d15b60b68d386e2a96bd06f2a97477eeb4297777b548a05bb41f0aae3060d8058a178aa2d23ef35aa2c8ab6d9a60e686adc7f1b43b334aba0078b778ca310562080504059adb33762dab65721dbcc5ed0d9c1c46e938bf2eddbc54060ca35540429fc8ea83190371097413c6dbeb3838ef3c5866c46dafd5e319158f20d2d5b5747008a959ce7dd052c0d872cdc526673f7796d3c5076f4c3919e7c0f53053c08b623c6efdac19ebac2ee19edb13065323506971145b0c58369676ee20f4a02594dde0547b2997b675cb03d473c3b487f1b779bb7f598e33c3a691f67416fa9db2300a00ac9c52296776c815ef843d10926d3c4d1c425b39da40c9d8b8dd1162b653e052cd08ae56b94a6cdf7823f5ae2b7067b2e0a7693edcf28d806e0de435faf01a9164acd9338e37019760dc1320564f7a28fec76d37f5325d2cd375ebc940cdde22e04eb485c571abeb7db79376f313f9ef7dda0036abec679a4225e2c5789e872923521d01b03ad529d375cfa7230276bb1901645bb808c3a93ba5c5e5b230b0ab677346c3cd47ce529c76776a372b9450e9b097c5db31df4470f033c2c8e78a4de2c3092a4f9b6de21a2acfa92c90543212bb9ff8c5cd952950e57be298463ccf0360f9e518795195941a669b7a6e43afd0efa4e8d13e29b1b191de3528fb93dd1ac76ed2a7a402c02d60832b2588898eccb2a482e44d382256d75047b80953f7de2246549c12286c92af5b7a4d40036a1a09e7717d7dc6c8f5a07c6b2d39a4cabf809e0b8665b3fcc214be00eb66fcd29559f15e6513f9f382ee5953b5073694b6fba7991c453448a20e90db9e1384dbce0be6d0b37a855787f694125cff55a7c4c61d06c5bb8327827c8f3d68324b6c6d2c2ed3cecf24973620a55be164dd36e50e086a7930d3925d076d10d6a1757ac14a7b54053a9f2aa654c31b85e63652a45544dcff543df6149536dd54a7d7ea092d789a81a82193c59a73d698154d7a17df1acb4a4cc381cbf75593469691def846537e991d73d2c7dbc5fab61cfdcc5a97e41318aa7711b7eeda3688766b3559a5627c2d88bc50b4c12b0b975ce2550756753de6ad6a791bb5717acca37c443544efc352400524dc62a3b75eb953fa6705958a590cdea5a2dfa9b2efb842ab2ce6dd50edbd84fb7960b18be041c1b53cf5068cb40a4486d0f8e5490b0c39f99a3dff95edddb44c6f08151d19948dcb614dbd35dd676027664ac13b2af719b47424f58d01996a4926e6fb8824f865964d72a94429ca2a852153bb806e6b700183f8c39c22a7c504dc1ee7b816b01462ca1602dac44e81668e7d63e2bebbbad6f17aa60a4c356bef849e782a048a1266f20312ddbaacabda4ec4169aabf9966a70e84613cf1e87f727e02b6c8b39039422022e58554998ae22c9895502dfda5c05de6e9a568d19d964431f6635111603d5c3a4dba6b8879d754e7eebb6f54e5f903282e56435790eb963d4b6e68942b80609c0c3aa8cabf62c58abfef4534f815d6a620b881a10c7869591fbbe7c13e0757f93023511d488d8a4002a7b1bce8b7fe35c20dd5cf2da2c11eab8e0aa5133ae0ed46261d50395facdee96cfdaa5475c6db044f4c83e5a276e2c0dec09ec5ffac5a8ead71aa62095d1f2c594cf32ee5cb0bc33f54720fb684155f0a267628ce5295c596416f71b39711ed2d05881cece47f17cb1a3eecfd313570fd5f364963c122226b55e5d64acefc21db781ef23b15b8dc0b77c5e92b4ae933ec72efe44148aaf3bef8b4e1895e85866ac17c69a1e36dcf22c3c1de2472c0edf8048e6fda1e8101091cc941f831d059e6c5f6aca5ffee0f1a1bd8fecd162fb5e44c3459aacba7bea966a6e2b940cfe599ee35f5f96a228f104de96ac8649c570d036915146561df89b9c214b137f9e9d6969d6cc1ed69a47b5d93fa6eb7b1578b33788de70d10df85d0e4448888ad226fd9ef5d5a58f430551f607f714f0cb314825da91fb674bdb03f4cc387b0a5fdfe167b0e21e4e304d9c83d436cc7eec9516ffed387d3927a59da86ae54bf06a5812f7bb967d7131b75135bdf0495211c67a180579277654759f2efd4fdd6542b1e6c27f8c7aca9b38d7e05b0a823c6413521d6c47787ca0fc2d7f44db582718b7b06e19c127867fbffd459ddff392fc81fdb513d1c18480db79ea3875c66f2d6bbd211970bb2e0e5c5cd6672a80f89928dace30cb0e724097f721f292b577b9d4a1e4e5f5a9950c0b158917c624168d4914630b1d1939dcfc0bddf52ffd83e102c0d50814be8ae4d556bba65c6759ae344d88e1565c582ea8486d042d1dad8319e854ce2d205a0d33b2adcfbbc59ad1ce76d54c0152dbc1afeb11d055d3971cbd7e3c6499abeef6f01173c2819347ebe742580a78165d0f137031b3e22882f3b3d1235b594be783363567fc4b38bde5e982dbf7cad0b5c9bd202641141354c621c491385bc9fdc6e62dc5ba4d2a8cc90fb2837ccbb638ea93be6d3a2a729f03f2be53ec8cf1d1aa8dbc0220722ca14714262ca82672d8b9245f2f2857865ec3090718904ac4394be16c43d1d737682e5104d6b75f3173352e8dc0ef40b7aeeda9bad483c50d377db9026d2e0edd80191204f7244c80cf69bd5fe28e3c9be5569f0a0f49b27d90e89300e061c0831fb955c74c1c7b3ed68616acdaf6f2b6ef2af3ab56206750b540269686cced0b93531dd1dc9454aeee18d8e2d81a357fc74689cdf2e0708ca58727c08af7717c54cd3d33e7b5275b38da73ead1694886219c6e2eff4815d6563db6e92b9e0d99fa884601efed1fe37ebb557d331174adaa412545ea54c2cadebecc0488103de96af1b8200b4e99cf0b1fceef87c0feddc30c03881806f49be676a49f4bee3bf4ac164693b2c2b80655800f505e6bc15321894169b49011213e5a9772e6ba836ce22eada4babc37a6c08eca756fdb006b679bb39a2dbfb91c073f3683db869b2b97eb8a6022a4c5a6da48413d4ad0bd8f210fd1bf3a9d3999d215816fc2468455700c611e3c1195f3dcf312f7f6afa93469e9db65b4d688fff97713185fc0247320ff539098a3cd9edf6bdb2ce168d29892343cc7153649a91d17acdafb947b1fbe0b0fa92d59219554419f0369616e693decca4134468ab0f9acce36ff590aa8d710289d19de1c5796eadd537320730f4fd9f58d377a3c44a6cde79ff12d6fa328825976f8417f49167df8fe391cb21b7eb3d38131e615472f79b73d62f305ad1a8600592c2aca1f87b0069ec0e0138902833abc2efba2bed63a5792d2c8a32f80e69538154028497d8f7ef2a1c4688d5c0926d31a19c0fef5ad110b0143496fb7e349ce275aacbd9f985624831e58992303a497a231e44a6c528714a87c028ca7055d44df1d1292883c366a44fdd1c92394868373e6c11dee399304f8a2abd3d2a3bf27aa6308beeb6141b3d8cfd9da4d82962c39585d965a366c2576b6611a23d0d1a6d1aa49ad9ad07e19a65b9ca1fb29808b1acefa5411041e1fca64996a24fa0f7b0c0a99799e630cb0f21eaefe2fd74fd07833467d574b85d9b452d8768c21fa184b631466f776956052fa3d3aab81a93672f5bbad0b9f24cb8dc60b9b296423e525687e74f9732b7d6ee7f27924e1e667ff9d0c15ba8b5b24dab573be1dd1ea983cf0bfa9edd95cb7ded61af5c74f478049bc1e50ed1aafc57952895ac4ae53e8fbc2cd848fb32e435b82a56cdb3c7b58021d720dc00be695f5d00233fd8ed2fd0c22cf297ac2345de5dfc960d15bc36bcf20011d4caa0816bd634d726f0c265d74c66132b8a3936a5210325bc582b240b5e9535f087e9c4c3bb1875b90f70ce64c46958a4f4c2aafcdff4a2f0c0375f9d40b20598b181f824247690a51900db280e250bf382b30c300707836274b16f0dc8e3972a6235ce3b555053ab49b5f81fc53cdce891473a1ab708086e66420ce43a966c93f58519412a4c97e75ce9d0a54e0282fee529932c54334ec895ff1a5a97038c966d623e75ee01f8009f915ce88103c73c2e6c462aa28a8b6358938739ffce91bffb7358411874d7ff9c3d1d2f6dd21f7bba7d0749fa803cd0006f5fa5139afdaef1d955d76e2e79558c08a29dc9976dbc717da2ccbdb1ca2c331bbb7bb69aae0d34c8fcc8d38f473223c1eea8b41bcbe05ce2c2bd1d72d5d4627af4e16fe6425c59624bf2b13c175cf6fbc367603bdc4f417fb399d58aacf31b6f16609c9dca250687e909702fddef63194ea9b0534d2ef82d1b351e242fe639c76ccaa7530cd24d4cd33cd4fd87e10fad41e5130627a555ddcc1a57315a200ef6fe105169c47d36c3b03e6a8a6c8f3919822ea5ffb428d9745e8be513306f980e69a0b0d38ac794fb38d016e09adf84ed498a9156d40be6f989fc66b0b01902af6800dff891641a9833b5e20f5e47a9fdd76125dadfd442879a19952f6dd2e8404cd0c9002fa2ea4efcdaae3370f44b919e99e8f8d4984ffa08e3c362a8e145fe3a6b213bcbbd4c20310f08d809bca8af83657af3b924a375ed7f8310aa4cfe0a43895a36c257d51a32bd649b0f1b989eea90d8980d816bb4267d01f782abdfa948efa8bd11a7db10ee22c2b63cb81940f7ca606f30aaec73e7e810e7e389e32980a255ada2b22a992219b415b48d15ad9920d806230e9894fa7208f5dd9c15d25272bcc92abcc8c55625732e42a88f7e23a3fb692b871eb81182c4417a42df26151725482066af342ec8766b206ff78097d15397ebc197b04ac48ad2932dfd9f8a6e34ab7b3f5cf7758a5c3ded83701940f01931cd9f844da3cfc2e59433f13b3e65bea88cebdce4166863f642f821043196c853b60a9c5d9d703728edea421a2c20dbb177330c4659aacf7f020ecbd646925559b26f7228cc2e305af87780de9fa55593b582c337f638fb1865c50b138cd12388936cdd7e4654e7de8eb813d71689e90243d6e8ccb149d98832281808faffba201946943bd16d2b115f751cac08ba0c46b0b56a0a7dbb0761a1ce7f71bf39c7f6277a8e1fa169e0a7eb3d4edb4b696888da8853b49e0c135b63076cf35c7bf3d10f03c0373b3c3ca8a8d5baf632245e714507c91f723a4d3022781ba48fec51666deb4d17490233265bf15bed47dd6388c9cc8b68a51306475fdf7842fdbedcc1e0b42ad181166a9101a64976bce88309b0ff0096c66ac7d0afbce7445aae6be3ef97dc2ddd17724a34d63e53384c2832e060e7e3267a655f3de56033bfed264cb8c5cd90ee0556a0c73aeed785cc56963e4fb5eafda63d61b2a3d9e162dbe471d2935e57d043516693fe20ed5b5d631d626eaea97b35222de7a227c7d2e1703fe2e31db074c168eca147cb2565085fbb8131201e5b21bc2a077323dbaa7155cf0dd7964d21bf5dfcef02f6ded3d00ebc339f0d748606077eca8ccf4b013fe47f337250267f465ea406251669793aee1f389caf8d77b225bce04d46d549ed284fb54fab689bec62f808ec9ac14080bacfe178027fcfdff55025ee3c6a69e039ddbae692f69c6a5bdc89264b6d66186f3e16be72eef6221892a8cb173d8bb79f086dd3c43e4187ddcca8a48357143c6051543b182651f794cdb11f5ec9906a3a11eaab7b3b3ae2812ebf345847d97b577f1278b981f9ba35313b09dca7da3f873c019cd73285301f32c5c85ce2309d4ac45b491b4189d50c96c3b7cd364f7f7ffa7b883dca0708f31788b79bfaa3981a99a06a9710ec80ef318ad52e9781f31bfd039fc3bdae81a5a6152c99b68c9b55ca7ddaad356aff91bc4430efebc8f7aca34b382b6fa13a8c2fd03558f919d498055b950b918b6785ccc247d78b9d76839465999007b06b2a61f8f11fb7d48ae660aaa1baa2ded921d38789ef6f3dffbea2aeccb98662772c30a89aefb8ec3daea44aee4685bdf5a5a897bf986609432874f28f548f07da63bb6c514c8ddfecb41ffabd7bbec7e61aeb9a71cd7e7c45d4bc43426641246830ee13126889aca14492694bb858801170b63851967b4990dc2dfbfa17460b3e0eb6d468951b8e2dea37ce506dda144f1cd2f9118f5811e1619373c5bfd89d909d3f4d59e9a2de2aa40daeaf71e23ad7e0019c585a161f2622dd31c5e8d7bb8263c59888e5d4158ceeef48bc3013a1b2360b2502b123e8cdf1d820d1e86104144596e20f61a9237a97555f535aba57fb1a61aa56b9bea93e569e753ac2bf5bdbb49ef54fbc1bc03d71bfe2fc4bf879fee1cab5d28db7def24cd12bdca5eb2bbf98ccdf06d3809e5c03d0fd8762982032c7d7b43915ce2dab7ad46f8f70e0fe095c9f9562dddaf4c77f9908c6ec9e82f4019434aa7e5fb4ff0babe3902ad1d4e4ba8ec8f0c7f2a2c0ab87b7188273bc59ac1ea1dca9d8e8332a02835b45a271e75276c258d9bb27f2e2b0a5d776ee9652266c33b103e567ee2d2e8de8dd0a4c9129e5e30ff12dbbcbc9fcb3ae91b089d22521234da3909ccb42a86c7a8fe2f516fcb73f0d6f31206e749f010613c4f7d5e200d6e6a94fd97abc5b41a5783be19c069d311b79d542e73c5f1f9385c31c8c893eabfc7afad4f002b1920fa22a9cac3801e51a33edafec430e552e74e663ef50e246b9a99da1302c6f708578b0317dc4e06c5fc6d31d19ef411f76345489646597a86842fff97e5d81660cd3e1a5b19661bff6518ec31f7ee67869d7cd42b13182f0ac50dfb8d53c52c3bc6898c9ec5cf9f3315cdec8cc61dfc63b883c3cb1bb5bd88e352beca1c8d386f5198b43c3bcd20bcd06d2d41e600b29c14f56a92ea223415213129ab472f65b0c1dcde6023968d453a1f4de5008900d0fa7469b55c56146af91baa2ed3aa807b2641a4791309a40c9063be015786a4a35362845cf33f217787244c7ad0e139fc292d82d0624acf41fa72e8660e27b114ee71b14bb3ded9bb8147cff7f955513d2c727d378078b2ce4860d4897dc7bd55e4ad25363864692c92c59f2a531df3f3d8e4beeb9bbc874221ac8cf77b18e15eedffb24891bc970b74de8193f167c9742aa0858ac360dcf0a09a171e30efdf752760e6f1986149cd8bd59e76a0342bc62ca95fada8194b4c47caae10288e5daccc74915eda891965c0da1a7eba75779d255cfa0046d333c3d2e078fa744bdbd66761e3041d633bde4cb2e22475d10d98e6ffde8bf7a44c3ca8e6079940a3dc4db9208ae1b28ee3882152b4bf578bebc211440c6157f288a17f05a3f5ade8a8458f01e20abb9b98aa78da68bb7a8a8111c6e7a5639b1f07825f118f2cd1c041956b7bb0203e863085a47fec8923a53735a71f7688f27daf6b46c8db7bda357c5038b567fede6724ca3d39c3dfca7be086261e6c203ec89881e4e79f33b5636b0a8e5c90835d984029266f270a7ab9a0cc2926070890b5cf552bb9b88270483f5b945c234e91524d36098975444ba54d349068cdcc2eafd544ad240b8d07673a29acce34eb0d7c4fcc8b80035ae933eeab7cb0dae4092acf4d00f92303c213d575917f40fe8c0352efe910f7c025496ed53921569c057f6c53f667cb13333acb54458441f41b86593090e60bae2c3822c059ca2c36bc64b46ad74fef88a92735207e558ceb138bf186b8f821cc4c2b226da0a82e5de71e19946fc1cc21bce31f8c4eb69969faa7efb244466d9d58da84aba98abec07c277bc6d1d66583f9282d0ffb70ff7de0698b60fbe290ed48c6f81f1c7108e1a707eaa7a755e183c17d4baa505c429a7fcc3fa2892eb67c2f661fdf1990ea9ba1e88d4f2d75ba663350a59b7511c1ea068cd3d740a2b5461a1c6b780c8720222ab37c6bbb46326ee3ff69da887411ad1d159e8b6a537a73e70e4709a323be486fe4c479e1c957e1a5c834bf08d97dec17fa3c30d3b43308fc32e7b3c81622e15b218e015aef7affc6c401ef39970f1884379fcfac0e9e60d869123228065912366076bf23e59af54e014f892a16fbc1834e55b8cb136deff4a1d3932a63578fd41a24316b0e2ac3dfe2437b8df99d49ea5ac0984f8bd5baf36d92e4a95848fae01dece64f4f9f0e5d150d1d08bdd132ecffbd836a2647fa01c3e96836846e2f23d76b3a52e297532f88e59caa08ef63c66a951ca85f592c4d484e481021036b15d9375ca80176951e22a438ca3b9a37edf75536b1f7c9d4030d89ce5d642a3f7bbdc9e8311866c56f015d53ca701410d3ffd4cbc733e49cc4bdb5942aa245cf8a041ddc1187cc09534a0eb4bbff0cdd2bb2a6c187ee1d6707fbb4bd79ee46d72eb5d484638cc38a48a5dff62c9e5d8fcca88eab2ce3ffa5b2d499062ac4b89a37535c28e63868d682625f5d8fb64faea0baaa042c61c200648f541465e8eee98e1b2fd235257a2df58fed4917d55df4eca3b38d3d33b8a5d122aa0d204ec61e44f414d68719a5f4f19a8b101d0c68e94fc9bc93af0534f7606a0ef55c5234e95ccd5b22c3ad238c5fa048c7e2d6e75776a7129eaeb19c33008dff60c08b3c50ca9879b3e582e9dd68cfc2aa41b6d3b845519b1488a234f45ab09d8e52b7965c4af76949b69874555ba79adf83e50b97647ba97ce1c14ee5298a206532074b2fe92539ab3093cb68f6c1897912fffa96491e8a84b22a9c9889f747315c174349ea45c402b827ecc6e2476d8eb3ccdab6d65a995e2ee31e2139b68094ca3fb44414456b39c5c3e7b5cf2023812f8888c153f34237cfabbc5a2b44a8c70f6819c75686a5934664bf43bffc7d0af1897f746e0069a4ae6a25d6e901708800dcf81243b34d3e5dd2ba49231d58305e0aa331f270ec539e4014cd76c529c96913d1704cb3be5871b03f64c8e83519ed9ccdd33b86bd37579094550aefd2f9cacaf54969661bc3b78d6b2d5b77ba359fc359d5 + +# Use public key and valid signature of an empty message +Params = SHAKE256_W16_H20 +Msg = a84ac56687bde5e2d8382fd88e343a128dcc899a02ce38126675fe2a3bfd6c2ad8adf8d092ed6f7951e042f8fc60a366e191c44f3fd3d77c8dd23505273cbac651a48ff067f90af5d467c4ac525872c4140e82358591a1daf8a7bf6716a6fea003d128ae6cf80a30bc06f6057702f97133de52648641a4f8dde73ca365bdcfc6c4bc3bdec3258b61f23105ebb52ca189c7ba30fc24f0752c66c00331c28e53aa16219a85c90658c615e20ce175028b6fc01dc0aa1ae9d92f5f8fb4212c6e4e0dea138c2cfa3f79495188eda3c2405e66b410c19617e4b5a2651e086b834182a0821b5794a7c417d7084a876fc7618c96172eeb972a5f323a924b6f0530daa8898f9907fcaad6ed374590d38fbc65de46f26bd8aa70bcb59b0119bfac482a1c10b415 +PublicKey = 0c00000c51544a5f352653430cd7baf816d6c2bf8889b556ab69270a9eaf8981a05d1a5340a60c096904643a3fe5a7418294796ce452b83ca9206f2a854f7f4678a92a5bb3c196c4c85bc1a7a8847eeae9725617755557c8f10522933f79ec8461dd792d8b5712140598d3027e5de2ae79975e6a2b36a46383792a9980652b4fcc28e5c5 +InvalidSignature = 0000000000002ee19973fac1f51067e9f8203202d7183432b8144af2ced132452b8815e2980e9224f0f99d1ac21a0723d098ab065b06ea55cb41edd88c368f10e78b2513ddc37df57e0dfa9bbb30a3d79e986e2acbdebbb879c3911e75423b816a1cb421dee63f612b1544acea2dd2f1ca240ae751816ccf0ad702603dbf7938035312a705cf7cea8b87e21cf08eec23d361d506a6dcf55d57d09dbc47c012edbfbcda31441bf54dc150b58a02a1ee2bf44140a82ed1b33b13def8988a5b9aa95658a72f9091e3308e39e292186a0f13e51a32ba69659d81c0939169fa07ab9fa12cfed3246340e2d7dde77e5400998788a47dd6431c6dd15a7bc7f4d3fdd0aeb61dd3d6550c4295800cb23e1c6dad768b0880c7e3d462ea5599b2124c7f68b2256de2f9283ba126e2835b305e88a685852a36a843827ba91a3ed9af9580f917286b62970926aa94a80b6551ad36d8ec46173b5e705adcd6aa6524382be08ada69b8ec8ef729795e80a6695826033901743425bed68546e637e919acb20448b9f684148c8e9572ebba61039640b82d1414e81d4943dbeb3ec56a79ac790d0a4b188b67676d85c458b4a76dfbe2ce7464b14ed5f25552f9e8dea774478ab417dea6dd5e72b613a772ac0be9c31cda1f4e7e4ded44cbd9f9019d533a3ed9a7d2d053dc36f913a4f772c399ed3c5eb533ccaf9da1711db7873997db8b50afb9c2dd8d374c282b13e02415f46c3ede66e58469e4c769b170dd8fccdc40b7d2ac2483da939eb4df751b5f37eb11a64eb7565bdf89e59ecc526e94b6d0342ae292fd4f0ec4acf9fe89dd41dbbdaea87687ea1c38bf3721ffded1636f0c09b9627d45961454670a632dc4a83db48acbddf53099f1912ef5fc1c999dfa3b8e15f66d0a5fb75567d3c9c495c3ffd02ac5686317ceb142aa1cda0ceddd81902ed9a4dcb372fff369b6727afcdb3b4c6fa1eb17f340aef2010f490843fb25707c64ebd5117269d5aba150f197e2c3e01e93ef3bc45067051bab62a208b2ff6bd6966049bfcbe0f57824d8fc27491405e6950249836fa7ce55128a8d752faf7ea0a1645ff0bca1a4b4f851a0a82efbf5a6f2c1e5dd78c9b757c1bed85c2c9b5328465cc7d65258abf5bd6186e5dc1d80e65f5c5466d1159bb4db411775c585d199214a771fc3f1161b34c300f43bc069b0c949b08d63c483ee3833b837d3159b867aad3b7f517b5d058bb7178dd4e9215c84a975e597d501515662e0ab279424da6412f9dee49a000802cfe9d7410197f8125936c9435d1a92a93b85979e8278a2fc1d3685adad4ac5a0b199ca8155e3b156211d6765a5e2fbf5bec793507d650c84757280496a996df3c0a5c4dc66d0ac4b4a687a864da17f43a0b49c5ff6db502ac4cc087274ce125d7e432a30c28a66d61e2b46a5828e1e25eec9bdaf21a31c2c5d172d002d7d14f3a6cbbe14801973d8b8331a920dd419abfa6697b4aaa2f242c23f58ce2ccaff6d16c7ff0d870304079866fd358818fc3e4d174ee15581c9dff7d95e7f8b7e6288d6e6220227a585be5f743fa441f9248b2b6f3541a85448a55f4bf8691facd68f9c1f3a70dfd73195d2ac885c6f8d155735cbf8591efc86562344f580074cbed95ae910660766b193bb8e554e6235582871756fe263c61489b87d95b16597786731d33e0ba81803858af91060d66c7d932ea1b98e90e4327ca5d3adb8864f9969e04f41aae948d08ee69ea5085a2901eeecb62fe5c4df11d6af90896c7a5c622dfeeb2c1b3a0cc5c1aabc2df77f64311bddf5149d8d2c0fe5cb52c4bca221822006c74fb6e2afba83ee465044efb20d7e9694d9ceaf4977da4636af38a75bf6deab0aa06d0904421ed8ef58d20319e3a0ab600566b0a1cf8e93259d47e12b9845216dce879aa3cb4b0dd417e6e4e346ffe3aef87cb3941cf853bc7747e90c99474b06e30c8fd8f0619f7c236775736cc5ab9a31ac003915123fd3f0c91d7c1e963b31b733bbe61564b9b2565929a001c97c7eda664bb97a4a9f052ef1462c246dd8c3492b80067835b7cb6d3f18858fdc9b458d095b6ffc7f5542a3df99514124629d91614a555d478932b8e7cb6ca5eb50be80f7f42575dc8d218511935203a40b9106095b2f53225272cf784d39cf5a333e5679584d5a15e1f9817f450e56ba1f7d0be13700951b4e94a8df56dcd6dfed5aa1a0f0f61a0487fd23421903246ff2a5241826ebde16d56790c01f1485304d711285c01dff11943bc92fa38520bfd72dabb92700f7062edcd5c2557a1b15c0b872c0ef8718e55f13a1455e1add258591ffb2083b0c38611fa3779a313a58c25fd07a5d09424526e9db2df35b7b78acb44846e564116cc84258e5bfce04057a16503da8da57ef6643e2422b492786685fc790238a375651a3dc2afde18ab6a002f46127e5a9695b3fed953c826acb22f22acdd181f004425efb165bef2e7dc32e1701e8fdc67166da3a896f25610d345c9a007b54ea0dba45e1bd1d502946d69ab51b4ae88c8d6ba794a8129b3220c31ab3aba2c9fbd69e6f3549b0f0344045a7bc2e41b4f9ce8a8fc776463d120dab1184681e37c5578c78fbeaacd68d73cbdcd57970221c18a9c91e3a35a7d5ba246f590f04a6f4defb02fd4e8d55b68c132e0fb47c80663b548bd0585f68124dc8b1a9a1c066a7b7c25be1ddb1f8ead957a650782dd3d7c47723def2e681b887c9085934d7c66cd32e3ef359dabd54a700dfda2219e553145f58b2c65b226eea195463b0837748307fc1789f72d496962c6a5e4f2bda13edb599bf524b684c92512b9f9d3a17b03d31b53f184b9ac0fad8c09adea331f642c3ea5eb2a06cb593f69081362ab8dd817c2e8694823fb3c61244c5230a77b67ce3adb4eacd19d5d9c059b9df2b81dfd0f23c9a2c18f6a9c29afe54290a57a2e5330d0bed868fd1c0cda9cee56dd91aba6b302c147b5e044835ff6ed268b18ae7de49d18054e01940638fe583e3ee134d8dceba0bbe7fc86d1bae8334c1c9e8a21a8ed72990bef9142e8fef51e92904b05f44e3cf7d7595caaf35f90faae14b5fc650020d471a2fb149bcea9923aae0de6428ebc79ee588a97328b4a27c92e8248c0d1c22c48b3070ca35aa247d354fefe7b936c23aed09a69ada8c39cd63c563ec0d6a30ccc4b740b0320b89d35c658e810993002561a2ac56db9968193acec2a39bf3bd515798403c8f55fe5e958d6ac24cae11abfca31ede31fdd9e81ae21ceb85f59864165b95dc2e091c88c488ed48aa1154960508ee214899c665b2100c07d11f4db150134db58d8a027db100e3bf554679684e2e023c97dfe523279f6bad9a43c59add304c9a49f166919318062f4dbab185cac7b06df0a51b3a57dc9a0541ebe67b23b5208e524c9e5d42ae3b27723ba0a9b9c88724927757cec48efee3d264d16d8a65b01e10853ad7fbccccc6c21c8cf10586248a5fbc1496977bca08f5ff23aa3756b3909933d64dea4ff8092ab880521df11a937921a07caab6e38fe758cf3cf92961b923864ff23f1778f2ff96349c6c83956a2b27cf715300b4deadb26e2ee75d7a1ede1c9e82f955c1b897b383b256f78aa52f5be437e5bf5b2fe7101bd26a8fb143afb6e7bf52d3b720fe99ccf49857d265f1d0bbecf3722a3ad940a287cff6e9a9f9ae9cf32573ef6e7756a70842b622d0a587c9c21663f7203df90ed93e230d8ff142eda60c501478c8a12b5ea6e3acad2d641ea55cbd1a9252ecd341912795e47660b1b71a546ff8338e755e67f859b742f9c725a41d3c6e16f9225df7066d250ee44adb0b24a5fb936a58ac4efef41f5815ec8209c08533d60e08d07b0fa470e50260d3ab0e97d754dc60e32a7d83495f770948e67bd06417678bd7b9c9678d1c6106d434522aae177b938cbb5b860f4d93983f260460d63985c056c8e4e4440089aba9110f6dd2a985fb01d810fc47244712c9a8af325aefa17ea6365c9d0eb60d3a112c09983621a3a20b9dbc2d0f471fd2bf29e38fde6050cb569735ac8195cb41089e2ea1afb1216ad527a1781265256051e770b35fb026bcf397006171f8f65fcf22921d14eef738bcf7033796e920dfa180b746a1199c134287c0fbeb78ebd233c7cc4e2df6a735df5fcf24a0963ffaf8a8b42f048fda71c3115177c4ed592575f09d75be760556cd6e078a189d602cf5dd29cdc8120d09355b3cb868b079dfb5f75959aaab26ffaf43afae9168d946eab4b8baee31d1b947a0a927d016bd325f4c4a27f8a424ee504b9cb54a6910889d94d96535e1fbe932213c1d6d57e78085aaf9079607ac1f7d90b62e9b115cea8c407c1744688ec308a819e73373cdf565e2d80962bf047fb8a649fcaf00d7079d91d32aa1dd21215a31a70c7d68ae81eeba0923fea7f00963446d1e9f4ad5001cef11fcb3fa1b35120dbbbed77717ab2dc5fb0c09d6687efcbcad35c6d209b66f8635513141075f1ce1341a2cb6f177a5aa3307b5e430557616673cdfd324b6abc6756de23f1be055a6b01008704cfaab86f84e75f3dc3b05803811998cfe157700c7d5d3a130626d70c0b26b5699fb7ab33e9f7f9d97d7214e760c0224c283a064bc66df57c33bbef7ce829b9ae8a136b3225a3b96ade941e980f1946da477ebe040bdac8e7be031a0eee83695c6f7f181aef8165a599b7c9258d29273cbec0eb1caea11132d0fe49c9cf93e5e4da54dfef13a8b2f0f062b3c0b24b682b1c0c43f2cd5b25792afac91ab34a0c73356ff8d323c6f7d4649e80c8a9411a48d3c8ae2482bec69e198f353664ae9fd7efb46329e92fc4b042f17af6756592ce76e97addc3c360b6b91fbc712a436410c24ba7fbc67968528ea4b9a1af6dc82a2665276556d538cf97cfa25e42a691e92adaf1d5791b91323d15b60b68d386e2a96bd06f2a97477eeb4297777b548a05bb41f0aae3060d8058a178aa2d23ef35aa2c8ab6d9a60e686adc7f1b43b334aba0078b778ca310562080504059adb33762dab65721dbcc5ed0d9c1c46e938bf2eddbc54060ca35540429fc8ea83190371097413c6dbeb3838ef3c5866c46dafd5e319158f20d2d5b5747008a959ce7dd052c0d872cdc526673f7796d3c5076f4c3919e7c0f53053c08b623c6efdac19ebac2ee19edb13065323506971145b0c58369676ee20f4a02594dde0547b2997b675cb03d473c3b487f1b779bb7f598e33c3a691f67416fa9db2300a00ac9c52296776c815ef843d10926d3c4d1c425b39da40c9d8b8dd1162b653e052cd08ae56b94a6cdf7823f5ae2b7067b2e0a7693edcf28d806e0de435faf01a9164acd9338e37019760dc1320564f7a28fec76d37f5325d2cd375ebc940cdde22e04eb485c571abeb7db79376f313f9ef7dda0036abec679a4225e2c5789e872923521d01b03ad529d375cfa7230276bb1901645bb808c3a93ba5c5e5b230b0ab677346c3cd47ce529c76776a372b9450e9b097c5db31df4470f033c2c8e78a4de2c3092a4f9b6de21a2acfa92c90543212bb9ff8c5cd952950e57be298463ccf0360f9e518795195941a669b7a6e43afd0efa4e8d13e29b1b191de3528fb93dd1ac76ed2a7a402c02d60832b2588898eccb2a482e44d382256d75047b80953f7de2246549c12286c92af5b7a4d40036a1a09e7717d7dc6c8f5a07c6b2d39a4cabf809e0b8665b3fcc214be00eb66fcd29559f15e6513f9f382ee5953b5073694b6fba7991c453448a20e90db9e1384dbce0be6d0b37a855787f694125cff55a7c4c61d06c5bb8327827c8f3d68324b6c6d2c2ed3cecf24973620a55be164dd36e50e086a7930d3925d076d10d6a1757ac14a7b54053a9f2aa654c31b85e63652a45544dcff543df6149536dd54a7d7ea092d789a81a82193c59a73d698154d7a17df1acb4a4cc381cbf75593469691def846537e991d73d2c7dbc5fab61cfdcc5a97e41318aa7711b7eeda3688766b3559a5627c2d88bc50b4c12b0b975ce2550756753de6ad6a791bb5717acca37c443544efc352400524dc62a3b75eb953fa6705958a590cdea5a2dfa9b2efb842ab2ce6dd50edbd84fb7960b18be041c1b53cf5068cb40a4486d0f8e5490b0c39f99a3dff95edddb44c6f08151d19948dcb614dbd35dd676027664ac13b2af719b47424f58d01996a4926e6fb8824f865964d72a94429ca2a852153bb806e6b700183f8c39c22a7c504dc1ee7b816b01462ca1602dac44e81668e7d63e2bebbbad6f17aa60a4c356bef849e782a048a1266f20312ddbaacabda4ec4169aabf9966a70e84613cf1e87f727e02b6c8b39039422022e58554998ae22c9895502dfda5c05de6e9a568d19d964431f6635111603d5c3a4dba6b8879d754e7eebb6f54e5f903282e56435790eb963d4b6e68942b80609c0c3aa8cabf62c58abfef4534f815d6a620b881a10c7869591fbbe7c13e0757f93023511d488d8a4002a7b1bce8b7fe35c20dd5cf2da2c11eab8e0aa5133ae0ed46261d50395facdee96cfdaa5475c6db044f4c83e5a276e2c0dec09ec5ffac5a8ead71aa62095d1f2c594cf32ee5cb0bc33f54720fb684155f0a267628ce5295c596416f71b39711ed2d05881cece47f17cb1a3eecfd313570fd5f364963c122226b55e5d64acefc21db781ef23b15b8dc0b77c5e92b4ae933ec72efe44148aaf3bef8b4e1895e85866ac17c69a1e36dcf22c3c1de2472c0edf8048e6fda1e8101091cc941f831d059e6c5f6aca5ffee0f1a1bd8fecd162fb5e44c3459aacba7bea966a6e2b940cfe599ee35f5f96a228f104de96ac8649c570d036915146561df89b9c214b137f9e9d6969d6cc1ed69a47b5d93fa6eb7b1578b33788de70d10df85d0e4448888ad226fd9ef5d5a58f430551f607f714f0cb314825da91fb674bdb03f4cc387b0a5fdfe167b0e21e4e304d9c83d436cc7eec9516ffed387d3927a59da86ae54bf06a5812f7bb967d7131b75135bdf0495211c67a180579277654759f2efd4fdd6542b1e6c27f8c7aca9b38d7e05b0a823c6413521d6c47787ca0fc2d7f44db582718b7b06e19c127867fbffd459ddff392fc81fdb513d1c18480db79ea3875c66f2d6bbd211970bb2e0e5c5cd6672a80f89928dace30cb0e724097f721f292b577b9d4a1e4e5f5a9950c0b158917c624168d4914630b1d1939dcfc0bddf52ffd83e102c0d50814be8ae4d556bba65c6759ae344d88e1565c582ea8486d042d1dad8319e854ce2d205a0d33b2adcfbbc59ad1ce76d54c0152dbc1afeb11d055d3971cbd7e3c6499abeef6f01173c2819347ebe742580a78165d0f137031b3e22882f3b3d1235b594be783363567fc4b38bde5e982dbf7cad0b5c9bd202641141354c621c491385bc9fdc6e62dc5ba4d2a8cc90fb2837ccbb638ea93be6d3a2a729f03f2be53ec8cf1d1aa8dbc0220722ca14714262ca82672d8b9245f2f2857865ec3090718904ac4394be16c43d1d737682e5104d6b75f3173352e8dc0ef40b7aeeda9bad483c50d377db9026d2e0edd80191204f7244c80cf69bd5fe28e3c9be5569f0a0f49b27d90e89300e061c0831fb955c74c1c7b3ed68616acdaf6f2b6ef2af3ab56206750b540269686cced0b93531dd1dc9454aeee18d8e2d81a357fc74689cdf2e0708ca58727c08af7717c54cd3d33e7b5275b38da73ead1694886219c6e2eff4815d6563db6e92b9e0d99fa884601efed1fe37ebb557d331174adaa412545ea54c2cadebecc0488103de96af1b8200b4e99cf0b1fceef87c0feddc30c03881806f49be676a49f4bee3bf4ac164693b2c2b80655800f505e6bc15321894169b49011213e5a9772e6ba836ce22eada4babc37a6c08eca756fdb006b679bb39a2dbfb91c073f3683db869b2b97eb8a6022a4c5a6da48413d4ad0bd8f210fd1bf3a9d3999d215816fc2468455700c611e3c1195f3dcf312f7f6afa93469e9db65b4d688fff97713185fc0247320ff539098a3cd9edf6bdb2ce168d29892343cc7153649a91d17acdafb947b1fbe0b0fa92d59219554419f0369616e693decca4134468ab0f9acce36ff590aa8d710289d19de1c5796eadd537320730f4fd9f58d377a3c44a6cde79ff12d6fa328825976f8417f49167df8fe391cb21b7eb3d38131e615472f79b73d62f305ad1a8600592c2aca1f87b0069ec0e0138902833abc2efba2bed63a5792d2c8a32f80e69538154028497d8f7ef2a1c4688d5c0926d31a19c0fef5ad110b0143496fb7e349ce275aacbd9f985624831e58992303a497a231e44a6c528714a87c028ca7055d44df1d1292883c366a44fdd1c92394868373e6c11dee399304f8a2abd3d2a3bf27aa6308beeb6141b3d8cfd9da4d82962c39585d965a366c2576b6611a23d0d1a6d1aa49ad9ad07e19a65b9ca1fb29808b1acefa5411041e1fca64996a24fa0f7b0c0a99799e630cb0f21eaefe2fd74fd07833467d574b85d9b452d8768c21fa184b631466f776956052fa3d3aab81a93672f5bbad0b9f24cb8dc60b9b296423e525687e74f9732b7d6ee7f27924e1e667ff9d0c15ba8b5b24dab573be1dd1ea983cf0bfa9edd95cb7ded61af5c74f478049bc1e50ed1aafc57952895ac4ae53e8fbc2cd848fb32e435b82a56cdb3c7b58021d720dc00be695f5d00233fd8ed2fd0c22cf297ac2345de5dfc960d15bc36bcf20011d4caa0816bd634d726f0c265d74c66132b8a3936a5210325bc582b240b5e9535f087e9c4c3bb1875b90f70ce64c46958a4f4c2aafcdff4a2f0c0375f9d40b20598b181f824247690a51900db280e250bf382b30c300707836274b16f0dc8e3972a6235ce3b555053ab49b5f81fc53cdce891473a1ab708086e66420ce43a966c93f58519412a4c97e75ce9d0a54e0282fee529932c54334ec895ff1a5a97038c966d623e75ee01f8009f915ce88103c73c2e6c462aa28a8b6358938739ffce91bffb7358411874d7ff9c3d1d2f6dd21f7bba7d0749fa803cd0006f5fa5139afdaef1d955d76e2e79558c08a29dc9976dbc717da2ccbdb1ca2c331bbb7bb69aae0d34c8fcc8d38f473223c1eea8b41bcbe05ce2c2bd1d72d5d4627af4e16fe6425c59624bf2b13c175cf6fbc367603bdc4f417fb399d58aacf31b6f16609c9dca250687e909702fddef63194ea9b0534d2ef82d1b351e242fe639c76ccaa7530cd24d4cd33cd4fd87e10fad41e5130627a555ddcc1a57315a200ef6fe105169c47d36c3b03e6a8a6c8f3919822ea5ffb428d9745e8be513306f980e69a0b0d38ac794fb38d016e09adf84ed498a9156d40be6f989fc66b0b01902af6800dff891641a9833b5e20f5e47a9fdd76125dadfd442879a19952f6dd2e8404cd0c9002fa2ea4efcdaae3370f44b919e99e8f8d4984ffa08e3c362a8e145fe3a6b213bcbbd4c20310f08d809bca8af83657af3b924a375ed7f8310aa4cfe0a43895a36c257d51a32bd649b0f1b989eea90d8980d816bb4267d01f782abdfa948efa8bd11a7db10ee22c2b63cb81940f7ca606f30aaec73e7e810e7e389e32980a255ada2b22a992219b415b48d15ad9920d806230e9894fa7208f5dd9c15d25272bcc92abcc8c55625732e42a88f7e23a3fb692b871eb81182c4417a42df26151725482066af342ec8766b206ff78097d15397ebc197b04ac48ad2932dfd9f8a6e34ab7b3f5cf7758a5c3ded83701940f01931cd9f844da3cfc2e59433f13b3e65bea88cebdce4166863f642f821043196c853b60a9c5d9d703728edea421a2c20dbb177330c4659aacf7f020ecbd646925559b26f7228cc2e305af87780de9fa55593b582c337f638fb1865c50b138cd12388936cdd7e4654e7de8eb813d71689e90243d6e8ccb149d98832281808faffba201946943bd16d2b115f751cac08ba0c46b0b56a0a7dbb0761a1ce7f71bf39c7f6277a8e1fa169e0a7eb3d4edb4b696888da8853b49e0c135b63076cf35c7bf3d10f03c0373b3c3ca8a8d5baf632245e714507c91f723a4d3022781ba48fec51666deb4d17490233265bf15bed47dd6388c9cc8b68a51306475fdf7842fdbedcc1e0b42ad181166a9101a64976bce88309b0ff0096c66ac7d0afbce7445aae6be3ef97dc2ddd17724a34d63e53384c2832e060e7e3267a655f3de56033bfed264cb8c5cd90ee0556a0c73aeed785cc56963e4fb5eafda63d61b2a3d9e162dbe471d2935e57d043516693fe20ed5b5d631d626eaea97b35222de7a227c7d2e1703fe2e31db074c168eca147cb2565085fbb8131201e5b21bc2a077323dbaa7155cf0dd7964d21bf5dfcef02f6ded3d00ebc339f0d748606077eca8ccf4b013fe47f337250267f465ea406251669793aee1f389caf8d77b225bce04d46d549ed284fb54fab689bec62f808ec9ac14080bacfe178027fcfdff55025ee3c6a69e039ddbae692f69c6a5bdc89264b6d66186f3e16be72eef6221892a8cb173d8bb79f086dd3c43e4187ddcca8a48357143c6051543b182651f794cdb11f5ec9906a3a11eaab7b3b3ae2812ebf345847d97b577f1278b981f9ba35313b09dca7da3f873c019cd73285301f32c5c85ce2309d4ac45b491b4189d50c96c3b7cd364f7f7ffa7b883dca0708f31788b79bfaa3981a99a06a9710ec80ef318ad52e9781f31bfd039fc3bdae81a5a6152c99b68c9b55ca7ddaad356aff91bc4430efebc8f7aca34b382b6fa13a8c2fd03558f919d498055b950b918b6785ccc247d78b9d76839465999007b06b2a61f8f11fb7d48ae660aaa1baa2ded921d38789ef6f3dffbea2aeccb98662772c30a89aefb8ec3daea44aee4685bdf5a5a897bf986609432874f28f548f07da63bb6c514c8ddfecb41ffabd7bbec7e61aeb9a71cd7e7c45d4bc43426641246830ee13126889aca14492694bb858801170b63851967b4990dc2dfbfa17460b3e0eb6d468951b8e2dea37ce506dda144f1cd2f9118f5811e1619373c5bfd89d909d3f4d59e9a2de2aa40daeaf71e23ad7e0019c585a161f2622dd31c5e8d7bb8263c59888e5d4158ceeef48bc3013a1b2360b2502b123e8cdf1d820d1e86104144596e20f61a9237a97555f535aba57fb1a61aa56b9bea93e569e753ac2bf5bdbb49ef54fbc1bc03d71bfe2fc4bf879fee1cab5d28db7def24cd12bdca5eb2bbf98ccdf06d3809e5c03d0fd8762982032c7d7b43915ce2dab7ad46f8f70e0fe095c9f9562dddaf4c77f9908c6ec9e82f4019434aa7e5fb4ff0babe3902ad1d4e4ba8ec8f0c7f2a2c0ab87b7188273bc59ac1ea1dca9d8e8332a02835b45a271e75276c258d9bb27f2e2b0a5d776ee9652266c33b103e567ee2d2e8de8dd0a4c9129e5e30ff12dbbcbc9fcb3ae91b089d22521234da3909ccb42a86c7a8fe2f516fcb73f0d6f31206e749f010613c4f7d5e200d6e6a94fd97abc5b41a5783be19c069d311b79d542e73c5f1f9385c31c8c893eabfc7afad4f002b1920fa22a9cac3801e51a33edafec430e552e74e663ef50e246b9a99da1302c6f708578b0317dc4e06c5fc6d31d19ef411f76345489646597a86842fff97e5d81660cd3e1a5b19661bff6518ec31f7ee67869d7cd42b13182f0ac50dfb8d53c52c3bc6898c9ec5cf9f3315cdec8cc61dfc63b883c3cb1bb5bd88e352beca1c8d386f5198b43c3bcd20bcd06d2d41e600b29c14f56a92ea223415213129ab472f65b0c1dcde6023968d453a1f4de5008900d0fa7469b55c56146af91baa2ed3aa807b2641a4791309a40c9063be015786a4a35362845cf33f217787244c7ad0e139fc292d82d0624acf41fa72e8660e27b114ee71b14bb3ded9bb8147cff7f955513d2c727d378078b2ce4860d4897dc7bd55e4ad25363864692c92c59f2a531df3f3d8e4beeb9bbc874221ac8cf77b18e15eedffb24891bc970b74de8193f167c9742aa0858ac360dcf0a09a171e30efdf752760e6f1986149cd8bd59e76a0342bc62ca95fada8194b4c47caae10288e5daccc74915eda891965c0da1a7eba75779d255cfa0046d333c3d2e078fa744bdbd66761e3041d633bde4cb2e22475d10d98e6ffde8bf7a44c3ca8e6079940a3dc4db9208ae1b28ee3882152b4bf578bebc211440c6157f288a17f05a3f5ade8a8458f01e20abb9b98aa78da68bb7a8a8111c6e7a5639b1f07825f118f2cd1c041956b7bb0203e863085a47fec8923a53735a71f7688f27daf6b46c8db7bda357c5038b567fede6724ca3d39c3dfca7be086261e6c203ec89881e4e79f33b5636b0a8e5c90835d984029266f270a7ab9a0cc2926070890b5cf552bb9b88270483f5b945c234e91524d36098975444ba54d349068cdcc2eafd544ad240b8d07673a29acce34eb0d7c4fcc8b80035ae933eeab7cb0dae4092acf4d00f92303c213d575917f40fe8c0352efe910f7c025496ed53921569c057f6c53f667cb13333acb54458441f41b86593090e60bae2c3822c059ca2c36bc64b46ad74fef88a92735207e558ceb138bf186b8f821cc4c2b226da0a82e5de71e19946fc1cc21bce31f8c4eb69969faa7efb244466d9d58da84aba98abec07c277bc6d1d66583f9282d0ffb70ff7de0698b60fbe290ed48c6f81f1c7108e1a707eaa7a755e183c17d4baa505c429a7fcc3fa2892eb67c2f661fdf1990ea9ba1e88d4f2d75ba663350a59b7511c1ea068cd3d740a2b5461a1c6b780c8720222ab37c6bbb46326ee3ff69da887411ad1d159e8b6a537a73e70e4709a323be486fe4c479e1c957e1a5c834bf08d97dec17fa3c30d3b43308fc32e7b3c81622e15b218e015aef7affc6c401ef39970f1884379fcfac0e9e60d869123228065912366076bf23e59af54e014f892a16fbc1834e55b8cb136deff4a1d3932a63578fd41a24316b0e2ac3dfe2437b8df99d49ea5ac0984f8bd5baf36d92e4a95848fae01dece64f4f9f0e5d150d1d08bdd132ecffbd836a2647fa01c3e96836846e2f23d76b3a52e297532f88e59caa08ef63c66a951ca85f592c4d484e481021036b15d9375ca80176951e22a438ca3b9a37edf75536b1f7c9d4030d89ce5d642a3f7bbdc9e8311866c56f015d53ca701410d3ffd4cbc733e49cc4bdb5942aa245cf8a041ddc1187cc09534a0eb4bbff0cdd2bb2a6c187ee1d6707fbb4bd79ee46d72eb5d484638cc38a48a5dff62c9e5d8fcca88eab2ce3ffa5b2d499062ac4b89a37535c28e63868d682625f5d8fb64faea0baaa042c61c200648f541465e8eee98e1b2fd235257a2df58fed4917d55df4eca3b38d3d33b8a5d122aa0d204ec61e44f414d68719a5f4f19a8b101d0c68e94fc9bc93af0534f7606a0ef55c5234e95ccd5b22c3ad238c5fa048c7e2d6e75776a7129eaeb19c33008dff60c08b3c50ca9879b3e582e9dd68cfc2aa41b6d3b845519b1488a234f45ab09d8e52b7965c4af76949b69874555ba79adf83e50b97647ba97ce1c14ee5298a206532074b2fe92539ab3093cb68f6c1897912fffa96491e8a84b22a9c9889f747315c174349ea45c402b827ecc6e2476d8eb3ccdab6d65a995e2ee31e2139b68094ca3fb44414456b39c5c3e7b5cf2023812f8888c153f34237cfabbc5a2b44a8c70f6819c75686a5934664bf43bffc7d0af1897f746e0069a4ae6a25d6e901708800dcf81243b34d3e5dd2ba49231d58305e0aa331f270ec539e4014cd76c529c96913d1704cb3be5871b03f64c8e83519ed9ccdd33b86bd37579094550aefd2f9cacaf54969661bc3b78d6b2d5b77ba359fc359d5 + diff --git a/src/tests/test_xmss.cpp b/src/tests/test_xmss.cpp index 0c69bf986e0..f8610e1e11a 100644 --- a/src/tests/test_xmss.cpp +++ b/src/tests/test_xmss.cpp @@ -2,7 +2,7 @@ * Extended Hash-Based Signatures Tests * * (C) 2014,2015 Jack Lloyd - * (C) 2016 Matthias Gierlings + * (C) 2016,2018 Matthias Gierlings **/ #include "tests.h" @@ -82,6 +82,28 @@ class XMSS_Signature_Verify_Tests final : public PK_Signature_Verification_Test } }; +class XMSS_Signature_Verify_Invalid_Tests final : public PK_Signature_NonVerification_Test + { + public: + XMSS_Signature_Verify_Invalid_Tests() + : PK_Signature_NonVerification_Test( + "XMSS", + "pubkey/xmss_invalid.vec", + "Params,Msg,PublicKey,InvalidSignature") {} + + std::string default_padding(const VarMap& vars) const override + { + return get_req_str(vars, "Params"); + } + + std::unique_ptr load_public_key(const VarMap& vars) override + { + const std::vector raw_key = get_req_bin(vars, "PublicKey"); + std::unique_ptr key(new Botan::XMSS_PublicKey(raw_key)); + return key; + } + }; + class XMSS_Keygen_Tests final : public PK_Key_Generation_Test { public: @@ -97,6 +119,7 @@ class XMSS_Keygen_Tests final : public PK_Key_Generation_Test BOTAN_REGISTER_TEST("xmss_sign", XMSS_Signature_Tests); BOTAN_REGISTER_TEST("xmss_verify", XMSS_Signature_Verify_Tests); +BOTAN_REGISTER_TEST("xmss_verify_invalid", XMSS_Signature_Verify_Invalid_Tests); BOTAN_REGISTER_TEST("xmss_keygen", XMSS_Keygen_Tests); #endif From 8b3a420571fa33ba968b36e79d751fe1db0de586 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 12 Apr 2018 16:14:21 -0400 Subject: [PATCH 013/174] In XMSS_Tools::bench_threads only call hardware_concurrency once Getting this value will typically require either a system call or a cpuid call, both of which are fairly expensive. --- src/lib/pubkey/xmss/xmss_tools.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/lib/pubkey/xmss/xmss_tools.cpp b/src/lib/pubkey/xmss/xmss_tools.cpp index f4f762aeb75..f9bd4892ec3 100644 --- a/src/lib/pubkey/xmss/xmss_tools.cpp +++ b/src/lib/pubkey/xmss/xmss_tools.cpp @@ -19,26 +19,28 @@ size_t XMSS_Tools::max_threads() size_t XMSS_Tools::bench_threads() { - if(std::thread::hardware_concurrency() <= 1) + const size_t hardware_concurrency = std::thread::hardware_concurrency(); + + if(hardware_concurrency <= 1) { return 1; } const size_t BENCH_ITERATIONS = 1000; std::vector threads; - threads.reserve(std::thread::hardware_concurrency()); + threads.reserve(hardware_concurrency); std::vector durations; - std::vector concurrency { std::thread::hardware_concurrency(), - std::thread::hardware_concurrency() / 2 }; + std::vector concurrency { hardware_concurrency, + hardware_concurrency / 2 }; for(const auto& cc : concurrency) { - std::vector hash(std::thread::hardware_concurrency(), + std::vector hash(hardware_concurrency, XMSS_Hash("SHA-256")); const std::vector buffer(hash[0].output_length()); std::vector> data( - std::thread::hardware_concurrency(), + hardware_concurrency, secure_vector(hash[0].output_length())); auto start = std::chrono::high_resolution_clock::now(); for(size_t i = 0; i < cc; ++i) @@ -46,7 +48,7 @@ size_t XMSS_Tools::bench_threads() auto& hs = hash[i]; auto& d = data[i]; - const size_t n_iters = BENCH_ITERATIONS * (std::thread::hardware_concurrency() / cc); + const size_t n_iters = BENCH_ITERATIONS * (hardware_concurrency / cc); threads.emplace_back(std::thread([n_iters, &hs, &d]() { for(size_t n = 0; n < n_iters; n++) From eae170db2a6f0461cfe2f55b84ae4e89bd719a74 Mon Sep 17 00:00:00 2001 From: Matthias Gierlings Date: Tue, 10 Apr 2018 22:10:37 +0200 Subject: [PATCH 014/174] Codecov - cover MT code in XMSS_PrivateKey Codecov does not reach all parts of the `XMSS_PrivateKey` code because too few cores are detected during the CI run. To cover the missed codepaths always return a large enough core count if botan is compiled with coverage. --- configure.py | 2 ++ src/build-data/buildh.in | 4 ++++ src/lib/pubkey/xmss/xmss_tools.cpp | 8 ++++++++ 3 files changed, 14 insertions(+) diff --git a/configure.py b/configure.py index 26a5ba8a229..bf4cf1365ed 100755 --- a/configure.py +++ b/configure.py @@ -1857,6 +1857,8 @@ def shared_lib_uses_symlinks(): 'build_fuzzers': options.build_fuzzers, + 'build_coverage' : options.with_coverage_info or options.with_coverage, + 'symlink_shared_lib': options.build_shared_lib and shared_lib_uses_symlinks(), 'libobj_dir': build_paths.libobj_dir, diff --git a/src/build-data/buildh.in b/src/build-data/buildh.in index 807b6f4797f..594eab9c83a 100644 --- a/src/build-data/buildh.in +++ b/src/build-data/buildh.in @@ -56,6 +56,10 @@ #define BOTAN_HAS_SANITIZER_%{i|upper} %{endfor} +%{if build_coverage} +#define BOTAN_HAS_COVERAGE +%{endif} + #define BOTAN_TARGET_ARCH_IS_%{arch|upper} %{if endian} #define BOTAN_TARGET_CPU_IS_%{endian|upper}_ENDIAN diff --git a/src/lib/pubkey/xmss/xmss_tools.cpp b/src/lib/pubkey/xmss/xmss_tools.cpp index f4f762aeb75..3297664fb29 100644 --- a/src/lib/pubkey/xmss/xmss_tools.cpp +++ b/src/lib/pubkey/xmss/xmss_tools.cpp @@ -66,11 +66,19 @@ size_t XMSS_Tools::bench_threads() if(durations[0].count() < durations[1].count()) { +#if defined(BOTAN_HAS_COVERAGE) + return 4; +#else return concurrency[0]; +#endif } else { +#if defined(BOTAN_HAS_COVERAGE) + return 4; +#else return concurrency[1]; +#endif } } From 134e2d21b6118542a0000ba6b556db9357000339 Mon Sep 17 00:00:00 2001 From: Matthias Gierlings Date: Thu, 12 Apr 2018 15:56:57 +0200 Subject: [PATCH 015/174] Removes unused overload in XMSS_Hash - Removes overload `XMSS_Hash::h_msg_update(secure_vector&)` --- src/lib/pubkey/xmss/xmss_hash.cpp | 5 ----- src/lib/pubkey/xmss/xmss_hash.h | 7 ------- 2 files changed, 12 deletions(-) diff --git a/src/lib/pubkey/xmss/xmss_hash.cpp b/src/lib/pubkey/xmss/xmss_hash.cpp index a691453dc9b..cd714873ca9 100644 --- a/src/lib/pubkey/xmss/xmss_hash.cpp +++ b/src/lib/pubkey/xmss/xmss_hash.cpp @@ -56,11 +56,6 @@ void XMSS_Hash::h_msg_init(const secure_vector& randomness, m_msg_hash->update(index_bytes); } -void XMSS_Hash::h_msg_update(const secure_vector& data) - { - m_msg_hash->update(data); - } - void XMSS_Hash::h_msg_update(const uint8_t data[], size_t size) { m_msg_hash->update(data, size); diff --git a/src/lib/pubkey/xmss/xmss_hash.h b/src/lib/pubkey/xmss/xmss_hash.h index 85cebdc9169..f45432d59cf 100644 --- a/src/lib/pubkey/xmss/xmss_hash.h +++ b/src/lib/pubkey/xmss/xmss_hash.h @@ -116,13 +116,6 @@ class XMSS_Hash final const secure_vector& root, const secure_vector& index_bytes); - /** - * Adds a message block to buffered h_msg computation. - * - * @param data A message block - **/ - void h_msg_update(const secure_vector& data); - /** * Adds a message block to buffered h_msg computation. * From f0c16e78ccdec810b57dc73e4727011f5a163798 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Fri, 13 Apr 2018 10:41:36 -0400 Subject: [PATCH 016/174] Various minor ECC optimizations Add a way of getting Montgomery representation of one. Reduce use of temporaries in variable point mult. Prefer doubling over addition in precomputing fixed window. Add Brainpool ECDH tests Improves ECDH by 2-3% across the board --- src/lib/pubkey/ec_group/curve_gfp.cpp | 7 +++- src/lib/pubkey/ec_group/curve_gfp.h | 7 ++++ src/lib/pubkey/ec_group/ec_group.cpp | 2 +- src/lib/pubkey/ec_group/point_gfp.cpp | 31 ++++++++++++----- src/lib/pubkey/ec_group/point_gfp.h | 26 ++++++++++++++ src/lib/pubkey/ec_group/point_mul.cpp | 50 +++++++++++++++++++++------ src/lib/pubkey/ec_group/point_mul.h | 3 +- src/tests/data/pubkey/ecdh.vec | 32 +++++++++++++++++ 8 files changed, 137 insertions(+), 21 deletions(-) diff --git a/src/lib/pubkey/ec_group/curve_gfp.cpp b/src/lib/pubkey/ec_group/curve_gfp.cpp index 9f614ac61b3..e76636589ed 100644 --- a/src/lib/pubkey/ec_group/curve_gfp.cpp +++ b/src/lib/pubkey/ec_group/curve_gfp.cpp @@ -52,6 +52,8 @@ class CurveGFp_Montgomery final : public CurveGFp_Repr const BigInt& get_b_rep() const override { return m_b_r; } + const BigInt& get_1_rep() const override { return m_r; } + bool is_one(const BigInt& x) const override { return x == m_r; } size_t get_p_words() const override { return m_p_words; } @@ -197,7 +199,7 @@ class CurveGFp_NIST : public CurveGFp_Repr { public: CurveGFp_NIST(size_t p_bits, const BigInt& a, const BigInt& b) : - m_a(a), m_b(b), m_p_words((p_bits + BOTAN_MP_WORD_BITS - 1) / BOTAN_MP_WORD_BITS) + m_1(1), m_a(a), m_b(b), m_p_words((p_bits + BOTAN_MP_WORD_BITS - 1) / BOTAN_MP_WORD_BITS) { // All Solinas prime curves are assumed a == -3 } @@ -209,6 +211,8 @@ class CurveGFp_NIST : public CurveGFp_Repr const BigInt& get_b() const override { return m_b; } + const BigInt& get_1_rep() const override { return m_1; } + size_t get_p_words() const override { return m_p_words; } size_t get_ws_size() const override { return 2*m_p_words + 4; } @@ -242,6 +246,7 @@ class CurveGFp_NIST : public CurveGFp_Repr virtual void redc(BigInt& x, secure_vector& ws) const = 0; // Curve parameters + BigInt m_1; BigInt m_a, m_b; size_t m_p_words; // cache of m_p.sig_words() }; diff --git a/src/lib/pubkey/ec_group/curve_gfp.h b/src/lib/pubkey/ec_group/curve_gfp.h index 3a17c6678f6..865bb68f82e 100644 --- a/src/lib/pubkey/ec_group/curve_gfp.h +++ b/src/lib/pubkey/ec_group/curve_gfp.h @@ -44,6 +44,11 @@ class BOTAN_UNSTABLE_API CurveGFp_Repr */ virtual const BigInt& get_b_rep() const = 0; + /* + * Returns to_curve_rep(1) + */ + virtual const BigInt& get_1_rep() const = 0; + virtual BigInt invert_element(const BigInt& x, secure_vector& ws) const = 0; virtual void to_curve_rep(BigInt& x, secure_vector& ws) const = 0; @@ -120,6 +125,8 @@ class BOTAN_UNSTABLE_API CurveGFp final const BigInt& get_b_rep() const { return m_repr->get_b_rep(); } + const BigInt& get_1_rep() const { return m_repr->get_1_rep(); } + bool a_is_minus_3() const { return m_repr->a_is_minus_3(); } bool a_is_zero() const { return m_repr->a_is_zero(); } diff --git a/src/lib/pubkey/ec_group/ec_group.cpp b/src/lib/pubkey/ec_group/ec_group.cpp index d5a94c90c9e..fc512b7332a 100644 --- a/src/lib/pubkey/ec_group/ec_group.cpp +++ b/src/lib/pubkey/ec_group/ec_group.cpp @@ -528,7 +528,7 @@ PointGFp EC_Group::blinded_var_point_multiply(const PointGFp& point, std::vector& ws) const { PointGFp_Var_Point_Precompute mul(point); - mul.randomize_repr(rng); + mul.randomize_repr(rng, ws); return mul.mul(k, rng, get_order(), ws); } diff --git a/src/lib/pubkey/ec_group/point_gfp.cpp b/src/lib/pubkey/ec_group/point_gfp.cpp index 86045925239..c65b4ac168e 100644 --- a/src/lib/pubkey/ec_group/point_gfp.cpp +++ b/src/lib/pubkey/ec_group/point_gfp.cpp @@ -111,8 +111,7 @@ void PointGFp::add_affine(const word x_words[], size_t x_size, // FIXME avoid the copy here m_coord_x = BigInt(x_words, x_size); m_coord_y = BigInt(y_words, y_size); - m_coord_z = 1; - m_curve.to_rep(m_coord_z, ws_bn[0].get_word_vector()); + m_coord_z = m_curve.get_1_rep(); return; } @@ -284,6 +283,25 @@ void PointGFp::add(const PointGFp& rhs, std::vector& ws_bn) m_curve.mul(m_coord_z, T0, T4, ws); } +void PointGFp::mult2i(size_t iterations, std::vector& ws_bn) + { + if(iterations == 0) + return; + + if(m_coord_y.is_zero()) + { + *this = PointGFp(m_curve); // setting myself to zero + return; + } + + /* + TODO we can save 2 squarings per iteration by computing + a*Z^4 using values cached from previous iteration + */ + for(size_t i = 0; i != iterations; ++i) + mult2(ws_bn); + } + // *this *= 2 void PointGFp::mult2(std::vector& ws_bn) { @@ -301,7 +319,7 @@ void PointGFp::mult2(std::vector& ws_bn) secure_vector& ws = ws_bn[0].get_word_vector(); BigInt& T0 = ws_bn[1]; BigInt& T1 = ws_bn[2]; - BigInt& T2 = ws_bn[6]; + BigInt& T2 = ws_bn[3]; BigInt& T3 = ws_bn[4]; BigInt& T4 = ws_bn[5]; @@ -459,13 +477,11 @@ void PointGFp::force_all_affine(std::vector& points, */ const CurveGFp& curve = points[0].m_curve; + const BigInt& rep_1 = curve.get_1_rep(); if(ws.size() < curve.get_ws_size()) ws.resize(curve.get_ws_size()); - BigInt rep_1 = 1; - curve.to_rep(rep_1, ws); - std::vector c(points.size()); c[0] = points[0].m_coord_z; @@ -512,8 +528,7 @@ void PointGFp::force_affine() const BigInt z3_inv = m_curve.mul_to_tmp(z_inv, z2_inv, ws); m_coord_x = m_curve.mul_to_tmp(m_coord_x, z2_inv, ws); m_coord_y = m_curve.mul_to_tmp(m_coord_y, z3_inv, ws); - m_coord_z = 1; - m_curve.to_rep(m_coord_z, ws); + m_coord_z = m_curve.get_1_rep(); } bool PointGFp::is_affine() const diff --git a/src/lib/pubkey/ec_group/point_gfp.h b/src/lib/pubkey/ec_group/point_gfp.h index 2a9948fde11..271d7383aae 100644 --- a/src/lib/pubkey/ec_group/point_gfp.h +++ b/src/lib/pubkey/ec_group/point_gfp.h @@ -152,6 +152,13 @@ class BOTAN_PUBLIC_API(2,0) PointGFp final const BigInt& get_y() const { return m_coord_y; } const BigInt& get_z() const { return m_coord_z; } + void swap_coords(BigInt& new_x, BigInt& new_y, BigInt& new_z) + { + m_coord_x.swap(new_x); + m_coord_y.swap(new_y); + m_coord_z.swap(new_z); + } + /** * Force this point to affine coordinates */ @@ -235,6 +242,13 @@ class BOTAN_PUBLIC_API(2,0) PointGFp final */ void mult2(std::vector& workspace); + /** + * Repeated point doubling + * @param i number of doublings to perform + * @param workspace temp space, at least WORKSPACE_SIZE elements + */ + void mult2i(size_t i, std::vector& workspace); + /** * Point addition * @param other the point to add to *this @@ -248,6 +262,18 @@ class BOTAN_PUBLIC_API(2,0) PointGFp final return x; } + /** + * Point doubling + * @param workspace temp space, at least WORKSPACE_SIZE elements + * @return *this doubled + */ + PointGFp double_of(std::vector& workspace) const + { + PointGFp x = (*this); + x.mult2(workspace); + return x; + } + /** * Return the zero (aka infinite) point associated with this curve */ diff --git a/src/lib/pubkey/ec_group/point_mul.cpp b/src/lib/pubkey/ec_group/point_mul.cpp index d052b837c4b..17087a6edb1 100644 --- a/src/lib/pubkey/ec_group/point_mul.cpp +++ b/src/lib/pubkey/ec_group/point_mul.cpp @@ -140,22 +140,54 @@ PointGFp_Var_Point_Precompute::PointGFp_Var_Point_Precompute(const PointGFp& poi { m_window_bits = 4; + std::vector ws(PointGFp::WORKSPACE_SIZE); + m_U.resize(1U << m_window_bits); m_U[0] = point.zero(); m_U[1] = point; - std::vector ws(PointGFp::WORKSPACE_SIZE); - for(size_t i = 2; i < m_U.size(); ++i) + for(size_t i = 2; i < m_U.size(); i += 2) { - m_U[i] = m_U[i-1]; - m_U[i].add(point, ws); + m_U[i] = m_U[i/2].double_of(ws); + m_U[i+1] = m_U[i].plus(point, ws); } } -void PointGFp_Var_Point_Precompute::randomize_repr(RandomNumberGenerator& rng) +void PointGFp_Var_Point_Precompute::randomize_repr(RandomNumberGenerator& rng, + std::vector& ws_bn) { + if(BOTAN_POINTGFP_RANDOMIZE_BLINDING_BITS <= 1) + return; + + if(ws_bn.size() < 7) + ws_bn.resize(7); + + BigInt& mask = ws_bn[0]; + BigInt& mask2 = ws_bn[1]; + BigInt& mask3 = ws_bn[2]; + BigInt& new_x = ws_bn[3]; + BigInt& new_y = ws_bn[4]; + BigInt& new_z = ws_bn[5]; + secure_vector& ws = ws_bn[6].get_word_vector(); + + const CurveGFp& curve = m_U[0].get_curve(); + + // Skipping zero point since it can't be randomized for(size_t i = 1; i != m_U.size(); ++i) - m_U[i].randomize_repr(rng); + { + mask.randomize(rng, BOTAN_POINTGFP_RANDOMIZE_BLINDING_BITS, false); + // Easy way of ensuring mask != 0 + mask.set_bit(0); + + curve.sqr(mask2, mask, ws); + curve.mul(mask3, mask, mask2, ws); + + curve.mul(new_x, m_U[i].get_x(), mask2, ws); + curve.mul(new_y, m_U[i].get_y(), mask3, ws); + curve.mul(new_z, m_U[i].get_z(), mask, ws); + + m_U[i].swap_coords(new_x, new_y, new_z); + } } PointGFp PointGFp_Var_Point_Precompute::mul(const BigInt& k, @@ -193,8 +225,7 @@ PointGFp PointGFp_Var_Point_Precompute::mul(const BigInt& k, while(windows) { - for(size_t i = 0; i != m_window_bits; ++i) - R.mult2(ws); + R.mult2i(m_window_bits, ws); const uint32_t inner_nibble = scalar.get_substring((windows-1)*m_window_bits, m_window_bits); // cache side channel here, we are relying on blinding... @@ -261,8 +292,7 @@ PointGFp PointGFp_Multi_Point_Precompute::multi_exp(const BigInt& z1, { if(i > 0) { - H.mult2(ws); - H.mult2(ws); + H.mult2i(2, ws); } const uint8_t z1_b = z1.get_substring(z_bits - i - 2, 2); diff --git a/src/lib/pubkey/ec_group/point_mul.h b/src/lib/pubkey/ec_group/point_mul.h index cfce05d5c7b..da1d3b7445e 100644 --- a/src/lib/pubkey/ec_group/point_mul.h +++ b/src/lib/pubkey/ec_group/point_mul.h @@ -43,7 +43,8 @@ class PointGFp_Var_Point_Precompute public: PointGFp_Var_Point_Precompute(const PointGFp& point); - void randomize_repr(RandomNumberGenerator& rng); + void randomize_repr(RandomNumberGenerator& rng, + std::vector& ws); PointGFp mul(const BigInt& k, RandomNumberGenerator& rng, diff --git a/src/tests/data/pubkey/ecdh.vec b/src/tests/data/pubkey/ecdh.vec index 085041b1af0..336fd0acbeb 100644 --- a/src/tests/data/pubkey/ecdh.vec +++ b/src/tests/data/pubkey/ecdh.vec @@ -607,3 +607,35 @@ K = c026b625989f1c31e9330792ca6a9fd11896938ade31a91d38ab0457d911eeaa Secret = 0x85a268f9d7772f990c36b42b0a331adc92b5941de0b862d5d89a347cbf8faab0 CounterKey = 04AE597AD61FF4489367D4BD4132CCFD738E53C347AA463FFB5EA193713612530CBDAF81342A5ABF8B9A62CA88D52C5B6F6873678B6FEB0B991C2E16E32FDEB141 K = 19ee841c07e4874d727e4d56a664cbc0af6238ca49fd54f567c9829299b8dbff + +# From RFC 7027 + +[brainpool256r1] + +Secret = 0x81DB1EE100150FF2EA338D708271BE38300CB54241D79950F77B063039804F1D +CounterKey = 048D2D688C6CF93E1160AD04CC4429117DC2C41825E1E9FCA0ADDD34E6F1B39F7B990C57520812BE512641E47034832106BC7D3E8DD0E4C7F1136D7006547CEC6A +K = 89AFC39D41D3B327814B80940B042590F96556EC91E6AE7939BCE31F3A18BF2B + +Secret = 0x55E40BC41E37E3E2AD25C3C6654511FFA8474A91A0032087593852D3E7D76BD3 +CounterKey = 0444106E913F92BC02A1705D9953A8414DB95E1AAA49E81D9E85F929A8E3100BE58AB4846F11CACCB73CE49CBDD120F5A900A69FD32C272223F789EF10EB089BDC +K = 89AFC39D41D3B327814B80940B042590F96556EC91E6AE7939BCE31F3A18BF2B + +[brainpool384r1] + +Secret = 0x1E20F5E048A5886F1F157C74E91BDE2B98C8B52D58E5003D57053FC4B0BD65D6F15EB5D1EE1610DF870795143627D042 +CounterKey = 044D44326F269A597A5B58BBA565DA5556ED7FD9A8A9EB76C25F46DB69D19DC8CE6AD18E404B15738B2086DF37E71D1EB462D692136DE56CBE93BF5FA3188EF58BC8A3A0EC6C1E151A21038A42E9185329B5B275903D192F8D4E1F32FE9CC78C48 +K = 0BD9D3A7EA0B3D519D09D8E48D0785FB744A6B355E6304BC51C229FBBCE239BBADF6403715C35D4FB2A5444F575D4F42 + +Secret = 0x032640BC6003C59260F7250C3DB58CE647F98E1260ACCE4ACDA3DD869F74E01F8BA5E0324309DB6A9831497ABAC96670 +CounterKey = 0468B665DD91C195800650CDD363C625F4E742E8134667B767B1B476793588F885AB698C852D4A6E77A252D6380FCAF06855BC91A39C9EC01DEE36017B7D673A931236D2F1F5C83942D049E3FA20607493E0D038FF2FD30C2AB67D15C85F7FAA59 +K = 0BD9D3A7EA0B3D519D09D8E48D0785FB744A6B355E6304BC51C229FBBCE239BBADF6403715C35D4FB2A5444F575D4F42 + +[brainpool512r1] + +Secret = 0x16302FF0DBBB5A8D733DAB7141C1B45ACBC8715939677F6A56850A38BD87BD59B09E80279609FF333EB9D4C061231FB26F92EEB04982A5F1D1764CAD57665422 +CounterKey = 049D45F66DE5D67E2E6DB6E93A59CE0BB48106097FF78A081DE781CDB31FCE8CCBAAEA8DD4320C4119F1E9CD437A2EAB3731FA9668AB268D871DEDA55A5473199F2FDC313095BCDD5FB3A91636F07A959C8E86B5636A1E930E8396049CB481961D365CC11453A06C719835475B12CB52FC3C383BCE35E27EF194512B71876285FA +K = A7927098655F1F9976FA50A9D566865DC530331846381C87256BAF3226244B76D36403C024D7BBF0AA0803EAFF405D3D24F11A9B5C0BEF679FE1454B21C4CD1F + +Secret = 0x230E18E1BCC88A362FA54E4EA3902009292F7F8033624FD471B5D8ACE49D12CFABBC19963DAB8E2F1EBA00BFFB29E4D72D13F2224562F405CB80503666B25429 +CounterKey = 040A420517E406AAC0ACDCE90FCD71487718D3B953EFD7FBEC5F7F27E28C6149999397E91E029E06457DB2D3E640668B392C2A7E737A7F0BF04436D11640FD09FD72E6882E8DB28AAD36237CD25D580DB23783961C8DC52DFA2EC138AD472A0FCEF3887CF62B623B2A87DE5C588301EA3E5FC269B373B60724F5E82A6AD147FDE7 +K = A7927098655F1F9976FA50A9D566865DC530331846381C87256BAF3226244B76D36403C024D7BBF0AA0803EAFF405D3D24F11A9B5C0BEF679FE1454B21C4CD1F From 325d772cf89763a3ca9e5ac144d10af6c408421f Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Sat, 14 Apr 2018 08:50:39 -0400 Subject: [PATCH 017/174] Another todo --- doc/todo.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/todo.rst b/doc/todo.rst index 17a1f340885..d052bfcf948 100644 --- a/doc/todo.rst +++ b/doc/todo.rst @@ -31,6 +31,8 @@ Ciphers, Hashes, PBKDF Public Key Crypto, Math ---------------------------------------- +* Abstract repesentation of ECC point elements to allow specific + implementations of the field arithmetic depending upon the curve. * Curves for pairings (BN-256 is widely implemented) * Identity based encryption * BBS group signatures From 92605ef479e6b12a095a5451d20bcbcc72007c09 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Sat, 14 Apr 2018 10:05:57 -0400 Subject: [PATCH 018/174] Add an explicit test mode build GH #1537 --- configure.py | 11 +++++++++-- src/build-data/buildh.in | 4 ++-- src/lib/pubkey/xmss/xmss_tools.cpp | 4 ++-- src/scripts/ci_build.py | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/configure.py b/configure.py index bf4cf1365ed..8e2c807a2c7 100755 --- a/configure.py +++ b/configure.py @@ -3,7 +3,7 @@ """ Configuration program for botan -(C) 2009,2010,2011,2012,2013,2014,2015,2016,2017 Jack Lloyd +(C) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018 Jack Lloyd (C) 2015,2016,2017 Simon Warta (Kullo GmbH) Botan is released under the Simplified BSD License (see license.txt) @@ -460,6 +460,12 @@ def process_command_line(args): # pylint: disable=too-many-locals build_group.add_option('--with-fuzzer-lib', metavar='LIB', default=None, dest='fuzzer_lib', help='additionally link in LIB') + build_group.add_option('--test-mode', action='store_true', default=False, + help=optparse.SUPPRESS_HELP) + + build_group.add_option('--with-debug-asserts', action='store_true', default=False, + help=optparse.SUPPRESS_HELP) + docs_group = optparse.OptionGroup(parser, 'Documentation Options') docs_group.add_option('--with-documentation', action='store_true', @@ -1947,7 +1953,8 @@ def shared_lib_uses_symlinks(): 'with_valgrind': options.with_valgrind, 'with_openmp': options.with_openmp, - 'with_debug_asserts': options.debug_mode, + 'with_debug_asserts': options.with_debug_asserts, + 'test_mode': options.test_mode, 'mod_list': sorted([m.basename for m in modules]) } diff --git a/src/build-data/buildh.in b/src/build-data/buildh.in index 594eab9c83a..bb7d1419bee 100644 --- a/src/build-data/buildh.in +++ b/src/build-data/buildh.in @@ -56,8 +56,8 @@ #define BOTAN_HAS_SANITIZER_%{i|upper} %{endfor} -%{if build_coverage} -#define BOTAN_HAS_COVERAGE +%{if test_mode} +#define BOTAN_TEST_MODE %{endif} #define BOTAN_TARGET_ARCH_IS_%{arch|upper} diff --git a/src/lib/pubkey/xmss/xmss_tools.cpp b/src/lib/pubkey/xmss/xmss_tools.cpp index b55a977d84e..585e14f2ed8 100644 --- a/src/lib/pubkey/xmss/xmss_tools.cpp +++ b/src/lib/pubkey/xmss/xmss_tools.cpp @@ -68,7 +68,7 @@ size_t XMSS_Tools::bench_threads() if(durations[0].count() < durations[1].count()) { -#if defined(BOTAN_HAS_COVERAGE) +#if defined(BOTAN_TEST_MODE) return 4; #else return concurrency[0]; @@ -76,7 +76,7 @@ size_t XMSS_Tools::bench_threads() } else { -#if defined(BOTAN_HAS_COVERAGE) +#if defined(BOTAN_TEST_MODE) return 4; #else return concurrency[1]; diff --git a/src/scripts/ci_build.py b/src/scripts/ci_build.py index 97b7a1cf934..18dae66b227 100755 --- a/src/scripts/ci_build.py +++ b/src/scripts/ci_build.py @@ -89,7 +89,7 @@ def determine_flags(target, target_os, target_cpu, target_cc, cc_bin, ccache, ro test_cmd = None if target == 'coverage': - flags += ['--with-coverage-info'] + flags += ['--with-coverage-info', '--test-mode'] if target == 'valgrind': flags += ['--with-valgrind'] test_prefix = ['valgrind', '--error-exitcode=9', '-v', '--leak-check=full', '--show-reachable=yes'] From 2e3050c98994a4f4792839a3a1e1f294b24ba363 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Sun, 15 Apr 2018 17:45:47 -0400 Subject: [PATCH 019/174] Use GCC builtins for clz operation --- src/lib/utils/bit_ops.h | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/lib/utils/bit_ops.h b/src/lib/utils/bit_ops.h index aa41db3912b..c7e40149237 100644 --- a/src/lib/utils/bit_ops.h +++ b/src/lib/utils/bit_ops.h @@ -107,11 +107,36 @@ inline size_t ctz(T n) template<> inline size_t ctz(uint32_t n) { + if(n == 0) + return 32; return __builtin_ctz(n); } -#endif +template<> +inline size_t ctz(uint64_t n) + { + if(n == 0) + return 64; + return __builtin_ctzll(n); + } +template<> +inline size_t high_bit(uint32_t x) + { + if(x == 0) + return 0; + return (32 - __builtin_clz(x)); + } + +template<> +inline size_t high_bit(uint64_t x) + { + if(x == 0) + return 0; + return (64 - __builtin_clzll(x)); + } + +#endif template size_t ceil_log2(T x) From 4fdc3ee1922df17bcb3a2ecdbd17e4494fe3d661 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Sun, 15 Apr 2018 17:46:37 -0400 Subject: [PATCH 020/174] Simplify Karatsuba code And set us up for eventually having this be completely const time. --- src/lib/math/mp/mp_core.cpp | 19 +++++++++++--- src/lib/math/mp/mp_core.h | 13 ++++++++-- src/lib/math/mp/mp_karat.cpp | 50 ++++++++++++------------------------ 3 files changed, 43 insertions(+), 39 deletions(-) diff --git a/src/lib/math/mp/mp_core.cpp b/src/lib/math/mp/mp_core.cpp index 52ad3a4d4f4..b1add33a4de 100644 --- a/src/lib/math/mp/mp_core.cpp +++ b/src/lib/math/mp/mp_core.cpp @@ -157,8 +157,7 @@ word bigint_add3_nc(word z[], const word x[], size_t x_size, */ void bigint_add2(word x[], size_t x_size, const word y[], size_t y_size) { - if(bigint_add2_nc(x, x_size, y, y_size)) - x[x_size] += 1; + x[x_size] += bigint_add2_nc(x, x_size, y, y_size); } /* @@ -212,6 +211,20 @@ void bigint_sub2_rev(word x[], const word y[], size_t y_size) BOTAN_ASSERT(!borrow, "y must be greater than x"); } +int32_t bigint_sub_abs(word z[], const word x[], const word y[], size_t sz) + { + word borrow = bigint_sub3(z, x, sz, y, sz); + + CT::unpoison(borrow); + if(borrow) + { + bigint_sub3(z, y, sz, x, sz); + return -1; + } + + return 1; + } + /* * Three Operand Subtraction */ @@ -396,7 +409,7 @@ void bigint_shr2(word y[], const word x[], size_t x_size, * Compare two MP integers */ int32_t bigint_cmp(const word x[], size_t x_size, - const word y[], size_t y_size) + const word y[], size_t y_size) { if(x_size < y_size) { return (-bigint_cmp(y, y_size, x, x_size)); } diff --git a/src/lib/math/mp/mp_core.h b/src/lib/math/mp/mp_core.h index a2c39bafa28..1fae33987ba 100644 --- a/src/lib/math/mp/mp_core.h +++ b/src/lib/math/mp/mp_core.h @@ -95,6 +95,15 @@ word bigint_sub3(word z[], const word x[], size_t x_size, const word y[], size_t y_size); +/** +* Return abs(x-y), ie if x >= y, then compute z = x - y +* Otherwise compute z = y - x +* No borrow is possible since the result is always >= 0 +* +* Returns 1 if x >= y or -1 if x < y +*/ +int32_t bigint_sub_abs(word z[], const word x[], const word y[], size_t size); + /* * Shift Operations */ @@ -134,10 +143,10 @@ void bigint_monty_redc(word z[], size_t ws_size); /** -* Compare x and y +* Compare x and y returning early */ int32_t bigint_cmp(const word x[], size_t x_size, - const word y[], size_t y_size); + const word y[], size_t y_size); /** * Compute ((n1< 0) - bigint_sub3(z0, x0, N2, x1, N2); - else - bigint_sub3(z0, x1, N2, x0, N2); - - if(cmp1 > 0) - bigint_sub3(z1, y1, N2, y0, N2); - else - bigint_sub3(z1, y0, N2, y1, N2); + // First compute (X_lo - X_hi)*(Y_hi - Y_lo) + const int32_t cmp0 = bigint_sub_abs(z0, x0, x1, N2); + const int32_t cmp1 = bigint_sub_abs(z1, y1, y0, N2); - karatsuba_mul(workspace, z0, z1, N2, workspace+N); - } + karatsuba_mul(workspace, z0, z1, N2, workspace+N); + const bool is_negative = cmp0 != cmp1; + // Compute X_lo * Y_lo karatsuba_mul(z0, x0, y0, N2, workspace+N); + + // Compute X_hi * Y_hi karatsuba_mul(z1, x1, y1, N2, workspace+N); const word ws_carry = bigint_add3_nc(workspace + N, z0, N, z1, N); @@ -139,10 +131,10 @@ void karatsuba_mul(word z[], const word x[], const word y[], size_t N, z_carry += bigint_add2_nc(z + N + N2, N2, &ws_carry, 1); bigint_add2_nc(z + N + N2, N2, &z_carry, 1); - if((cmp0 == cmp1) || (cmp0 == 0) || (cmp1 == 0)) - bigint_add2(z + N2, 2*N-N2, workspace, N); - else + if(is_negative) bigint_sub2(z + N2, 2*N-N2, workspace, N); + else + bigint_add2_nc(z + N2, 2*N-N2, workspace, N); } /* @@ -169,21 +161,11 @@ void karatsuba_sqr(word z[], const word x[], size_t N, word workspace[]) word* z0 = z; word* z1 = z + N; - const int32_t cmp = bigint_cmp(x0, N2, x1, N2); - clear_mem(workspace, 2*N); // See comment in karatsuba_mul - - //if(cmp) - { - if(cmp > 0) - bigint_sub3(z0, x0, N2, x1, N2); - else - bigint_sub3(z0, x1, N2, x0, N2); - - karatsuba_sqr(workspace, z0, N2, workspace+N); - } + bigint_sub_abs(z0, x0, x1, N2); + karatsuba_sqr(workspace, z0, N2, workspace+N); karatsuba_sqr(z0, x0, N2, workspace+N); karatsuba_sqr(z1, x1, N2, workspace+N); @@ -195,9 +177,9 @@ void karatsuba_sqr(word z[], const word x[], size_t N, word workspace[]) bigint_add2_nc(z + N + N2, N2, &z_carry, 1); /* - * This is only actually required if cmp is != 0, however - * if cmp==0 then workspace[0:N] == 0 and avoiding the jump - * hides a timing channel. + * This is only actually required if cmp (result of bigint_sub_abs) is != 0, + * however if cmp==0 then workspace[0:N] == 0 and avoiding the jump hides a + * timing channel. */ bigint_sub2(z + N2, 2*N-N2, workspace, N); } From f425705104cf01b30ac8f0c155f96b82fa93124d Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Sun, 15 Apr 2018 17:49:20 -0400 Subject: [PATCH 021/174] Add const time annotations --- src/lib/math/bigint/bigint.cpp | 12 ++++++++++++ src/lib/math/bigint/bigint.h | 8 ++++++++ src/lib/math/numbertheory/monty.h | 3 +++ src/lib/math/numbertheory/monty_exp.cpp | 22 +++++++++++++++++----- src/lib/math/numbertheory/monty_exp.h | 3 ++- src/lib/pubkey/rsa/rsa.cpp | 2 +- 6 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/lib/math/bigint/bigint.cpp b/src/lib/math/bigint/bigint.cpp index fd967e66eee..8874195afa3 100644 --- a/src/lib/math/bigint/bigint.cpp +++ b/src/lib/math/bigint/bigint.cpp @@ -335,6 +335,18 @@ void BigInt::shrink_to_fit(size_t min_size) m_reg.resize(words); } +#if defined(BOTAN_HAS_VALGRIND) +void BigInt::const_time_poison() const + { + CT::poison(m_reg.data(), m_reg.size()); + } + +void BigInt::const_time_unpoison() const + { + CT::unpoison(m_reg.data(), m_reg.size()); + } +#endif + void BigInt::const_time_lookup(secure_vector& output, const std::vector& vec, size_t idx) diff --git a/src/lib/math/bigint/bigint.h b/src/lib/math/bigint/bigint.h index 44177de96dc..eec7f617693 100644 --- a/src/lib/math/bigint/bigint.h +++ b/src/lib/math/bigint/bigint.h @@ -565,6 +565,14 @@ class BOTAN_PUBLIC_API(2,0) BigInt final */ void encode_words(word out[], size_t size) const; +#if defined(BOTAN_HAS_VALGRIND) + void const_time_poison() const; + void const_time_unpoison() const; +#else + void const_time_poison() const {} + void const_time_unpoison() const {} +#endif + /** * @param rng a random number generator * @param min the minimum value diff --git a/src/lib/math/numbertheory/monty.h b/src/lib/math/numbertheory/monty.h index 9f369f1a5ea..2af655230d7 100644 --- a/src/lib/math/numbertheory/monty.h +++ b/src/lib/math/numbertheory/monty.h @@ -100,6 +100,9 @@ class Montgomery_Int final Montgomery_Int& mul_by_8(secure_vector& ws); + void const_time_poison() const { m_v.const_time_poison(); } + void const_time_unpoison() const { return m_v.const_time_unpoison(); } + private: std::shared_ptr m_params; BigInt m_v; diff --git a/src/lib/math/numbertheory/monty_exp.cpp b/src/lib/math/numbertheory/monty_exp.cpp index 4bf281fa9b0..b32a7ab4c73 100644 --- a/src/lib/math/numbertheory/monty_exp.cpp +++ b/src/lib/math/numbertheory/monty_exp.cpp @@ -20,7 +20,8 @@ class Montgomery_Exponentation_State public: Montgomery_Exponentation_State(std::shared_ptr params, const BigInt& g, - size_t window_bits); + size_t window_bits, + bool const_time); BigInt exponentiation(const BigInt& k) const; @@ -29,13 +30,16 @@ class Montgomery_Exponentation_State std::shared_ptr m_params; std::vector m_g; size_t m_window_bits; + bool m_const_time; }; Montgomery_Exponentation_State::Montgomery_Exponentation_State(std::shared_ptr params, const BigInt& g, - size_t window_bits) : + size_t window_bits, + bool const_time) : m_params(params), - m_window_bits(window_bits == 0 ? 4 : window_bits) + m_window_bits(window_bits == 0 ? 4 : window_bits), + m_const_time(const_time) { if(m_window_bits < 1 || m_window_bits > 12) // really even 8 is too large ... throw Invalid_Argument("Invalid window bits for Montgomery exponentiation"); @@ -59,6 +63,8 @@ Montgomery_Exponentation_State::Montgomery_Exponentation_State(std::shared_ptr& output, BigInt Montgomery_Exponentation_State::exponentiation(const BigInt& scalar) const { const size_t exp_nibbles = (scalar.bits() + m_window_bits - 1) / m_window_bits; + CT::unpoison(exp_nibbles); Montgomery_Int x(m_params, m_params->R1(), false); @@ -111,11 +118,14 @@ BigInt Montgomery_Exponentation_State::exponentiation(const BigInt& scalar) cons x.mul_by(e_bits, ws); } + x.const_time_unpoison(); return x.value(); } BigInt Montgomery_Exponentation_State::exponentiation_vartime(const BigInt& scalar) const { + BOTAN_ASSERT_NOMSG(m_const_time == false); + const size_t exp_nibbles = (scalar.bits() + m_window_bits - 1) / m_window_bits; Montgomery_Int x(m_params, m_params->R1(), false); @@ -135,15 +145,17 @@ BigInt Montgomery_Exponentation_State::exponentiation_vartime(const BigInt& scal x.mul_by(m_g[nibble], ws); } + x.const_time_unpoison(); return x.value(); } std::shared_ptr monty_precompute(std::shared_ptr params, const BigInt& g, - size_t window_bits) + size_t window_bits, + bool const_time) { - return std::make_shared(params, g, window_bits); + return std::make_shared(params, g, window_bits, const_time); } BigInt monty_execute(const Montgomery_Exponentation_State& precomputed_state, diff --git a/src/lib/math/numbertheory/monty_exp.h b/src/lib/math/numbertheory/monty_exp.h index 6eeb88e7f8e..61da258cc00 100644 --- a/src/lib/math/numbertheory/monty_exp.h +++ b/src/lib/math/numbertheory/monty_exp.h @@ -24,7 +24,8 @@ class Montgomery_Exponentation_State; std::shared_ptr monty_precompute(std::shared_ptr params_p, const BigInt& g, - size_t window_bits); + size_t window_bits, + bool const_time = true); /* * Return g^x mod p diff --git a/src/lib/pubkey/rsa/rsa.cpp b/src/lib/pubkey/rsa/rsa.cpp index 69d7052dc50..df639be5834 100644 --- a/src/lib/pubkey/rsa/rsa.cpp +++ b/src/lib/pubkey/rsa/rsa.cpp @@ -356,7 +356,7 @@ class RSA_Public_Operation const size_t powm_window = 1; - auto powm_m_n = monty_precompute(m_monty_n, m, powm_window); + auto powm_m_n = monty_precompute(m_monty_n, m, powm_window, false); return monty_execute_vartime(*powm_m_n, m_e); } From aa6bca4a149228cc3061a7a357865597da53251c Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 16 Apr 2018 06:58:14 -0400 Subject: [PATCH 022/174] Use bad_record_mac instead of decode_error for short TLS packets Decode error seems more appropriate but it confuses some automated tools including older versions of TLS-Attacker. --- src/lib/tls/tls_record.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/lib/tls/tls_record.cpp b/src/lib/tls/tls_record.cpp index 1f564a68940..b5ea33c070d 100644 --- a/src/lib/tls/tls_record.cpp +++ b/src/lib/tls/tls_record.cpp @@ -299,8 +299,15 @@ void decrypt_record(secure_vector& output, const uint8_t* msg = &record_contents[cs.nonce_bytes_from_record()]; const size_t msg_length = record_len - cs.nonce_bytes_from_record(); + /* + * This early rejection is based just on public information (length of the + * encrypted packet) and so does not leak any information. We used to use + * decode_error here which really is more appropriate, but that confuses some + * tools which are attempting automated detection of padding oracles, + * including older versions of TLS-Attacker. + */ if(msg_length < aead->minimum_final_size()) - throw Decoding_Error("AEAD packet is shorter than the tag"); + throw TLS_Exception(Alert::BAD_RECORD_MAC, "AEAD packet is shorter than the tag"); const size_t ptext_size = aead->output_length(msg_length); From c620c61cf5e9379a074a1ff8fa9fa913c27dd5eb Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 16 Apr 2018 07:18:34 -0400 Subject: [PATCH 023/174] Add vars to split the two Karatsuba sub-workspaces --- src/lib/math/mp/mp_karat.cpp | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/lib/math/mp/mp_karat.cpp b/src/lib/math/mp/mp_karat.cpp index 2ac03ac1e4a..220bd8f9e5e 100644 --- a/src/lib/math/mp/mp_karat.cpp +++ b/src/lib/math/mp/mp_karat.cpp @@ -101,6 +101,9 @@ void karatsuba_mul(word z[], const word x[], const word y[], size_t N, word* z0 = z; word* z1 = z + N; + word* ws0 = workspace; + word* ws1 = workspace + N; + clear_mem(workspace, 2*N); /* @@ -116,25 +119,25 @@ void karatsuba_mul(word z[], const word x[], const word y[], size_t N, const int32_t cmp0 = bigint_sub_abs(z0, x0, x1, N2); const int32_t cmp1 = bigint_sub_abs(z1, y1, y0, N2); - karatsuba_mul(workspace, z0, z1, N2, workspace+N); + karatsuba_mul(ws0, z0, z1, N2, ws1); const bool is_negative = cmp0 != cmp1; // Compute X_lo * Y_lo - karatsuba_mul(z0, x0, y0, N2, workspace+N); + karatsuba_mul(z0, x0, y0, N2, ws1); // Compute X_hi * Y_hi - karatsuba_mul(z1, x1, y1, N2, workspace+N); + karatsuba_mul(z1, x1, y1, N2, ws1); - const word ws_carry = bigint_add3_nc(workspace + N, z0, N, z1, N); - word z_carry = bigint_add2_nc(z + N2, N, workspace + N, N); + const word ws_carry = bigint_add3_nc(ws1, z0, N, z1, N); + word z_carry = bigint_add2_nc(z + N2, N, ws1, N); z_carry += bigint_add2_nc(z + N + N2, N2, &ws_carry, 1); bigint_add2_nc(z + N + N2, N2, &z_carry, 1); if(is_negative) - bigint_sub2(z + N2, 2*N-N2, workspace, N); + bigint_sub2(z + N2, 2*N-N2, ws0, N); else - bigint_add2_nc(z + N2, 2*N-N2, workspace, N); + bigint_add2_nc(z + N2, 2*N-N2, ws0, N); } /* @@ -161,27 +164,30 @@ void karatsuba_sqr(word z[], const word x[], size_t N, word workspace[]) word* z0 = z; word* z1 = z + N; + word* ws0 = workspace; + word* ws1 = workspace + N; + clear_mem(workspace, 2*N); // See comment in karatsuba_mul bigint_sub_abs(z0, x0, x1, N2); - karatsuba_sqr(workspace, z0, N2, workspace+N); + karatsuba_sqr(ws0, z0, N2, ws1); - karatsuba_sqr(z0, x0, N2, workspace+N); - karatsuba_sqr(z1, x1, N2, workspace+N); + karatsuba_sqr(z0, x0, N2, ws1); + karatsuba_sqr(z1, x1, N2, ws1); - const word ws_carry = bigint_add3_nc(workspace + N, z0, N, z1, N); - word z_carry = bigint_add2_nc(z + N2, N, workspace + N, N); + const word ws_carry = bigint_add3_nc(ws1, z0, N, z1, N); + word z_carry = bigint_add2_nc(z + N2, N, ws1, N); z_carry += bigint_add2_nc(z + N + N2, N2, &ws_carry, 1); bigint_add2_nc(z + N + N2, N2, &z_carry, 1); /* * This is only actually required if cmp (result of bigint_sub_abs) is != 0, - * however if cmp==0 then workspace[0:N] == 0 and avoiding the jump hides a + * however if cmp==0 then ws0[0:N] == 0 and avoiding the jump hides a * timing channel. */ - bigint_sub2(z + N2, 2*N-N2, workspace, N); + bigint_sub2(z + N2, 2*N-N2, ws0, N); } /* From 7398cea6fd7bfc1012a8b17a5034c095777195d6 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 16 Apr 2018 07:18:52 -0400 Subject: [PATCH 024/174] Update news --- news.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/news.rst b/news.rst index 352886c57c2..cb77a317fbc 100644 --- a/news.rst +++ b/news.rst @@ -7,6 +7,19 @@ Version 2.7.0, Not Yet Released * Optimized elliptic point doubling for curves with an ``a`` parameter of zero or negative three. (GH #1534) +* Allow the year to be up to 2200 in ASN.1 time objects. Previously this + was limited to 2100. (GH #1536) + +* XMSS signature verification did not check that the signature was of + the expected length which could lead to a crash. (GH #1537) + +* Small optimizations for ECC (#1531) + +* In the test suite use ``mkstemp`` to create temporary files instead + of creating them in the current working directory. (GH #1533 #1530) + +* Avoid creating symlinks to the shared object on OpenBSD (#1535) + Version 2.6.0, 2018-04-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 5a05ea6b00d672d521eabb4250dfbd997ff0700d Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 16 Apr 2018 07:47:58 -0400 Subject: [PATCH 025/174] Truncate new SKIDs to 192 bits More than long enough, and saves quite a bit of space especially for SHA-512 certificates. --- news.rst | 5 +++++ src/lib/x509/x509_ext.cpp | 6 ++++++ src/lib/x509/x509self.cpp | 9 +++------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/news.rst b/news.rst index cb77a317fbc..573eb152c45 100644 --- a/news.rst +++ b/news.rst @@ -13,6 +13,11 @@ Version 2.7.0, Not Yet Released * XMSS signature verification did not check that the signature was of the expected length which could lead to a crash. (GH #1537) +* Botan generates X.509 subject key IDs by hashing the public key with + whatever hash function is being used to sign the certificate. However + especially for SHA-512 this caused SKIDs that were far longer than + necessary. Now all SKIDs are truncated to 192 bits. + * Small optimizations for ECC (#1531) * In the test suite use ``mkstemp`` to create temporary files instead diff --git a/src/lib/x509/x509_ext.cpp b/src/lib/x509/x509_ext.cpp index b969ad7cfd3..c0fe904bc9c 100644 --- a/src/lib/x509/x509_ext.cpp +++ b/src/lib/x509/x509_ext.cpp @@ -434,6 +434,12 @@ Subject_Key_ID::Subject_Key_ID(const std::vector& pub_key, const std::s hash->update(pub_key); hash->final(m_key_id.data()); + + // Truncate longer hashes, 192 bits here seems plenty + const size_t max_skid_len = (192 / 8); + if(m_key_id.size() > max_skid_len) + m_key_id.resize(max_skid_len); + m_key_id[0] = 0x44; } /* diff --git a/src/lib/x509/x509self.cpp b/src/lib/x509/x509self.cpp index 78bbe8615b0..32f21c10153 100644 --- a/src/lib/x509/x509self.cpp +++ b/src/lib/x509/x509self.cpp @@ -82,13 +82,10 @@ X509_Certificate create_self_signed_cert(const X509_Cert_Options& opts, extensions.add_new(new Cert_Extension::Key_Usage(constraints), true); } - std::unique_ptr hash(HashFunction::create_or_throw(hash_fn)); - hash->update(pub_key); - std::vector skid(hash->output_length()); - hash->final(skid.data()); + std::unique_ptr skid(new Cert_Extension::Subject_Key_ID(pub_key, hash_fn)); - extensions.add_new(new Cert_Extension::Subject_Key_ID(skid)); - extensions.add_new(new Cert_Extension::Authority_Key_ID(skid)); + extensions.add_new(new Cert_Extension::Authority_Key_ID(skid->get_key_id())); + extensions.add_new(skid.release()); extensions.add_new( new Cert_Extension::Subject_Alternative_Name(subject_alt)); From 8e1ac525333fcb09aca9f9f5126e14f8389d82ec Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 16 Apr 2018 12:19:02 -0400 Subject: [PATCH 026/174] Remove debug assignment [ci skip] --- src/lib/x509/x509_ext.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/x509/x509_ext.cpp b/src/lib/x509/x509_ext.cpp index c0fe904bc9c..9686eacda45 100644 --- a/src/lib/x509/x509_ext.cpp +++ b/src/lib/x509/x509_ext.cpp @@ -439,7 +439,6 @@ Subject_Key_ID::Subject_Key_ID(const std::vector& pub_key, const std::s const size_t max_skid_len = (192 / 8); if(m_key_id.size() > max_skid_len) m_key_id.resize(max_skid_len); - m_key_id[0] = 0x44; } /* From 83d8a4871750df398e9a0438f70a7df96c13c66c Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 17 Apr 2018 11:12:13 -0400 Subject: [PATCH 027/174] Avoid potential side channel when generating RSA primes Add a new function dedicated to generating RSA primes. Don't test for p.bits() > bits until the very end - rarely happens, and speeds up prime generation quite noticably. Add Miller-Rabin error probabilities for 1/2**128, which again speeds up RSA keygen and DL param gen quite a bit. --- src/lib/math/numbertheory/make_prm.cpp | 157 ++++++++++++++++++++----- src/lib/math/numbertheory/numthry.cpp | 40 +++++-- src/lib/math/numbertheory/numthry.h | 17 ++- src/lib/pubkey/rsa/rsa.cpp | 8 +- 4 files changed, 179 insertions(+), 43 deletions(-) diff --git a/src/lib/math/numbertheory/make_prm.cpp b/src/lib/math/numbertheory/make_prm.cpp index bd0ae8e925e..85089c9cbd0 100644 --- a/src/lib/math/numbertheory/make_prm.cpp +++ b/src/lib/math/numbertheory/make_prm.cpp @@ -12,6 +12,61 @@ namespace Botan { +namespace { + +class Prime_Sieve + { + public: + Prime_Sieve(const BigInt& init_value) : m_sieve(PRIME_TABLE_SIZE) + { + for(size_t i = 0; i != m_sieve.size(); ++i) + m_sieve[i] = static_cast(init_value % PRIMES[i]); + } + + void step(word increment) + { + for(size_t i = 0; i != m_sieve.size(); ++i) + { + m_sieve[i] = (m_sieve[i] + increment) % PRIMES[i]; + } + } + + bool passes(bool check_2p1 = false) const + { + for(size_t i = 0; i != m_sieve.size(); ++i) + { + /* + In this case, p is a multiple of PRIMES[i] + */ + if(m_sieve[i] == 0) + return false; + + if(check_2p1) + { + /* + In this case, 2*p+1 will be a multiple of PRIMES[i] + + So if potentially generating a safe prime, we want to + avoid this value because 2*p+1 will certainly not be prime. + + See "Safe Prime Generation with a Combined Sieve" M. Wiener + https://eprint.iacr.org/2003/186.pdf + */ + if(m_sieve[i] == (PRIMES[i] - 1) / 2) + return false; + } + } + + return true; + } + + private: + std::vector m_sieve; + }; + +} + + /* * Generate a random prime */ @@ -64,7 +119,6 @@ BigInt random_prime(RandomNumberGenerator& rng, } } - secure_vector sieve(PRIME_TABLE_SIZE); const size_t MAX_ATTEMPTS = 32*1024; while(true) @@ -79,8 +133,7 @@ BigInt random_prime(RandomNumberGenerator& rng, // Force p to be equal to equiv mod modulo p += (modulo - (p % modulo)) + equiv; - for(size_t i = 0; i != sieve.size(); ++i) - sieve[i] = static_cast(p % PRIMES[i]); + Prime_Sieve sieve(p); size_t counter = 0; while(true) @@ -94,46 +147,89 @@ BigInt random_prime(RandomNumberGenerator& rng, p += modulo; - if(p.bits() > bits) - break; + sieve.step(modulo); - // Now that p is updated, update the sieve - for(size_t i = 0; i != sieve.size(); ++i) - { - sieve[i] = (sieve[i] + modulo) % PRIMES[i]; - } + if(sieve.passes(true) == false) + continue; - bool passes_sieve = true; - for(size_t i = 0; passes_sieve && (i != sieve.size()); ++i) + if(coprime > 1) { /* - In this case, p is a multiple of PRIMES[i] + * Check if gcd(p - 1, coprime) != 1 by computing the inverse. The + * gcd algorithm is not constant time, but modular inverse is (for + * odd modulus anyway). This avoids a side channel attack against RSA + * key generation, though RSA keygen should be using generate_rsa_prime. */ - if(sieve[i] == 0) - passes_sieve = false; + if(inverse_mod(p - 1, coprime).is_zero()) + continue; + } - /* - In this case, 2*p+1 will be a multiple of PRIMES[i] + if(p.bits() > bits) + break; - So if generating a safe prime, we want to avoid this value - because 2*p+1 will not be useful. Since the check is cheap to - do and doesn't seem to affect the overall distribution of the - generated primes overmuch it's used in all cases. + if(is_prime(p, rng, prob, true)) + return p; + } + } + } - See "Safe Prime Generation with a Combined Sieve" M. Wiener - https://eprint.iacr.org/2003/186.pdf - */ - if(sieve[i] == (PRIMES[i] - 1) / 2) - passes_sieve = false; +BigInt generate_rsa_prime(RandomNumberGenerator& keygen_rng, + RandomNumberGenerator& prime_test_rng, + size_t bits, + const BigInt& coprime, + size_t prob) + { + if(bits < 512) + throw Invalid_Argument("generate_rsa_prime bits too small"); + + if(coprime <= 1 || coprime.is_even()) + throw Invalid_Argument("generate_rsa_prime coprime must be odd positive integer"); + + const size_t MAX_ATTEMPTS = 32*1024; + + while(true) + { + BigInt p(keygen_rng, bits); + + // Force lowest and two top bits on + p.set_bit(bits - 1); + p.set_bit(bits - 2); + p.set_bit(0); + + Prime_Sieve sieve(p); + + const word step = 2; + + size_t counter = 0; + while(true) + { + ++counter; + + if(counter > MAX_ATTEMPTS) + { + break; // don't try forever, choose a new starting point } - if(!passes_sieve) + p += step; + + sieve.step(step); + + if(sieve.passes() == false) continue; - if(coprime > 0 && gcd(p - 1, coprime) != 1) + /* + * Check if gcd(p - 1, coprime) != 1 by computing the inverse. The + * gcd algorithm is not constant time, but modular inverse is (for + * odd modulus anyway). This avoids a side channel attack against RSA + * key generation. + */ + if(inverse_mod(p - 1, coprime).is_zero()) continue; - if(is_prime(p, rng, prob, true)) + if(p.bits() > bits) + break; + + if(is_prime(p, prime_test_rng, prob, true)) return p; } } @@ -156,7 +252,7 @@ BigInt random_safe_prime(RandomNumberGenerator& rng, size_t bits) Otherwise [q == 1 (mod 3) case], 2*q+1 == 3 (mod 3) and not prime. */ - q = random_prime(rng, bits - 1, 1, 2, 3, 8); + q = random_prime(rng, bits - 1, 0, 2, 3, 8); p = (q << 1) + 1; if(is_prime(p, rng, 128, true)) @@ -165,7 +261,6 @@ BigInt random_safe_prime(RandomNumberGenerator& rng, size_t bits) if(is_prime(q, rng, 128, true)) return p; } - } } diff --git a/src/lib/math/numbertheory/numthry.cpp b/src/lib/math/numbertheory/numthry.cpp index 76d7936bc4e..8cc9301755c 100644 --- a/src/lib/math/numbertheory/numthry.cpp +++ b/src/lib/math/numbertheory/numthry.cpp @@ -452,6 +452,13 @@ size_t mr_test_iterations(size_t n_bits, size_t prob, bool random) { const size_t base = (prob + 2) / 2; // worst case 4^-t error rate + /* + * If the candidate prime was maliciously constructed, we can't rely + * on arguments based on p being random. + */ + if(random == false) + return base; + /* * For randomly chosen numbers we can use the estimates from * http://www.math.dartmouth.edu/~carlp/PDF/paper88.pdf @@ -459,16 +466,31 @@ size_t mr_test_iterations(size_t n_bits, size_t prob, bool random) * These values are derived from the inequality for p(k,t) given on * the second page. */ - if(random && prob <= 80) + if(random) { - if(n_bits >= 1536) - return 2; // < 2^-89 - if(n_bits >= 1024) - return 4; // < 2^-89 - if(n_bits >= 512) - return 5; // < 2^-80 - if(n_bits >= 256) - return 11; // < 2^-80 + if(prob <= 80) + { + if(n_bits >= 1536) + return 2; // < 2^-89 + if(n_bits >= 1024) + return 3; // < 2^-89 + if(n_bits >= 512) + return 5; // < 2^-80 + if(n_bits >= 256) + return 11; // < 2^-80 + } + + if(prob <= 128) + { + if(n_bits >= 1536) + return 4; // < 2^-133 + if(n_bits >= 1024) + return 6; // < 2^-133 + if(n_bits >= 512) + return 12; // < 2^-129 + if(n_bits >= 256) + return 28; // < 2^-128 + } } return base; diff --git a/src/lib/math/numbertheory/numthry.h b/src/lib/math/numbertheory/numthry.h index 61da93bcdb7..7097979bd74 100644 --- a/src/lib/math/numbertheory/numthry.h +++ b/src/lib/math/numbertheory/numthry.h @@ -189,7 +189,7 @@ inline bool verify_prime(const BigInt& n, RandomNumberGenerator& rng) /** -* Randomly generate a prime +* Randomly generate a prime suitable for discrete logarithm parameters * @param rng a random number generator * @param bits how large the resulting prime should be in bits * @param coprime a positive integer that (prime - 1) should be coprime to @@ -206,6 +206,21 @@ BigInt BOTAN_PUBLIC_API(2,0) random_prime(RandomNumberGenerator& rng, size_t equiv_mod = 2, size_t prob = 128); +/** +* Generate a prime suitable for RSA p/q +* @param keygen_rng a random number generator +* @param prime_test_rng a random number generator +* @param bits how large the resulting prime should be in bits (must be >= 512) +* @param coprime a positive integer that (prime - 1) should be coprime to +* @param prob use test so false positive is bounded by 1/2**prob +* @return random prime with the specified criteria +*/ +BigInt BOTAN_PUBLIC_API(2,7) generate_rsa_prime(RandomNumberGenerator& keygen_rng, + RandomNumberGenerator& prime_test_rng, + size_t bits, + const BigInt& coprime, + size_t prob = 128); + /** * Return a 'safe' prime, of the form p=2*q+1 with q prime * @param rng a random number generator diff --git a/src/lib/pubkey/rsa/rsa.cpp b/src/lib/pubkey/rsa/rsa.cpp index df639be5834..ca0f414f511 100644 --- a/src/lib/pubkey/rsa/rsa.cpp +++ b/src/lib/pubkey/rsa/rsa.cpp @@ -143,9 +143,13 @@ RSA_PrivateKey::RSA_PrivateKey(RandomNumberGenerator& rng, do { - m_p = random_prime(rng, (bits + 1) / 2, m_e); - m_q = random_prime(rng, bits - m_p.bits(), m_e); + const size_t p_bits = (bits + 1) / 2; + const size_t q_bits = bits - p_bits; + + m_p = generate_rsa_prime(rng, rng, p_bits, m_e); + m_q = generate_rsa_prime(rng, rng, q_bits, m_e); m_n = m_p * m_q; + } while(m_n.bits() != bits); const BigInt phi_n = lcm(m_p - 1, m_q - 1); From 86247ee70e14c03fd09933e1e869c445caf5949f Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 17 Apr 2018 12:56:11 -0400 Subject: [PATCH 028/174] Update news --- news.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/news.rst b/news.rst index 573eb152c45..6a86833ce8c 100644 --- a/news.rst +++ b/news.rst @@ -4,6 +4,12 @@ Release Notes Version 2.7.0, Not Yet Released ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* Avoid a side channel in RSA key generation due to use of a non-constant time + gcd algorithm. (GH #1542) + +* Optimize prime generation, especially improving RSA key generation. + (GH #1542) + * Optimized elliptic point doubling for curves with an ``a`` parameter of zero or negative three. (GH #1534) From 4ef7125afe98fafa261cec0b083b69a029aaf678 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 17 Apr 2018 17:58:04 -0400 Subject: [PATCH 029/174] Precompute for multiexponentation when verifying ECC signatures ECDSA already did this. Improves repeated ECGDSA, ECKCDSA, SM2, and GOST signature verification by 10-15% --- news.rst | 3 +++ src/lib/pubkey/ecgdsa/ecgdsa.cpp | 7 ++++--- src/lib/pubkey/eckcdsa/eckcdsa.cpp | 11 ++++++----- src/lib/pubkey/gost_3410/gost_3410.cpp | 7 ++++--- src/lib/pubkey/sm2/sm2.cpp | 9 +++++---- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/news.rst b/news.rst index 6a86833ce8c..f970bd8f4ab 100644 --- a/news.rst +++ b/news.rst @@ -13,6 +13,9 @@ Version 2.7.0, Not Yet Released * Optimized elliptic point doubling for curves with an ``a`` parameter of zero or negative three. (GH #1534) +* Improved performance of signature verification in ECGDSA, ECKCDSA, + SM2 and GOST by 10-15%. + * Allow the year to be up to 2200 in ASN.1 time objects. Previously this was limited to 2100. (GH #1536) diff --git a/src/lib/pubkey/ecgdsa/ecgdsa.cpp b/src/lib/pubkey/ecgdsa/ecgdsa.cpp index 062bb524d96..192d999a8e5 100644 --- a/src/lib/pubkey/ecgdsa/ecgdsa.cpp +++ b/src/lib/pubkey/ecgdsa/ecgdsa.cpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace Botan { @@ -86,7 +87,7 @@ class ECGDSA_Verification_Operation final : public PK_Ops::Verification_with_EMS const std::string& emsa) : PK_Ops::Verification_with_EMSA(emsa), m_group(ecgdsa.domain()), - m_public_point(ecgdsa.public_point()) + m_gy_mul(m_group.get_base_point(), ecgdsa.public_point()) { } @@ -98,7 +99,7 @@ class ECGDSA_Verification_Operation final : public PK_Ops::Verification_with_EMS const uint8_t sig[], size_t sig_len) override; private: const EC_Group m_group; - const PointGFp& m_public_point; + const PointGFp_Multi_Point_Precompute m_gy_mul; }; bool ECGDSA_Verification_Operation::verify(const uint8_t msg[], size_t msg_len, @@ -119,7 +120,7 @@ bool ECGDSA_Verification_Operation::verify(const uint8_t msg[], size_t msg_len, const BigInt u1 = m_group.multiply_mod_order(e, w); const BigInt u2 = m_group.multiply_mod_order(s, w); - const PointGFp R = m_group.point_multiply(u1, m_public_point, u2); + const PointGFp R = m_gy_mul.multi_exp(u1, u2); if(R.is_zero()) return false; diff --git a/src/lib/pubkey/eckcdsa/eckcdsa.cpp b/src/lib/pubkey/eckcdsa/eckcdsa.cpp index f16fb027edb..90716228a07 100644 --- a/src/lib/pubkey/eckcdsa/eckcdsa.cpp +++ b/src/lib/pubkey/eckcdsa/eckcdsa.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -113,11 +114,11 @@ class ECKCDSA_Verification_Operation final : public PK_Ops::Verification_with_EM const std::string& emsa) : PK_Ops::Verification_with_EMSA(emsa), m_group(eckcdsa.domain()), - m_public_point(eckcdsa.public_point()), + m_gy_mul(m_group.get_base_point(), eckcdsa.public_point()), m_prefix() { - const BigInt public_point_x = m_public_point.get_affine_x(); - const BigInt public_point_y = m_public_point.get_affine_y(); + const BigInt public_point_x = eckcdsa.public_point().get_affine_x(); + const BigInt public_point_y = eckcdsa.public_point().get_affine_y(); m_prefix.resize(public_point_x.bytes() + public_point_y.bytes()); public_point_x.binary_encode(&m_prefix[0]); @@ -136,7 +137,7 @@ class ECKCDSA_Verification_Operation final : public PK_Ops::Verification_with_EM const uint8_t sig[], size_t sig_len) override; private: const EC_Group m_group; - const PointGFp& m_public_point; + const PointGFp_Multi_Point_Precompute m_gy_mul; secure_vector m_prefix; }; @@ -169,7 +170,7 @@ bool ECKCDSA_Verification_Operation::verify(const uint8_t msg[], size_t, BigInt w(r_xor_e.data(), r_xor_e.size()); w = m_group.mod_order(w); - const PointGFp q = m_group.point_multiply(w, m_public_point, s); + const PointGFp q = m_gy_mul.multi_exp(w, s); const BigInt q_x = q.get_affine_x(); secure_vector c(q_x.bytes()); q_x.binary_encode(c.data()); diff --git a/src/lib/pubkey/gost_3410/gost_3410.cpp b/src/lib/pubkey/gost_3410/gost_3410.cpp index 0fcca1b8d79..b0c94fb7e97 100644 --- a/src/lib/pubkey/gost_3410/gost_3410.cpp +++ b/src/lib/pubkey/gost_3410/gost_3410.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -151,7 +152,7 @@ class GOST_3410_Verification_Operation final : public PK_Ops::Verification_with_ const std::string& emsa) : PK_Ops::Verification_with_EMSA(emsa), m_group(gost.domain()), - m_public_point(gost.public_point()) + m_gy_mul(m_group.get_base_point(), gost.public_point()) {} size_t max_input_bits() const override { return m_group.get_order_bits(); } @@ -162,7 +163,7 @@ class GOST_3410_Verification_Operation final : public PK_Ops::Verification_with_ const uint8_t sig[], size_t sig_len) override; private: const EC_Group m_group; - const PointGFp& m_public_point; + const PointGFp_Multi_Point_Precompute m_gy_mul; }; bool GOST_3410_Verification_Operation::verify(const uint8_t msg[], size_t msg_len, @@ -189,7 +190,7 @@ bool GOST_3410_Verification_Operation::verify(const uint8_t msg[], size_t msg_le const BigInt z1 = m_group.multiply_mod_order(s, v); const BigInt z2 = m_group.multiply_mod_order(-r, v); - const PointGFp R = m_group.point_multiply(z1, m_public_point, z2); + const PointGFp R = m_gy_mul.multi_exp(z1, z2); if(R.is_zero()) return false; diff --git a/src/lib/pubkey/sm2/sm2.cpp b/src/lib/pubkey/sm2/sm2.cpp index 4b5610c85bc..95fe28f1470 100644 --- a/src/lib/pubkey/sm2/sm2.cpp +++ b/src/lib/pubkey/sm2/sm2.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -136,11 +137,11 @@ class SM2_Verification_Operation final : public PK_Ops::Verification const std::string& ident, const std::string& hash) : m_group(sm2.domain()), - m_public_point(sm2.public_point()), + m_gy_mul(m_group.get_base_point(), sm2.public_point()), m_hash(HashFunction::create_or_throw(hash)) { // ZA=H256(ENTLA || IDA || a || b || xG || yG || xA || yA) - m_za = sm2_compute_za(*m_hash, ident, m_group, m_public_point); + m_za = sm2_compute_za(*m_hash, ident, m_group, sm2.public_point()); m_hash->update(m_za); } @@ -152,7 +153,7 @@ class SM2_Verification_Operation final : public PK_Ops::Verification bool is_valid_signature(const uint8_t sig[], size_t sig_len) override; private: const EC_Group m_group; - const PointGFp& m_public_point; + const PointGFp_Multi_Point_Precompute m_gy_mul; std::vector m_za; std::unique_ptr m_hash; }; @@ -178,7 +179,7 @@ bool SM2_Verification_Operation::is_valid_signature(const uint8_t sig[], size_t if(t == 0) return false; - const PointGFp R = m_group.point_multiply(s, m_public_point, t); + const PointGFp R = m_gy_mul.multi_exp(s, t); // ??? if(R.is_zero()) From 2cfa191a940b7b884f24d23d94227ff382c672b4 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 17 Apr 2018 18:06:34 -0400 Subject: [PATCH 030/174] Add EC_Group::inverse_mod_order Centralizing this logic allows curve specific implementations such as using a precomputed ladder for exponentiating by p - 2 GH #1479 --- src/lib/pubkey/ec_group/ec_group.cpp | 10 ++++++++++ src/lib/pubkey/ec_group/ec_group.h | 5 +++++ src/lib/pubkey/ecdh/ecdh.cpp | 2 +- src/lib/pubkey/ecdsa/ecdsa.cpp | 4 ++-- src/lib/pubkey/ecgdsa/ecgdsa.cpp | 2 +- src/lib/pubkey/sm2/sm2.cpp | 4 ++-- 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/lib/pubkey/ec_group/ec_group.cpp b/src/lib/pubkey/ec_group/ec_group.cpp index fc512b7332a..ac23aa151e8 100644 --- a/src/lib/pubkey/ec_group/ec_group.cpp +++ b/src/lib/pubkey/ec_group/ec_group.cpp @@ -89,6 +89,11 @@ class EC_Group_Data final return m_mod_order.multiply(x, y); } + BigInt inverse_mod_order(const BigInt& x) const + { + return inverse_mod(x, m_order); + } + PointGFp blinded_base_point_multiply(const BigInt& k, RandomNumberGenerator& rng, std::vector& ws) const @@ -477,6 +482,11 @@ BigInt EC_Group::multiply_mod_order(const BigInt& x, const BigInt& y) const return data().multiply_mod_order(x, y); } +BigInt EC_Group::inverse_mod_order(const BigInt& x) const + { + return data().inverse_mod_order(x); + } + const OID& EC_Group::get_curve_oid() const { return data().oid(); diff --git a/src/lib/pubkey/ec_group/ec_group.h b/src/lib/pubkey/ec_group/ec_group.h index 8bb1a304488..f273108d2b6 100644 --- a/src/lib/pubkey/ec_group/ec_group.h +++ b/src/lib/pubkey/ec_group/ec_group.h @@ -198,6 +198,11 @@ class BOTAN_PUBLIC_API(2,0) EC_Group final */ BigInt mod_order(const BigInt& x) const; + /* + * Return inverse of x modulo the order + */ + BigInt inverse_mod_order(const BigInt& x) const; + /* * Reduce (x*y) modulo the order */ diff --git a/src/lib/pubkey/ecdh/ecdh.cpp b/src/lib/pubkey/ecdh/ecdh.cpp index adadb27036b..59f245a00cc 100644 --- a/src/lib/pubkey/ecdh/ecdh.cpp +++ b/src/lib/pubkey/ecdh/ecdh.cpp @@ -31,7 +31,7 @@ class ECDH_KA_Operation final : public PK_Ops::Key_Agreement_with_KDF m_group(key.domain()), m_rng(rng) { - m_l_times_priv = inverse_mod(m_group.get_cofactor(), m_group.get_order()) * key.private_value(); + m_l_times_priv = m_group.inverse_mod_order(m_group.get_cofactor()) * key.private_value(); } secure_vector raw_agree(const uint8_t w[], size_t w_len) override diff --git a/src/lib/pubkey/ecdsa/ecdsa.cpp b/src/lib/pubkey/ecdsa/ecdsa.cpp index 03f5e57ab6e..6e104f16414 100644 --- a/src/lib/pubkey/ecdsa/ecdsa.cpp +++ b/src/lib/pubkey/ecdsa/ecdsa.cpp @@ -89,7 +89,7 @@ ECDSA_Signature_Operation::raw_sign(const uint8_t msg[], size_t msg_len, const BigInt k = m_group.random_scalar(rng); #endif - const BigInt k_inv = inverse_mod(k, m_group.get_order()); + const BigInt k_inv = m_group.inverse_mod_order(k); const BigInt r = m_group.mod_order( m_group.blinded_base_point_multiply_x(k, rng, m_ws)); @@ -142,7 +142,7 @@ bool ECDSA_Verification_Operation::verify(const uint8_t msg[], size_t msg_len, if(r <= 0 || r >= m_group.get_order() || s <= 0 || s >= m_group.get_order()) return false; - const BigInt w = inverse_mod(s, m_group.get_order()); + const BigInt w = m_group.inverse_mod_order(s); const BigInt u1 = m_group.multiply_mod_order(e, w); const BigInt u2 = m_group.multiply_mod_order(r, w); diff --git a/src/lib/pubkey/ecgdsa/ecgdsa.cpp b/src/lib/pubkey/ecgdsa/ecgdsa.cpp index 192d999a8e5..61b7ae0558c 100644 --- a/src/lib/pubkey/ecgdsa/ecgdsa.cpp +++ b/src/lib/pubkey/ecgdsa/ecgdsa.cpp @@ -116,7 +116,7 @@ bool ECGDSA_Verification_Operation::verify(const uint8_t msg[], size_t msg_len, if(r <= 0 || r >= m_group.get_order() || s <= 0 || s >= m_group.get_order()) return false; - const BigInt w = inverse_mod(r, m_group.get_order()); + const BigInt w = m_group.inverse_mod_order(r); const BigInt u1 = m_group.multiply_mod_order(e, w); const BigInt u2 = m_group.multiply_mod_order(s, w); diff --git a/src/lib/pubkey/sm2/sm2.cpp b/src/lib/pubkey/sm2/sm2.cpp index 95fe28f1470..1096ea99f54 100644 --- a/src/lib/pubkey/sm2/sm2.cpp +++ b/src/lib/pubkey/sm2/sm2.cpp @@ -31,7 +31,7 @@ SM2_Signature_PrivateKey::SM2_Signature_PrivateKey(const AlgorithmIdentifier& al const secure_vector& key_bits) : EC_PrivateKey(alg_id, key_bits) { - m_da_inv = inverse_mod(m_private_key + 1, domain().get_order()); + m_da_inv = domain().inverse_mod_order(m_private_key + 1); } SM2_Signature_PrivateKey::SM2_Signature_PrivateKey(RandomNumberGenerator& rng, @@ -39,7 +39,7 @@ SM2_Signature_PrivateKey::SM2_Signature_PrivateKey(RandomNumberGenerator& rng, const BigInt& x) : EC_PrivateKey(rng, domain, x) { - m_da_inv = inverse_mod(m_private_key + 1, domain.get_order()); + m_da_inv = domain.inverse_mod_order(m_private_key + 1); } std::vector sm2_compute_za(HashFunction& hash, From 60fc5e9e739a642c0bd9396efff35897381caa1e Mon Sep 17 00:00:00 2001 From: tcely Date: Tue, 17 Apr 2018 19:29:17 -0400 Subject: [PATCH 031/174] Recognize armv8l [ci skip] Addresses https://github.com/randombit/botan/issues/1543 --- src/build-data/arch/arm32.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/build-data/arch/arm32.txt b/src/build-data/arch/arm32.txt index 38e7dcab880..d2fe782b3bc 100644 --- a/src/build-data/arch/arm32.txt +++ b/src/build-data/arch/arm32.txt @@ -11,6 +11,8 @@ evbarm # For NetBSD armv7 armv7l armv7-a + +armv8l # For AlpineLinux From 70a7ff0bd2424a4d37c2b0f8ea7835bb3e39e5b1 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 17 Apr 2018 20:08:20 -0400 Subject: [PATCH 032/174] Minor optimizations for P-256 and P-384 Improves ECDSA by ~5% on Skylake --- src/lib/math/numbertheory/nistp_redc.cpp | 226 +++++++---------------- 1 file changed, 65 insertions(+), 161 deletions(-) diff --git a/src/lib/math/numbertheory/nistp_redc.cpp b/src/lib/math/numbertheory/nistp_redc.cpp index f2782038b7e..9dba160f509 100644 --- a/src/lib/math/numbertheory/nistp_redc.cpp +++ b/src/lib/math/numbertheory/nistp_redc.cpp @@ -273,116 +273,71 @@ void redc_p256(BigInt& x, secure_vector& ws) BOTAN_UNUSED(ws); - const uint32_t X8 = get_uint32_t(x, 8); - const uint32_t X9 = get_uint32_t(x, 9); - const uint32_t X10 = get_uint32_t(x, 10); - const uint32_t X11 = get_uint32_t(x, 11); - const uint32_t X12 = get_uint32_t(x, 12); - const uint32_t X13 = get_uint32_t(x, 13); - const uint32_t X14 = get_uint32_t(x, 14); - const uint32_t X15 = get_uint32_t(x, 15); + const int64_t X08 = get_uint32_t(x, 8); + const int64_t X09 = get_uint32_t(x, 9); + const int64_t X10 = get_uint32_t(x, 10); + const int64_t X11 = get_uint32_t(x, 11); + const int64_t X12 = get_uint32_t(x, 12); + const int64_t X13 = get_uint32_t(x, 13); + const int64_t X14 = get_uint32_t(x, 14); + const int64_t X15 = get_uint32_t(x, 15); + + // Adds 6 * P-256 to prevent underflow + const int64_t S0 = 0xFFFFFFFA + X08 + X09 - X11 - X12 - X13 - X14; + const int64_t S1 = 0xFFFFFFFF + X09 + X10 - X12 - X13 - X14 - X15; + const int64_t S2 = 0xFFFFFFFF + X10 + X11 - X13 - X14 - X15; + const int64_t S3 = 0x00000005 + (X11 + X12)*2 + X13 - X15 - X08 - X09; + const int64_t S4 = 0x00000000 + (X12 + X13)*2 + X14 - X09 - X10; + const int64_t S5 = 0x00000000 + (X13 + X14)*2 + X15 - X10 - X11; + const int64_t S6 = 0x00000006 + X13 + X14*3 + X15*2 - X08 - X09; + const int64_t S7 = 0xFFFFFFFA + X15*3 + X08 - X10 - X11 - X12 - X13; x.mask_bits(256); x.shrink_to_fit(p256_limbs + 1); int64_t S = 0; - // Adds 6 * P-256 to prevent underflow - S = get_uint32_t(x, 0); - S += 0xFFFFFFFA; - S += X8; - S += X9; - S -= X11; - S -= X12; - S -= X13; - S -= X14; + S += S0; set_uint32_t(x, 0, S); S >>= 32; S += get_uint32_t(x, 1); - S += 0xFFFFFFFF; - S += X9; - S += X10; - S -= X12; - S -= X13; - S -= X14; - S -= X15; + S += S1; set_uint32_t(x, 1, S); S >>= 32; S += get_uint32_t(x, 2); - S += 0xFFFFFFFF; - S += X10; - S += X11; - S -= X13; - S -= X14; - S -= X15; + S += S2; set_uint32_t(x, 2, S); S >>= 32; S += get_uint32_t(x, 3); - S += 5; - S += X11; - S += X11; - S += X12; - S += X12; - S += X13; - S -= X15; - S -= X8; - S -= X9; + S += S3; set_uint32_t(x, 3, S); S >>= 32; S += get_uint32_t(x, 4); - S += X12; - S += X12; - S += X13; - S += X13; - S += X14; - S -= X9; - S -= X10; + S += S4; set_uint32_t(x, 4, S); S >>= 32; S += get_uint32_t(x, 5); - S += X13; - S += X13; - S += X14; - S += X14; - S += X15; - S -= X10; - S -= X11; + S += S5; set_uint32_t(x, 5, S); S >>= 32; S += get_uint32_t(x, 6); - S += 6; - S += X14; - S += X14; - S += X15; - S += X15; - S += X14; - S += X13; - S -= X8; - S -= X9; + S += S6; set_uint32_t(x, 6, S); S >>= 32; S += get_uint32_t(x, 7); - S += 0xFFFFFFFA; - S += X15; - S += X15; - S += X15; - S += X8; - S -= X10; - S -= X11; - S -= X12; - S -= X13; + S += S7; set_uint32_t(x, 7, S); S >>= 32; - S += 5; // final carry of 6*P-256 + S += 5; // the top digits of 6*P-256 BOTAN_ASSERT(S >= 0 && S <= 10, "Expected overflow"); @@ -439,146 +394,95 @@ void redc_p384(BigInt& x, secure_vector& ws) static const size_t p384_limbs = (BOTAN_MP_WORD_BITS == 32) ? 12 : 6; - const uint32_t X12 = get_uint32_t(x, 12); - const uint32_t X13 = get_uint32_t(x, 13); - const uint32_t X14 = get_uint32_t(x, 14); - const uint32_t X15 = get_uint32_t(x, 15); - const uint32_t X16 = get_uint32_t(x, 16); - const uint32_t X17 = get_uint32_t(x, 17); - const uint32_t X18 = get_uint32_t(x, 18); - const uint32_t X19 = get_uint32_t(x, 19); - const uint32_t X20 = get_uint32_t(x, 20); - const uint32_t X21 = get_uint32_t(x, 21); - const uint32_t X22 = get_uint32_t(x, 22); - const uint32_t X23 = get_uint32_t(x, 23); + const int64_t X12 = get_uint32_t(x, 12); + const int64_t X13 = get_uint32_t(x, 13); + const int64_t X14 = get_uint32_t(x, 14); + const int64_t X15 = get_uint32_t(x, 15); + const int64_t X16 = get_uint32_t(x, 16); + const int64_t X17 = get_uint32_t(x, 17); + const int64_t X18 = get_uint32_t(x, 18); + const int64_t X19 = get_uint32_t(x, 19); + const int64_t X20 = get_uint32_t(x, 20); + const int64_t X21 = get_uint32_t(x, 21); + const int64_t X22 = get_uint32_t(x, 22); + const int64_t X23 = get_uint32_t(x, 23); + + // One copy of P-384 is added to prevent underflow + const int64_t S0 = 0xFFFFFFFF + X12 + X20 + X21 - X23; + const int64_t S1 = 0x00000000 + X13 + X22 + X23 - X12 - X20; + const int64_t S2 = 0x00000000 + X14 + X23 - X13 - X21; + const int64_t S3 = 0xFFFFFFFF + X12 + X15 + X20 + X21 - X14 - X22 - X23; + const int64_t S4 = 0xFFFFFFFE + X12 + X13 + X16 + X20 + X21*2 + X22 - X15 - X23*2; + const int64_t S5 = 0xFFFFFFFF + X13 + X14 + X17 + X21 + X22*2 + X23 - X16; + const int64_t S6 = 0xFFFFFFFF + X14 + X15 + X18 + X22 + X23*2 - X17; + const int64_t S7 = 0xFFFFFFFF + X15 + X16 + X19 + X23 - X18; + const int64_t S8 = 0xFFFFFFFF + X16 + X17 + X20 - X19; + const int64_t S9 = 0xFFFFFFFF + X17 + X18 + X21 - X20; + const int64_t SA = 0xFFFFFFFF + X18 + X19 + X22 - X21; + const int64_t SB = 0xFFFFFFFF + X19 + X20 + X23 - X22; x.mask_bits(384); x.shrink_to_fit(p384_limbs + 1); int64_t S = 0; - // One copy of P-384 is added to prevent underflow S = get_uint32_t(x, 0); - S += 0xFFFFFFFF; - S += X12; - S += X21; - S += X20; - S -= X23; + S += S0; set_uint32_t(x, 0, S); S >>= 32; S += get_uint32_t(x, 1); - S += X13; - S += X22; - S += X23; - S -= X12; - S -= X20; + S += S1; set_uint32_t(x, 1, S); S >>= 32; S += get_uint32_t(x, 2); - S += X14; - S += X23; - S -= X13; - S -= X21; + S += S2; set_uint32_t(x, 2, S); S >>= 32; S += get_uint32_t(x, 3); - S += 0xFFFFFFFF; - S += X15; - S += X12; - S += X20; - S += X21; - S -= X14; - S -= X22; - S -= X23; + S += S3; set_uint32_t(x, 3, S); S >>= 32; S += get_uint32_t(x, 4); - S += 0xFFFFFFFE; - S += X21; - S += X21; - S += X16; - S += X13; - S += X12; - S += X20; - S += X22; - S -= X15; - S -= X23; - S -= X23; + S += S4; set_uint32_t(x, 4, S); S >>= 32; S += get_uint32_t(x, 5); - S += 0xFFFFFFFF; - S += X22; - S += X22; - S += X17; - S += X14; - S += X13; - S += X21; - S += X23; - S -= X16; + S += S5; set_uint32_t(x, 5, S); S >>= 32; S += get_uint32_t(x, 6); - S += 0xFFFFFFFF; - S += X23; - S += X23; - S += X18; - S += X15; - S += X14; - S += X22; - S -= X17; + S += S6; set_uint32_t(x, 6, S); S >>= 32; S += get_uint32_t(x, 7); - S += 0xFFFFFFFF; - S += X19; - S += X16; - S += X15; - S += X23; - S -= X18; + S += S7; set_uint32_t(x, 7, S); S >>= 32; S += get_uint32_t(x, 8); - S += 0xFFFFFFFF; - S += X20; - S += X17; - S += X16; - S -= X19; + S += S8; set_uint32_t(x, 8, S); S >>= 32; S += get_uint32_t(x, 9); - S += 0xFFFFFFFF; - S += X21; - S += X18; - S += X17; - S -= X20; + S += S9; set_uint32_t(x, 9, S); S >>= 32; S += get_uint32_t(x, 10); - S += 0xFFFFFFFF; - S += X22; - S += X19; - S += X18; - S -= X21; + S += SA; set_uint32_t(x, 10, S); S >>= 32; S += get_uint32_t(x, 11); - S += 0xFFFFFFFF; - S += X23; - S += X20; - S += X19; - S -= X22; + S += SB; set_uint32_t(x, 11, S); S >>= 32; From 812b100b5e6612a8916f03624ea51fbb24e87434 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 18 Apr 2018 10:28:04 -0400 Subject: [PATCH 033/174] Micro optimizations in P-256 and P-384 reductions Improves ECDSA and ECDH by 1% or so. --- src/lib/math/numbertheory/nistp_redc.cpp | 103 ++++++++++++++++------- 1 file changed, 73 insertions(+), 30 deletions(-) diff --git a/src/lib/math/numbertheory/nistp_redc.cpp b/src/lib/math/numbertheory/nistp_redc.cpp index 9dba160f509..63b2447d9c8 100644 --- a/src/lib/math/numbertheory/nistp_redc.cpp +++ b/src/lib/math/numbertheory/nistp_redc.cpp @@ -117,6 +117,18 @@ inline void set_uint32_t(BigInt& x, size_t i, T v_in) #endif } +inline void set_words(BigInt& x, size_t i, uint32_t R0, uint32_t R1) + { +#if (BOTAN_MP_WORD_BITS == 32) + x.set_word_at(i, R0); + x.set_word_at(i+1, R1); +#elif (BOTAN_MP_WORD_BITS == 64) + x.set_word_at(i/2, (static_cast(R1) << 32) | R0); +#else + #error "Not implemented" +#endif + } + } const BigInt& prime_p192() @@ -273,8 +285,16 @@ void redc_p256(BigInt& x, secure_vector& ws) BOTAN_UNUSED(ws); - const int64_t X08 = get_uint32_t(x, 8); - const int64_t X09 = get_uint32_t(x, 9); + const int64_t X00 = get_uint32_t(x, 0); + const int64_t X01 = get_uint32_t(x, 1); + const int64_t X02 = get_uint32_t(x, 2); + const int64_t X03 = get_uint32_t(x, 3); + const int64_t X04 = get_uint32_t(x, 4); + const int64_t X05 = get_uint32_t(x, 5); + const int64_t X06 = get_uint32_t(x, 6); + const int64_t X07 = get_uint32_t(x, 7); + const int64_t X08 = get_uint32_t(x, 8); + const int64_t X09 = get_uint32_t(x, 9); const int64_t X10 = get_uint32_t(x, 10); const int64_t X11 = get_uint32_t(x, 11); const int64_t X12 = get_uint32_t(x, 12); @@ -297,45 +317,54 @@ void redc_p256(BigInt& x, secure_vector& ws) int64_t S = 0; - S = get_uint32_t(x, 0); + uint32_t R0 = 0, R1 = 0; + + S = X00; S += S0; - set_uint32_t(x, 0, S); + R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 1); + S += X01; S += S1; - set_uint32_t(x, 1, S); + R1 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 2); + set_words(x, 0, R0, R1); + + S += X02; S += S2; - set_uint32_t(x, 2, S); + R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 3); + S += X03; S += S3; - set_uint32_t(x, 3, S); + R1 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 4); + set_words(x, 2, R0, R1); + + S += X04; S += S4; - set_uint32_t(x, 4, S); + R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 5); + S += X05; S += S5; - set_uint32_t(x, 5, S); + R1 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 6); + set_words(x, 4, R0, R1); + + S += X06; S += S6; - set_uint32_t(x, 6, S); + R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 7); + S += X07; S += S7; - set_uint32_t(x, 7, S); + R1 = static_cast(S); S >>= 32; + set_words(x, 6, R0, R1); S += 5; // the top digits of 6*P-256 @@ -426,66 +455,80 @@ void redc_p384(BigInt& x, secure_vector& ws) int64_t S = 0; + uint32_t R0 = 0, R1 = 0; + S = get_uint32_t(x, 0); S += S0; - set_uint32_t(x, 0, S); + R0 = static_cast(S); S >>= 32; S += get_uint32_t(x, 1); S += S1; - set_uint32_t(x, 1, S); + R1 = static_cast(S); S >>= 32; + set_words(x, 0, R0, R1); + S += get_uint32_t(x, 2); S += S2; - set_uint32_t(x, 2, S); + R0 = static_cast(S); S >>= 32; S += get_uint32_t(x, 3); S += S3; - set_uint32_t(x, 3, S); + R1 = static_cast(S); S >>= 32; + set_words(x, 2, R0, R1); + S += get_uint32_t(x, 4); S += S4; - set_uint32_t(x, 4, S); + R0 = static_cast(S); S >>= 32; S += get_uint32_t(x, 5); S += S5; - set_uint32_t(x, 5, S); + R1 = static_cast(S); S >>= 32; + set_words(x, 4, R0, R1); + S += get_uint32_t(x, 6); S += S6; - set_uint32_t(x, 6, S); + R0 = static_cast(S); S >>= 32; S += get_uint32_t(x, 7); S += S7; - set_uint32_t(x, 7, S); + R1 = static_cast(S); S >>= 32; + set_words(x, 6, R0, R1); + S += get_uint32_t(x, 8); S += S8; - set_uint32_t(x, 8, S); + R0 = static_cast(S); S >>= 32; S += get_uint32_t(x, 9); S += S9; - set_uint32_t(x, 9, S); + R1 = static_cast(S); S >>= 32; + set_words(x, 8, R0, R1); + S += get_uint32_t(x, 10); S += SA; - set_uint32_t(x, 10, S); + R0 = static_cast(S); S >>= 32; S += get_uint32_t(x, 11); S += SB; - set_uint32_t(x, 11, S); + R1 = static_cast(S); S >>= 32; + set_words(x, 10, R0, R1); + BOTAN_ASSERT(S >= 0 && S <= 4, "Expected overflow in P-384 reduction"); /* From b05abd8e76edac867204695ac959fc898e495ffd Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 18 Apr 2018 10:47:51 -0400 Subject: [PATCH 034/174] P-192 optimizations 5-7% faster for ECDSA and ECDH --- src/lib/math/numbertheory/nistp_redc.cpp | 98 ++++++++++++++++-------- 1 file changed, 64 insertions(+), 34 deletions(-) diff --git a/src/lib/math/numbertheory/nistp_redc.cpp b/src/lib/math/numbertheory/nistp_redc.cpp index 63b2447d9c8..2f2b3216317 100644 --- a/src/lib/math/numbertheory/nistp_redc.cpp +++ b/src/lib/math/numbertheory/nistp_redc.cpp @@ -139,60 +139,90 @@ const BigInt& prime_p192() void redc_p192(BigInt& x, secure_vector& ws) { - const uint32_t X6 = get_uint32_t(x, 6); - const uint32_t X7 = get_uint32_t(x, 7); - const uint32_t X8 = get_uint32_t(x, 8); - const uint32_t X9 = get_uint32_t(x, 9); - const uint32_t X10 = get_uint32_t(x, 10); - const uint32_t X11 = get_uint32_t(x, 11); + static const size_t p192_limbs = 192 / BOTAN_MP_WORD_BITS; + + const uint64_t X00 = get_uint32_t(x, 0); + const uint64_t X01 = get_uint32_t(x, 1); + const uint64_t X02 = get_uint32_t(x, 2); + const uint64_t X03 = get_uint32_t(x, 3); + const uint64_t X04 = get_uint32_t(x, 4); + const uint64_t X05 = get_uint32_t(x, 5); + const uint64_t X06 = get_uint32_t(x, 6); + const uint64_t X07 = get_uint32_t(x, 7); + const uint64_t X08 = get_uint32_t(x, 8); + const uint64_t X09 = get_uint32_t(x, 9); + const uint64_t X10 = get_uint32_t(x, 10); + const uint64_t X11 = get_uint32_t(x, 11); + + const uint64_t S0 = X00 + X06 + X10; + const uint64_t S1 = X01 + X07 + X11; + const uint64_t S2 = X02 + X06 + X08 + X10; + const uint64_t S3 = X03 + X07 + X09 + X11; + const uint64_t S4 = X04 + X08 + X10; + const uint64_t S5 = X05 + X09 + X11; x.mask_bits(192); uint64_t S = 0; + uint32_t R0 = 0, R1 = 0; - S += get_uint32_t(x, 0); - S += X6; - S += X10; - set_uint32_t(x, 0, S); + S += S0; + R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 1); - S += X7; - S += X11; - set_uint32_t(x, 1, S); + S += S1; + R1 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 2); - S += X6; - S += X8; - S += X10; - set_uint32_t(x, 2, S); + set_words(x, 0, R0, R1); + + S += S2; + R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 3); - S += X7; - S += X9; - S += X11; - set_uint32_t(x, 3, S); + S += S3; + R1 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 4); - S += X8; - S += X10; - set_uint32_t(x, 4, S); + set_words(x, 2, R0, R1); + + S += S4; + R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 5); - S += X9; - S += X11; - set_uint32_t(x, 5, S); + S += S5; + R1 = static_cast(S); S >>= 32; - set_uint32_t(x, 6, S); + set_words(x, 4, R0, R1); // No underflow possible - x.reduce_below(prime_p192(), ws); + BOTAN_ASSERT(S <= 2, "Expected overflow in P-192 reduce"); + + /* + This is a table of (i*P-192) % 2**192 for i in 1...3 + */ + static const word p192_mults[3][p192_limbs] = { +#if (BOTAN_MP_WORD_BITS == 64) + {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFF}, + {0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFD, 0xFFFFFFFFFFFFFFFF}, + {0xFFFFFFFFFFFFFFFD, 0xFFFFFFFFFFFFFFFC, 0xFFFFFFFFFFFFFFFF}, +#else + {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}, + {0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}, + {0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}, +#endif + }; + + word borrow = bigint_sub2(x.mutable_data(), x.size(), p192_mults[S], p192_limbs); + + BOTAN_ASSERT(borrow == 0 || borrow == 1, "Expected borrow during P-192 reduction"); + + if(borrow) + { + bigint_add2(x.mutable_data(), x.size() - 1, p192_mults[0], p192_limbs); + } } const BigInt& prime_p224() From 7b8ba3ddeea6085937fca12a152677015014783d Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 18 Apr 2018 11:05:28 -0400 Subject: [PATCH 035/174] Further NIST reduction tweaks --- src/lib/math/numbertheory/nistp_redc.cpp | 84 +++++++++++++----------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/src/lib/math/numbertheory/nistp_redc.cpp b/src/lib/math/numbertheory/nistp_redc.cpp index 2f2b3216317..5e66b92890e 100644 --- a/src/lib/math/numbertheory/nistp_redc.cpp +++ b/src/lib/math/numbertheory/nistp_redc.cpp @@ -139,6 +139,8 @@ const BigInt& prime_p192() void redc_p192(BigInt& x, secure_vector& ws) { + BOTAN_UNUSED(ws); + static const size_t p192_limbs = 192 / BOTAN_MP_WORD_BITS; const uint64_t X00 = get_uint32_t(x, 0); @@ -333,14 +335,14 @@ void redc_p256(BigInt& x, secure_vector& ws) const int64_t X15 = get_uint32_t(x, 15); // Adds 6 * P-256 to prevent underflow - const int64_t S0 = 0xFFFFFFFA + X08 + X09 - X11 - X12 - X13 - X14; - const int64_t S1 = 0xFFFFFFFF + X09 + X10 - X12 - X13 - X14 - X15; - const int64_t S2 = 0xFFFFFFFF + X10 + X11 - X13 - X14 - X15; - const int64_t S3 = 0x00000005 + (X11 + X12)*2 + X13 - X15 - X08 - X09; - const int64_t S4 = 0x00000000 + (X12 + X13)*2 + X14 - X09 - X10; - const int64_t S5 = 0x00000000 + (X13 + X14)*2 + X15 - X10 - X11; - const int64_t S6 = 0x00000006 + X13 + X14*3 + X15*2 - X08 - X09; - const int64_t S7 = 0xFFFFFFFA + X15*3 + X08 - X10 - X11 - X12 - X13; + const int64_t S0 = 0xFFFFFFFA + X00 + X08 + X09 - X11 - X12 - X13 - X14; + const int64_t S1 = 0xFFFFFFFF + X01 + X09 + X10 - X12 - X13 - X14 - X15; + const int64_t S2 = 0xFFFFFFFF + X02 + X10 + X11 - X13 - X14 - X15; + const int64_t S3 = 0x00000005 + X03 + (X11 + X12)*2 + X13 - X15 - X08 - X09; + const int64_t S4 = 0x00000000 + X04 + (X12 + X13)*2 + X14 - X09 - X10; + const int64_t S5 = 0x00000000 + X05 + (X13 + X14)*2 + X15 - X10 - X11; + const int64_t S6 = 0x00000006 + X06 + X13 + X14*3 + X15*2 - X08 - X09; + const int64_t S7 = 0xFFFFFFFA + X07 + X15*3 + X08 - X10 - X11 - X12 - X13; x.mask_bits(256); x.shrink_to_fit(p256_limbs + 1); @@ -349,48 +351,40 @@ void redc_p256(BigInt& x, secure_vector& ws) uint32_t R0 = 0, R1 = 0; - S = X00; S += S0; R0 = static_cast(S); S >>= 32; - S += X01; S += S1; R1 = static_cast(S); S >>= 32; set_words(x, 0, R0, R1); - S += X02; S += S2; R0 = static_cast(S); S >>= 32; - S += X03; S += S3; R1 = static_cast(S); S >>= 32; set_words(x, 2, R0, R1); - S += X04; S += S4; R0 = static_cast(S); S >>= 32; - S += X05; S += S5; R1 = static_cast(S); S >>= 32; set_words(x, 4, R0, R1); - S += X06; S += S6; R0 = static_cast(S); S >>= 32; - S += X07; S += S7; R1 = static_cast(S); S >>= 32; @@ -431,6 +425,11 @@ void redc_p256(BigInt& x, secure_vector& ws) #endif }; + if(S == 0 && x.word_at(p256_limbs-1) < p256_mults[0][p256_limbs-1]) + { + return; + } + word borrow = bigint_sub2(x.mutable_data(), x.size(), p256_mults[S], p256_limbs); BOTAN_ASSERT(borrow == 0 || borrow == 1, "Expected borrow during P-256 reduction"); @@ -453,6 +452,18 @@ void redc_p384(BigInt& x, secure_vector& ws) static const size_t p384_limbs = (BOTAN_MP_WORD_BITS == 32) ? 12 : 6; + const int64_t X00 = get_uint32_t(x, 0); + const int64_t X01 = get_uint32_t(x, 1); + const int64_t X02 = get_uint32_t(x, 2); + const int64_t X03 = get_uint32_t(x, 3); + const int64_t X04 = get_uint32_t(x, 4); + const int64_t X05 = get_uint32_t(x, 5); + const int64_t X06 = get_uint32_t(x, 6); + const int64_t X07 = get_uint32_t(x, 7); + const int64_t X08 = get_uint32_t(x, 8); + const int64_t X09 = get_uint32_t(x, 9); + const int64_t X10 = get_uint32_t(x, 10); + const int64_t X11 = get_uint32_t(x, 11); const int64_t X12 = get_uint32_t(x, 12); const int64_t X13 = get_uint32_t(x, 13); const int64_t X14 = get_uint32_t(x, 14); @@ -467,18 +478,18 @@ void redc_p384(BigInt& x, secure_vector& ws) const int64_t X23 = get_uint32_t(x, 23); // One copy of P-384 is added to prevent underflow - const int64_t S0 = 0xFFFFFFFF + X12 + X20 + X21 - X23; - const int64_t S1 = 0x00000000 + X13 + X22 + X23 - X12 - X20; - const int64_t S2 = 0x00000000 + X14 + X23 - X13 - X21; - const int64_t S3 = 0xFFFFFFFF + X12 + X15 + X20 + X21 - X14 - X22 - X23; - const int64_t S4 = 0xFFFFFFFE + X12 + X13 + X16 + X20 + X21*2 + X22 - X15 - X23*2; - const int64_t S5 = 0xFFFFFFFF + X13 + X14 + X17 + X21 + X22*2 + X23 - X16; - const int64_t S6 = 0xFFFFFFFF + X14 + X15 + X18 + X22 + X23*2 - X17; - const int64_t S7 = 0xFFFFFFFF + X15 + X16 + X19 + X23 - X18; - const int64_t S8 = 0xFFFFFFFF + X16 + X17 + X20 - X19; - const int64_t S9 = 0xFFFFFFFF + X17 + X18 + X21 - X20; - const int64_t SA = 0xFFFFFFFF + X18 + X19 + X22 - X21; - const int64_t SB = 0xFFFFFFFF + X19 + X20 + X23 - X22; + const int64_t S0 = 0xFFFFFFFF + X00 + X12 + X20 + X21 - X23; + const int64_t S1 = 0x00000000 + X01 + X13 + X22 + X23 - X12 - X20; + const int64_t S2 = 0x00000000 + X02 + X14 + X23 - X13 - X21; + const int64_t S3 = 0xFFFFFFFF + X03 + X12 + X15 + X20 + X21 - X14 - X22 - X23; + const int64_t S4 = 0xFFFFFFFE + X04 + X12 + X13 + X16 + X20 + X21*2 + X22 - X15 - X23*2; + const int64_t S5 = 0xFFFFFFFF + X05 + X13 + X14 + X17 + X21 + X22*2 + X23 - X16; + const int64_t S6 = 0xFFFFFFFF + X06 + X14 + X15 + X18 + X22 + X23*2 - X17; + const int64_t S7 = 0xFFFFFFFF + X07 + X15 + X16 + X19 + X23 - X18; + const int64_t S8 = 0xFFFFFFFF + X08 + X16 + X17 + X20 - X19; + const int64_t S9 = 0xFFFFFFFF + X09 + X17 + X18 + X21 - X20; + const int64_t SA = 0xFFFFFFFF + X10 + X18 + X19 + X22 - X21; + const int64_t SB = 0xFFFFFFFF + X11 + X19 + X20 + X23 - X22; x.mask_bits(384); x.shrink_to_fit(p384_limbs + 1); @@ -487,72 +498,60 @@ void redc_p384(BigInt& x, secure_vector& ws) uint32_t R0 = 0, R1 = 0; - S = get_uint32_t(x, 0); S += S0; R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 1); S += S1; R1 = static_cast(S); S >>= 32; set_words(x, 0, R0, R1); - S += get_uint32_t(x, 2); S += S2; R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 3); S += S3; R1 = static_cast(S); S >>= 32; set_words(x, 2, R0, R1); - S += get_uint32_t(x, 4); S += S4; R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 5); S += S5; R1 = static_cast(S); S >>= 32; set_words(x, 4, R0, R1); - S += get_uint32_t(x, 6); S += S6; R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 7); S += S7; R1 = static_cast(S); S >>= 32; set_words(x, 6, R0, R1); - S += get_uint32_t(x, 8); S += S8; R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 9); S += S9; R1 = static_cast(S); S >>= 32; set_words(x, 8, R0, R1); - S += get_uint32_t(x, 10); S += SA; R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 11); S += SB; R1 = static_cast(S); S >>= 32; @@ -586,6 +585,11 @@ void redc_p384(BigInt& x, secure_vector& ws) #endif }; + if(S == 0 && x.word_at(p384_limbs-1) < p384_mults[0][p384_limbs-1]) + { + return; + } + word borrow = bigint_sub2(x.mutable_data(), x.size(), p384_mults[S], p384_limbs); BOTAN_ASSERT(borrow == 0 || borrow == 1, "Expected borrow during P-384 reduction"); From b95c70232d9b8434c0cf7bb16aa767c10fbf3522 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 18 Apr 2018 11:34:23 -0400 Subject: [PATCH 036/174] Optimize P-224 reduction 5-7% faster ECDSA --- src/lib/math/numbertheory/nistp_redc.cpp | 124 ++++++++++++++--------- 1 file changed, 77 insertions(+), 47 deletions(-) diff --git a/src/lib/math/numbertheory/nistp_redc.cpp b/src/lib/math/numbertheory/nistp_redc.cpp index 5e66b92890e..d0da7b9f19c 100644 --- a/src/lib/math/numbertheory/nistp_redc.cpp +++ b/src/lib/math/numbertheory/nistp_redc.cpp @@ -235,74 +235,104 @@ const BigInt& prime_p224() void redc_p224(BigInt& x, secure_vector& ws) { - const uint32_t X7 = get_uint32_t(x, 7); - const uint32_t X8 = get_uint32_t(x, 8); - const uint32_t X9 = get_uint32_t(x, 9); - const uint32_t X10 = get_uint32_t(x, 10); - const uint32_t X11 = get_uint32_t(x, 11); - const uint32_t X12 = get_uint32_t(x, 12); - const uint32_t X13 = get_uint32_t(x, 13); + BOTAN_UNUSED(ws); - x.mask_bits(224); + const int64_t X00 = get_uint32_t(x, 0); + const int64_t X01 = get_uint32_t(x, 1); + const int64_t X02 = get_uint32_t(x, 2); + const int64_t X03 = get_uint32_t(x, 3); + const int64_t X04 = get_uint32_t(x, 4); + const int64_t X05 = get_uint32_t(x, 5); + const int64_t X06 = get_uint32_t(x, 6); + const int64_t X07 = get_uint32_t(x, 7); + const int64_t X08 = get_uint32_t(x, 8); + const int64_t X09 = get_uint32_t(x, 9); + const int64_t X10 = get_uint32_t(x, 10); + const int64_t X11 = get_uint32_t(x, 11); + const int64_t X12 = get_uint32_t(x, 12); + const int64_t X13 = get_uint32_t(x, 13); // One full copy of P224 is added, so the result is always positive + const int64_t S0 = 0x00000001 + X00 - X07 - X11; + const int64_t S1 = 0x00000000 + X01 - X08 - X12; + const int64_t S2 = 0x00000000 + X02 - X09 - X13; + const int64_t S3 = 0xFFFFFFFF + X03 + X07 + X11 - X10; + const int64_t S4 = 0xFFFFFFFF + X04 + X08 + X12 - X11; + const int64_t S5 = 0xFFFFFFFF + X05 + X09 + X13 - X12; + const int64_t S6 = 0xFFFFFFFF + X06 + X10 - X13; + + x.mask_bits(224); + int64_t S = 0; + uint32_t R0 = 0, R1 = 0; - S += get_uint32_t(x, 0); - S += 1; - S -= X7; - S -= X11; - set_uint32_t(x, 0, S); + S += S0; + R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 1); - S -= X8; - S -= X12; - set_uint32_t(x, 1, S); + S += S1; + R1 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 2); - S -= X9; - S -= X13; - set_uint32_t(x, 2, S); + set_words(x, 0, R0, R1); + + S += S2; + R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 3); - S += 0xFFFFFFFF; - S += X7; - S += X11; - S -= X10; - set_uint32_t(x, 3, S); + S += S3; + R1 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 4); - S += 0xFFFFFFFF; - S += X8; - S += X12; - S -= X11; - set_uint32_t(x, 4, S); + set_words(x, 2, R0, R1); + + S += S4; + R0 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 5); - S += 0xFFFFFFFF; - S += X9; - S += X13; - S -= X12; - set_uint32_t(x, 5, S); + S += S5; + R1 = static_cast(S); S >>= 32; - S += get_uint32_t(x, 6); - S += 0xFFFFFFFF; - S += X10; - S -= X13; - set_uint32_t(x, 6, S); + set_words(x, 4, R0, R1); + + S += S6; + R0 = static_cast(S); S >>= 32; - set_uint32_t(x, 7, S); - BOTAN_ASSERT_EQUAL(S >> 32, 0, "No underflow"); + set_words(x, 6, R0, 0); + + BOTAN_ASSERT(S >= 0 && S <= 2, "Expected overflow in P-224 reduce"); + + static const size_t p224_limbs = (BOTAN_MP_WORD_BITS == 32) ? 7 : 4; + + static const word p224_mults[3][p224_limbs] = { +#if (BOTAN_MP_WORD_BITS == 64) + {0x0000000000000001, 0xFFFFFFFF00000000, 0xFFFFFFFFFFFFFFFF, 0x00000000FFFFFFFF}, + {0x0000000000000002, 0xFFFFFFFE00000000, 0xFFFFFFFFFFFFFFFF, 0x00000000FFFFFFFF}, + {0x0000000000000003, 0xFFFFFFFD00000000, 0xFFFFFFFFFFFFFFFF, 0x00000000FFFFFFFF}, +#else + {0x00000001, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}, + {0x00000002, 0x00000000, 0x00000000, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}, + {0x00000003, 0x00000000, 0x00000000, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF} +#endif + + }; + + if(S == 0 && x.word_at(p224_limbs-1) < p224_mults[0][p224_limbs-1]) + { + return; + } + + word borrow = bigint_sub2(x.mutable_data(), x.size(), p224_mults[S], p224_limbs); + + BOTAN_ASSERT(borrow == 0 || borrow == 1, "Expected borrow during P-224 reduction"); - x.reduce_below(prime_p224(), ws); + if(borrow) + { + bigint_add2(x.mutable_data(), x.size() - 1, p224_mults[0], p224_limbs); + } } const BigInt& prime_p256() From 7e4e69629d61307c0366a3fc7aae675b3a947ca3 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 18 Apr 2018 11:35:27 -0400 Subject: [PATCH 037/174] Remove now unused function --- src/lib/math/numbertheory/nistp_redc.cpp | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/lib/math/numbertheory/nistp_redc.cpp b/src/lib/math/numbertheory/nistp_redc.cpp index d0da7b9f19c..9ceb7c16750 100644 --- a/src/lib/math/numbertheory/nistp_redc.cpp +++ b/src/lib/math/numbertheory/nistp_redc.cpp @@ -98,25 +98,6 @@ inline uint32_t get_uint32_t(const BigInt& x, size_t i) #endif } -/** -* Treating this MPI as a sequence of 32-bit words in big-endian -* order, set word i to the value x -*/ -template -inline void set_uint32_t(BigInt& x, size_t i, T v_in) - { - const uint32_t v = static_cast(v_in); -#if (BOTAN_MP_WORD_BITS == 32) - x.set_word_at(i, v); -#elif (BOTAN_MP_WORD_BITS == 64) - const word shift_32 = (i % 2) * 32; - const word w = (x.word_at(i/2) & (static_cast(0xFFFFFFFF) << (32-shift_32))) | (static_cast(v) << shift_32); - x.set_word_at(i/2, w); -#else - #error "Not implemented" -#endif - } - inline void set_words(BigInt& x, size_t i, uint32_t R0, uint32_t R1) { #if (BOTAN_MP_WORD_BITS == 32) From 3716327e26a9298cf4d09ed7703074ed4e4d5a37 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 18 Apr 2018 11:41:46 -0400 Subject: [PATCH 038/174] Add early exit for P-192 reduce --- src/lib/math/numbertheory/nistp_redc.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lib/math/numbertheory/nistp_redc.cpp b/src/lib/math/numbertheory/nistp_redc.cpp index 9ceb7c16750..33e77562e77 100644 --- a/src/lib/math/numbertheory/nistp_redc.cpp +++ b/src/lib/math/numbertheory/nistp_redc.cpp @@ -198,6 +198,11 @@ void redc_p192(BigInt& x, secure_vector& ws) #endif }; + if(S == 0 && x.word_at(p192_limbs-1) < p192_mults[0][p192_limbs-1]) + { + return; + } + word borrow = bigint_sub2(x.mutable_data(), x.size(), p192_mults[S], p192_limbs); BOTAN_ASSERT(borrow == 0 || borrow == 1, "Expected borrow during P-192 reduction"); From 45fa74db0a273f9ad36b1496c59b5caaaa1e6874 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 18 Apr 2018 12:01:47 -0400 Subject: [PATCH 039/174] Add cycle counter for NIST reduction --- src/cli/speed.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/cli/speed.cpp b/src/cli/speed.cpp index fdd62ce11b5..3ec8b83e463 100644 --- a/src/cli/speed.cpp +++ b/src/cli/speed.cpp @@ -91,6 +91,7 @@ #include #include #include + #include #endif #if defined(BOTAN_HAS_ECC_GROUP) @@ -919,6 +920,10 @@ class Speed final : public Command { bench_bn_redc(msec); } + else if(algo == "nistp_redc") + { + bench_nistp_redc(msec); + } #endif #if defined(BOTAN_HAS_FPE_FE1) @@ -1506,6 +1511,53 @@ class Speed final : public Command #endif #if defined(BOTAN_HAS_NUMBERTHEORY) + void bench_nistp_redc(const std::chrono::milliseconds total_runtime) + { + Botan::secure_vector ws; + + auto runtime = total_runtime / 5; + + std::unique_ptr p192_timer = make_timer("P-192 redc"); + while(p192_timer->under(runtime)) + { + Botan::BigInt r192(rng(), 192*2 - 1); + p192_timer->run([&]() { Botan::redc_p192(r192, ws); }); + } + record_result(p192_timer); + + std::unique_ptr p224_timer = make_timer("P-224 redc"); + while(p224_timer->under(runtime)) + { + Botan::BigInt r224(rng(), 224*2 - 1); + p224_timer->run([&]() { Botan::redc_p224(r224, ws); }); + } + record_result(p224_timer); + + std::unique_ptr p256_timer = make_timer("P-256 redc"); + while(p256_timer->under(runtime)) + { + Botan::BigInt r256(rng(), 256*2 - 1); + p256_timer->run([&]() { Botan::redc_p256(r256, ws); }); + } + record_result(p256_timer); + + std::unique_ptr p384_timer = make_timer("P-384 redc"); + while(p384_timer->under(runtime)) + { + Botan::BigInt r384(rng(), 384*2 - 1); + p384_timer->run([&]() { Botan::redc_p384(r384, ws); }); + } + record_result(p384_timer); + + std::unique_ptr p521_timer = make_timer("P-521 redc"); + while(p521_timer->under(runtime)) + { + Botan::BigInt r521(rng(), 521*2 - 1); + p521_timer->run([&]() { Botan::redc_p521(r521, ws); }); + } + record_result(p521_timer); + } + void bench_bn_redc(const std::chrono::milliseconds runtime) { Botan::BigInt p; From 1d8d825438d5271acb7d2f2e0e18445cf907a5f6 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 18 Apr 2018 14:46:50 -0400 Subject: [PATCH 040/174] Add timing for ECC double and addition algorithms --- src/cli/speed.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/cli/speed.cpp b/src/cli/speed.cpp index 3ec8b83e463..526244c8604 100644 --- a/src/cli/speed.cpp +++ b/src/cli/speed.cpp @@ -945,6 +945,10 @@ class Speed final : public Command { bench_ecc_mult(ecc_groups, msec); } + else if(algo == "ecc_ops") + { + bench_ecc_ops(ecc_groups, msec); + } else if(algo == "os2ecp") { bench_os2ecp(ecc_groups, msec); @@ -1313,6 +1317,35 @@ class Speed final : public Command } #if defined(BOTAN_HAS_ECC_GROUP) + void bench_ecc_ops(const std::vector& groups, const std::chrono::milliseconds runtime) + { + for(std::string group_name : groups) + { + const Botan::EC_Group group(group_name); + + std::unique_ptr add_timer = make_timer(group_name + " add"); + std::unique_ptr addf_timer = make_timer(group_name + " addf"); + std::unique_ptr dbl_timer = make_timer(group_name + " dbl"); + + const Botan::PointGFp& base_point = group.get_base_point(); + Botan::PointGFp non_affine_pt = group.get_base_point() * 1776; // create a non-affine point + Botan::PointGFp pt = group.get_base_point(); + + std::vector ws(Botan::PointGFp::WORKSPACE_SIZE); + + while(add_timer->under(runtime) && addf_timer->under(runtime) && dbl_timer->under(runtime)) + { + dbl_timer->run([&]() { pt.mult2(ws); }); + add_timer->run([&]() { pt.add(non_affine_pt, ws); }); + addf_timer->run([&]() { pt.add_affine(base_point, ws); }); + } + + record_result(dbl_timer); + record_result(add_timer); + record_result(addf_timer); + } + } + void bench_ecc_mult(const std::vector& groups, const std::chrono::milliseconds runtime) { for(std::string group_name : groups) From 1866b7ae009ebf2d9343fb70fa38a818a868bf95 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 18 Apr 2018 18:51:51 -0400 Subject: [PATCH 041/174] Add optimized inversion for P-256 Could be slightly more clever here but this is pretty decent. GH #1479 --- src/lib/pubkey/ec_group/curve_gfp.cpp | 75 +++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/src/lib/pubkey/ec_group/curve_gfp.cpp b/src/lib/pubkey/ec_group/curve_gfp.cpp index e76636589ed..abd5419125e 100644 --- a/src/lib/pubkey/ec_group/curve_gfp.cpp +++ b/src/lib/pubkey/ec_group/curve_gfp.cpp @@ -240,6 +240,18 @@ class CurveGFp_NIST : public CurveGFp_Repr const BigInt& y, secure_vector& ws) const override; + void curve_mul_tmp(BigInt& x, const BigInt& y, BigInt& tmp, secure_vector& ws) const + { + curve_mul(tmp, x, y, ws); + x.swap(tmp); + } + + void curve_sqr_tmp(BigInt& x, BigInt& tmp, secure_vector& ws) const + { + curve_sqr(tmp, x, ws); + x.swap(tmp); + } + void curve_sqr(BigInt& z, const BigInt& x, secure_vector& ws) const override; private: @@ -357,8 +369,71 @@ class CurveGFp_P256 final : public CurveGFp_NIST const BigInt& get_p() const override { return prime_p256(); } private: void redc(BigInt& x, secure_vector& ws) const override { redc_p256(x, ws); } + BigInt invert_element(const BigInt& x, secure_vector& ws) const override; }; +BigInt CurveGFp_P256::invert_element(const BigInt& x, secure_vector& ws) const + { + BigInt r, p2, p4, p8, p16, p32, tmp; + + curve_sqr(r, x, ws); + + curve_mul(p2, r, x, ws); + curve_sqr(r, p2, ws); + curve_sqr_tmp(r, tmp, ws); + + curve_mul(p4, r, p2, ws); + + curve_sqr(r, p4, ws); + for(size_t i = 0; i != 3; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul(p8, r, p4, ws);; + + curve_sqr(r, p8, ws); + for(size_t i = 0; i != 7; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul(p16, r, p8, ws); + + curve_sqr(r, p16, ws); + for(size_t i = 0; i != 15; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul(p32, r, p16, ws); + + curve_sqr(r, p32, ws); + for(size_t i = 0; i != 31; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x, tmp, ws); + + for(size_t i = 0; i != 32*4; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, p32, tmp, ws); + + for(size_t i = 0; i != 32; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, p32, tmp, ws); + + for(size_t i = 0; i != 16; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, p16, tmp, ws); + for(size_t i = 0; i != 8; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, p8, tmp, ws); + + for(size_t i = 0; i != 4; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, p4, tmp, ws); + + for(size_t i = 0; i != 2; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, p2, tmp, ws); + + for(size_t i = 0; i != 2; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x, tmp, ws); + + return r; + } + /** * The NIST P-384 curve */ From aac1328f4ca820c5f04c562d856f4bd33ffacd26 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 18 Apr 2018 19:24:10 -0400 Subject: [PATCH 042/174] Add field inversion for P-521 ECDSA sign about 10% faster, ECDSA verify and ECDH about 5% faster. --- src/lib/pubkey/ec_group/curve_gfp.cpp | 68 +++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/lib/pubkey/ec_group/curve_gfp.cpp b/src/lib/pubkey/ec_group/curve_gfp.cpp index abd5419125e..b9ff7caaa70 100644 --- a/src/lib/pubkey/ec_group/curve_gfp.cpp +++ b/src/lib/pubkey/ec_group/curve_gfp.cpp @@ -458,8 +458,76 @@ class CurveGFp_P521 final : public CurveGFp_NIST const BigInt& get_p() const override { return prime_p521(); } private: void redc(BigInt& x, secure_vector& ws) const override { redc_p521(x, ws); } + BigInt invert_element(const BigInt& x, secure_vector& ws) const override; }; +BigInt CurveGFp_P521::invert_element(const BigInt& x, secure_vector& ws) const + { + BigInt r; + BigInt rl; + BigInt a7; + BigInt tmp; + + curve_sqr(r, x, ws); + curve_mul_tmp(r, x, tmp, ws); + + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x, tmp, ws); + + rl = r; + + for(size_t i = 0; i != 3; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, rl, tmp, ws); + + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x, tmp, ws); + a7 = r; // need this value later + + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x, tmp, ws); + + rl = r; + for(size_t i = 0; i != 8; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, rl, tmp, ws); + + rl = r; + for(size_t i = 0; i != 16; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, rl, tmp, ws); + + rl = r; + for(size_t i = 0; i != 32; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, rl, tmp, ws); + + rl = r; + for(size_t i = 0; i != 64; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, rl, tmp, ws); + + rl = r; + for(size_t i = 0; i != 128; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, rl, tmp, ws); + + rl = r; + for(size_t i = 0; i != 256; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, rl, tmp, ws); + + for(size_t i = 0; i != 7; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, a7, tmp, ws); + + for(size_t i = 0; i != 2; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x, tmp, ws); + + return r; + } + } std::shared_ptr From e7989a60634dce80124e9a4fa4f3c77c6cea2bbb Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 19 Apr 2018 09:58:10 -0400 Subject: [PATCH 043/174] Update news --- news.rst | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/news.rst b/news.rst index f970bd8f4ab..8b1d5658b8d 100644 --- a/news.rst +++ b/news.rst @@ -10,8 +10,7 @@ Version 2.7.0, Not Yet Released * Optimize prime generation, especially improving RSA key generation. (GH #1542) -* Optimized elliptic point doubling for curves with an ``a`` parameter - of zero or negative three. (GH #1534) +* Optimizations for elliptic curve operations (GH #1534 #1531 #1546) * Improved performance of signature verification in ECGDSA, ECKCDSA, SM2 and GOST by 10-15%. @@ -27,8 +26,6 @@ Version 2.7.0, Not Yet Released especially for SHA-512 this caused SKIDs that were far longer than necessary. Now all SKIDs are truncated to 192 bits. -* Small optimizations for ECC (#1531) - * In the test suite use ``mkstemp`` to create temporary files instead of creating them in the current working directory. (GH #1533 #1530) From 33f4ceb178adf291109926fefc679949c8037404 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 19 Apr 2018 21:52:21 -0400 Subject: [PATCH 044/174] Add Fermat based inversion of P-384 field elements Cuts about 100K cycles from the inversion, improving ECDSA sign by 10% and ECDH by ~2% Addition chain from https://briansmith.org/ecc-inversion-addition-chains-01 GH #1479 --- src/lib/pubkey/ec_group/curve_gfp.cpp | 72 +++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/src/lib/pubkey/ec_group/curve_gfp.cpp b/src/lib/pubkey/ec_group/curve_gfp.cpp index b9ff7caaa70..112213d6cb0 100644 --- a/src/lib/pubkey/ec_group/curve_gfp.cpp +++ b/src/lib/pubkey/ec_group/curve_gfp.cpp @@ -444,8 +444,80 @@ class CurveGFp_P384 final : public CurveGFp_NIST const BigInt& get_p() const override { return prime_p384(); } private: void redc(BigInt& x, secure_vector& ws) const override { redc_p384(x, ws); } + BigInt invert_element(const BigInt& x, secure_vector& ws) const override; }; +BigInt CurveGFp_P384::invert_element(const BigInt& x, secure_vector& ws) const + { + BigInt r, x2, x3, x15, x30, tmp, rl; + + r = x; + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x, tmp, ws); + x2 = r; + + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x, tmp, ws); + + x3 = r; + + for(size_t i = 0; i != 3; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x3, tmp, ws); + + rl = r; + for(size_t i = 0; i != 6; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, rl, tmp, ws); + + for(size_t i = 0; i != 3; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x3, tmp, ws); + + x15 = r; + for(size_t i = 0; i != 15; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x15, tmp, ws); + + x30 = r; + for(size_t i = 0; i != 30; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x30, tmp, ws); + + rl = r; + for(size_t i = 0; i != 60; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, rl, tmp, ws); + + rl = r; + for(size_t i = 0; i != 120; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, rl, tmp, ws); + + for(size_t i = 0; i != 15; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x15, tmp, ws); + + for(size_t i = 0; i != 31; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x30, tmp, ws); + + for(size_t i = 0; i != 2; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x2, tmp, ws); + + for(size_t i = 0; i != 94; ++i) + curve_sqr_tmp(r, tmp, ws); + curve_mul_tmp(r, x30, tmp, ws); + + for(size_t i = 0; i != 2; ++i) + curve_sqr_tmp(r, tmp, ws); + + curve_mul_tmp(r, x, tmp, ws); + + return r; + } + #endif /** From fd039ca6fed04c4c04477a80dcea484bb0425c75 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 19 Apr 2018 22:05:24 -0400 Subject: [PATCH 045/174] Reorder Travis builds [ci skip] I guess Travis has changed how they sort builds, previously compiler took precedence but now the BUILD_MODE env variable does. Anyway the result is Sonar build runs later than before, which adds several minutes to the overall build time. Put it near the top so it starts early and can run concurrently with other builds. --- src/scripts/ci/travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/ci/travis.yml b/src/scripts/ci/travis.yml index 499f2228617..17f750c6687 100644 --- a/src/scripts/ci/travis.yml +++ b/src/scripts/ci/travis.yml @@ -19,6 +19,7 @@ env: matrix: - BUILD_MODE="shared" + - BUILD_MODE="sonar" - BUILD_MODE="fuzzers" - BUILD_MODE="coverage" - BUILD_MODE="cross-ppc32" @@ -27,7 +28,6 @@ env: - BUILD_MODE="cross-arm64" - BUILD_MODE="cross-win32" - BUILD_MODE="valgrind" - - BUILD_MODE="sonar" - BUILD_MODE="static" - BUILD_MODE="mini-shared" - BUILD_MODE="bsi" From 1177467fbae03f2370f7f20d692a95b484616923 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Fri, 20 Apr 2018 10:16:18 -0400 Subject: [PATCH 046/174] Update news --- news.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/news.rst b/news.rst index 8b1d5658b8d..d761252772d 100644 --- a/news.rst +++ b/news.rst @@ -10,7 +10,7 @@ Version 2.7.0, Not Yet Released * Optimize prime generation, especially improving RSA key generation. (GH #1542) -* Optimizations for elliptic curve operations (GH #1534 #1531 #1546) +* Optimizations for elliptic curve operations (GH #1534 #1531 #1546 #1547) * Improved performance of signature verification in ECGDSA, ECKCDSA, SM2 and GOST by 10-15%. From c90d868a533c13501e8d6e3b71919501b9d70f9e Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Fri, 20 Apr 2018 10:30:04 -0400 Subject: [PATCH 047/174] Use EC_Group::inverse_mod_order where appropriate --- src/cli/timing_tests.cpp | 2 +- src/lib/pubkey/ecc_key/ecc_key.cpp | 7 ++----- src/lib/pubkey/gost_3410/gost_3410.cpp | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/cli/timing_tests.cpp b/src/cli/timing_tests.cpp index 5c0c504df2c..5a6b2b773a6 100644 --- a/src/cli/timing_tests.cpp +++ b/src/cli/timing_tests.cpp @@ -291,7 +291,7 @@ ticks ECDSA_Timing_Test::measure_critical_function(std::vector input) //The following ECDSA operations involve and should not leak any information about k. - const Botan::BigInt k_inv = Botan::inverse_mod(k, m_group.get_order()); + const Botan::BigInt k_inv = m_group.inverse_mod_order(k); const Botan::PointGFp k_times_P = m_group.blinded_base_point_multiply(k, Timing_Test::timing_test_rng(), m_ws); const Botan::BigInt r = m_group.mod_order(k_times_P.get_affine_x()); const Botan::BigInt s = m_group.multiply_mod_order(k_inv, mul_add(m_x, r, msg)); diff --git a/src/lib/pubkey/ecc_key/ecc_key.cpp b/src/lib/pubkey/ecc_key/ecc_key.cpp index 7c46a2fa0e0..2c23c1b47e8 100644 --- a/src/lib/pubkey/ecc_key/ecc_key.cpp +++ b/src/lib/pubkey/ecc_key/ecc_key.cpp @@ -118,8 +118,6 @@ EC_PrivateKey::EC_PrivateKey(RandomNumberGenerator& rng, else m_domain_encoding = EC_DOMPAR_ENC_EXPLICIT; - const BigInt& order = m_domain_params.get_order(); - if(x == 0) { m_private_key = ec_group.random_scalar(rng); @@ -133,7 +131,7 @@ EC_PrivateKey::EC_PrivateKey(RandomNumberGenerator& rng, if(with_modular_inverse) { // ECKCDSA - m_public_key = domain().get_base_point() * inverse_mod(m_private_key, order); + m_public_key = domain().get_base_point() * m_domain_params.inverse_mod_order(m_private_key); } else { @@ -183,8 +181,7 @@ EC_PrivateKey::EC_PrivateKey(const AlgorithmIdentifier& alg_id, if(with_modular_inverse) { // ECKCDSA - const BigInt& order = m_domain_params.get_order(); - m_public_key = domain().get_base_point() * inverse_mod(m_private_key, order); + m_public_key = domain().get_base_point() * m_domain_params.inverse_mod_order(m_private_key); } else { diff --git a/src/lib/pubkey/gost_3410/gost_3410.cpp b/src/lib/pubkey/gost_3410/gost_3410.cpp index b0c94fb7e97..1d1b0d75e7f 100644 --- a/src/lib/pubkey/gost_3410/gost_3410.cpp +++ b/src/lib/pubkey/gost_3410/gost_3410.cpp @@ -185,7 +185,7 @@ bool GOST_3410_Verification_Operation::verify(const uint8_t msg[], size_t msg_le if(e == 0) e = 1; - const BigInt v = inverse_mod(e, order); + const BigInt v = m_group.inverse_mod_order(e); const BigInt z1 = m_group.multiply_mod_order(s, v); const BigInt z2 = m_group.multiply_mod_order(-r, v); From d1479ede7bc01b60f67d6826611baf43987e941b Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 23 Apr 2018 19:01:51 -0400 Subject: [PATCH 048/174] Add BigInt::mod_sub --- src/lib/math/bigint/big_ops2.cpp | 49 ++++++++ src/lib/math/bigint/bigint.h | 16 +++ src/lib/pubkey/ec_group/point_gfp.cpp | 154 +++++++++++--------------- src/lib/pubkey/ec_group/point_gfp.h | 2 +- 4 files changed, 128 insertions(+), 93 deletions(-) diff --git a/src/lib/math/bigint/big_ops2.cpp b/src/lib/math/bigint/big_ops2.cpp index 212a44fa074..24263525728 100644 --- a/src/lib/math/bigint/big_ops2.cpp +++ b/src/lib/math/bigint/big_ops2.cpp @@ -95,6 +95,55 @@ BigInt& BigInt::operator-=(const BigInt& y) return (*this); } +BigInt& BigInt::mod_add(const BigInt& s, const BigInt& mod, secure_vector& ws) + { + if(this->is_negative() || s.is_negative() || mod.is_negative()) + throw Invalid_Argument("BigInt::mod_add expects all arguments are positive"); + + // TODO add optimized version of this + *this += s; + this->reduce_below(mod, ws); + + return (*this); + } + +BigInt& BigInt::mod_sub(const BigInt& s, const BigInt& mod, secure_vector& ws) + { + if(this->is_negative() || s.is_negative() || mod.is_negative()) + throw Invalid_Argument("BigInt::mod_sub expects all arguments are positive"); + + const size_t t_sw = sig_words(); + const size_t s_sw = s.sig_words(); + const size_t mod_sw = mod.sig_words(); + + if(t_sw > mod_sw || s_sw > mod_sw) + throw Invalid_Argument("BigInt::mod_sub args larger than modulus"); + + int32_t relative_size = bigint_cmp(data(), t_sw, s.data(), s_sw); + + if(relative_size >= 0) + { + // this >= s in which case just subtract + bigint_sub2(mutable_data(), t_sw, s.data(), s_sw); + } + else + { + // Otherwise we must sub s and then add p (or add (p - s) as here) + + ws.resize(mod_sw + 1); + + bigint_sub3(ws.data(), mod.data(), mod_sw, s.data(), s_sw); + + if(m_reg.size() < mod_sw) + grow_to(mod_sw); + + word carry = bigint_add2_nc(mutable_data(), m_reg.size(), ws.data(), mod_sw); + BOTAN_ASSERT_NOMSG(carry == 0); + } + + return (*this); + } + BigInt& BigInt::rev_sub(const word y[], size_t y_sw, secure_vector& ws) { /* diff --git a/src/lib/math/bigint/bigint.h b/src/lib/math/bigint/bigint.h index eec7f617693..bb7a6954148 100644 --- a/src/lib/math/bigint/bigint.h +++ b/src/lib/math/bigint/bigint.h @@ -265,6 +265,22 @@ class BOTAN_PUBLIC_API(2,0) BigInt final */ BigInt& rev_sub(const word y[], size_t y_size, secure_vector& ws); + /** + * Set *this to (*this + y) % mod + * @param y the BigInt to add - assumed y >= 0 and y < mod + * @param mod the positive modulus + * @param ws a temp workspace + */ + BigInt& mod_add(const BigInt& y, const BigInt& mod, secure_vector& ws); + + /** + * Set *this to (*this - y) % mod + * @param y the BigInt to subtract - assumed y >= 0 and y < mod + * @param mod the positive modulus + * @param ws a temp workspace + */ + BigInt& mod_sub(const BigInt& y, const BigInt& mod, secure_vector& ws); + /** * Return *this below mod * diff --git a/src/lib/pubkey/ec_group/point_gfp.cpp b/src/lib/pubkey/ec_group/point_gfp.cpp index c65b4ac168e..8f53bb0795b 100644 --- a/src/lib/pubkey/ec_group/point_gfp.cpp +++ b/src/lib/pubkey/ec_group/point_gfp.cpp @@ -17,20 +17,17 @@ namespace Botan { PointGFp::PointGFp(const CurveGFp& curve) : m_curve(curve), m_coord_x(0), - m_coord_y(1), + m_coord_y(curve.get_1_rep()), m_coord_z(0) { - secure_vector monty_ws(m_curve.get_ws_size()); - m_curve.to_rep(m_coord_x, monty_ws); - m_curve.to_rep(m_coord_y, monty_ws); - m_curve.to_rep(m_coord_z, monty_ws); + // Assumes Montgomery rep of zero is zero } PointGFp::PointGFp(const CurveGFp& curve, const BigInt& x, const BigInt& y) : m_curve(curve), m_coord_x(x), m_coord_y(y), - m_coord_z(1) + m_coord_z(m_curve.get_1_rep()) { if(x <= 0 || x >= curve.get_p()) throw Invalid_Argument("Invalid PointGFp affine x"); @@ -40,7 +37,6 @@ PointGFp::PointGFp(const CurveGFp& curve, const BigInt& x, const BigInt& y) : secure_vector monty_ws(m_curve.get_ws_size()); m_curve.to_rep(m_coord_x, monty_ws); m_curve.to_rep(m_coord_y, monty_ws); - m_curve.to_rep(m_coord_z, monty_ws); } void PointGFp::randomize_repr(RandomNumberGenerator& rng) @@ -118,12 +114,13 @@ void PointGFp::add_affine(const word x_words[], size_t x_size, resize_ws(ws_bn, m_curve.get_ws_size()); secure_vector& ws = ws_bn[0].get_word_vector(); + secure_vector& sub_ws = ws_bn[1].get_word_vector(); - BigInt& T0 = ws_bn[1]; - BigInt& T1 = ws_bn[2]; - BigInt& T2 = ws_bn[3]; - BigInt& T3 = ws_bn[4]; - BigInt& T4 = ws_bn[5]; + BigInt& T0 = ws_bn[2]; + BigInt& T1 = ws_bn[3]; + BigInt& T2 = ws_bn[4]; + BigInt& T3 = ws_bn[5]; + BigInt& T4 = ws_bn[6]; /* https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#addition-add-1998-cmo-2 @@ -138,13 +135,9 @@ void PointGFp::add_affine(const word x_words[], size_t x_size, m_curve.mul(T2, m_coord_z, T3, ws); // z1^3 m_curve.mul(T0, y_words, y_size, T2, ws); // y2*z1^3 - T4 -= m_coord_x; // x2*z1^2 - x1*z2^2 - if(T4.is_negative()) - T4 += p; + T4.mod_sub(m_coord_x, p, sub_ws); // x2*z1^2 - x1*z2^2 - T0 -= m_coord_y; - if(T0.is_negative()) - T0 += p; + T0.mod_sub(m_coord_y, p, sub_ws); if(T4.is_zero()) { @@ -156,7 +149,7 @@ void PointGFp::add_affine(const word x_words[], size_t x_size, // setting to zero: m_coord_x = 0; - m_coord_y = 1; + m_coord_y = m_curve.get_1_rep(); m_coord_z = 0; return; } @@ -168,22 +161,16 @@ void PointGFp::add_affine(const word x_words[], size_t x_size, m_curve.mul(T1, T2, T4, ws); m_curve.sqr(m_coord_x, T0, ws); - m_coord_x -= T1; - m_coord_x -= T3; - m_coord_x -= T3; - while(m_coord_x.is_negative()) - m_coord_x += p; + m_coord_x.mod_sub(T1, p, sub_ws); + m_coord_x.mod_sub(T3, p, sub_ws); + m_coord_x.mod_sub(T3, p, sub_ws); - T3 -= m_coord_x; - if(T3.is_negative()) - T3 += p; + T3.mod_sub(m_coord_x, p, sub_ws); T2 = m_coord_y; m_curve.mul(T2, T0, T3, ws); m_curve.mul(T3, m_coord_y, T1, ws); - T2 -= T3; - if(T2.is_negative()) - T2 += p; + T2.mod_sub(T3, p, sub_ws); m_coord_y = T2; m_curve.mul(T3, m_coord_z, T4, ws); @@ -207,13 +194,14 @@ void PointGFp::add(const PointGFp& rhs, std::vector& ws_bn) resize_ws(ws_bn, m_curve.get_ws_size()); secure_vector& ws = ws_bn[0].get_word_vector(); + secure_vector& sub_ws = ws_bn[1].get_word_vector(); - BigInt& T0 = ws_bn[1]; - BigInt& T1 = ws_bn[2]; - BigInt& T2 = ws_bn[3]; - BigInt& T3 = ws_bn[4]; - BigInt& T4 = ws_bn[5]; - BigInt& T5 = ws_bn[6]; + BigInt& T0 = ws_bn[2]; + BigInt& T1 = ws_bn[3]; + BigInt& T2 = ws_bn[4]; + BigInt& T3 = ws_bn[5]; + BigInt& T4 = ws_bn[6]; + BigInt& T5 = ws_bn[7]; /* https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#addition-add-1998-cmo-2 @@ -232,18 +220,13 @@ void PointGFp::add(const PointGFp& rhs, std::vector& ws_bn) m_curve.mul(T5, m_coord_z, T3, ws); // z1^3 m_curve.mul(T0, rhs.m_coord_y, T5, ws); // y2*z1^3 - T4 -= T1; // x2*z1^2 - x1*z2^2 - if(T4.is_negative()) - T4 += p; + T4.mod_sub(T1, p, sub_ws); // x2*z1^2 - x1*z2^2 - T3 = T0; - T3 -= T2; - if(T3.is_negative()) - T3 += p; + T0.mod_sub(T2, p, sub_ws); if(T4.is_zero()) { - if(T3.is_zero()) + if(T0.is_zero()) { mult2(ws_bn); return; @@ -251,36 +234,31 @@ void PointGFp::add(const PointGFp& rhs, std::vector& ws_bn) // setting to zero: m_coord_x = 0; - m_coord_y = 1; + m_coord_y = m_curve.get_1_rep(); m_coord_z = 0; return; } m_curve.sqr(T5, T4, ws); - m_curve.mul(T0, T1, T5, ws); + m_curve.mul(T3, T1, T5, ws); m_curve.mul(T1, T5, T4, ws); - m_curve.sqr(m_coord_x, T3, ws); - m_coord_x -= T1; - m_coord_x -= T0; - m_coord_x -= T0; - while(m_coord_x.is_negative()) - m_coord_x += p; - - T0 -= m_coord_x; - if(T0.is_negative()) - T0 += p; - - m_curve.mul(m_coord_y, T3, T0, ws); - m_curve.mul(T0, T2, T1, ws); - m_coord_y -= T0; - if(m_coord_y.is_negative()) - m_coord_y += p; - - m_curve.mul(T0, m_coord_z, rhs.m_coord_z, ws); - m_curve.mul(m_coord_z, T0, T4, ws); + m_curve.sqr(m_coord_x, T0, ws); + m_coord_x.mod_sub(T1, p, sub_ws); + m_coord_x.mod_sub(T3, p, sub_ws); + m_coord_x.mod_sub(T3, p, sub_ws); + + T3.mod_sub(m_coord_x, p, sub_ws); + + m_curve.mul(m_coord_y, T0, T3, ws); + m_curve.mul(T3, T2, T1, ws); + + m_coord_y.mod_sub(T3, p, sub_ws); + + m_curve.mul(T3, m_coord_z, rhs.m_coord_z, ws); + m_curve.mul(m_coord_z, T3, T4, ws); } void PointGFp::mult2i(size_t iterations, std::vector& ws_bn) @@ -317,11 +295,13 @@ void PointGFp::mult2(std::vector& ws_bn) resize_ws(ws_bn, m_curve.get_ws_size()); secure_vector& ws = ws_bn[0].get_word_vector(); - BigInt& T0 = ws_bn[1]; - BigInt& T1 = ws_bn[2]; - BigInt& T2 = ws_bn[3]; - BigInt& T3 = ws_bn[4]; - BigInt& T4 = ws_bn[5]; + secure_vector& sub_ws = ws_bn[1].get_word_vector(); + + BigInt& T0 = ws_bn[2]; + BigInt& T1 = ws_bn[3]; + BigInt& T2 = ws_bn[4]; + BigInt& T3 = ws_bn[5]; + BigInt& T4 = ws_bn[6]; /* https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-1986-cc @@ -332,14 +312,14 @@ void PointGFp::mult2(std::vector& ws_bn) m_curve.mul(T1, m_coord_x, T0, ws); T1 <<= 2; // * 4 - T1.reduce_below(p, T3.get_word_vector()); + T1.reduce_below(p, sub_ws); if(m_curve.a_is_zero()) { // if a == 0 then 3*x^2 + a*z^4 is just 3*x^2 m_curve.sqr(T4, m_coord_x, ws); // x^2 T4 *= 3; // 3*x^2 - T4.reduce_below(p, T3.get_word_vector()); + T4.reduce_below(p, sub_ws); } else if(m_curve.a_is_minus_3()) { @@ -351,18 +331,15 @@ void PointGFp::mult2(std::vector& ws_bn) // (x-z^2) T2 = m_coord_x; - T2 -= T3; - if(T2.is_negative()) - T2 += p; + T2.mod_sub(T3, p, sub_ws); // (x+z^2) - T3 += m_coord_x; - T3.reduce_below(p, T4.get_word_vector()); + T3.mod_add(m_coord_x, p, sub_ws); m_curve.mul(T4, T2, T3, ws); // (x-z^2)*(x+z^2) T4 *= 3; // 3*(x-z^2)*(x+z^2) - T4.reduce_below(p, T3.get_word_vector()); + T4.reduce_below(p, sub_ws); } else { @@ -372,34 +349,27 @@ void PointGFp::mult2(std::vector& ws_bn) m_curve.sqr(T4, m_coord_x, ws); // x^2 T4 *= 3; // 3*x^2 - T4 += T3; // 3*x^2 + a*z^4 - T4.reduce_below(p, T3.get_word_vector()); + T4.mod_add(T3, p, sub_ws); // 3*x^2 + a*z^4 } m_curve.sqr(T2, T4, ws); - T2 -= T1; - T2 -= T1; - while(T2.is_negative()) - T2 += p; + T2.mod_sub(T1, p, sub_ws); + T2.mod_sub(T1, p, sub_ws); m_curve.sqr(T3, T0, ws); T3 <<= 3; - T3.reduce_below(p, T0.get_word_vector()); + T3.reduce_below(p, sub_ws); - T1 -= T2; - while(T1.is_negative()) - T1 += p; + T1.mod_sub(T2, p, sub_ws); m_curve.mul(T0, T4, T1, ws); - T0 -= T3; - if(T0.is_negative()) - T0 += p; + T0.mod_sub(T3, p, sub_ws); m_coord_x = T2; m_curve.mul(T2, m_coord_y, m_coord_z, ws); T2 <<= 1; - T2.reduce_below(p, T3.get_word_vector()); + T2.reduce_below(p, sub_ws); m_coord_y = T0; m_coord_z = T2; diff --git a/src/lib/pubkey/ec_group/point_gfp.h b/src/lib/pubkey/ec_group/point_gfp.h index 271d7383aae..cce2adcc639 100644 --- a/src/lib/pubkey/ec_group/point_gfp.h +++ b/src/lib/pubkey/ec_group/point_gfp.h @@ -49,7 +49,7 @@ class BOTAN_PUBLIC_API(2,0) PointGFp final HYBRID = 2 }; - enum { WORKSPACE_SIZE = 7 }; + enum { WORKSPACE_SIZE = 8 }; /** * Construct an uninitialized PointGFp From 8658125f1663a28d8cbd7b3d324c440b1bd2a9d0 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 23 Apr 2018 20:20:56 -0400 Subject: [PATCH 049/174] Update news --- news.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/news.rst b/news.rst index d761252772d..778eec027e1 100644 --- a/news.rst +++ b/news.rst @@ -10,7 +10,7 @@ Version 2.7.0, Not Yet Released * Optimize prime generation, especially improving RSA key generation. (GH #1542) -* Optimizations for elliptic curve operations (GH #1534 #1531 #1546 #1547) +* Optimizations for elliptic curve operations (GH #1534 #1531 #1546 #1547 #1550) * Improved performance of signature verification in ECGDSA, ECKCDSA, SM2 and GOST by 10-15%. From 557475a93e60e9632a8eadd2d9f4ed98a01058ea Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 24 Apr 2018 16:49:17 -0400 Subject: [PATCH 050/174] Add final annotations [ci skip] --- src/lib/pubkey/ec_group/point_mul.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/pubkey/ec_group/point_mul.h b/src/lib/pubkey/ec_group/point_mul.h index da1d3b7445e..a85c2bee992 100644 --- a/src/lib/pubkey/ec_group/point_mul.h +++ b/src/lib/pubkey/ec_group/point_mul.h @@ -15,7 +15,7 @@ class Modular_Reducer; static const size_t PointGFp_SCALAR_BLINDING_BITS = 80; -class PointGFp_Base_Point_Precompute +class PointGFp_Base_Point_Precompute final { public: PointGFp_Base_Point_Precompute(const PointGFp& base_point, @@ -38,7 +38,7 @@ class PointGFp_Base_Point_Precompute std::vector m_W; }; -class PointGFp_Var_Point_Precompute +class PointGFp_Var_Point_Precompute final { public: PointGFp_Var_Point_Precompute(const PointGFp& point); @@ -55,7 +55,7 @@ class PointGFp_Var_Point_Precompute std::vector m_U; }; -class PointGFp_Multi_Point_Precompute +class PointGFp_Multi_Point_Precompute final { public: PointGFp_Multi_Point_Precompute(const PointGFp& g1, From 5860f9db36fcfa0ae7c3c4e768b446106e228f32 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 24 Apr 2018 17:54:29 -0400 Subject: [PATCH 051/174] Another todo [ci skip] --- doc/todo.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/todo.rst b/doc/todo.rst index d052bfcf948..0cba6ce5f2c 100644 --- a/doc/todo.rst +++ b/doc/todo.rst @@ -31,7 +31,7 @@ Ciphers, Hashes, PBKDF Public Key Crypto, Math ---------------------------------------- -* Abstract repesentation of ECC point elements to allow specific +* Abstract representation of ECC point elements to allow specific implementations of the field arithmetic depending upon the curve. * Curves for pairings (BN-256 is widely implemented) * Identity based encryption @@ -110,6 +110,7 @@ New Protocols / Formats * PKCS12 / PFX * NaCl compatible cryptobox functions * Off-The-Record v3 https://otr.cypherpunks.ca/ +* Fernet symmetric encryption (https://cryptography.io/en/latest/fernet/) * Some useful subset of OpenPGP - Subset #1: symmetrically encrypted files @@ -172,7 +173,7 @@ FIPS 140 Build plus wrapping the appropriate functions for self-tests and so on. This creates a library in FIPS 140 validated form (since there is no 'crypto' anymore from Botan, just the ASN.1 parser, TLS library, PKI etc all of which FIPS 140 does - not care about) without the enourmous hassle and expense of actually having to + not care about) without the enormous hassle and expense of actually having to maintain a FIPS validation on Botan. Email Jack if you are interested in this. CLI From ebb73b99a8ca14c45d64de2619ab0cf6b89b860e Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 26 Apr 2018 11:40:50 -0400 Subject: [PATCH 052/174] Add BigInt functions for adding, subtracting and comparing with words Avoids needless allocations for expressions like x - 1 or y <= 4. --- src/lib/math/bigint/big_ops2.cpp | 64 ++++++++++++++++----------- src/lib/math/bigint/big_ops3.cpp | 75 +++++++++++++++++++++----------- src/lib/math/bigint/bigint.cpp | 12 +++++ src/lib/math/bigint/bigint.h | 42 ++++++++++++++++++ 4 files changed, 142 insertions(+), 51 deletions(-) diff --git a/src/lib/math/bigint/big_ops2.cpp b/src/lib/math/bigint/big_ops2.cpp index 24263525728..39f98556639 100644 --- a/src/lib/math/bigint/big_ops2.cpp +++ b/src/lib/math/bigint/big_ops2.cpp @@ -12,32 +12,29 @@ namespace Botan { -/* -* Addition Operator -*/ -BigInt& BigInt::operator+=(const BigInt& y) +BigInt& BigInt::add(const word y[], size_t y_sw, Sign y_sign) { - const size_t x_sw = sig_words(), y_sw = y.sig_words(); + const size_t x_sw = sig_words(); - if(sign() == y.sign()) + if(sign() == y_sign) { const size_t reg_size = std::max(x_sw, y_sw) + 1; if(m_reg.size() < reg_size) grow_to(reg_size); - bigint_add2(mutable_data(), reg_size - 1, y.data(), y_sw); + bigint_add2(mutable_data(), reg_size - 1, y, y_sw); } else { - const int32_t relative_size = bigint_cmp(data(), x_sw, y.data(), y_sw); + const int32_t relative_size = bigint_cmp(data(), x_sw, y, y_sw); if(relative_size < 0) { const size_t reg_size = std::max(x_sw, y_sw); grow_to(reg_size); - bigint_sub2_rev(mutable_data(), y.data(), y_sw); - set_sign(y.sign()); + bigint_sub2_rev(mutable_data(), y, y_sw); + set_sign(y_sign); } else if(relative_size == 0) { @@ -46,37 +43,44 @@ BigInt& BigInt::operator+=(const BigInt& y) } else if(relative_size > 0) { - bigint_sub2(mutable_data(), x_sw, y.data(), y_sw); + bigint_sub2(mutable_data(), x_sw, y, y_sw); } } return (*this); } -/* -* Subtraction Operator -*/ -BigInt& BigInt::operator-=(const BigInt& y) +BigInt& BigInt::operator+=(const BigInt& y) + { + return add(y.data(), y.sig_words(), y.sign()); + } + +BigInt& BigInt::operator+=(word y) { - const size_t x_sw = sig_words(), y_sw = y.sig_words(); + return add(&y, 1, Positive); + } + +BigInt& BigInt::sub(const word y[], size_t y_sw, Sign y_sign) + { + const size_t x_sw = sig_words(); - int32_t relative_size = bigint_cmp(data(), x_sw, y.data(), y_sw); + int32_t relative_size = bigint_cmp(data(), x_sw, y, y_sw); const size_t reg_size = std::max(x_sw, y_sw) + 1; grow_to(reg_size); if(relative_size < 0) { - if(sign() == y.sign()) - bigint_sub2_rev(mutable_data(), y.data(), y_sw); + if(sign() == y_sign) + bigint_sub2_rev(mutable_data(), y, y_sw); else - bigint_add2(mutable_data(), reg_size - 1, y.data(), y_sw); + bigint_add2(mutable_data(), reg_size - 1, y, y_sw); - set_sign(y.reverse_sign()); + set_sign(y_sign == Positive ? Negative : Positive); } else if(relative_size == 0) { - if(sign() == y.sign()) + if(sign() == y_sign) { clear(); set_sign(Positive); @@ -86,15 +90,25 @@ BigInt& BigInt::operator-=(const BigInt& y) } else if(relative_size > 0) { - if(sign() == y.sign()) - bigint_sub2(mutable_data(), x_sw, y.data(), y_sw); + if(sign() == y_sign) + bigint_sub2(mutable_data(), x_sw, y, y_sw); else - bigint_add2(mutable_data(), reg_size - 1, y.data(), y_sw); + bigint_add2(mutable_data(), reg_size - 1, y, y_sw); } return (*this); } +BigInt& BigInt::operator-=(const BigInt& y) + { + return sub(y.data(), y.sig_words(), y.sign()); + } + +BigInt& BigInt::operator-=(word y) + { + return sub(&y, 1, Positive); + } + BigInt& BigInt::mod_add(const BigInt& s, const BigInt& mod, secure_vector& ws) { if(this->is_negative() || s.is_negative() || mod.is_negative()) diff --git a/src/lib/math/bigint/big_ops3.cpp b/src/lib/math/bigint/big_ops3.cpp index ce9047b15b1..4f0ba5364f9 100644 --- a/src/lib/math/bigint/big_ops3.cpp +++ b/src/lib/math/bigint/big_ops3.cpp @@ -14,71 +14,94 @@ namespace Botan { -/* -* Addition Operator -*/ -BigInt operator+(const BigInt& x, const BigInt& y) +namespace { + +BigInt bigint_add(const BigInt& x, const word y[], size_t y_sw, BigInt::Sign y_sign) { - const size_t x_sw = x.sig_words(), y_sw = y.sig_words(); + const size_t x_sw = x.sig_words(); BigInt z(x.sign(), std::max(x_sw, y_sw) + 1); - if(x.sign() == y.sign()) - bigint_add3(z.mutable_data(), x.data(), x_sw, y.data(), y_sw); + if(x.sign() == y_sign) + bigint_add3(z.mutable_data(), x.data(), x_sw, y, y_sw); else { - int32_t relative_size = bigint_cmp(x.data(), x_sw, y.data(), y_sw); + int32_t relative_size = bigint_cmp(x.data(), x_sw, y, y_sw); if(relative_size < 0) { - bigint_sub3(z.mutable_data(), y.data(), y_sw, x.data(), x_sw); - z.set_sign(y.sign()); + bigint_sub3(z.mutable_data(), y, y_sw, x.data(), x_sw); + z.set_sign(y_sign); } else if(relative_size == 0) z.set_sign(BigInt::Positive); else if(relative_size > 0) - bigint_sub3(z.mutable_data(), x.data(), x_sw, y.data(), y_sw); + bigint_sub3(z.mutable_data(), x.data(), x_sw, y, y_sw); } return z; } -/* -* Subtraction Operator -*/ -BigInt operator-(const BigInt& x, const BigInt& y) +BigInt bigint_sub(const BigInt& x, const word y[], size_t y_sw, BigInt::Sign y_sign) { - const size_t x_sw = x.sig_words(), y_sw = y.sig_words(); + const size_t x_sw = x.sig_words(); - int32_t relative_size = bigint_cmp(x.data(), x_sw, y.data(), y_sw); + int32_t relative_size = bigint_cmp(x.data(), x_sw, y, y_sw); BigInt z(BigInt::Positive, std::max(x_sw, y_sw) + 1); if(relative_size < 0) { - if(x.sign() == y.sign()) - bigint_sub3(z.mutable_data(), y.data(), y_sw, x.data(), x_sw); + if(x.sign() == y_sign) + bigint_sub3(z.mutable_data(), y, y_sw, x.data(), x_sw); else - bigint_add3(z.mutable_data(), x.data(), x_sw, y.data(), y_sw); - z.set_sign(y.reverse_sign()); + bigint_add3(z.mutable_data(), x.data(), x_sw, y, y_sw); + z.set_sign(y_sign == BigInt::Positive ? BigInt::Negative : BigInt::Positive); } else if(relative_size == 0) { - if(x.sign() != y.sign()) + if(x.sign() != y_sign) bigint_shl2(z.mutable_data(), x.data(), x_sw, 0, 1); - z.set_sign(y.reverse_sign()); + z.set_sign(y_sign == BigInt::Positive ? BigInt::Negative : BigInt::Positive); } else if(relative_size > 0) { - if(x.sign() == y.sign()) - bigint_sub3(z.mutable_data(), x.data(), x_sw, y.data(), y_sw); + if(x.sign() == y_sign) + bigint_sub3(z.mutable_data(), x.data(), x_sw, y, y_sw); else - bigint_add3(z.mutable_data(), x.data(), x_sw, y.data(), y_sw); + bigint_add3(z.mutable_data(), x.data(), x_sw, y, y_sw); z.set_sign(x.sign()); } return z; } +} + +BigInt operator+(const BigInt& x, const BigInt& y) + { + return bigint_add(x, y.data(), y.sig_words(), y.sign()); + } + +BigInt operator+(const BigInt& x, word y) + { + return bigint_add(x, &y, 1, BigInt::Positive); + } + +BigInt operator+(word y, const BigInt& x) + { + return bigint_add(x, &y, 1, BigInt::Positive); + } + +BigInt operator-(const BigInt& x, const BigInt& y) + { + return bigint_sub(x, y.data(), y.sig_words(), y.sign()); + } + +BigInt operator-(const BigInt& x, word y) + { + return bigint_sub(x, &y, 1, BigInt::Positive); + } + /* * Multiplication Operator */ diff --git a/src/lib/math/bigint/bigint.cpp b/src/lib/math/bigint/bigint.cpp index 8874195afa3..39cff666c7d 100644 --- a/src/lib/math/bigint/bigint.cpp +++ b/src/lib/math/bigint/bigint.cpp @@ -113,6 +113,18 @@ BigInt::BigInt(RandomNumberGenerator& rng, size_t bits, bool set_high_bit) randomize(rng, bits, set_high_bit); } +int32_t BigInt::cmp_word(word other) const + { + if(is_negative()) + return -1; // other is positive ... + + const size_t sw = this->sig_words(); + if(sw > 1) + return 1; // must be larger since other is just one word ... + + return bigint_cmp(this->data(), sw, &other, 1); + } + /* * Comparison Function */ diff --git a/src/lib/math/bigint/bigint.h b/src/lib/math/bigint/bigint.h index bb7a6954148..33a1252abe2 100644 --- a/src/lib/math/bigint/bigint.h +++ b/src/lib/math/bigint/bigint.h @@ -164,12 +164,24 @@ class BOTAN_PUBLIC_API(2,0) BigInt final */ BigInt& operator+=(const BigInt& y); + /** + * += operator + * @param y the word to add to this + */ + BigInt& operator+=(word y); + /** * -= operator * @param y the BigInt to subtract from this */ BigInt& operator-=(const BigInt& y); + /** + * -= operator + * @param y the word to subtract from this + */ + BigInt& operator-=(word y); + /** * *= operator * @param y the BigInt to multiply with this @@ -305,6 +317,14 @@ class BOTAN_PUBLIC_API(2,0) BigInt final */ int32_t cmp(const BigInt& n, bool check_signs = true) const; + /** + * Compare this to an integer + * @param n the value to compare with + * @result if (thisn) return 1, if both + * values are identical return 0 [like Perl's <=> operator] + */ + int32_t cmp_word(word n) const; + /** * Test if the integer has an even value * @result true if the integer is even, false otherwise @@ -700,6 +720,10 @@ class BOTAN_PUBLIC_API(2,0) BigInt final size_t idx); private: + + BigInt& add(const word y[], size_t y_words, Sign sign); + BigInt& sub(const word y[], size_t y_words, Sign sign); + secure_vector m_reg; Sign m_signedness = Positive; }; @@ -708,7 +732,12 @@ class BOTAN_PUBLIC_API(2,0) BigInt final * Arithmetic Operators */ BigInt BOTAN_PUBLIC_API(2,0) operator+(const BigInt& x, const BigInt& y); +BigInt BOTAN_PUBLIC_API(2,7) operator+(const BigInt& x, word y); +BigInt BOTAN_PUBLIC_API(2,7) operator+(word x, const BigInt& y); + BigInt BOTAN_PUBLIC_API(2,0) operator-(const BigInt& x, const BigInt& y); +BigInt BOTAN_PUBLIC_API(2,7) operator-(const BigInt& x, word y); + BigInt BOTAN_PUBLIC_API(2,0) operator*(const BigInt& x, const BigInt& y); BigInt BOTAN_PUBLIC_API(2,0) operator/(const BigInt& x, const BigInt& d); BigInt BOTAN_PUBLIC_API(2,0) operator%(const BigInt& x, const BigInt& m); @@ -732,6 +761,19 @@ inline bool operator<(const BigInt& a, const BigInt& b) inline bool operator>(const BigInt& a, const BigInt& b) { return (a.cmp(b) > 0); } +inline bool operator==(const BigInt& a, word b) + { return (a.cmp_word(b) == 0); } +inline bool operator!=(const BigInt& a, word b) + { return (a.cmp_word(b) != 0); } +inline bool operator<=(const BigInt& a, word b) + { return (a.cmp_word(b) <= 0); } +inline bool operator>=(const BigInt& a, word b) + { return (a.cmp_word(b) >= 0); } +inline bool operator<(const BigInt& a, word b) + { return (a.cmp_word(b) < 0); } +inline bool operator>(const BigInt& a, word b) + { return (a.cmp_word(b) > 0); } + /* * I/O Operators */ From a41779e3c2a9e90726f3ec45fb333af77128663f Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 26 Apr 2018 11:42:15 -0400 Subject: [PATCH 053/174] Rewrite GCD in less branchy way, and use Montgomery in M-R test --- src/lib/math/numbertheory/numthry.cpp | 46 +++++++++++++++++---------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/src/lib/math/numbertheory/numthry.cpp b/src/lib/math/numbertheory/numthry.cpp index 8cc9301755c..10f44a1ee08 100644 --- a/src/lib/math/numbertheory/numthry.cpp +++ b/src/lib/math/numbertheory/numthry.cpp @@ -8,9 +8,11 @@ #include #include #include +#include #include #include #include +#include #include namespace Botan { @@ -46,26 +48,32 @@ size_t low_zero_bits(const BigInt& n) */ BigInt gcd(const BigInt& a, const BigInt& b) { - if(a.is_zero() || b.is_zero()) return 0; - if(a == 1 || b == 1) return 1; + if(a.is_zero() || b.is_zero()) + return 0; + if(a == 1 || b == 1) + return 1; + + BigInt X[2] = { a, b }; + X[0].set_sign(BigInt::Positive); + X[1].set_sign(BigInt::Positive); - BigInt x = a, y = b; - x.set_sign(BigInt::Positive); - y.set_sign(BigInt::Positive); - size_t shift = std::min(low_zero_bits(x), low_zero_bits(y)); + const size_t shift = std::min(low_zero_bits(X[0]), low_zero_bits(X[1])); - x >>= shift; - y >>= shift; + X[0] >>= shift; + X[1] >>= shift; - while(x.is_nonzero()) + while(X[0].is_nonzero()) { - x >>= low_zero_bits(x); - y >>= low_zero_bits(y); - if(x >= y) { x -= y; x >>= 1; } - else { y -= x; y >>= 1; } + X[0] >>= low_zero_bits(X[0]); + X[1] >>= low_zero_bits(X[1]); + + const uint8_t sel = static_cast(X[0] >= X[1]); + + X[sel^1] -= X[sel]; + X[sel^1] >>= 1; } - return (y << shift); + return (X[1] << shift); } /* @@ -521,14 +529,20 @@ bool is_prime(const BigInt& n, RandomNumberGenerator& rng, const BigInt n_minus_1 = n - 1; const size_t s = low_zero_bits(n_minus_1); + const BigInt nm1_s = n_minus_1 >> s; const Modular_Reducer mod_n(n); - const Fixed_Exponent_Power_Mod pow_mod(n_minus_1 >> s, n); + auto monty_n = std::make_shared(n, mod_n); + + const size_t powm_window = 4; for(size_t i = 0; i != test_iterations; ++i) { const BigInt a = BigInt::random_integer(rng, 2, n_minus_1); - BigInt y = pow_mod(a); + + auto powm_a_n = monty_precompute(monty_n, a, powm_window); + + BigInt y = monty_execute(*powm_a_n, nm1_s); if(mr_witness(std::move(y), mod_n, n_minus_1, s)) return false; From f5aa418e5d345f7054ebf2883fb880991eb7d1c0 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 26 Apr 2018 11:44:13 -0400 Subject: [PATCH 054/174] Add a couple more GCD tests --- src/tests/data/bn/gcd.vec | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/tests/data/bn/gcd.vec b/src/tests/data/bn/gcd.vec index c7f63023162..4378c95341c 100644 --- a/src/tests/data/bn/gcd.vec +++ b/src/tests/data/bn/gcd.vec @@ -2,3 +2,11 @@ X = 259 Y = 4943984437 GCD = 259 + +X = 9298631792927489555577881706641 +Y = 536756618553495860610657489331151 +GCD = 1 + +X = 10022247630053045674847735694652 +Y = 25956 +GCD = 28 From e66b79e7ad1c99154069c4b94f59f4135b6bd986 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 26 Apr 2018 11:44:25 -0400 Subject: [PATCH 055/174] Remove unused include --- src/lib/pubkey/dsa/dsa.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/pubkey/dsa/dsa.cpp b/src/lib/pubkey/dsa/dsa.cpp index a3a6b9a5234..1728049727f 100644 --- a/src/lib/pubkey/dsa/dsa.cpp +++ b/src/lib/pubkey/dsa/dsa.cpp @@ -8,7 +8,6 @@ #include #include -#include #include #include #include From 178ddff62cc460be771018f48468e114b723da4e Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 26 Apr 2018 11:52:03 -0400 Subject: [PATCH 056/174] Correct handling of gcd(p - 1, e) in RSA keygen We were calling inverse mod but because p - 1 > e the binary extended euclidean algorithm was used instead of the const time version. Use the fact that e is odd (for RSA keys) to remove the factors of 2 from p - 1 and then check coprimality that way, since it allows using our const time algo. --- src/lib/math/numbertheory/make_prm.cpp | 32 ++++++++++++++++++++------ 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/lib/math/numbertheory/make_prm.cpp b/src/lib/math/numbertheory/make_prm.cpp index 85089c9cbd0..1979fa5502c 100644 --- a/src/lib/math/numbertheory/make_prm.cpp +++ b/src/lib/math/numbertheory/make_prm.cpp @@ -182,8 +182,13 @@ BigInt generate_rsa_prime(RandomNumberGenerator& keygen_rng, if(bits < 512) throw Invalid_Argument("generate_rsa_prime bits too small"); - if(coprime <= 1 || coprime.is_even()) - throw Invalid_Argument("generate_rsa_prime coprime must be odd positive integer"); + /* + * The restriction on coprime <= 64 bits is arbitrary but generally speaking + * very large RSA public exponents are a bad idea both for performance and due + * to attacks on small d. + */ + if(coprime <= 1 || coprime.is_even() || coprime.bits() > 64) + throw Invalid_Argument("generate_rsa_prime coprime must be small odd positive integer"); const size_t MAX_ATTEMPTS = 32*1024; @@ -218,13 +223,26 @@ BigInt generate_rsa_prime(RandomNumberGenerator& keygen_rng, continue; /* - * Check if gcd(p - 1, coprime) != 1 by computing the inverse. The - * gcd algorithm is not constant time, but modular inverse is (for - * odd modulus anyway). This avoids a side channel attack against RSA - * key generation. + * Check if p - 1 and coprime are relatively prime by computing the inverse. + * + * We avoid gcd here because that algorithm is not constant time. + * Modular inverse is (for odd modulus anyway). + * + * We earlier verified that coprime argument is odd. Thus the factors of 2 + * in (p - 1) cannot possibly be factors in coprime, so remove them from p - 1. + * Using an odd modulus allows the const time algorithm to be used. + * + * This assumes coprime < p - 1 which is always true for RSA. */ - if(inverse_mod(p - 1, coprime).is_zero()) + BigInt p1 = p - 1; + p1 >>= low_zero_bits(p1); + if(inverse_mod(coprime, p1).is_zero()) + { + BOTAN_DEBUG_ASSERT(gcd(p1, coprime) > 1); continue; + } + + BOTAN_DEBUG_ASSERT(gcd(p1, coprime) == 1); if(p.bits() > bits) break; From 0ccee221ca464320f1458aef82c90b1bea163649 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 26 Apr 2018 11:57:20 -0400 Subject: [PATCH 057/174] Add a comment on side channels here --- src/lib/pubkey/rsa/rsa.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/lib/pubkey/rsa/rsa.cpp b/src/lib/pubkey/rsa/rsa.cpp index ca0f414f511..fdc5b63d03c 100644 --- a/src/lib/pubkey/rsa/rsa.cpp +++ b/src/lib/pubkey/rsa/rsa.cpp @@ -141,18 +141,19 @@ RSA_PrivateKey::RSA_PrivateKey(RandomNumberGenerator& rng, m_e = exp; + const size_t p_bits = (bits + 1) / 2; + const size_t q_bits = bits - p_bits; + do { - const size_t p_bits = (bits + 1) / 2; - const size_t q_bits = bits - p_bits; - m_p = generate_rsa_prime(rng, rng, p_bits, m_e); m_q = generate_rsa_prime(rng, rng, q_bits, m_e); m_n = m_p * m_q; - } while(m_n.bits() != bits); + // FIXME: lcm calls gcd which is not const time const BigInt phi_n = lcm(m_p - 1, m_q - 1); + // FIXME: this uses binary ext gcd because phi_n is even m_d = inverse_mod(m_e, phi_n); m_d1 = m_d % (m_p - 1); m_d2 = m_d % (m_q - 1); From b2b0ea31a5d3f8b697c3fcb19defbe0adc30aa80 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 26 Apr 2018 13:04:53 -0400 Subject: [PATCH 058/174] Inline this operator+ [ci skip] --- src/lib/math/bigint/big_ops3.cpp | 5 ----- src/lib/math/bigint/bigint.h | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/lib/math/bigint/big_ops3.cpp b/src/lib/math/bigint/big_ops3.cpp index 4f0ba5364f9..492a69ad05c 100644 --- a/src/lib/math/bigint/big_ops3.cpp +++ b/src/lib/math/bigint/big_ops3.cpp @@ -87,11 +87,6 @@ BigInt operator+(const BigInt& x, word y) return bigint_add(x, &y, 1, BigInt::Positive); } -BigInt operator+(word y, const BigInt& x) - { - return bigint_add(x, &y, 1, BigInt::Positive); - } - BigInt operator-(const BigInt& x, const BigInt& y) { return bigint_sub(x, y.data(), y.sig_words(), y.sign()); diff --git a/src/lib/math/bigint/bigint.h b/src/lib/math/bigint/bigint.h index 33a1252abe2..d5bd4ad4fd5 100644 --- a/src/lib/math/bigint/bigint.h +++ b/src/lib/math/bigint/bigint.h @@ -733,7 +733,7 @@ class BOTAN_PUBLIC_API(2,0) BigInt final */ BigInt BOTAN_PUBLIC_API(2,0) operator+(const BigInt& x, const BigInt& y); BigInt BOTAN_PUBLIC_API(2,7) operator+(const BigInt& x, word y); -BigInt BOTAN_PUBLIC_API(2,7) operator+(word x, const BigInt& y); +inline BigInt operator+(word x, const BigInt& y) { return y + x; } BigInt BOTAN_PUBLIC_API(2,0) operator-(const BigInt& x, const BigInt& y); BigInt BOTAN_PUBLIC_API(2,7) operator-(const BigInt& x, word y); From ea10dfbbb6a5e748cde9c743f5ace02656736746 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 26 Apr 2018 13:13:02 -0400 Subject: [PATCH 059/174] Note MSVC 2013 deprecation --- doc/manual/deprecated.rst | 2 ++ news.rst | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/manual/deprecated.rst b/doc/manual/deprecated.rst index c91730cf323..4170a0c3032 100644 --- a/doc/manual/deprecated.rst +++ b/doc/manual/deprecated.rst @@ -34,6 +34,8 @@ in the source. classes which currently subclass it. This only affects your code if you are referencing `Botan::SymmetricAlgorithm` directly. +- Support for Visual C++ 2013 + - Platform support for Google Native Client - Platform support for Windows Phone diff --git a/news.rst b/news.rst index 778eec027e1..86b59317ea4 100644 --- a/news.rst +++ b/news.rst @@ -5,7 +5,7 @@ Version 2.7.0, Not Yet Released ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Avoid a side channel in RSA key generation due to use of a non-constant time - gcd algorithm. (GH #1542) + gcd algorithm. (GH #1542 #1556) * Optimize prime generation, especially improving RSA key generation. (GH #1542) @@ -31,6 +31,8 @@ Version 2.7.0, Not Yet Released * Avoid creating symlinks to the shared object on OpenBSD (#1535) +* Support for Visual C++ 2013 is deprecated, and will be removed in Jan 2019. + Version 2.6.0, 2018-04-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 3765d60a3618a57705ecfa403076405df3ed9882 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 26 Apr 2018 19:03:01 -0400 Subject: [PATCH 060/174] Add a compile time warning if MSVC 2013 is detected GH #1557 --- configure.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/configure.py b/configure.py index 8e2c807a2c7..d2286f0814a 100755 --- a/configure.py +++ b/configure.py @@ -2912,8 +2912,14 @@ def calculate_cc_min_version(options, ccinfo, source_paths): ccinfo.basename, cc_output)) return "0.0" - cc_version = "%d.%d" % (int(match.group(1), 0), int(match.group(2), 0)) + major_version = int(match.group(1), 0) + minor_version = int(match.group(2), 0) + cc_version = "%d.%d" % (major_version, minor_version) logging.info('Auto-detected compiler version %s' % (cc_version)) + + if ccinfo.basename == 'msvc': + if major_version == 18: + logging.warning('MSVC 2013 support is deprecated and will be removed in a future release') return cc_version def check_compiler_arch(options, ccinfo, archinfo, source_paths): From f85907c5f4b29cc3370c053bbb22e09c86f376cd Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 2 May 2018 08:57:22 -0400 Subject: [PATCH 061/174] Correct file name to regenerate [ci skip] --- src/build-data/oids.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build-data/oids.txt b/src/build-data/oids.txt index 321439e5bc9..0613bf82204 100644 --- a/src/build-data/oids.txt +++ b/src/build-data/oids.txt @@ -1,4 +1,4 @@ -# Regenerate with ./src/scripts/oids.py oids > src/lib/asn1/oids.cpp +# Regenerate with ./src/scripts/oids.py oids > src/lib/asn1/oid_maps.cpp # AND ./src/scripts/oids.py dn_ub > src/lib/x509/x509_dn_ub.cpp # (if you modified something under [dn] # AND ./src/scripts/oids.py pads > src/lib/pk_pad/padding.cpp From da499e6490b8b0f5a9b53943049c05a33d10cdf8 Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Wed, 2 May 2018 13:08:36 +0200 Subject: [PATCH 062/174] Add OpenPGP-specific curve OIDs --- src/build-data/oids.txt | 4 ++++ src/lib/asn1/oid_maps.cpp | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/build-data/oids.txt b/src/build-data/oids.txt index 321439e5bc9..b062dec8441 100644 --- a/src/build-data/oids.txt +++ b/src/build-data/oids.txt @@ -32,6 +32,10 @@ 1.2.643.2.2.19 = GOST-34.10 +# OpenPGP (RFC4880bis) +1.3.6.1.4.1.11591.15.1 = OpenPGP.Ed25519 +1.3.6.1.4.1.3029.1.5.1 = OpenPGP.Curve25519 + [cipher] # Cipher modes 1.3.14.3.2.7 = DES/CBC diff --git a/src/lib/asn1/oid_maps.cpp b/src/lib/asn1/oid_maps.cpp index d0d961e2754..e9c671d169c 100644 --- a/src/lib/asn1/oid_maps.cpp +++ b/src/lib/asn1/oid_maps.cpp @@ -1,7 +1,7 @@ /* * OID maps * -* This file was automatically generated by ./src/scripts/oids.py on 2018-02-07 +* This file was automatically generated by ./src/scripts/oids.py on 2018-05-02 * * All manual edits to this file will be lost. Edit the script * then regenerate this source file. @@ -114,6 +114,7 @@ std::unordered_map OIDS::load_oid2str_map() { "1.3.36.3.3.2.8.1.1.7", "brainpool256r1" }, { "1.3.36.3.3.2.8.1.1.9", "brainpool320r1" }, { "1.3.6.1.4.1.11591.12.2", "Tiger(24,3)" }, + { "1.3.6.1.4.1.11591.15.1", "OpenPGP.Ed25519" }, { "1.3.6.1.4.1.25258.1.3", "McEliece" }, { "1.3.6.1.4.1.25258.1.5", "XMSS" }, { "1.3.6.1.4.1.25258.1.6.1", "GOST-34.10/EMSA1(SHA-256)" }, @@ -128,6 +129,7 @@ std::unordered_map OIDS::load_oid2str_map() { "1.3.6.1.4.1.25258.3.2.5", "Twofish/OCB" }, { "1.3.6.1.4.1.25258.3.3", "Twofish/CBC" }, { "1.3.6.1.4.1.3029.1.2.1", "ElGamal" }, + { "1.3.6.1.4.1.3029.1.5.1", "OpenPGP.Curve25519" }, { "1.3.6.1.4.1.311.20.2.2", "Microsoft SmartcardLogon" }, { "1.3.6.1.4.1.8301.3.1.2.9.0.38", "secp521r1" }, { "1.3.6.1.5.5.7.1.1", "PKIX.AuthorityInformationAccess" }, @@ -290,6 +292,8 @@ std::unordered_map OIDS::load_str2oid_map() { "MGF1", OID({1,2,840,113549,1,1,8}) }, { "McEliece", OID({1,3,6,1,4,1,25258,1,3}) }, { "Microsoft SmartcardLogon", OID({1,3,6,1,4,1,311,20,2,2}) }, + { "OpenPGP.Curve25519", OID({1,3,6,1,4,1,3029,1,5,1}) }, + { "OpenPGP.Ed25519", OID({1,3,6,1,4,1,11591,15,1}) }, { "PBE-PKCS5v20", OID({1,2,840,113549,1,5,13}) }, { "PKCS5.PBKDF2", OID({1,2,840,113549,1,5,12}) }, { "PKCS9.ChallengePassword", OID({1,2,840,113549,1,9,7}) }, From f97c355b8b3a64744fc03212db857415ea26f973 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 2 May 2018 13:45:08 -0400 Subject: [PATCH 063/174] Add arch aliases for Debian builds [ci skip] --- src/build-data/arch/hppa.txt | 1 + src/build-data/arch/superh.txt | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/build-data/arch/hppa.txt b/src/build-data/arch/hppa.txt index 0144cf4ebcc..8828126b650 100644 --- a/src/build-data/arch/hppa.txt +++ b/src/build-data/arch/hppa.txt @@ -1,6 +1,7 @@ hp-pa parisc +parisc64 pa-risc hp-parisc hp-pa-risc diff --git a/src/build-data/arch/superh.txt b/src/build-data/arch/superh.txt index e69de29bb2d..6af6dbe682a 100644 --- a/src/build-data/arch/superh.txt +++ b/src/build-data/arch/superh.txt @@ -0,0 +1,4 @@ + + +sh4 + From 78b061cad074337385a67f3e454ed2746570d2c7 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 2 May 2018 20:02:29 -0400 Subject: [PATCH 064/174] Make Montgomery_Int public, add function for addition with workspace --- src/lib/math/numbertheory/monty.cpp | 7 ++++++- src/lib/math/numbertheory/monty.h | 7 +++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/lib/math/numbertheory/monty.cpp b/src/lib/math/numbertheory/monty.cpp index 33d15de5be1..1cdc7fa9a53 100644 --- a/src/lib/math/numbertheory/monty.cpp +++ b/src/lib/math/numbertheory/monty.cpp @@ -281,8 +281,13 @@ Montgomery_Int Montgomery_Int::operator-(const Montgomery_Int& other) const Montgomery_Int& Montgomery_Int::operator+=(const Montgomery_Int& other) { - m_v += other.m_v; secure_vector ws; + return this->add(other, ws); + } + +Montgomery_Int& Montgomery_Int::add(const Montgomery_Int& other, secure_vector& ws) + { + m_v += other.m_v; m_v.reduce_below(m_params->p(), ws); return (*this); } diff --git a/src/lib/math/numbertheory/monty.h b/src/lib/math/numbertheory/monty.h index 2af655230d7..8a594325c55 100644 --- a/src/lib/math/numbertheory/monty.h +++ b/src/lib/math/numbertheory/monty.h @@ -18,7 +18,7 @@ class Montgomery_Params; /** * The Montgomery representation of an integer */ -class Montgomery_Int final +class BOTAN_UNSTABLE_API Montgomery_Int final { public: /** @@ -75,6 +75,9 @@ class Montgomery_Int final Montgomery_Int& operator*=(const secure_vector& other); + Montgomery_Int& add(const Montgomery_Int& other, + secure_vector& ws); + Montgomery_Int mul(const Montgomery_Int& other, secure_vector& ws) const; @@ -111,7 +114,7 @@ class Montgomery_Int final /** * Parameters for Montgomery Reduction */ -class Montgomery_Params final +class BOTAN_UNSTABLE_API Montgomery_Params final { public: /** From 7badac9c6a32dbb0fe64fc909b7124c044ee1a1d Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 2 May 2018 20:10:44 -0400 Subject: [PATCH 065/174] Improve performance of Pollard rho implementation Using Montgomery is somewhat faster and allows avoiding mallocs. Test GCD only on intervals since gcd is 90+% of the runtime cost. --- src/cli/math.cpp | 48 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/src/cli/math.cpp b/src/cli/math.cpp index 2f3339898d7..0ddc9c48cc5 100644 --- a/src/cli/math.cpp +++ b/src/cli/math.cpp @@ -10,6 +10,7 @@ #include #include +#include #include namespace Botan_CLI { @@ -163,34 +164,55 @@ class Factor final : public Command } /* - * Pollard's Rho algorithm, as described in the MIT algorithms book. We - * use (x^2+x) mod n instead of (x*2-1) mod n as the random function, - * it _seems_ to lead to faster factorization for the values I tried. + * Pollard's Rho algorithm, as described in the MIT algorithms book. + * Uses Brent's cycle finding */ Botan::BigInt rho(const Botan::BigInt& n, Botan::RandomNumberGenerator& rng) { - Botan::BigInt x = Botan::BigInt::random_integer(rng, 0, n - 1); - Botan::BigInt y = x; - Botan::BigInt d = 0; + auto monty_n = std::make_shared(n); - Botan::Modular_Reducer mod_n(n); + const Botan::Montgomery_Int one(monty_n, monty_n->R1(), false); + + Botan::Montgomery_Int x(monty_n, Botan::BigInt::random_integer(rng, 2, n - 3), false); + Botan::Montgomery_Int y = x; + Botan::Montgomery_Int z = one; + Botan::BigInt d; + Botan::Montgomery_Int t(monty_n); + + Botan::secure_vector ws; size_t i = 1, k = 2; + while(true) { i++; - if(i == 0) // overflow, bail out + if(i >= 0xFFFF0000) // bad seed? too slow? bail out { break; } - x = mod_n.multiply((x + 1), x); + x.square_this(ws); // x = x^2 + x.add(one, ws); + + t = y; + t -= x; + + z.mul_by(t, ws); - d = Botan::gcd(y - x, n); - if(d != 1 && d != n) + if(i == k || i % 128 == 0) { - return d; + d = Botan::gcd(z.value(), n); + z = one; + + if(d == n) + { + // TODO Should rewind here + break; + } + + if(d != 1) + return d; } if(i == k) @@ -199,6 +221,8 @@ class Factor final : public Command k = 2 * k; } } + + // failed return 0; } From 9aafe361e714a0376d5bf4ebfdaae6e0a3aaa915 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 2 May 2018 20:28:02 -0400 Subject: [PATCH 066/174] Remove needless allocation in Montgomery_Int::mul_by --- src/lib/math/numbertheory/monty.cpp | 42 ++++++++++++++++++++++++----- src/lib/math/numbertheory/monty.h | 6 +++++ 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/lib/math/numbertheory/monty.cpp b/src/lib/math/numbertheory/monty.cpp index 1cdc7fa9a53..b33fdf34c54 100644 --- a/src/lib/math/numbertheory/monty.cpp +++ b/src/lib/math/numbertheory/monty.cpp @@ -136,6 +136,32 @@ void Montgomery_Params::mul_by(BigInt& x, copy_mem(x.mutable_data(), z_data, output_size); } +void Montgomery_Params::mul_by(BigInt& x, + const BigInt& y, + secure_vector& ws) const + { + const size_t output_size = 2*m_p_words + 2; + + if(ws.size() < 2*output_size) + ws.resize(2*output_size); + + word* z_data = &ws[0]; + word* ws_data = &ws[output_size]; + + bigint_mul(z_data, output_size, + x.data(), x.size(), x.sig_words(), + y.data(), y.size(), y.sig_words(), + ws_data, output_size); + + bigint_monty_redc(z_data, + m_p.data(), m_p_words, m_p_dash, + ws_data, output_size); + + if(x.size() < output_size) + x.grow_to(output_size); + copy_mem(x.mutable_data(), z_data, output_size); + } + BigInt Montgomery_Params::sqr(const BigInt& x, secure_vector& ws) const { const size_t output_size = 2*m_p_words + 2; @@ -287,16 +313,19 @@ Montgomery_Int& Montgomery_Int::operator+=(const Montgomery_Int& other) Montgomery_Int& Montgomery_Int::add(const Montgomery_Int& other, secure_vector& ws) { - m_v += other.m_v; - m_v.reduce_below(m_params->p(), ws); + m_v.mod_add(other.m_v, m_params->p(), ws); return (*this); } Montgomery_Int& Montgomery_Int::operator-=(const Montgomery_Int& other) { - m_v -= other.m_v; - if(m_v.is_negative()) - m_v += m_params->p(); + secure_vector ws; + return this->sub(other, ws); + } + +Montgomery_Int& Montgomery_Int::sub(const Montgomery_Int& other, secure_vector& ws) + { + m_v.mod_sub(other.m_v, m_params->p(), ws); return (*this); } @@ -315,7 +344,7 @@ Montgomery_Int Montgomery_Int::mul(const Montgomery_Int& other, Montgomery_Int& Montgomery_Int::mul_by(const Montgomery_Int& other, secure_vector& ws) { - m_v = m_params->mul(m_v, other.m_v, ws); + m_params->mul_by(m_v, other.m_v, ws); return (*this); } @@ -323,7 +352,6 @@ Montgomery_Int& Montgomery_Int::mul_by(const secure_vector& other, secure_vector& ws) { m_params->mul_by(m_v, other, ws); - //m_v = m_params->mul(m_v, other, ws); return (*this); } diff --git a/src/lib/math/numbertheory/monty.h b/src/lib/math/numbertheory/monty.h index 8a594325c55..7586b634fe6 100644 --- a/src/lib/math/numbertheory/monty.h +++ b/src/lib/math/numbertheory/monty.h @@ -78,6 +78,9 @@ class BOTAN_UNSTABLE_API Montgomery_Int final Montgomery_Int& add(const Montgomery_Int& other, secure_vector& ws); + Montgomery_Int& sub(const Montgomery_Int& other, + secure_vector& ws); + Montgomery_Int mul(const Montgomery_Int& other, secure_vector& ws) const; @@ -153,6 +156,9 @@ class BOTAN_UNSTABLE_API Montgomery_Params final const secure_vector& y, secure_vector& ws) const; + void mul_by(BigInt& x, const BigInt& y, + secure_vector& ws) const; + BigInt sqr(const BigInt& x, secure_vector& ws) const; From c446f0791175c41b7a70f64506c71ddfafe5a3c1 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 2 May 2018 20:28:18 -0400 Subject: [PATCH 067/174] Use Montgomery_Int::sub to avoid an allocation --- src/cli/math.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cli/math.cpp b/src/cli/math.cpp index 0ddc9c48cc5..0ba709f368f 100644 --- a/src/cli/math.cpp +++ b/src/cli/math.cpp @@ -176,8 +176,8 @@ class Factor final : public Command Botan::Montgomery_Int x(monty_n, Botan::BigInt::random_integer(rng, 2, n - 3), false); Botan::Montgomery_Int y = x; Botan::Montgomery_Int z = one; - Botan::BigInt d; Botan::Montgomery_Int t(monty_n); + Botan::BigInt d; Botan::secure_vector ws; @@ -196,7 +196,7 @@ class Factor final : public Command x.add(one, ws); t = y; - t -= x; + t.sub(x, ws); z.mul_by(t, ws); From 071e31ab04026f61b8c62c8424cfd89757aef195 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 2 May 2018 20:34:18 -0400 Subject: [PATCH 068/174] Update news --- news.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/news.rst b/news.rst index 86b59317ea4..89b4c6bcf0d 100644 --- a/news.rst +++ b/news.rst @@ -31,6 +31,8 @@ Version 2.7.0, Not Yet Released * Avoid creating symlinks to the shared object on OpenBSD (#1535) +* The ``factor`` command runs much faster on larger inputs now. + * Support for Visual C++ 2013 is deprecated, and will be removed in Jan 2019. Version 2.6.0, 2018-04-10 From d1227f830ee37b3d67e79aaa85df73b338931135 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 3 May 2018 22:39:40 -0400 Subject: [PATCH 069/174] Add todo (ORAM) --- doc/todo.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/todo.rst b/doc/todo.rst index 0cba6ce5f2c..0006e1132a5 100644 --- a/doc/todo.rst +++ b/doc/todo.rst @@ -105,6 +105,7 @@ PKIX New Protocols / Formats ---------------------------------------- +* ORAM (Circuit-ORAM, Path-ORAM, ??) * Roughtime client (https://roughtime.googlesource.com/roughtime/) * PKCS7 / Cryptographic Message Syntax * PKCS12 / PFX From c86f83c1e5a3c54b6c4e72a728af9cd63c1ba5a2 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 3 May 2018 22:40:21 -0400 Subject: [PATCH 070/174] Let pkcs8 command line util accept '-' for stdin --- src/cli/pubkey.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/cli/pubkey.cpp b/src/cli/pubkey.cpp index 60119ca1350..a72ff68e66a 100644 --- a/src/cli/pubkey.cpp +++ b/src/cli/pubkey.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #if defined(BOTAN_HAS_DL_GROUP) #include @@ -256,16 +257,18 @@ class PKCS8_Tool final : public Command void go() override { + const std::string pass_in = get_arg("pass-in"); + + Botan::DataSource_Memory key_src(slurp_file(get_arg("key"))); std::unique_ptr key; - std::string pass_in = get_arg("pass-in"); if(pass_in.empty()) { - key.reset(Botan::PKCS8::load_key(get_arg("key"), rng())); + key.reset(Botan::PKCS8::load_key(key_src, rng())); } else { - key.reset(Botan::PKCS8::load_key(get_arg("key"), rng(), pass_in)); + key.reset(Botan::PKCS8::load_key(key_src, rng(), pass_in)); } const std::chrono::milliseconds pbe_millis(get_arg_sz("pbe-millis")); From 4b9690d9abc6d1dec75444dba615fd87508805b4 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 3 May 2018 22:41:07 -0400 Subject: [PATCH 071/174] Improve PEM detection for asn1 printer --- src/cli/asn1.cpp | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/cli/asn1.cpp b/src/cli/asn1.cpp index 8a424aad858..65f38c06008 100644 --- a/src/cli/asn1.cpp +++ b/src/cli/asn1.cpp @@ -9,6 +9,7 @@ #if defined(BOTAN_HAS_ASN1) #include +#include #if defined(BOTAN_HAS_PEM_CODEC) #include @@ -31,6 +32,18 @@ class ASN1_Printer final : public Command return "Decode and print file with ASN.1 Basic Encoding Rules (BER)"; } + bool first_n(const std::vector& data, size_t n, uint8_t b) + { + if(data.size() < n) + return false; + + for(size_t i = 0; i != n; ++i) + if(data[i] != b) + return false; + + return true; + } + void go() override { const std::string input = get_arg("file"); @@ -42,26 +55,30 @@ class ASN1_Printer final : public Command const size_t value_column = 60; const size_t initial_level = 0; - std::vector contents; + std::vector file_contents = slurp_file(input); + std::vector data; - if(flag_set("pem") || (input.size() > 4 && input.substr(input.size() - 4) == ".pem")) + if(flag_set("pem") || + (input.size() > 4 && input.substr(input.size() - 4) == ".pem") || + (file_contents.size() > 20 && first_n(file_contents, 5, '-'))) { #if defined(BOTAN_HAS_PEM_CODEC) std::string pem_label; - contents = unlock(Botan::PEM_Code::decode(slurp_file_as_str(input), pem_label)); + Botan::DataSource_Memory src(file_contents); + data = unlock(Botan::PEM_Code::decode(src, pem_label)); #else throw CLI_Error_Unsupported("PEM decoding not available in this build"); #endif } else { - contents = slurp_file(input); + data.swap(file_contents); } Botan::ASN1_Pretty_Printer printer(print_limit, bin_limit, print_context_specific, initial_level, value_column, max_depth); - printer.print_to_stream(output(), contents.data(), contents.size()); + printer.print_to_stream(output(), data.data(), data.size()); } }; From 623fbd9505afb3397b26a127b0602aaacd272de6 Mon Sep 17 00:00:00 2001 From: Ori Peleg Date: Sun, 6 May 2018 20:32:03 +0300 Subject: [PATCH 072/174] typo: fixed AES key wrapping RFC number --- doc/manual/keywrap.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manual/keywrap.rst b/doc/manual/keywrap.rst index ae1172701fd..a0791a5aec4 100644 --- a/doc/manual/keywrap.rst +++ b/doc/manual/keywrap.rst @@ -6,7 +6,7 @@ another key. The first (and older, more widely supported) methd requres the input be a multiple of 8 bytes long. The other allows any length input, though only up to 2**32 bytes. -These algorithms are described in NIST SP 800-38F, and RFCs 3394 and 5694. +These algorithms are described in NIST SP 800-38F, and RFCs 3394 and 5649. This API, defined in ``nist_keywrap.h``, first became available in version 2.4.0 From 312f0194e09a2f2cef5af3750fd750a1d0137945 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 7 May 2018 13:39:01 -0400 Subject: [PATCH 073/174] Fix some warnings new in GCC 8.1 It thinks the typedefs are "locals" that are being conflicted with, which seems wrong to me but whatever. --- src/lib/tls/tls_callbacks.h | 33 ++++++++++++++++++--------------- src/lib/tls/tls_channel.cpp | 4 ++-- src/lib/tls/tls_client.cpp | 16 ++++++++-------- src/lib/tls/tls_client.h | 13 +++++++------ src/lib/tls/tls_server.cpp | 16 ++++++++-------- src/lib/tls/tls_server.h | 10 ++++++---- 6 files changed, 49 insertions(+), 43 deletions(-) diff --git a/src/lib/tls/tls_callbacks.h b/src/lib/tls/tls_callbacks.h index 88e502e891a..1e0aca9a948 100644 --- a/src/lib/tls/tls_callbacks.h +++ b/src/lib/tls/tls_callbacks.h @@ -353,40 +353,43 @@ class BOTAN_PUBLIC_API(2,0) Compat_Callbacks final : public Callbacks * @param next_proto is called with ALPN protocol data sent by the client */ BOTAN_DEPRECATED("Use TLS::Callbacks (virtual interface).") - Compat_Callbacks(output_fn output_fn, data_cb app_data_cb, alert_cb alert_cb, + Compat_Callbacks(output_fn data_output_fn, data_cb app_data_cb, alert_cb recv_alert_cb, handshake_cb hs_cb, handshake_msg_cb hs_msg_cb = nullptr, next_protocol_fn next_proto = nullptr) - : m_output_function(output_fn), m_app_data_cb(app_data_cb), - m_alert_cb(std::bind(alert_cb, std::placeholders::_1, nullptr, 0)), + : m_output_function(data_output_fn), m_app_data_cb(app_data_cb), + m_alert_cb(std::bind(recv_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 output_fn, data_cb app_data_cb, - std::function alert_cb, + Compat_Callbacks(output_fn data_output_fn, data_cb app_data_cb, + std::function recv_alert_cb, handshake_cb hs_cb, handshake_msg_cb hs_msg_cb = nullptr, next_protocol_fn next_proto = nullptr) - : m_output_function(output_fn), m_app_data_cb(app_data_cb), - m_alert_cb(alert_cb), + : m_output_function(data_output_fn), m_app_data_cb(app_data_cb), + m_alert_cb(recv_alert_cb), m_hs_cb(hs_cb), m_hs_msg_cb(hs_msg_cb), m_next_proto(next_proto) {} enum class SILENCE_DEPRECATION_WARNING { PLEASE = 0 }; Compat_Callbacks(SILENCE_DEPRECATION_WARNING, - output_fn output_fn, data_cb app_data_cb, - std::function alert_cb, + output_fn data_output_fn, data_cb app_data_cb, + std::function recv_alert_cb, handshake_cb hs_cb, handshake_msg_cb hs_msg_cb = nullptr, next_protocol_fn next_proto = nullptr) - : m_output_function(output_fn), 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) {} + : m_output_function(data_output_fn), + m_app_data_cb(app_data_cb), + m_alert_cb(recv_alert_cb), + m_hs_cb(hs_cb), + m_hs_msg_cb(hs_msg_cb), + m_next_proto(next_proto) {} Compat_Callbacks(SILENCE_DEPRECATION_WARNING, - output_fn output_fn, data_cb app_data_cb, alert_cb alert_cb, + output_fn data_output_fn, data_cb app_data_cb, alert_cb recv_alert_cb, handshake_cb hs_cb, handshake_msg_cb hs_msg_cb = nullptr, next_protocol_fn next_proto = nullptr) - : m_output_function(output_fn), m_app_data_cb(app_data_cb), - m_alert_cb(std::bind(alert_cb, std::placeholders::_1, nullptr, 0)), + : m_output_function(data_output_fn), m_app_data_cb(app_data_cb), + m_alert_cb(std::bind(recv_alert_cb, std::placeholders::_1, nullptr, 0)), m_hs_cb(hs_cb), m_hs_msg_cb(hs_msg_cb), m_next_proto(next_proto) {} diff --git a/src/lib/tls/tls_channel.cpp b/src/lib/tls/tls_channel.cpp index 6e3e5987b48..37f3ec41581 100644 --- a/src/lib/tls/tls_channel.cpp +++ b/src/lib/tls/tls_channel.cpp @@ -40,7 +40,7 @@ Channel::Channel(Callbacks& callbacks, Channel::Channel(output_fn out, data_cb app_data_cb, - alert_cb alert_cb, + alert_cb recv_alert_cb, handshake_cb hs_cb, handshake_msg_cb hs_msg_cb, Session_Manager& session_manager, @@ -55,7 +55,7 @@ Channel::Channel(output_fn out, relies on a deprecated API */ Compat_Callbacks::SILENCE_DEPRECATION_WARNING::PLEASE, - out, app_data_cb, alert_cb, hs_cb, hs_msg_cb)), + out, app_data_cb, recv_alert_cb, hs_cb, hs_msg_cb)), m_callbacks(*m_compat_callbacks.get()), m_session_manager(session_manager), m_policy(policy), diff --git a/src/lib/tls/tls_client.cpp b/src/lib/tls/tls_client.cpp index 39e69d8ea3e..94616c60ba8 100644 --- a/src/lib/tls/tls_client.cpp +++ b/src/lib/tls/tls_client.cpp @@ -64,10 +64,10 @@ Client::Client(Callbacks& callbacks, init(offer_version, next_protos); } -Client::Client(output_fn output_fn, +Client::Client(output_fn data_output_fn, data_cb proc_cb, - alert_cb alert_cb, - handshake_cb handshake_cb, + alert_cb recv_alert_cb, + handshake_cb hs_cb, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, @@ -76,7 +76,7 @@ Client::Client(output_fn output_fn, const Protocol_Version& offer_version, const std::vector& next_protos, size_t io_buf_sz) : - Channel(output_fn, proc_cb, alert_cb, handshake_cb, Channel::handshake_msg_cb(), + Channel(data_output_fn, proc_cb, recv_alert_cb, hs_cb, Channel::handshake_msg_cb(), session_manager, rng, policy, offer_version.is_datagram_protocol(), io_buf_sz), m_creds(creds), m_info(info) @@ -84,10 +84,10 @@ Client::Client(output_fn output_fn, init(offer_version, next_protos); } -Client::Client(output_fn output_fn, +Client::Client(output_fn data_output_fn, data_cb proc_cb, - alert_cb alert_cb, - handshake_cb handshake_cb, + alert_cb recv_alert_cb, + handshake_cb hs_cb, handshake_msg_cb hs_msg_cb, Session_Manager& session_manager, Credentials_Manager& creds, @@ -96,7 +96,7 @@ Client::Client(output_fn output_fn, const Server_Information& info, const Protocol_Version& offer_version, const std::vector& next_protos) : - Channel(output_fn, proc_cb, alert_cb, handshake_cb, hs_msg_cb, + Channel(data_output_fn, proc_cb, recv_alert_cb, hs_cb, hs_msg_cb, session_manager, rng, policy, offer_version.is_datagram_protocol()), m_creds(creds), m_info(info) diff --git a/src/lib/tls/tls_client.h b/src/lib/tls/tls_client.h index 67a086e15e9..63c26b9cdb9 100644 --- a/src/lib/tls/tls_client.h +++ b/src/lib/tls/tls_client.h @@ -63,15 +63,16 @@ class BOTAN_PUBLIC_API(2,0) Client final : public Channel /** * DEPRECATED. This constructor is only provided for backward - * compatibility and should not be used in new code. - * + * compatibility and should not be used in new code. It will be + * removed in a future release. + * * Set up a new TLS client session * - * @param output_fn is called with data for the outbound socket + * @param data_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 recv_alert_cb is called when a TLS alert is received * * @param hs_cb is called when a handshake is completed * @@ -95,9 +96,9 @@ class BOTAN_PUBLIC_API(2,0) Client final : public Channel * values just mean reallocations and copies are more likely. */ BOTAN_DEPRECATED("Use TLS::Client(TLS::Callbacks ...)") - Client(output_fn output_fn, + Client(output_fn data_output_fn, data_cb app_data_cb, - alert_cb alert_cb, + alert_cb recv_alert_cb, handshake_cb hs_cb, Session_Manager& session_manager, Credentials_Manager& creds, diff --git a/src/lib/tls/tls_server.cpp b/src/lib/tls/tls_server.cpp index 786932a1dc6..2b1885e454c 100644 --- a/src/lib/tls/tls_server.cpp +++ b/src/lib/tls/tls_server.cpp @@ -303,9 +303,9 @@ Server::Server(Callbacks& callbacks, } Server::Server(output_fn output, - data_cb data_cb, - alert_cb alert_cb, - handshake_cb handshake_cb, + data_cb got_data_cb, + alert_cb recv_alert_cb, + handshake_cb hs_cb, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, @@ -313,7 +313,7 @@ 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(output, got_data_cb, recv_alert_cb, hs_cb, Channel::handshake_msg_cb(), session_manager, rng, policy, is_datagram, io_buf_sz), m_creds(creds), @@ -323,9 +323,9 @@ Server::Server(output_fn output, Server::Server(output_fn output, - data_cb data_cb, - alert_cb alert_cb, - handshake_cb handshake_cb, + data_cb got_data_cb, + alert_cb recv_alert_cb, + handshake_cb hs_cb, handshake_msg_cb hs_msg_cb, Session_Manager& session_manager, Credentials_Manager& creds, @@ -333,7 +333,7 @@ Server::Server(output_fn output, RandomNumberGenerator& rng, next_protocol_fn next_proto, bool is_datagram) : - Channel(output, data_cb, alert_cb, handshake_cb, hs_msg_cb, + Channel(output, got_data_cb, recv_alert_cb, hs_cb, hs_msg_cb, session_manager, rng, policy, is_datagram), m_creds(creds), m_choose_next_protocol(next_proto) diff --git a/src/lib/tls/tls_server.h b/src/lib/tls/tls_server.h index 7c5d9668fd1..c55c3f93d29 100644 --- a/src/lib/tls/tls_server.h +++ b/src/lib/tls/tls_server.h @@ -61,12 +61,13 @@ class BOTAN_PUBLIC_API(2,0) Server final : public Channel /** * DEPRECATED. This constructor is only provided for backward * compatibility and should not be used in new implementations. + * It will be removed in a future release. */ BOTAN_DEPRECATED("Use TLS::Server(TLS::Callbacks ...)") Server(output_fn output, data_cb data_cb, - alert_cb alert_cb, - handshake_cb handshake_cb, + alert_cb recv_alert_cb, + handshake_cb hs_cb, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, @@ -79,12 +80,13 @@ class BOTAN_PUBLIC_API(2,0) Server final : public Channel /** * DEPRECATED. This constructor is only provided for backward * compatibility and should not be used in new implementations. + * It will be removed in a future release. */ BOTAN_DEPRECATED("Use TLS::Server(TLS::Callbacks ...)") Server(output_fn output, data_cb data_cb, - alert_cb alert_cb, - handshake_cb handshake_cb, + alert_cb recv_alert_cb, + handshake_cb hs_cb, handshake_msg_cb hs_msg_cb, Session_Manager& session_manager, Credentials_Manager& creds, From 10983cb8f201881c16e6addb918188e8820344d5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 7 May 2018 23:26:54 +0200 Subject: [PATCH 074/174] Add missing NTAPI to RtlGenRandom_f signature --- src/lib/rng/system_rng/system_rng.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/rng/system_rng/system_rng.cpp b/src/lib/rng/system_rng/system_rng.cpp index 32dabbe9f6b..091fc94a09e 100644 --- a/src/lib/rng/system_rng/system_rng.cpp +++ b/src/lib/rng/system_rng/system_rng.cpp @@ -50,7 +50,7 @@ class System_RNG_Impl final : public RandomNumberGenerator void clear() override { /* not possible */ } std::string name() const override { return "RtlGenRandom"; } private: - typedef BOOL (*RtlGenRandom_f)(PVOID, ULONG); + typedef BOOL (NTAPI *RtlGenRandom_f)(PVOID, ULONG); Dynamically_Loaded_Library m_advapi; RtlGenRandom_f m_rtlgenrandom; From 3a676ad11a0bbeabcb4bf2a78946bfaed5086c9d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 7 May 2018 23:27:27 +0200 Subject: [PATCH 075/174] Use BOOLEAN return type for RtlGenRandom_f --- src/lib/rng/system_rng/system_rng.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/rng/system_rng/system_rng.cpp b/src/lib/rng/system_rng/system_rng.cpp index 091fc94a09e..65d4dcb027e 100644 --- a/src/lib/rng/system_rng/system_rng.cpp +++ b/src/lib/rng/system_rng/system_rng.cpp @@ -50,7 +50,7 @@ class System_RNG_Impl final : public RandomNumberGenerator void clear() override { /* not possible */ } std::string name() const override { return "RtlGenRandom"; } private: - typedef BOOL (NTAPI *RtlGenRandom_f)(PVOID, ULONG); + typedef BOOLEAN (NTAPI *RtlGenRandom_f)(PVOID, ULONG); Dynamically_Loaded_Library m_advapi; RtlGenRandom_f m_rtlgenrandom; From 90dc93660265baf2bf408b46b175590f451c6675 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 7 May 2018 23:29:05 +0200 Subject: [PATCH 076/174] Check return value of m_rtlgenrandom against proper type --- src/lib/rng/system_rng/system_rng.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/rng/system_rng/system_rng.cpp b/src/lib/rng/system_rng/system_rng.cpp index 65d4dcb027e..39ccf2f6b80 100644 --- a/src/lib/rng/system_rng/system_rng.cpp +++ b/src/lib/rng/system_rng/system_rng.cpp @@ -41,7 +41,8 @@ class System_RNG_Impl final : public RandomNumberGenerator void randomize(uint8_t buf[], size_t len) override { - if(m_rtlgenrandom(buf, len) == false) + bool success = m_rtlgenrandom(buf, len) == TRUE; + if(!success) throw Exception("RtlGenRandom failed"); } From 46460afb53830373b0187fbc73ce6a1650a110da Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 7 May 2018 23:41:47 +0200 Subject: [PATCH 077/174] Rewrite assignment of RtlGenRandom_f using "using" --- src/lib/rng/system_rng/system_rng.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/rng/system_rng/system_rng.cpp b/src/lib/rng/system_rng/system_rng.cpp index 39ccf2f6b80..2a543aa8e02 100644 --- a/src/lib/rng/system_rng/system_rng.cpp +++ b/src/lib/rng/system_rng/system_rng.cpp @@ -51,7 +51,7 @@ class System_RNG_Impl final : public RandomNumberGenerator void clear() override { /* not possible */ } std::string name() const override { return "RtlGenRandom"; } private: - typedef BOOLEAN (NTAPI *RtlGenRandom_f)(PVOID, ULONG); + using RtlGenRandom_f = BOOLEAN (NTAPI *)(PVOID, ULONG); Dynamically_Loaded_Library m_advapi; RtlGenRandom_f m_rtlgenrandom; From 9a0e2bd88458e176abb983c742a7156aaad0909a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 7 May 2018 23:42:35 +0200 Subject: [PATCH 078/174] Rename RtlGenRandom_f -> RtlGenRandom_fptr because this is a function pointer, not a function --- src/lib/rng/system_rng/system_rng.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/rng/system_rng/system_rng.cpp b/src/lib/rng/system_rng/system_rng.cpp index 2a543aa8e02..78d258bb4e7 100644 --- a/src/lib/rng/system_rng/system_rng.cpp +++ b/src/lib/rng/system_rng/system_rng.cpp @@ -36,7 +36,7 @@ class System_RNG_Impl final : public RandomNumberGenerator System_RNG_Impl() : m_advapi("advapi32.dll") { // This throws if the function is not found - m_rtlgenrandom = m_advapi.resolve("SystemFunction036"); + m_rtlgenrandom = m_advapi.resolve("SystemFunction036"); } void randomize(uint8_t buf[], size_t len) override @@ -51,10 +51,10 @@ class System_RNG_Impl final : public RandomNumberGenerator void clear() override { /* not possible */ } std::string name() const override { return "RtlGenRandom"; } private: - using RtlGenRandom_f = BOOLEAN (NTAPI *)(PVOID, ULONG); + using RtlGenRandom_fptr = BOOLEAN (NTAPI *)(PVOID, ULONG); Dynamically_Loaded_Library m_advapi; - RtlGenRandom_f m_rtlgenrandom; + RtlGenRandom_fptr m_rtlgenrandom; }; #elif defined(BOTAN_TARGET_OS_HAS_ARC4RANDOM) From 819b7febe479dfa7f1c07ab52c890ca33b00f023 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 8 May 2018 00:29:05 +0200 Subject: [PATCH 079/174] Use type BYTE instead of BOOLEAN --- src/lib/rng/system_rng/system_rng.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lib/rng/system_rng/system_rng.cpp b/src/lib/rng/system_rng/system_rng.cpp index 78d258bb4e7..3c2e98661a4 100644 --- a/src/lib/rng/system_rng/system_rng.cpp +++ b/src/lib/rng/system_rng/system_rng.cpp @@ -51,7 +51,10 @@ class System_RNG_Impl final : public RandomNumberGenerator void clear() override { /* not possible */ } std::string name() const override { return "RtlGenRandom"; } private: - using RtlGenRandom_fptr = BOOLEAN (NTAPI *)(PVOID, ULONG); + // Use type BYTE instead of BOOLEAN because of a naming conflict + // https://msdn.microsoft.com/en-us/library/windows/desktop/aa387694(v=vs.85).aspx + // https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx + using RtlGenRandom_fptr = BYTE (NTAPI *)(PVOID, ULONG); Dynamically_Loaded_Library m_advapi; RtlGenRandom_fptr m_rtlgenrandom; From c20718f0332db1ef5f8f869f41204c5422a9fcbf Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 8 May 2018 19:28:43 -0400 Subject: [PATCH 080/174] Add 24-word wide Comba multiply/square Improves performance on "odd" sized DH/RSA (eg 1536, 3072, 6144) where otherwise the Karatsuba operation bottoms out with 24-word operands which ended up in the basecase multiply. --- src/cli/speed.cpp | 2 +- src/lib/math/mp/mp_comba.cpp | 1084 +++++++++++++++++++++++++++++++++- src/lib/math/mp/mp_core.h | 2 + src/lib/math/mp/mp_karat.cpp | 16 + src/scripts/comba.py | 2 +- 5 files changed, 1103 insertions(+), 3 deletions(-) diff --git a/src/cli/speed.cpp b/src/cli/speed.cpp index 526244c8604..ecd810ba2ce 100644 --- a/src/cli/speed.cpp +++ b/src/cli/speed.cpp @@ -1987,7 +1987,7 @@ class Speed final : public Command void bench_dh(const std::string& provider, std::chrono::milliseconds msec) { - for(size_t bits : { 1024, 2048, 3072, 4096, 6144, 8192 }) + for(size_t bits : { 1024, 1536, 2048, 3072, 4096, 6144, 8192 }) { bench_pk_ka("DH", "DH-" + std::to_string(bits), diff --git a/src/lib/math/mp/mp_comba.cpp b/src/lib/math/mp/mp_comba.cpp index 5cbd70e5622..ec527224c86 100644 --- a/src/lib/math/mp/mp_comba.cpp +++ b/src/lib/math/mp/mp_comba.cpp @@ -1,7 +1,7 @@ /* * Comba Multiplication and Squaring * -* This file was automatically generated by ./src/scripts/comba.py on 2018-04-08 +* This file was automatically generated by ./src/scripts/comba.py on 2018-05-08 * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -1126,4 +1126,1086 @@ void bigint_comba_mul16(word z[32], const word x[16], const word y[16]) z[31] = w1; } +/* +* Comba 24x24 Squaring +*/ +void bigint_comba_sqr24(word z[48], const word x[24]) + { + word w2 = 0, w1 = 0, w0 = 0; + + word3_muladd (&w2, &w1, &w0, x[ 0], x[ 0]); + z[ 0] = w0; w0 = 0; + + word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]); + z[ 1] = w1; w1 = 0; + + word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]); + word3_muladd (&w1, &w0, &w2, x[ 1], x[ 1]); + z[ 2] = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]); + z[ 3] = w0; w0 = 0; + + word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]); + word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]); + word3_muladd (&w0, &w2, &w1, x[ 2], x[ 2]); + z[ 4] = w1; w1 = 0; + + word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]); + word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]); + word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]); + z[ 5] = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]); + word3_muladd (&w2, &w1, &w0, x[ 3], x[ 3]); + z[ 6] = w0; w0 = 0; + + word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 7]); + word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 6]); + word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]); + word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]); + z[ 7] = w1; w1 = 0; + + word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 8]); + word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 7]); + word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 6]); + word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]); + word3_muladd (&w1, &w0, &w2, x[ 4], x[ 4]); + z[ 8] = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 9]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 8]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]); + z[ 9] = w0; w0 = 0; + + word3_muladd_2(&w0, &w2, &w1, x[ 0], x[10]); + word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 9]); + word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 8]); + word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 7]); + word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 6]); + word3_muladd (&w0, &w2, &w1, x[ 5], x[ 5]); + z[10] = w1; w1 = 0; + + word3_muladd_2(&w1, &w0, &w2, x[ 0], x[11]); + word3_muladd_2(&w1, &w0, &w2, x[ 1], x[10]); + word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 9]); + word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 8]); + word3_muladd_2(&w1, &w0, &w2, x[ 4], x[ 7]); + word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 6]); + z[11] = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[12]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[11]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[10]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 9]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 8]); + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]); + word3_muladd (&w2, &w1, &w0, x[ 6], x[ 6]); + z[12] = w0; w0 = 0; + + word3_muladd_2(&w0, &w2, &w1, x[ 0], x[13]); + word3_muladd_2(&w0, &w2, &w1, x[ 1], x[12]); + word3_muladd_2(&w0, &w2, &w1, x[ 2], x[11]); + word3_muladd_2(&w0, &w2, &w1, x[ 3], x[10]); + word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 9]); + word3_muladd_2(&w0, &w2, &w1, x[ 5], x[ 8]); + word3_muladd_2(&w0, &w2, &w1, x[ 6], x[ 7]); + z[13] = w1; w1 = 0; + + word3_muladd_2(&w1, &w0, &w2, x[ 0], x[14]); + word3_muladd_2(&w1, &w0, &w2, x[ 1], x[13]); + word3_muladd_2(&w1, &w0, &w2, x[ 2], x[12]); + word3_muladd_2(&w1, &w0, &w2, x[ 3], x[11]); + word3_muladd_2(&w1, &w0, &w2, x[ 4], x[10]); + word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 9]); + word3_muladd_2(&w1, &w0, &w2, x[ 6], x[ 8]); + word3_muladd (&w1, &w0, &w2, x[ 7], x[ 7]); + z[14] = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[13]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[12]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[11]); + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[10]); + word3_muladd_2(&w2, &w1, &w0, x[ 6], x[ 9]); + word3_muladd_2(&w2, &w1, &w0, x[ 7], x[ 8]); + z[15] = w0; w0 = 0; + + word3_muladd_2(&w0, &w2, &w1, x[ 0], x[16]); + word3_muladd_2(&w0, &w2, &w1, x[ 1], x[15]); + word3_muladd_2(&w0, &w2, &w1, x[ 2], x[14]); + word3_muladd_2(&w0, &w2, &w1, x[ 3], x[13]); + word3_muladd_2(&w0, &w2, &w1, x[ 4], x[12]); + word3_muladd_2(&w0, &w2, &w1, x[ 5], x[11]); + word3_muladd_2(&w0, &w2, &w1, x[ 6], x[10]); + word3_muladd_2(&w0, &w2, &w1, x[ 7], x[ 9]); + word3_muladd (&w0, &w2, &w1, x[ 8], x[ 8]); + z[16] = w1; w1 = 0; + + word3_muladd_2(&w1, &w0, &w2, x[ 0], x[17]); + word3_muladd_2(&w1, &w0, &w2, x[ 1], x[16]); + word3_muladd_2(&w1, &w0, &w2, x[ 2], x[15]); + word3_muladd_2(&w1, &w0, &w2, x[ 3], x[14]); + word3_muladd_2(&w1, &w0, &w2, x[ 4], x[13]); + word3_muladd_2(&w1, &w0, &w2, x[ 5], x[12]); + word3_muladd_2(&w1, &w0, &w2, x[ 6], x[11]); + word3_muladd_2(&w1, &w0, &w2, x[ 7], x[10]); + word3_muladd_2(&w1, &w0, &w2, x[ 8], x[ 9]); + z[17] = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[18]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[17]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[16]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[13]); + word3_muladd_2(&w2, &w1, &w0, x[ 6], x[12]); + word3_muladd_2(&w2, &w1, &w0, x[ 7], x[11]); + word3_muladd_2(&w2, &w1, &w0, x[ 8], x[10]); + word3_muladd (&w2, &w1, &w0, x[ 9], x[ 9]); + z[18] = w0; w0 = 0; + + word3_muladd_2(&w0, &w2, &w1, x[ 0], x[19]); + word3_muladd_2(&w0, &w2, &w1, x[ 1], x[18]); + word3_muladd_2(&w0, &w2, &w1, x[ 2], x[17]); + word3_muladd_2(&w0, &w2, &w1, x[ 3], x[16]); + word3_muladd_2(&w0, &w2, &w1, x[ 4], x[15]); + word3_muladd_2(&w0, &w2, &w1, x[ 5], x[14]); + word3_muladd_2(&w0, &w2, &w1, x[ 6], x[13]); + word3_muladd_2(&w0, &w2, &w1, x[ 7], x[12]); + word3_muladd_2(&w0, &w2, &w1, x[ 8], x[11]); + word3_muladd_2(&w0, &w2, &w1, x[ 9], x[10]); + z[19] = w1; w1 = 0; + + word3_muladd_2(&w1, &w0, &w2, x[ 0], x[20]); + word3_muladd_2(&w1, &w0, &w2, x[ 1], x[19]); + word3_muladd_2(&w1, &w0, &w2, x[ 2], x[18]); + word3_muladd_2(&w1, &w0, &w2, x[ 3], x[17]); + word3_muladd_2(&w1, &w0, &w2, x[ 4], x[16]); + word3_muladd_2(&w1, &w0, &w2, x[ 5], x[15]); + word3_muladd_2(&w1, &w0, &w2, x[ 6], x[14]); + word3_muladd_2(&w1, &w0, &w2, x[ 7], x[13]); + word3_muladd_2(&w1, &w0, &w2, x[ 8], x[12]); + word3_muladd_2(&w1, &w0, &w2, x[ 9], x[11]); + word3_muladd (&w1, &w0, &w2, x[10], x[10]); + z[20] = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 0], x[21]); + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[20]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[19]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[18]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[17]); + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[16]); + word3_muladd_2(&w2, &w1, &w0, x[ 6], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[ 7], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[ 8], x[13]); + word3_muladd_2(&w2, &w1, &w0, x[ 9], x[12]); + word3_muladd_2(&w2, &w1, &w0, x[10], x[11]); + z[21] = w0; w0 = 0; + + word3_muladd_2(&w0, &w2, &w1, x[ 0], x[22]); + word3_muladd_2(&w0, &w2, &w1, x[ 1], x[21]); + word3_muladd_2(&w0, &w2, &w1, x[ 2], x[20]); + word3_muladd_2(&w0, &w2, &w1, x[ 3], x[19]); + word3_muladd_2(&w0, &w2, &w1, x[ 4], x[18]); + word3_muladd_2(&w0, &w2, &w1, x[ 5], x[17]); + word3_muladd_2(&w0, &w2, &w1, x[ 6], x[16]); + word3_muladd_2(&w0, &w2, &w1, x[ 7], x[15]); + word3_muladd_2(&w0, &w2, &w1, x[ 8], x[14]); + word3_muladd_2(&w0, &w2, &w1, x[ 9], x[13]); + word3_muladd_2(&w0, &w2, &w1, x[10], x[12]); + word3_muladd (&w0, &w2, &w1, x[11], x[11]); + z[22] = w1; w1 = 0; + + word3_muladd_2(&w1, &w0, &w2, x[ 0], x[23]); + word3_muladd_2(&w1, &w0, &w2, x[ 1], x[22]); + word3_muladd_2(&w1, &w0, &w2, x[ 2], x[21]); + word3_muladd_2(&w1, &w0, &w2, x[ 3], x[20]); + word3_muladd_2(&w1, &w0, &w2, x[ 4], x[19]); + word3_muladd_2(&w1, &w0, &w2, x[ 5], x[18]); + word3_muladd_2(&w1, &w0, &w2, x[ 6], x[17]); + word3_muladd_2(&w1, &w0, &w2, x[ 7], x[16]); + word3_muladd_2(&w1, &w0, &w2, x[ 8], x[15]); + word3_muladd_2(&w1, &w0, &w2, x[ 9], x[14]); + word3_muladd_2(&w1, &w0, &w2, x[10], x[13]); + word3_muladd_2(&w1, &w0, &w2, x[11], x[12]); + z[23] = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 1], x[23]); + word3_muladd_2(&w2, &w1, &w0, x[ 2], x[22]); + word3_muladd_2(&w2, &w1, &w0, x[ 3], x[21]); + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[20]); + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[19]); + word3_muladd_2(&w2, &w1, &w0, x[ 6], x[18]); + word3_muladd_2(&w2, &w1, &w0, x[ 7], x[17]); + word3_muladd_2(&w2, &w1, &w0, x[ 8], x[16]); + word3_muladd_2(&w2, &w1, &w0, x[ 9], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[10], x[14]); + word3_muladd_2(&w2, &w1, &w0, x[11], x[13]); + word3_muladd (&w2, &w1, &w0, x[12], x[12]); + z[24] = w0; w0 = 0; + + word3_muladd_2(&w0, &w2, &w1, x[ 2], x[23]); + word3_muladd_2(&w0, &w2, &w1, x[ 3], x[22]); + word3_muladd_2(&w0, &w2, &w1, x[ 4], x[21]); + word3_muladd_2(&w0, &w2, &w1, x[ 5], x[20]); + word3_muladd_2(&w0, &w2, &w1, x[ 6], x[19]); + word3_muladd_2(&w0, &w2, &w1, x[ 7], x[18]); + word3_muladd_2(&w0, &w2, &w1, x[ 8], x[17]); + word3_muladd_2(&w0, &w2, &w1, x[ 9], x[16]); + word3_muladd_2(&w0, &w2, &w1, x[10], x[15]); + word3_muladd_2(&w0, &w2, &w1, x[11], x[14]); + word3_muladd_2(&w0, &w2, &w1, x[12], x[13]); + z[25] = w1; w1 = 0; + + word3_muladd_2(&w1, &w0, &w2, x[ 3], x[23]); + word3_muladd_2(&w1, &w0, &w2, x[ 4], x[22]); + word3_muladd_2(&w1, &w0, &w2, x[ 5], x[21]); + word3_muladd_2(&w1, &w0, &w2, x[ 6], x[20]); + word3_muladd_2(&w1, &w0, &w2, x[ 7], x[19]); + word3_muladd_2(&w1, &w0, &w2, x[ 8], x[18]); + word3_muladd_2(&w1, &w0, &w2, x[ 9], x[17]); + word3_muladd_2(&w1, &w0, &w2, x[10], x[16]); + word3_muladd_2(&w1, &w0, &w2, x[11], x[15]); + word3_muladd_2(&w1, &w0, &w2, x[12], x[14]); + word3_muladd (&w1, &w0, &w2, x[13], x[13]); + z[26] = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 4], x[23]); + word3_muladd_2(&w2, &w1, &w0, x[ 5], x[22]); + word3_muladd_2(&w2, &w1, &w0, x[ 6], x[21]); + word3_muladd_2(&w2, &w1, &w0, x[ 7], x[20]); + word3_muladd_2(&w2, &w1, &w0, x[ 8], x[19]); + word3_muladd_2(&w2, &w1, &w0, x[ 9], x[18]); + word3_muladd_2(&w2, &w1, &w0, x[10], x[17]); + word3_muladd_2(&w2, &w1, &w0, x[11], x[16]); + word3_muladd_2(&w2, &w1, &w0, x[12], x[15]); + word3_muladd_2(&w2, &w1, &w0, x[13], x[14]); + z[27] = w0; w0 = 0; + + word3_muladd_2(&w0, &w2, &w1, x[ 5], x[23]); + word3_muladd_2(&w0, &w2, &w1, x[ 6], x[22]); + word3_muladd_2(&w0, &w2, &w1, x[ 7], x[21]); + word3_muladd_2(&w0, &w2, &w1, x[ 8], x[20]); + word3_muladd_2(&w0, &w2, &w1, x[ 9], x[19]); + word3_muladd_2(&w0, &w2, &w1, x[10], x[18]); + word3_muladd_2(&w0, &w2, &w1, x[11], x[17]); + word3_muladd_2(&w0, &w2, &w1, x[12], x[16]); + word3_muladd_2(&w0, &w2, &w1, x[13], x[15]); + word3_muladd (&w0, &w2, &w1, x[14], x[14]); + z[28] = w1; w1 = 0; + + word3_muladd_2(&w1, &w0, &w2, x[ 6], x[23]); + word3_muladd_2(&w1, &w0, &w2, x[ 7], x[22]); + word3_muladd_2(&w1, &w0, &w2, x[ 8], x[21]); + word3_muladd_2(&w1, &w0, &w2, x[ 9], x[20]); + word3_muladd_2(&w1, &w0, &w2, x[10], x[19]); + word3_muladd_2(&w1, &w0, &w2, x[11], x[18]); + word3_muladd_2(&w1, &w0, &w2, x[12], x[17]); + word3_muladd_2(&w1, &w0, &w2, x[13], x[16]); + word3_muladd_2(&w1, &w0, &w2, x[14], x[15]); + z[29] = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[ 7], x[23]); + word3_muladd_2(&w2, &w1, &w0, x[ 8], x[22]); + word3_muladd_2(&w2, &w1, &w0, x[ 9], x[21]); + word3_muladd_2(&w2, &w1, &w0, x[10], x[20]); + word3_muladd_2(&w2, &w1, &w0, x[11], x[19]); + word3_muladd_2(&w2, &w1, &w0, x[12], x[18]); + word3_muladd_2(&w2, &w1, &w0, x[13], x[17]); + word3_muladd_2(&w2, &w1, &w0, x[14], x[16]); + word3_muladd (&w2, &w1, &w0, x[15], x[15]); + z[30] = w0; w0 = 0; + + word3_muladd_2(&w0, &w2, &w1, x[ 8], x[23]); + word3_muladd_2(&w0, &w2, &w1, x[ 9], x[22]); + word3_muladd_2(&w0, &w2, &w1, x[10], x[21]); + word3_muladd_2(&w0, &w2, &w1, x[11], x[20]); + word3_muladd_2(&w0, &w2, &w1, x[12], x[19]); + word3_muladd_2(&w0, &w2, &w1, x[13], x[18]); + word3_muladd_2(&w0, &w2, &w1, x[14], x[17]); + word3_muladd_2(&w0, &w2, &w1, x[15], x[16]); + z[31] = w1; w1 = 0; + + word3_muladd_2(&w1, &w0, &w2, x[ 9], x[23]); + word3_muladd_2(&w1, &w0, &w2, x[10], x[22]); + word3_muladd_2(&w1, &w0, &w2, x[11], x[21]); + word3_muladd_2(&w1, &w0, &w2, x[12], x[20]); + word3_muladd_2(&w1, &w0, &w2, x[13], x[19]); + word3_muladd_2(&w1, &w0, &w2, x[14], x[18]); + word3_muladd_2(&w1, &w0, &w2, x[15], x[17]); + word3_muladd (&w1, &w0, &w2, x[16], x[16]); + z[32] = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[10], x[23]); + word3_muladd_2(&w2, &w1, &w0, x[11], x[22]); + word3_muladd_2(&w2, &w1, &w0, x[12], x[21]); + word3_muladd_2(&w2, &w1, &w0, x[13], x[20]); + word3_muladd_2(&w2, &w1, &w0, x[14], x[19]); + word3_muladd_2(&w2, &w1, &w0, x[15], x[18]); + word3_muladd_2(&w2, &w1, &w0, x[16], x[17]); + z[33] = w0; w0 = 0; + + word3_muladd_2(&w0, &w2, &w1, x[11], x[23]); + word3_muladd_2(&w0, &w2, &w1, x[12], x[22]); + word3_muladd_2(&w0, &w2, &w1, x[13], x[21]); + word3_muladd_2(&w0, &w2, &w1, x[14], x[20]); + word3_muladd_2(&w0, &w2, &w1, x[15], x[19]); + word3_muladd_2(&w0, &w2, &w1, x[16], x[18]); + word3_muladd (&w0, &w2, &w1, x[17], x[17]); + z[34] = w1; w1 = 0; + + word3_muladd_2(&w1, &w0, &w2, x[12], x[23]); + word3_muladd_2(&w1, &w0, &w2, x[13], x[22]); + word3_muladd_2(&w1, &w0, &w2, x[14], x[21]); + word3_muladd_2(&w1, &w0, &w2, x[15], x[20]); + word3_muladd_2(&w1, &w0, &w2, x[16], x[19]); + word3_muladd_2(&w1, &w0, &w2, x[17], x[18]); + z[35] = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[13], x[23]); + word3_muladd_2(&w2, &w1, &w0, x[14], x[22]); + word3_muladd_2(&w2, &w1, &w0, x[15], x[21]); + word3_muladd_2(&w2, &w1, &w0, x[16], x[20]); + word3_muladd_2(&w2, &w1, &w0, x[17], x[19]); + word3_muladd (&w2, &w1, &w0, x[18], x[18]); + z[36] = w0; w0 = 0; + + word3_muladd_2(&w0, &w2, &w1, x[14], x[23]); + word3_muladd_2(&w0, &w2, &w1, x[15], x[22]); + word3_muladd_2(&w0, &w2, &w1, x[16], x[21]); + word3_muladd_2(&w0, &w2, &w1, x[17], x[20]); + word3_muladd_2(&w0, &w2, &w1, x[18], x[19]); + z[37] = w1; w1 = 0; + + word3_muladd_2(&w1, &w0, &w2, x[15], x[23]); + word3_muladd_2(&w1, &w0, &w2, x[16], x[22]); + word3_muladd_2(&w1, &w0, &w2, x[17], x[21]); + word3_muladd_2(&w1, &w0, &w2, x[18], x[20]); + word3_muladd (&w1, &w0, &w2, x[19], x[19]); + z[38] = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[16], x[23]); + word3_muladd_2(&w2, &w1, &w0, x[17], x[22]); + word3_muladd_2(&w2, &w1, &w0, x[18], x[21]); + word3_muladd_2(&w2, &w1, &w0, x[19], x[20]); + z[39] = w0; w0 = 0; + + word3_muladd_2(&w0, &w2, &w1, x[17], x[23]); + word3_muladd_2(&w0, &w2, &w1, x[18], x[22]); + word3_muladd_2(&w0, &w2, &w1, x[19], x[21]); + word3_muladd (&w0, &w2, &w1, x[20], x[20]); + z[40] = w1; w1 = 0; + + word3_muladd_2(&w1, &w0, &w2, x[18], x[23]); + word3_muladd_2(&w1, &w0, &w2, x[19], x[22]); + word3_muladd_2(&w1, &w0, &w2, x[20], x[21]); + z[41] = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[19], x[23]); + word3_muladd_2(&w2, &w1, &w0, x[20], x[22]); + word3_muladd (&w2, &w1, &w0, x[21], x[21]); + z[42] = w0; w0 = 0; + + word3_muladd_2(&w0, &w2, &w1, x[20], x[23]); + word3_muladd_2(&w0, &w2, &w1, x[21], x[22]); + z[43] = w1; w1 = 0; + + word3_muladd_2(&w1, &w0, &w2, x[21], x[23]); + word3_muladd (&w1, &w0, &w2, x[22], x[22]); + z[44] = w2; w2 = 0; + + word3_muladd_2(&w2, &w1, &w0, x[22], x[23]); + z[45] = w0; w0 = 0; + + word3_muladd (&w0, &w2, &w1, x[23], x[23]); + z[46] = w1; + z[47] = w2; + } + +/* +* Comba 24x24 Multiplication +*/ +void bigint_comba_mul24(word z[48], const word x[24], const word y[24]) + { + word w2 = 0, w1 = 0, w0 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]); + z[ 0] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]); + word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]); + z[ 1] = w1; w1 = 0; + + word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]); + word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]); + word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]); + z[ 2] = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]); + z[ 3] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]); + word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]); + word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]); + word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]); + word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]); + z[ 4] = w1; w1 = 0; + + word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]); + word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]); + word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]); + word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]); + word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]); + word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]); + z[ 5] = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]); + z[ 6] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[ 0], y[ 7]); + word3_muladd(&w0, &w2, &w1, x[ 1], y[ 6]); + word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]); + word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]); + word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]); + word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]); + word3_muladd(&w0, &w2, &w1, x[ 6], y[ 1]); + word3_muladd(&w0, &w2, &w1, x[ 7], y[ 0]); + z[ 7] = w1; w1 = 0; + + word3_muladd(&w1, &w0, &w2, x[ 0], y[ 8]); + word3_muladd(&w1, &w0, &w2, x[ 1], y[ 7]); + word3_muladd(&w1, &w0, &w2, x[ 2], y[ 6]); + word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]); + word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]); + word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]); + word3_muladd(&w1, &w0, &w2, x[ 6], y[ 2]); + word3_muladd(&w1, &w0, &w2, x[ 7], y[ 1]); + word3_muladd(&w1, &w0, &w2, x[ 8], y[ 0]); + z[ 8] = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[ 0]); + z[ 9] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[ 0], y[10]); + word3_muladd(&w0, &w2, &w1, x[ 1], y[ 9]); + word3_muladd(&w0, &w2, &w1, x[ 2], y[ 8]); + word3_muladd(&w0, &w2, &w1, x[ 3], y[ 7]); + word3_muladd(&w0, &w2, &w1, x[ 4], y[ 6]); + word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]); + word3_muladd(&w0, &w2, &w1, x[ 6], y[ 4]); + word3_muladd(&w0, &w2, &w1, x[ 7], y[ 3]); + word3_muladd(&w0, &w2, &w1, x[ 8], y[ 2]); + word3_muladd(&w0, &w2, &w1, x[ 9], y[ 1]); + word3_muladd(&w0, &w2, &w1, x[10], y[ 0]); + z[10] = w1; w1 = 0; + + word3_muladd(&w1, &w0, &w2, x[ 0], y[11]); + word3_muladd(&w1, &w0, &w2, x[ 1], y[10]); + word3_muladd(&w1, &w0, &w2, x[ 2], y[ 9]); + word3_muladd(&w1, &w0, &w2, x[ 3], y[ 8]); + word3_muladd(&w1, &w0, &w2, x[ 4], y[ 7]); + word3_muladd(&w1, &w0, &w2, x[ 5], y[ 6]); + word3_muladd(&w1, &w0, &w2, x[ 6], y[ 5]); + word3_muladd(&w1, &w0, &w2, x[ 7], y[ 4]); + word3_muladd(&w1, &w0, &w2, x[ 8], y[ 3]); + word3_muladd(&w1, &w0, &w2, x[ 9], y[ 2]); + word3_muladd(&w1, &w0, &w2, x[10], y[ 1]); + word3_muladd(&w1, &w0, &w2, x[11], y[ 0]); + z[11] = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[12]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[11]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[10]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[10], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[11], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[12], y[ 0]); + z[12] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[ 0], y[13]); + word3_muladd(&w0, &w2, &w1, x[ 1], y[12]); + word3_muladd(&w0, &w2, &w1, x[ 2], y[11]); + word3_muladd(&w0, &w2, &w1, x[ 3], y[10]); + word3_muladd(&w0, &w2, &w1, x[ 4], y[ 9]); + word3_muladd(&w0, &w2, &w1, x[ 5], y[ 8]); + word3_muladd(&w0, &w2, &w1, x[ 6], y[ 7]); + word3_muladd(&w0, &w2, &w1, x[ 7], y[ 6]); + word3_muladd(&w0, &w2, &w1, x[ 8], y[ 5]); + word3_muladd(&w0, &w2, &w1, x[ 9], y[ 4]); + word3_muladd(&w0, &w2, &w1, x[10], y[ 3]); + word3_muladd(&w0, &w2, &w1, x[11], y[ 2]); + word3_muladd(&w0, &w2, &w1, x[12], y[ 1]); + word3_muladd(&w0, &w2, &w1, x[13], y[ 0]); + z[13] = w1; w1 = 0; + + word3_muladd(&w1, &w0, &w2, x[ 0], y[14]); + word3_muladd(&w1, &w0, &w2, x[ 1], y[13]); + word3_muladd(&w1, &w0, &w2, x[ 2], y[12]); + word3_muladd(&w1, &w0, &w2, x[ 3], y[11]); + word3_muladd(&w1, &w0, &w2, x[ 4], y[10]); + word3_muladd(&w1, &w0, &w2, x[ 5], y[ 9]); + word3_muladd(&w1, &w0, &w2, x[ 6], y[ 8]); + word3_muladd(&w1, &w0, &w2, x[ 7], y[ 7]); + word3_muladd(&w1, &w0, &w2, x[ 8], y[ 6]); + word3_muladd(&w1, &w0, &w2, x[ 9], y[ 5]); + word3_muladd(&w1, &w0, &w2, x[10], y[ 4]); + word3_muladd(&w1, &w0, &w2, x[11], y[ 3]); + word3_muladd(&w1, &w0, &w2, x[12], y[ 2]); + word3_muladd(&w1, &w0, &w2, x[13], y[ 1]); + word3_muladd(&w1, &w0, &w2, x[14], y[ 0]); + z[14] = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[15]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[14]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[13]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[12]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[11]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[10]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[10], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[11], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[12], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[13], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[14], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[15], y[ 0]); + z[15] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[ 0], y[16]); + word3_muladd(&w0, &w2, &w1, x[ 1], y[15]); + word3_muladd(&w0, &w2, &w1, x[ 2], y[14]); + word3_muladd(&w0, &w2, &w1, x[ 3], y[13]); + word3_muladd(&w0, &w2, &w1, x[ 4], y[12]); + word3_muladd(&w0, &w2, &w1, x[ 5], y[11]); + word3_muladd(&w0, &w2, &w1, x[ 6], y[10]); + word3_muladd(&w0, &w2, &w1, x[ 7], y[ 9]); + word3_muladd(&w0, &w2, &w1, x[ 8], y[ 8]); + word3_muladd(&w0, &w2, &w1, x[ 9], y[ 7]); + word3_muladd(&w0, &w2, &w1, x[10], y[ 6]); + word3_muladd(&w0, &w2, &w1, x[11], y[ 5]); + word3_muladd(&w0, &w2, &w1, x[12], y[ 4]); + word3_muladd(&w0, &w2, &w1, x[13], y[ 3]); + word3_muladd(&w0, &w2, &w1, x[14], y[ 2]); + word3_muladd(&w0, &w2, &w1, x[15], y[ 1]); + word3_muladd(&w0, &w2, &w1, x[16], y[ 0]); + z[16] = w1; w1 = 0; + + word3_muladd(&w1, &w0, &w2, x[ 0], y[17]); + word3_muladd(&w1, &w0, &w2, x[ 1], y[16]); + word3_muladd(&w1, &w0, &w2, x[ 2], y[15]); + word3_muladd(&w1, &w0, &w2, x[ 3], y[14]); + word3_muladd(&w1, &w0, &w2, x[ 4], y[13]); + word3_muladd(&w1, &w0, &w2, x[ 5], y[12]); + word3_muladd(&w1, &w0, &w2, x[ 6], y[11]); + word3_muladd(&w1, &w0, &w2, x[ 7], y[10]); + word3_muladd(&w1, &w0, &w2, x[ 8], y[ 9]); + word3_muladd(&w1, &w0, &w2, x[ 9], y[ 8]); + word3_muladd(&w1, &w0, &w2, x[10], y[ 7]); + word3_muladd(&w1, &w0, &w2, x[11], y[ 6]); + word3_muladd(&w1, &w0, &w2, x[12], y[ 5]); + word3_muladd(&w1, &w0, &w2, x[13], y[ 4]); + word3_muladd(&w1, &w0, &w2, x[14], y[ 3]); + word3_muladd(&w1, &w0, &w2, x[15], y[ 2]); + word3_muladd(&w1, &w0, &w2, x[16], y[ 1]); + word3_muladd(&w1, &w0, &w2, x[17], y[ 0]); + z[17] = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[18]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[17]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[16]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[15]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[14]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[13]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[12]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[11]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[10]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[10], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[11], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[12], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[13], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[14], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[15], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[16], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[17], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[18], y[ 0]); + z[18] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[ 0], y[19]); + word3_muladd(&w0, &w2, &w1, x[ 1], y[18]); + word3_muladd(&w0, &w2, &w1, x[ 2], y[17]); + word3_muladd(&w0, &w2, &w1, x[ 3], y[16]); + word3_muladd(&w0, &w2, &w1, x[ 4], y[15]); + word3_muladd(&w0, &w2, &w1, x[ 5], y[14]); + word3_muladd(&w0, &w2, &w1, x[ 6], y[13]); + word3_muladd(&w0, &w2, &w1, x[ 7], y[12]); + word3_muladd(&w0, &w2, &w1, x[ 8], y[11]); + word3_muladd(&w0, &w2, &w1, x[ 9], y[10]); + word3_muladd(&w0, &w2, &w1, x[10], y[ 9]); + word3_muladd(&w0, &w2, &w1, x[11], y[ 8]); + word3_muladd(&w0, &w2, &w1, x[12], y[ 7]); + word3_muladd(&w0, &w2, &w1, x[13], y[ 6]); + word3_muladd(&w0, &w2, &w1, x[14], y[ 5]); + word3_muladd(&w0, &w2, &w1, x[15], y[ 4]); + word3_muladd(&w0, &w2, &w1, x[16], y[ 3]); + word3_muladd(&w0, &w2, &w1, x[17], y[ 2]); + word3_muladd(&w0, &w2, &w1, x[18], y[ 1]); + word3_muladd(&w0, &w2, &w1, x[19], y[ 0]); + z[19] = w1; w1 = 0; + + word3_muladd(&w1, &w0, &w2, x[ 0], y[20]); + word3_muladd(&w1, &w0, &w2, x[ 1], y[19]); + word3_muladd(&w1, &w0, &w2, x[ 2], y[18]); + word3_muladd(&w1, &w0, &w2, x[ 3], y[17]); + word3_muladd(&w1, &w0, &w2, x[ 4], y[16]); + word3_muladd(&w1, &w0, &w2, x[ 5], y[15]); + word3_muladd(&w1, &w0, &w2, x[ 6], y[14]); + word3_muladd(&w1, &w0, &w2, x[ 7], y[13]); + word3_muladd(&w1, &w0, &w2, x[ 8], y[12]); + word3_muladd(&w1, &w0, &w2, x[ 9], y[11]); + word3_muladd(&w1, &w0, &w2, x[10], y[10]); + word3_muladd(&w1, &w0, &w2, x[11], y[ 9]); + word3_muladd(&w1, &w0, &w2, x[12], y[ 8]); + word3_muladd(&w1, &w0, &w2, x[13], y[ 7]); + word3_muladd(&w1, &w0, &w2, x[14], y[ 6]); + word3_muladd(&w1, &w0, &w2, x[15], y[ 5]); + word3_muladd(&w1, &w0, &w2, x[16], y[ 4]); + word3_muladd(&w1, &w0, &w2, x[17], y[ 3]); + word3_muladd(&w1, &w0, &w2, x[18], y[ 2]); + word3_muladd(&w1, &w0, &w2, x[19], y[ 1]); + word3_muladd(&w1, &w0, &w2, x[20], y[ 0]); + z[20] = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 0], y[21]); + word3_muladd(&w2, &w1, &w0, x[ 1], y[20]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[19]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[18]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[17]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[16]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[15]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[14]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[13]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[12]); + word3_muladd(&w2, &w1, &w0, x[10], y[11]); + word3_muladd(&w2, &w1, &w0, x[11], y[10]); + word3_muladd(&w2, &w1, &w0, x[12], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[13], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[14], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[15], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[16], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[17], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[18], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[19], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[20], y[ 1]); + word3_muladd(&w2, &w1, &w0, x[21], y[ 0]); + z[21] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[ 0], y[22]); + word3_muladd(&w0, &w2, &w1, x[ 1], y[21]); + word3_muladd(&w0, &w2, &w1, x[ 2], y[20]); + word3_muladd(&w0, &w2, &w1, x[ 3], y[19]); + word3_muladd(&w0, &w2, &w1, x[ 4], y[18]); + word3_muladd(&w0, &w2, &w1, x[ 5], y[17]); + word3_muladd(&w0, &w2, &w1, x[ 6], y[16]); + word3_muladd(&w0, &w2, &w1, x[ 7], y[15]); + word3_muladd(&w0, &w2, &w1, x[ 8], y[14]); + word3_muladd(&w0, &w2, &w1, x[ 9], y[13]); + word3_muladd(&w0, &w2, &w1, x[10], y[12]); + word3_muladd(&w0, &w2, &w1, x[11], y[11]); + word3_muladd(&w0, &w2, &w1, x[12], y[10]); + word3_muladd(&w0, &w2, &w1, x[13], y[ 9]); + word3_muladd(&w0, &w2, &w1, x[14], y[ 8]); + word3_muladd(&w0, &w2, &w1, x[15], y[ 7]); + word3_muladd(&w0, &w2, &w1, x[16], y[ 6]); + word3_muladd(&w0, &w2, &w1, x[17], y[ 5]); + word3_muladd(&w0, &w2, &w1, x[18], y[ 4]); + word3_muladd(&w0, &w2, &w1, x[19], y[ 3]); + word3_muladd(&w0, &w2, &w1, x[20], y[ 2]); + word3_muladd(&w0, &w2, &w1, x[21], y[ 1]); + word3_muladd(&w0, &w2, &w1, x[22], y[ 0]); + z[22] = w1; w1 = 0; + + word3_muladd(&w1, &w0, &w2, x[ 0], y[23]); + word3_muladd(&w1, &w0, &w2, x[ 1], y[22]); + word3_muladd(&w1, &w0, &w2, x[ 2], y[21]); + word3_muladd(&w1, &w0, &w2, x[ 3], y[20]); + word3_muladd(&w1, &w0, &w2, x[ 4], y[19]); + word3_muladd(&w1, &w0, &w2, x[ 5], y[18]); + word3_muladd(&w1, &w0, &w2, x[ 6], y[17]); + word3_muladd(&w1, &w0, &w2, x[ 7], y[16]); + word3_muladd(&w1, &w0, &w2, x[ 8], y[15]); + word3_muladd(&w1, &w0, &w2, x[ 9], y[14]); + word3_muladd(&w1, &w0, &w2, x[10], y[13]); + word3_muladd(&w1, &w0, &w2, x[11], y[12]); + word3_muladd(&w1, &w0, &w2, x[12], y[11]); + word3_muladd(&w1, &w0, &w2, x[13], y[10]); + word3_muladd(&w1, &w0, &w2, x[14], y[ 9]); + word3_muladd(&w1, &w0, &w2, x[15], y[ 8]); + word3_muladd(&w1, &w0, &w2, x[16], y[ 7]); + word3_muladd(&w1, &w0, &w2, x[17], y[ 6]); + word3_muladd(&w1, &w0, &w2, x[18], y[ 5]); + word3_muladd(&w1, &w0, &w2, x[19], y[ 4]); + word3_muladd(&w1, &w0, &w2, x[20], y[ 3]); + word3_muladd(&w1, &w0, &w2, x[21], y[ 2]); + word3_muladd(&w1, &w0, &w2, x[22], y[ 1]); + word3_muladd(&w1, &w0, &w2, x[23], y[ 0]); + z[23] = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 1], y[23]); + word3_muladd(&w2, &w1, &w0, x[ 2], y[22]); + word3_muladd(&w2, &w1, &w0, x[ 3], y[21]); + word3_muladd(&w2, &w1, &w0, x[ 4], y[20]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[19]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[18]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[17]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[16]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[15]); + word3_muladd(&w2, &w1, &w0, x[10], y[14]); + word3_muladd(&w2, &w1, &w0, x[11], y[13]); + word3_muladd(&w2, &w1, &w0, x[12], y[12]); + word3_muladd(&w2, &w1, &w0, x[13], y[11]); + word3_muladd(&w2, &w1, &w0, x[14], y[10]); + word3_muladd(&w2, &w1, &w0, x[15], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[16], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[17], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[18], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[19], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[20], y[ 4]); + word3_muladd(&w2, &w1, &w0, x[21], y[ 3]); + word3_muladd(&w2, &w1, &w0, x[22], y[ 2]); + word3_muladd(&w2, &w1, &w0, x[23], y[ 1]); + z[24] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[ 2], y[23]); + word3_muladd(&w0, &w2, &w1, x[ 3], y[22]); + word3_muladd(&w0, &w2, &w1, x[ 4], y[21]); + word3_muladd(&w0, &w2, &w1, x[ 5], y[20]); + word3_muladd(&w0, &w2, &w1, x[ 6], y[19]); + word3_muladd(&w0, &w2, &w1, x[ 7], y[18]); + word3_muladd(&w0, &w2, &w1, x[ 8], y[17]); + word3_muladd(&w0, &w2, &w1, x[ 9], y[16]); + word3_muladd(&w0, &w2, &w1, x[10], y[15]); + word3_muladd(&w0, &w2, &w1, x[11], y[14]); + word3_muladd(&w0, &w2, &w1, x[12], y[13]); + word3_muladd(&w0, &w2, &w1, x[13], y[12]); + word3_muladd(&w0, &w2, &w1, x[14], y[11]); + word3_muladd(&w0, &w2, &w1, x[15], y[10]); + word3_muladd(&w0, &w2, &w1, x[16], y[ 9]); + word3_muladd(&w0, &w2, &w1, x[17], y[ 8]); + word3_muladd(&w0, &w2, &w1, x[18], y[ 7]); + word3_muladd(&w0, &w2, &w1, x[19], y[ 6]); + word3_muladd(&w0, &w2, &w1, x[20], y[ 5]); + word3_muladd(&w0, &w2, &w1, x[21], y[ 4]); + word3_muladd(&w0, &w2, &w1, x[22], y[ 3]); + word3_muladd(&w0, &w2, &w1, x[23], y[ 2]); + z[25] = w1; w1 = 0; + + word3_muladd(&w1, &w0, &w2, x[ 3], y[23]); + word3_muladd(&w1, &w0, &w2, x[ 4], y[22]); + word3_muladd(&w1, &w0, &w2, x[ 5], y[21]); + word3_muladd(&w1, &w0, &w2, x[ 6], y[20]); + word3_muladd(&w1, &w0, &w2, x[ 7], y[19]); + word3_muladd(&w1, &w0, &w2, x[ 8], y[18]); + word3_muladd(&w1, &w0, &w2, x[ 9], y[17]); + word3_muladd(&w1, &w0, &w2, x[10], y[16]); + word3_muladd(&w1, &w0, &w2, x[11], y[15]); + word3_muladd(&w1, &w0, &w2, x[12], y[14]); + word3_muladd(&w1, &w0, &w2, x[13], y[13]); + word3_muladd(&w1, &w0, &w2, x[14], y[12]); + word3_muladd(&w1, &w0, &w2, x[15], y[11]); + word3_muladd(&w1, &w0, &w2, x[16], y[10]); + word3_muladd(&w1, &w0, &w2, x[17], y[ 9]); + word3_muladd(&w1, &w0, &w2, x[18], y[ 8]); + word3_muladd(&w1, &w0, &w2, x[19], y[ 7]); + word3_muladd(&w1, &w0, &w2, x[20], y[ 6]); + word3_muladd(&w1, &w0, &w2, x[21], y[ 5]); + word3_muladd(&w1, &w0, &w2, x[22], y[ 4]); + word3_muladd(&w1, &w0, &w2, x[23], y[ 3]); + z[26] = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 4], y[23]); + word3_muladd(&w2, &w1, &w0, x[ 5], y[22]); + word3_muladd(&w2, &w1, &w0, x[ 6], y[21]); + word3_muladd(&w2, &w1, &w0, x[ 7], y[20]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[19]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[18]); + word3_muladd(&w2, &w1, &w0, x[10], y[17]); + word3_muladd(&w2, &w1, &w0, x[11], y[16]); + word3_muladd(&w2, &w1, &w0, x[12], y[15]); + word3_muladd(&w2, &w1, &w0, x[13], y[14]); + word3_muladd(&w2, &w1, &w0, x[14], y[13]); + word3_muladd(&w2, &w1, &w0, x[15], y[12]); + word3_muladd(&w2, &w1, &w0, x[16], y[11]); + word3_muladd(&w2, &w1, &w0, x[17], y[10]); + word3_muladd(&w2, &w1, &w0, x[18], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[19], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[20], y[ 7]); + word3_muladd(&w2, &w1, &w0, x[21], y[ 6]); + word3_muladd(&w2, &w1, &w0, x[22], y[ 5]); + word3_muladd(&w2, &w1, &w0, x[23], y[ 4]); + z[27] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[ 5], y[23]); + word3_muladd(&w0, &w2, &w1, x[ 6], y[22]); + word3_muladd(&w0, &w2, &w1, x[ 7], y[21]); + word3_muladd(&w0, &w2, &w1, x[ 8], y[20]); + word3_muladd(&w0, &w2, &w1, x[ 9], y[19]); + word3_muladd(&w0, &w2, &w1, x[10], y[18]); + word3_muladd(&w0, &w2, &w1, x[11], y[17]); + word3_muladd(&w0, &w2, &w1, x[12], y[16]); + word3_muladd(&w0, &w2, &w1, x[13], y[15]); + word3_muladd(&w0, &w2, &w1, x[14], y[14]); + word3_muladd(&w0, &w2, &w1, x[15], y[13]); + word3_muladd(&w0, &w2, &w1, x[16], y[12]); + word3_muladd(&w0, &w2, &w1, x[17], y[11]); + word3_muladd(&w0, &w2, &w1, x[18], y[10]); + word3_muladd(&w0, &w2, &w1, x[19], y[ 9]); + word3_muladd(&w0, &w2, &w1, x[20], y[ 8]); + word3_muladd(&w0, &w2, &w1, x[21], y[ 7]); + word3_muladd(&w0, &w2, &w1, x[22], y[ 6]); + word3_muladd(&w0, &w2, &w1, x[23], y[ 5]); + z[28] = w1; w1 = 0; + + word3_muladd(&w1, &w0, &w2, x[ 6], y[23]); + word3_muladd(&w1, &w0, &w2, x[ 7], y[22]); + word3_muladd(&w1, &w0, &w2, x[ 8], y[21]); + word3_muladd(&w1, &w0, &w2, x[ 9], y[20]); + word3_muladd(&w1, &w0, &w2, x[10], y[19]); + word3_muladd(&w1, &w0, &w2, x[11], y[18]); + word3_muladd(&w1, &w0, &w2, x[12], y[17]); + word3_muladd(&w1, &w0, &w2, x[13], y[16]); + word3_muladd(&w1, &w0, &w2, x[14], y[15]); + word3_muladd(&w1, &w0, &w2, x[15], y[14]); + word3_muladd(&w1, &w0, &w2, x[16], y[13]); + word3_muladd(&w1, &w0, &w2, x[17], y[12]); + word3_muladd(&w1, &w0, &w2, x[18], y[11]); + word3_muladd(&w1, &w0, &w2, x[19], y[10]); + word3_muladd(&w1, &w0, &w2, x[20], y[ 9]); + word3_muladd(&w1, &w0, &w2, x[21], y[ 8]); + word3_muladd(&w1, &w0, &w2, x[22], y[ 7]); + word3_muladd(&w1, &w0, &w2, x[23], y[ 6]); + z[29] = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[ 7], y[23]); + word3_muladd(&w2, &w1, &w0, x[ 8], y[22]); + word3_muladd(&w2, &w1, &w0, x[ 9], y[21]); + word3_muladd(&w2, &w1, &w0, x[10], y[20]); + word3_muladd(&w2, &w1, &w0, x[11], y[19]); + word3_muladd(&w2, &w1, &w0, x[12], y[18]); + word3_muladd(&w2, &w1, &w0, x[13], y[17]); + word3_muladd(&w2, &w1, &w0, x[14], y[16]); + word3_muladd(&w2, &w1, &w0, x[15], y[15]); + word3_muladd(&w2, &w1, &w0, x[16], y[14]); + word3_muladd(&w2, &w1, &w0, x[17], y[13]); + word3_muladd(&w2, &w1, &w0, x[18], y[12]); + word3_muladd(&w2, &w1, &w0, x[19], y[11]); + word3_muladd(&w2, &w1, &w0, x[20], y[10]); + word3_muladd(&w2, &w1, &w0, x[21], y[ 9]); + word3_muladd(&w2, &w1, &w0, x[22], y[ 8]); + word3_muladd(&w2, &w1, &w0, x[23], y[ 7]); + z[30] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[ 8], y[23]); + word3_muladd(&w0, &w2, &w1, x[ 9], y[22]); + word3_muladd(&w0, &w2, &w1, x[10], y[21]); + word3_muladd(&w0, &w2, &w1, x[11], y[20]); + word3_muladd(&w0, &w2, &w1, x[12], y[19]); + word3_muladd(&w0, &w2, &w1, x[13], y[18]); + word3_muladd(&w0, &w2, &w1, x[14], y[17]); + word3_muladd(&w0, &w2, &w1, x[15], y[16]); + word3_muladd(&w0, &w2, &w1, x[16], y[15]); + word3_muladd(&w0, &w2, &w1, x[17], y[14]); + word3_muladd(&w0, &w2, &w1, x[18], y[13]); + word3_muladd(&w0, &w2, &w1, x[19], y[12]); + word3_muladd(&w0, &w2, &w1, x[20], y[11]); + word3_muladd(&w0, &w2, &w1, x[21], y[10]); + word3_muladd(&w0, &w2, &w1, x[22], y[ 9]); + word3_muladd(&w0, &w2, &w1, x[23], y[ 8]); + z[31] = w1; w1 = 0; + + word3_muladd(&w1, &w0, &w2, x[ 9], y[23]); + word3_muladd(&w1, &w0, &w2, x[10], y[22]); + word3_muladd(&w1, &w0, &w2, x[11], y[21]); + word3_muladd(&w1, &w0, &w2, x[12], y[20]); + word3_muladd(&w1, &w0, &w2, x[13], y[19]); + word3_muladd(&w1, &w0, &w2, x[14], y[18]); + word3_muladd(&w1, &w0, &w2, x[15], y[17]); + word3_muladd(&w1, &w0, &w2, x[16], y[16]); + word3_muladd(&w1, &w0, &w2, x[17], y[15]); + word3_muladd(&w1, &w0, &w2, x[18], y[14]); + word3_muladd(&w1, &w0, &w2, x[19], y[13]); + word3_muladd(&w1, &w0, &w2, x[20], y[12]); + word3_muladd(&w1, &w0, &w2, x[21], y[11]); + word3_muladd(&w1, &w0, &w2, x[22], y[10]); + word3_muladd(&w1, &w0, &w2, x[23], y[ 9]); + z[32] = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[10], y[23]); + word3_muladd(&w2, &w1, &w0, x[11], y[22]); + word3_muladd(&w2, &w1, &w0, x[12], y[21]); + word3_muladd(&w2, &w1, &w0, x[13], y[20]); + word3_muladd(&w2, &w1, &w0, x[14], y[19]); + word3_muladd(&w2, &w1, &w0, x[15], y[18]); + word3_muladd(&w2, &w1, &w0, x[16], y[17]); + word3_muladd(&w2, &w1, &w0, x[17], y[16]); + word3_muladd(&w2, &w1, &w0, x[18], y[15]); + word3_muladd(&w2, &w1, &w0, x[19], y[14]); + word3_muladd(&w2, &w1, &w0, x[20], y[13]); + word3_muladd(&w2, &w1, &w0, x[21], y[12]); + word3_muladd(&w2, &w1, &w0, x[22], y[11]); + word3_muladd(&w2, &w1, &w0, x[23], y[10]); + z[33] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[11], y[23]); + word3_muladd(&w0, &w2, &w1, x[12], y[22]); + word3_muladd(&w0, &w2, &w1, x[13], y[21]); + word3_muladd(&w0, &w2, &w1, x[14], y[20]); + word3_muladd(&w0, &w2, &w1, x[15], y[19]); + word3_muladd(&w0, &w2, &w1, x[16], y[18]); + word3_muladd(&w0, &w2, &w1, x[17], y[17]); + word3_muladd(&w0, &w2, &w1, x[18], y[16]); + word3_muladd(&w0, &w2, &w1, x[19], y[15]); + word3_muladd(&w0, &w2, &w1, x[20], y[14]); + word3_muladd(&w0, &w2, &w1, x[21], y[13]); + word3_muladd(&w0, &w2, &w1, x[22], y[12]); + word3_muladd(&w0, &w2, &w1, x[23], y[11]); + z[34] = w1; w1 = 0; + + word3_muladd(&w1, &w0, &w2, x[12], y[23]); + word3_muladd(&w1, &w0, &w2, x[13], y[22]); + word3_muladd(&w1, &w0, &w2, x[14], y[21]); + word3_muladd(&w1, &w0, &w2, x[15], y[20]); + word3_muladd(&w1, &w0, &w2, x[16], y[19]); + word3_muladd(&w1, &w0, &w2, x[17], y[18]); + word3_muladd(&w1, &w0, &w2, x[18], y[17]); + word3_muladd(&w1, &w0, &w2, x[19], y[16]); + word3_muladd(&w1, &w0, &w2, x[20], y[15]); + word3_muladd(&w1, &w0, &w2, x[21], y[14]); + word3_muladd(&w1, &w0, &w2, x[22], y[13]); + word3_muladd(&w1, &w0, &w2, x[23], y[12]); + z[35] = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[13], y[23]); + word3_muladd(&w2, &w1, &w0, x[14], y[22]); + word3_muladd(&w2, &w1, &w0, x[15], y[21]); + word3_muladd(&w2, &w1, &w0, x[16], y[20]); + word3_muladd(&w2, &w1, &w0, x[17], y[19]); + word3_muladd(&w2, &w1, &w0, x[18], y[18]); + word3_muladd(&w2, &w1, &w0, x[19], y[17]); + word3_muladd(&w2, &w1, &w0, x[20], y[16]); + word3_muladd(&w2, &w1, &w0, x[21], y[15]); + word3_muladd(&w2, &w1, &w0, x[22], y[14]); + word3_muladd(&w2, &w1, &w0, x[23], y[13]); + z[36] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[14], y[23]); + word3_muladd(&w0, &w2, &w1, x[15], y[22]); + word3_muladd(&w0, &w2, &w1, x[16], y[21]); + word3_muladd(&w0, &w2, &w1, x[17], y[20]); + word3_muladd(&w0, &w2, &w1, x[18], y[19]); + word3_muladd(&w0, &w2, &w1, x[19], y[18]); + word3_muladd(&w0, &w2, &w1, x[20], y[17]); + word3_muladd(&w0, &w2, &w1, x[21], y[16]); + word3_muladd(&w0, &w2, &w1, x[22], y[15]); + word3_muladd(&w0, &w2, &w1, x[23], y[14]); + z[37] = w1; w1 = 0; + + word3_muladd(&w1, &w0, &w2, x[15], y[23]); + word3_muladd(&w1, &w0, &w2, x[16], y[22]); + word3_muladd(&w1, &w0, &w2, x[17], y[21]); + word3_muladd(&w1, &w0, &w2, x[18], y[20]); + word3_muladd(&w1, &w0, &w2, x[19], y[19]); + word3_muladd(&w1, &w0, &w2, x[20], y[18]); + word3_muladd(&w1, &w0, &w2, x[21], y[17]); + word3_muladd(&w1, &w0, &w2, x[22], y[16]); + word3_muladd(&w1, &w0, &w2, x[23], y[15]); + z[38] = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[16], y[23]); + word3_muladd(&w2, &w1, &w0, x[17], y[22]); + word3_muladd(&w2, &w1, &w0, x[18], y[21]); + word3_muladd(&w2, &w1, &w0, x[19], y[20]); + word3_muladd(&w2, &w1, &w0, x[20], y[19]); + word3_muladd(&w2, &w1, &w0, x[21], y[18]); + word3_muladd(&w2, &w1, &w0, x[22], y[17]); + word3_muladd(&w2, &w1, &w0, x[23], y[16]); + z[39] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[17], y[23]); + word3_muladd(&w0, &w2, &w1, x[18], y[22]); + word3_muladd(&w0, &w2, &w1, x[19], y[21]); + word3_muladd(&w0, &w2, &w1, x[20], y[20]); + word3_muladd(&w0, &w2, &w1, x[21], y[19]); + word3_muladd(&w0, &w2, &w1, x[22], y[18]); + word3_muladd(&w0, &w2, &w1, x[23], y[17]); + z[40] = w1; w1 = 0; + + word3_muladd(&w1, &w0, &w2, x[18], y[23]); + word3_muladd(&w1, &w0, &w2, x[19], y[22]); + word3_muladd(&w1, &w0, &w2, x[20], y[21]); + word3_muladd(&w1, &w0, &w2, x[21], y[20]); + word3_muladd(&w1, &w0, &w2, x[22], y[19]); + word3_muladd(&w1, &w0, &w2, x[23], y[18]); + z[41] = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[19], y[23]); + word3_muladd(&w2, &w1, &w0, x[20], y[22]); + word3_muladd(&w2, &w1, &w0, x[21], y[21]); + word3_muladd(&w2, &w1, &w0, x[22], y[20]); + word3_muladd(&w2, &w1, &w0, x[23], y[19]); + z[42] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[20], y[23]); + word3_muladd(&w0, &w2, &w1, x[21], y[22]); + word3_muladd(&w0, &w2, &w1, x[22], y[21]); + word3_muladd(&w0, &w2, &w1, x[23], y[20]); + z[43] = w1; w1 = 0; + + word3_muladd(&w1, &w0, &w2, x[21], y[23]); + word3_muladd(&w1, &w0, &w2, x[22], y[22]); + word3_muladd(&w1, &w0, &w2, x[23], y[21]); + z[44] = w2; w2 = 0; + + word3_muladd(&w2, &w1, &w0, x[22], y[23]); + word3_muladd(&w2, &w1, &w0, x[23], y[22]); + z[45] = w0; w0 = 0; + + word3_muladd(&w0, &w2, &w1, x[23], y[23]); + z[46] = w1; + z[47] = w2; + } + } diff --git a/src/lib/math/mp/mp_core.h b/src/lib/math/mp/mp_core.h index 1fae33987ba..4ae28f7bb08 100644 --- a/src/lib/math/mp/mp_core.h +++ b/src/lib/math/mp/mp_core.h @@ -166,12 +166,14 @@ void bigint_comba_mul6(word z[12], const word x[6], const word y[6]); void bigint_comba_mul8(word z[16], const word x[8], const word y[8]); void bigint_comba_mul9(word z[18], const word x[9], const word y[9]); void bigint_comba_mul16(word z[32], const word x[16], const word y[16]); +void bigint_comba_mul24(word z[48], const word x[24], const word y[24]); void bigint_comba_sqr4(word out[8], const word in[4]); void bigint_comba_sqr6(word out[12], const word in[6]); void bigint_comba_sqr8(word out[16], const word in[8]); void bigint_comba_sqr9(word out[18], const word in[9]); void bigint_comba_sqr16(word out[32], const word in[16]); +void bigint_comba_sqr24(word out[48], const word in[24]); /* * High Level Multiplication/Squaring Interfaces diff --git a/src/lib/math/mp/mp_karat.cpp b/src/lib/math/mp/mp_karat.cpp index 220bd8f9e5e..03a37ed8d3f 100644 --- a/src/lib/math/mp/mp_karat.cpp +++ b/src/lib/math/mp/mp_karat.cpp @@ -86,8 +86,12 @@ void karatsuba_mul(word z[], const word x[], const word y[], size_t N, return bigint_comba_mul6(z, x, y); else if(N == 8) return bigint_comba_mul8(z, x, y); + else if(N == 9) + return bigint_comba_mul9(z, x, y); else if(N == 16) return bigint_comba_mul16(z, x, y); + else if(N == 24) + return bigint_comba_mul24(z, x, y); else return basecase_mul(z, 2*N, x, N, y, N); } @@ -151,8 +155,12 @@ void karatsuba_sqr(word z[], const word x[], size_t N, word workspace[]) return bigint_comba_sqr6(z, x); else if(N == 8) return bigint_comba_sqr8(z, x); + else if(N == 9) + return bigint_comba_sqr9(z, x); else if(N == 16) return bigint_comba_sqr16(z, x); + else if(N == 24) + return bigint_comba_sqr24(z, x); else return basecase_sqr(z, 2*N, x, N); } @@ -316,6 +324,10 @@ void bigint_mul(word z[], size_t z_size, { bigint_comba_mul16(z, x, y); } + else if(sized_for_comba_mul<24>(x_sw, x_size, y_sw, y_size, z_size)) + { + bigint_comba_mul24(z, x, y); + } else if(x_sw < KARATSUBA_MULTIPLY_THRESHOLD || y_sw < KARATSUBA_MULTIPLY_THRESHOLD || !workspace) @@ -368,6 +380,10 @@ void bigint_sqr(word z[], size_t z_size, { bigint_comba_sqr16(z, x); } + else if(sized_for_comba_sqr<24>(x_sw, x_size, z_size)) + { + bigint_comba_sqr24(z, x); + } else if(x_size < KARATSUBA_SQUARE_THRESHOLD || !workspace) { basecase_sqr(z, z_size, x, x_sw); diff --git a/src/scripts/comba.py b/src/scripts/comba.py index 8cff76f8f20..b018b724c33 100755 --- a/src/scripts/comba.py +++ b/src/scripts/comba.py @@ -94,7 +94,7 @@ def main(args = None): namespace Botan { """ % (sys.argv[0], datetime.date.today().strftime("%Y-%m-%d"))) - for n in [4,6,8,9,16]: + for n in [4,6,8,9,16,24]: print("/*\n* Comba %dx%d Squaring\n*/" % (n, n)) print("void bigint_comba_sqr%d(word z[%d], const word x[%d])" % (n, 2*n, n)) print(" {") From f92af552e095f217e12538fd05b3d9877cec6cc1 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 8 May 2018 19:33:31 -0400 Subject: [PATCH 081/174] Slight refactoring to avoid GCC signed overflow warnings. [ci skip] Couldn't occur since length is 24 bits but GCC couldn't figure that out. --- src/lib/tls/tls_handshake_io.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/tls/tls_handshake_io.cpp b/src/lib/tls/tls_handshake_io.cpp index ec9ae16f157..af97c254587 100644 --- a/src/lib/tls/tls_handshake_io.cpp +++ b/src/lib/tls/tls_handshake_io.cpp @@ -83,16 +83,16 @@ Stream_Handshake_IO::get_next_record(bool) { if(m_queue.size() >= 4) { - const size_t length = make_uint32(0, m_queue[1], m_queue[2], m_queue[3]); + const size_t length = 4 + make_uint32(0, m_queue[1], m_queue[2], m_queue[3]); - if(m_queue.size() >= length + 4) + if(m_queue.size() >= length) { Handshake_Type type = static_cast(m_queue[0]); std::vector contents(m_queue.begin() + 4, - m_queue.begin() + 4 + length); + m_queue.begin() + length); - m_queue.erase(m_queue.begin(), m_queue.begin() + 4 + length); + m_queue.erase(m_queue.begin(), m_queue.begin() + length); return std::make_pair(type, contents); } From 21725a2355846fdec782df72ca0de35b0916d443 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 9 May 2018 12:07:40 -0400 Subject: [PATCH 082/174] Extensions to X509 CLI utils gen_self_signed: add --days= and --der to set lifetime and output format. cert_info: accept '-' to read from stdin --- src/cli/x509.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/cli/x509.cpp b/src/cli/x509.cpp index fef155c9f13..ca21c14934b 100644 --- a/src/cli/x509.cpp +++ b/src/cli/x509.cpp @@ -91,7 +91,7 @@ BOTAN_REGISTER_COMMAND("sign_cert", Sign_Cert); class Cert_Info final : public Command { public: - Cert_Info() : Command("cert_info --fingerprint --ber file") {} + Cert_Info() : Command("cert_info --fingerprint file") {} std::string group() const override { @@ -105,7 +105,11 @@ class Cert_Info final : public Command void go() override { - Botan::DataSource_Stream in(get_arg("file"), flag_set("ber")); + const std::string arg_file = get_arg("file"); + + std::vector data = slurp_file(get_arg("file")); + + Botan::DataSource_Memory in(data); while(!in.end_of_data()) { @@ -233,7 +237,7 @@ class Gen_Self_Signed final : public Command public: Gen_Self_Signed() : Command("gen_self_signed key CN --country= --dns= " - "--organization= --email= --key-pass= --ca --hash=SHA-256 --emsa=") {} + "--organization= --email= --days=365 --key-pass= --ca --hash=SHA-256 --emsa= --der") {} std::string group() const override { @@ -254,13 +258,16 @@ class Gen_Self_Signed final : public Command throw CLI_Error("Failed to load key from " + get_arg("key")); } - Botan::X509_Cert_Options opts; + const size_t days = get_arg_sz("days"); + + Botan::X509_Cert_Options opts("", days * 24 * 60 * 60); opts.common_name = get_arg("CN"); opts.country = get_arg("country"); opts.organization = get_arg("organization"); opts.email = get_arg("email"); opts.more_dns = Botan::split_on(get_arg("dns"), ','); + const bool der_format = flag_set("der"); std::string emsa = get_arg("emsa"); @@ -274,7 +281,13 @@ class Gen_Self_Signed final : public Command Botan::X509_Certificate cert = Botan::X509::create_self_signed_cert(opts, *key, get_arg("hash"), rng()); - output() << cert.PEM_encode(); + if(der_format) + { + auto der = cert.BER_encode(); + output().write(reinterpret_cast(der.data()), der.size()); + } + else + output() << cert.PEM_encode(); } }; From 1fffb3b18f039ca4ce87bbb2974242bf0aba2319 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 9 May 2018 12:53:10 -0400 Subject: [PATCH 083/174] Update news --- news.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/news.rst b/news.rst index 89b4c6bcf0d..5171f2cdd98 100644 --- a/news.rst +++ b/news.rst @@ -12,6 +12,9 @@ Version 2.7.0, Not Yet Released * Optimizations for elliptic curve operations (GH #1534 #1531 #1546 #1547 #1550) +* Add 24 word wide Comba multiplication, improving 3072-bit RSA and DH by + about 25%. (GH #1564) + * Improved performance of signature verification in ECGDSA, ECKCDSA, SM2 and GOST by 10-15%. From dcc2a6161ab4f6da160cd0705fa10117e35fb6e0 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 9 May 2018 18:06:03 -0400 Subject: [PATCH 084/174] Inline BigInt::shrink_to_fit Improves P-256 a bit --- src/lib/math/bigint/bigint.cpp | 6 ------ src/lib/math/bigint/bigint.h | 6 +++++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/lib/math/bigint/bigint.cpp b/src/lib/math/bigint/bigint.cpp index 39cff666c7d..495907d1ab1 100644 --- a/src/lib/math/bigint/bigint.cpp +++ b/src/lib/math/bigint/bigint.cpp @@ -341,12 +341,6 @@ void BigInt::binary_decode(const uint8_t buf[], size_t length) m_reg[length / WORD_BYTES] = (m_reg[length / WORD_BYTES] << 8) | buf[i]; } -void BigInt::shrink_to_fit(size_t min_size) - { - const size_t words = std::max(min_size, sig_words()); - m_reg.resize(words); - } - #if defined(BOTAN_HAS_VALGRIND) void BigInt::const_time_poison() const { diff --git a/src/lib/math/bigint/bigint.h b/src/lib/math/bigint/bigint.h index d5bd4ad4fd5..64ab24e7d6a 100644 --- a/src/lib/math/bigint/bigint.h +++ b/src/lib/math/bigint/bigint.h @@ -552,7 +552,11 @@ class BOTAN_PUBLIC_API(2,0) BigInt final * Resize the vector to the minimum word size to hold the integer, or * min_size words, whichever is larger */ - void shrink_to_fit(size_t min_size = 0); + void shrink_to_fit(size_t min_size = 0) + { + const size_t words = std::max(min_size, sig_words()); + m_reg.resize(words); + } /** * Fill BigInt with a random number with size of bitsize From bef5303b3ec1a17bc79ccce0eecdca4874639b56 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 9 May 2018 18:07:21 -0400 Subject: [PATCH 085/174] Properly set thread counts in asio TLS servers X || Y || 2 always evaluates to 1... --- src/cli/tls_http_server.cpp | 24 +++++++++++++++++++++--- src/cli/tls_proxy.cpp | 11 ++++++++++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/cli/tls_http_server.cpp b/src/cli/tls_http_server.cpp index 255cd31b3fe..053f9e055a3 100644 --- a/src/cli/tls_http_server.cpp +++ b/src/cli/tls_http_server.cpp @@ -27,9 +27,14 @@ #include #include #include -#include #include +#if defined(BOTAN_HAS_SYSTEM_RNG) + #include +#else + #include +#endif + #if defined(BOTAN_HAS_TLS_SQLITE3_SESSION_MANAGER) #include #endif @@ -385,7 +390,11 @@ class TLS_Asio_HTTP_Session final : public boost::enable_shared_from_this Date: Fri, 11 May 2018 14:30:34 -0400 Subject: [PATCH 086/174] Update BigInt docs --- doc/manual/bigint.rst | 236 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 195 insertions(+), 41 deletions(-) diff --git a/doc/manual/bigint.rst b/doc/manual/bigint.rst index 421ed27c58d..4eaec268b8b 100644 --- a/doc/manual/bigint.rst +++ b/doc/manual/bigint.rst @@ -1,48 +1,207 @@ BigInt ======================================== -``BigInt`` is Botan's implementation of a multiple-precision -integer. Thanks to C++'s operator overloading features, using -``BigInt`` is often quite similar to using a native integer type. The -number of functions related to ``BigInt`` is quite large. You can find -most of them in ``botan/bigint.h`` and ``botan/numthry.h``. +``BigInt`` is Botan's implementation of a multiple-precision integer. Thanks to +C++'s operator overloading features, using ``BigInt`` is often quite similar to +using a native integer type. The number of functions related to ``BigInt`` is +quite large, and not all of them are documented here. You can find the complete +declarations in ``botan/bigint.h`` and ``botan/numthry.h``. -Encoding Functions ----------------------------------------- +.. cpp:class:: BigInt + + .. cpp:function:: BigInt(uint64_t n) + + Create a BigInt with value *n* + + .. cpp:function:: BigInt(const std::string& str) + + Create a BigInt from a string. By default decimal is + expected. With an 0x prefix instead it is treated as hexadecimal. + + .. cpp:function:: BigInt(const uint8_t buf[], size_t length) + + Create a BigInt from a binary array (big-endian encoding). + + .. cpp:function:: BigInt(RandomNumberGenerator& rng, size_t bits, bool set_high_bit = true) + + Create a random BigInt of the specified size. + + .. cpp:function:: BigInt operator+(const BigInt& x, const BigInt& y) + + Add ``x`` and ``y`` and return result. + + .. cpp:function:: BigInt operator+(const BigInt& x, word y) + + Add ``x`` and ``y`` and return result. + + .. cpp:function:: BigInt operator+(word x, const BigInt& y) + + Add ``x`` and ``y`` and return result. + + .. cpp:function:: BigInt operator-(const BigInt& x, const BigInt& y) + + Subtract ``y`` from ``x`` and return result. + + .. cpp:function:: BigInt operator-(const BigInt& x, word y) + + Subtract ``y`` from ``x`` and return result. + + .. cpp:function:: BigInt operator*(const BigInt& x, const BigInt& y) + + Multiply ``x`` and ``y`` and return result. + + .. cpp:function:: BigInt operator/(const BigInt& x, const BigInt& y) + + Divide ``x`` by ``y`` and return result. + + .. cpp:function:: BigInt operator%(const BigInt& x, const BigInt& y) + + Divide ``x`` by ``y`` and return remainder. + + .. cpp:function:: word operator%(const BigInt& x, word y) + + Divide ``x`` by ``y`` and return remainder. + + .. cpp:function:: word operator<<(const BigInt& x, size_t n) + + Left shift ``x`` by ``n`` and return result. + + .. cpp:function:: word operator>>(const BigInt& x, size_t n) + + Right shift ``x`` by ``n`` and return result. + + .. cpp:function:: BigInt& operator+=(const BigInt& y) + + Add y to ``*this`` + + .. cpp:function:: BigInt& operator+=(word y) + + Add y to ``*this`` + + .. cpp:function:: BigInt& operator-=(const BigInt& y) + + Subtract y from ``*this`` + + .. cpp:function:: BigInt& operator-=(word y) + + Subtract y from ``*this`` + + .. cpp:function:: BigInt& operator*=(const BigInt& y) + + Multiply ``*this`` with y + + .. cpp:function:: BigInt& operator*=(word y) + + Multiply ``*this`` with y + + .. cpp:function:: BigInt& operator/=(const BigInt& y) + + Divide ``*this`` by y + + .. cpp:function:: BigInt& operator%=(const BigInt& y) + + Divide ``*this`` by y and set ``*this`` to the remainder. -These transform the normal representation of a ``BigInt`` into some -other form, such as a decimal string: + .. cpp:function:: word operator%=(word y) -.. cpp:function:: secure_vector BigInt::encode(const BigInt& n, Encoding enc = Binary) + Divide ``*this`` by y and set ``*this`` to the remainder. - This function encodes the BigInt n into a memory - vector. ``Encoding`` is an enum that has values ``Binary``, - ``Decimal``, and ``Hexadecimal``. + .. cpp:function:: word operator<<=(size_t shift) -.. cpp:function:: BigInt BigInt::decode(const std::vector& vec, Encoding enc) + Left shift ``*this`` by *shift* bits - Decode the integer from ``vec`` using the encoding specified. + .. cpp:function:: word operator>>=(size_t shift) -These functions are static member functions, so they would be called -like this:: + Right shift ``*this`` by *shift* bits - BigInt n1 = ...; // some number - secure_vector n1_encoded = BigInt::encode(n1); - BigInt n2 = BigInt::decode(n1_encoded); - assert(n1 == n2); + .. cpp:function:: BigInt& operator++() -There are also C++-style I/O operators defined for use with -``BigInt``. The input operator understands negative numbers and -hexadecimal numbers (marked with a leading "0x"). The '-' must come -before the "0x" marker. The output operator will never adorn the -output; for example, when printing a hexadecimal number, there will -not be a leading "0x" (though a leading '-' will be printed if the -number is negative). If you want such things, you'll have to do them -yourself. + Increment ``*this`` by 1 -``BigInt`` has constructors that can create a ``BigInt`` from an -unsigned integer or a string. You can also decode an array (a ``byte`` -pointer plus a length) into a ``BigInt`` using a constructor. + .. cpp:function:: BigInt& operator--() + + Decrement ``*this`` by 1 + + .. cpp:function:: BigInt operator++(int) + + Postfix increment ``*this`` by 1 + + .. cpp:function:: BigInt operator--(int) + + Postfix decrement ``*this`` by 1 + + .. cpp:function:: BigInt operator-() const + + Negation operator + + .. cpp:function:: bool operator !() const + + Return true unless ``*this`` is zero + + .. cpp:function:: void clear() + + Set ``*this`` to zero + + .. cpp:function:: size_t bytes() const + + Return number of bytes need to represent value of ``*this`` + + .. cpp:function:: size_t bits() const + + Return number of bits need to represent value of ``*this`` + + .. cpp:function:: bool is_even() const + + Return true if ``*this`` is even + + .. cpp:function:: bool is_odd() const + + Return true if ``*this`` is odd + + .. cpp:function:: bool is_nonzero() const + + Return true if ``*this`` is not zero + + .. cpp:function:: bool is_zero() const + + Return true if ``*this`` is zero + + .. cpp:function:: void set_bit(size_t n) + + Set bit *n* of ``*this`` + + .. cpp:function:: void clear_bit(size_t n) + + Clear bit *n* of ``*this`` + + .. cpp:function:: bool get_bit(size_t n) const + + Get bit *n* of ``*this`` + + .. cpp:function:: uint32_t to_u32bit() const + + Return value of ``*this`` as a 32-bit integer, if possible. + If the integer is negative or not in range, an exception is thrown. + + .. cpp:function:: bool is_negative() const + + Return true if ``*this`` is negative + + .. cpp:function:: bool is_positive() const + + Return true if ``*this`` is negative + + .. cpp:function:: BigInt abs() const + + Return absolute value of ``*this`` + + .. cpp:function:: void binary_encode(uint8_t buf[]) const + + Encode this BigInt as a big-endian integer. The sign is ignored. + + .. cpp:function:: void binary_decode(uint8_t buf[]) + + Decode this BigInt as a big-endian integer. Number Theory ---------------------------------------- @@ -58,6 +217,10 @@ Number theoretic functions available include: Returns an integer z which is the smallest integer such that z % x == 0 and z % y == 0 +.. cpp:function:: BigInt jacobi(BigInt a, BigInt n) + + Return Jacobi symbol of (a|n). + .. cpp:function:: BigInt inverse_mod(BigInt x, BigInt m) Returns the modular inverse of x modulo m, that is, an integer @@ -86,15 +249,6 @@ Number theoretic functions available include: chosen (ie, there is no danger it was chosen maliciously) as far fewer tests are needed in that case. -.. cpp:function:: bool quick_check_prime(BigInt n, RandomNumberGenerator& rng) - -.. cpp:function:: bool check_prime(BigInt n, RandomNumberGenerator& rng) - -.. cpp:function:: bool verify_prime(BigInt n, RandomNumberGenerator& rng) - - Three variations on *is_prime*, with probabilities set to 32, 56, and 80 - respectively. - .. cpp:function:: BigInt random_prime(RandomNumberGenerator& rng, \ size_t bits, \ BigInt coprime = 1, \ From 8f3f7743472ba625a0bb249cd06651ed13325b87 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Fri, 11 May 2018 14:36:24 -0400 Subject: [PATCH 087/174] Add docs for TOTP --- doc/manual/otp.rst | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/doc/manual/otp.rst b/doc/manual/otp.rst index 5c49c45330e..5a7864afd50 100644 --- a/doc/manual/otp.rst +++ b/doc/manual/otp.rst @@ -65,3 +65,32 @@ given to any other symmetric key or plaintext password. then always returns (false,starting_counter), since the last successful authentication counter has not changed. + +TOTP +^^^^^^^^^^ + +TOTP is based on the same algorithm as HOTP, but instead of a counter a +timestamp is used. + +.. cpp:class:: TOTP + + .. cpp:function:: TOTP(const SymmetricKey& key, const std::string& hash_algo = "SHA-1", \ + size_t digits = 6, size_t time_step = 30) + + Setup to perform TOTP authentication using secret key *key*. + + .. cpp:function:: uint32_t generate_totp(std::chrono::system_clock::time_point time_point) + + .. cpp:function:: uint32_t generate_totp(uint64_t unix_time) + + Generate and return a TOTP code based on a timestamp. + + .. cpp:function:: bool verify_totp(uint32_t otp, std::chrono::system_clock::time_point time, \ + size_t clock_drift_accepted = 0) + + .. cpp:function:: bool verify_totp(uint32_t otp, uint64_t unix_time, \ + size_t clock_drift_accepted = 0) + + Return true if the provided OTP code is correct for the provided + timestamp. If required, use *clock_drift_accepted* to deal with + the client and server having slightly different clocks. From 85aa2ad493b0352e940ef7b1756a5c858c857488 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Sun, 13 May 2018 12:00:58 -0400 Subject: [PATCH 088/174] Fixes for compilation in C++17 mode by MSVC Fixes GH #1566 --- src/lib/utils/filesystem.cpp | 10 +++++++--- src/tests/test_x509_path.cpp | 19 ++++++++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/lib/utils/filesystem.cpp b/src/lib/utils/filesystem.cpp index 9ce23d0c6d0..fbfafdf5b32 100644 --- a/src/lib/utils/filesystem.cpp +++ b/src/lib/utils/filesystem.cpp @@ -35,17 +35,21 @@ namespace { #if defined(BOTAN_TARGET_OS_HAS_STL_FILESYSTEM_MSVC) && defined(BOTAN_BUILD_COMPILER_IS_MSVC) std::vector impl_stl_filesystem(const std::string& dir) { +#if (_MSVC_LANG >= 201703L) + using namespace std::filesystem; +#else using namespace std::tr2::sys; +#endif std::vector out; path p(dir); - if (is_directory(p)) + if(is_directory(p)) { - for (recursive_directory_iterator itr(p), end; itr != end; ++itr) + for(recursive_directory_iterator itr(p), end; itr != end; ++itr) { - if (is_regular_file(itr->path())) + if(is_regular_file(itr->path())) { out.push_back(itr->path().string()); } diff --git a/src/tests/test_x509_path.cpp b/src/tests/test_x509_path.cpp index 43ecb81e0b6..080a78e5800 100644 --- a/src/tests/test_x509_path.cpp +++ b/src/tests/test_x509_path.cpp @@ -578,16 +578,21 @@ std::vector BSI_Path_Validation_Tests::run() * the validation function may be relevant, i.e. if issuer DNs are * ambiguous. */ - auto uniform_shuffle = [](size_t m) -> size_t - { - size_t s; - Test::rng().randomize(reinterpret_cast(&s), sizeof(s)); - return s % m; - }; + struct random_bit_generator { + using result_type = size_t; + static result_type min() { return 0; } + static result_type max() { return std::numeric_limits::max(); } + result_type operator()() + { + size_t s; + Test::rng().randomize(reinterpret_cast(&s), sizeof(s)); + return s; + } + } rbg; for(size_t r = 0; r < 16; r++) { - std::random_shuffle(++(certs.begin()), certs.end(), uniform_shuffle); + std::shuffle(++(certs.begin()), certs.end(), rbg); Botan::Path_Validation_Result validation_result = Botan::x509_path_validate(certs, restrictions, trusted, "", From 1fcf8c6ba3f8912c9c6cba0555597ab0083eaaa2 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Sun, 13 May 2018 12:49:40 -0400 Subject: [PATCH 089/174] Add message to BOTAN_ARG_CHECK and use it more widely --- src/lib/asn1/asn1_time.cpp | 16 +++++------- src/lib/base/sym_algo.cpp | 25 +++++++++++++++++++ src/lib/base/sym_algo.h | 14 ++--------- src/lib/block/aes/aes.cpp | 3 +-- src/lib/block/aria/aria.cpp | 9 ++++--- src/lib/block/block_cipher.cpp | 1 + src/lib/block/blowfish/blowfish.cpp | 8 ++---- src/lib/block/gost_28147/gost_28147.cpp | 1 + src/lib/block/lion/lion.cpp | 1 + src/lib/block/threefish_512/threefish_512.cpp | 4 +-- src/lib/hash/sha3/sha3.cpp | 4 +-- src/lib/kdf/hkdf/hkdf.cpp | 13 +++------- src/lib/kdf/prf_tls/prf_tls.cpp | 1 + src/lib/kdf/sp800_108/sp800_108.cpp | 2 +- src/lib/mac/cmac/cmac.cpp | 1 + src/lib/mac/gmac/gmac.cpp | 1 + src/lib/mac/hmac/hmac.cpp | 4 +-- src/lib/mac/mac.cpp | 8 ++++++ src/lib/mac/mac.h | 7 +----- src/lib/math/mp/mp_monty.cpp | 3 +-- src/lib/misc/hotp/hotp.cpp | 5 ++-- src/lib/misc/hotp/totp.cpp | 3 +-- src/lib/misc/rfc3394/rfc3394.cpp | 12 ++++----- src/lib/modes/aead/ccm/ccm.cpp | 10 ++++---- src/lib/modes/aead/gcm/gcm.cpp | 8 +++--- src/lib/modes/aead/ocb/ocb.cpp | 10 +++++--- src/lib/pbkdf/pbkdf.cpp | 1 + src/lib/pbkdf/pbkdf.h | 6 +---- src/lib/pbkdf/pbkdf2/pbkdf2.cpp | 1 + src/lib/pbkdf/pgp_s2k/pgp_s2k.cpp | 1 + src/lib/psk_db/psk_db.cpp | 1 + src/lib/pubkey/ec_group/point_gfp.h | 1 + src/lib/stream/chacha/chacha.cpp | 5 ++-- src/lib/stream/ctr/ctr.cpp | 5 ++-- src/lib/stream/ofb/ofb.cpp | 1 + src/lib/stream/salsa20/salsa20.cpp | 1 + src/lib/stream/shake_cipher/shake_cipher.cpp | 1 + src/lib/stream/stream_cipher.cpp | 1 + src/lib/tls/tls_ciphersuite.cpp | 1 + src/lib/utils/assert.cpp | 13 +++++++++- src/lib/utils/assert.h | 13 ++++++++++ src/lib/utils/donna128.h | 2 +- src/lib/utils/exceptn.h | 3 --- src/lib/utils/rounding.h | 2 +- 44 files changed, 138 insertions(+), 95 deletions(-) create mode 100644 src/lib/base/sym_algo.cpp diff --git a/src/lib/asn1/asn1_time.cpp b/src/lib/asn1/asn1_time.cpp index 863a064f0b4..43f94af6aac 100644 --- a/src/lib/asn1/asn1_time.cpp +++ b/src/lib/asn1/asn1_time.cpp @@ -37,8 +37,8 @@ X509_Time::X509_Time(const std::string& t_spec, ASN1_Tag tag) void X509_Time::encode_into(DER_Encoder& der) const { - if(m_tag != GENERALIZED_TIME && m_tag != UTC_TIME) - throw Invalid_Argument("X509_Time: Bad encoding tag"); + BOTAN_ARG_CHECK(m_tag == UTC_TIME || m_tag == GENERALIZED_TIME, + "X509_Time: Bad encoding tag"); der.add_object(m_tag, UNIVERSAL, to_string()); } @@ -161,21 +161,17 @@ void X509_Time::set_to(const std::string& t_spec, ASN1_Tag spec_tag) BOTAN_ASSERT(spec_tag == UTC_TIME || spec_tag == GENERALIZED_TIME, "Invalid tag."); - if(t_spec.empty()) - throw Invalid_Argument("Time string must not be empty."); + BOTAN_ARG_CHECK(t_spec.size() > 0, "Time string must not be empty."); - if(t_spec.back() != 'Z') - throw Unsupported_Argument("Botan does not support times with timezones other than Z: " + t_spec); + BOTAN_ARG_CHECK(t_spec.back() == 'Z', "Botan does not support times with timezones other than Z"); if(spec_tag == GENERALIZED_TIME) { - if(t_spec.size() != 15) - throw Invalid_Argument("Invalid GeneralizedTime string: '" + t_spec + "'"); + BOTAN_ARG_CHECK(t_spec.size() == 15, "Invalid GeneralizedTime string"); } else if(spec_tag == UTC_TIME) { - if(t_spec.size() != 13) - throw Invalid_Argument("Invalid UTCTime string: '" + t_spec + "'"); + BOTAN_ARG_CHECK(t_spec.size() == 13, "Invalid UTCTime string"); } const size_t YEAR_SIZE = (spec_tag == UTC_TIME) ? 2 : 4; diff --git a/src/lib/base/sym_algo.cpp b/src/lib/base/sym_algo.cpp new file mode 100644 index 00000000000..c6062667b27 --- /dev/null +++ b/src/lib/base/sym_algo.cpp @@ -0,0 +1,25 @@ +/* +* (C) 2018 Jack Lloyd +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include +#include + +namespace Botan { + +void SymmetricAlgorithm::verify_key_set(bool cond) const + { + if(cond == false) + throw Key_Not_Set(name()); + } + +void SymmetricAlgorithm::set_key(const uint8_t key[], size_t length) + { + if(!valid_keylength(length)) + throw Invalid_Key_Length(name(), length); + key_schedule(key, length); + } + +} diff --git a/src/lib/base/sym_algo.h b/src/lib/base/sym_algo.h index a0ebac6260b..2dff9c40d37 100644 --- a/src/lib/base/sym_algo.h +++ b/src/lib/base/sym_algo.h @@ -9,7 +9,6 @@ #define BOTAN_SYMMETRIC_ALGORITHM_H_ #include -#include #include #include @@ -79,12 +78,7 @@ class BOTAN_PUBLIC_API(2,0) SymmetricAlgorithm * @param key the to be set as a byte array. * @param length in bytes of key param */ - void set_key(const uint8_t key[], size_t length) - { - if(!valid_keylength(length)) - throw Invalid_Key_Length(name(), length); - key_schedule(key, length); - } + void set_key(const uint8_t key[], size_t length); /** * @return the algorithm name @@ -92,11 +86,7 @@ class BOTAN_PUBLIC_API(2,0) SymmetricAlgorithm virtual std::string name() const = 0; protected: - void verify_key_set(bool cond) const - { - if(cond == false) - throw Key_Not_Set(name()); - } + void verify_key_set(bool cond) const; private: /** diff --git a/src/lib/block/aes/aes.cpp b/src/lib/block/aes/aes.cpp index c35bdabaaf5..403945cc91c 100644 --- a/src/lib/block/aes/aes.cpp +++ b/src/lib/block/aes/aes.cpp @@ -337,8 +337,7 @@ void aes_key_schedule(const uint8_t key[], size_t length, const size_t X = length / 4; // Can't happen, but make static analyzers happy - if(X != 4 && X != 6 && X != 8) - throw Invalid_Argument("Invalid AES key size"); + BOTAN_ARG_CHECK(X == 4 || X == 6 || X == 8, "Invalid AES key size"); for(size_t i = 0; i != X; ++i) XEK[i] = load_be(key, i); diff --git a/src/lib/block/aria/aria.cpp b/src/lib/block/aria/aria.cpp index 4b99d23065d..83383cce158 100644 --- a/src/lib/block/aria/aria.cpp +++ b/src/lib/block/aria/aria.cpp @@ -220,9 +220,6 @@ inline void ARIA_FE(uint32_t& T0, uint32_t& T1, uint32_t& T2, uint32_t& T3) void transform(const uint8_t in[], uint8_t out[], size_t blocks, const secure_vector& KS) { - if(KS.empty()) - throw Invalid_State("ARIA key was not set"); - // Hit every cache line of S1 and S2 const size_t cache_line_size = CPUID::cache_line_size(); @@ -436,31 +433,37 @@ void key_schedule(secure_vector& ERK, void ARIA_128::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { + verify_key_set(m_ERK.size() > 0); ARIA_F::transform(in, out, blocks, m_ERK); } void ARIA_192::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { + verify_key_set(m_ERK.size() > 0); ARIA_F::transform(in, out, blocks, m_ERK); } void ARIA_256::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { + verify_key_set(m_ERK.size() > 0); ARIA_F::transform(in, out, blocks, m_ERK); } void ARIA_128::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { + verify_key_set(m_DRK.size() > 0); ARIA_F::transform(in, out, blocks, m_DRK); } void ARIA_192::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { + verify_key_set(m_DRK.size() > 0); ARIA_F::transform(in, out, blocks, m_DRK); } void ARIA_256::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { + verify_key_set(m_DRK.size() > 0); ARIA_F::transform(in, out, blocks, m_DRK); } diff --git a/src/lib/block/block_cipher.cpp b/src/lib/block/block_cipher.cpp index 544cbbc36d4..3ace6cd4f49 100644 --- a/src/lib/block/block_cipher.cpp +++ b/src/lib/block/block_cipher.cpp @@ -7,6 +7,7 @@ #include #include +#include #if defined(BOTAN_HAS_AES) #include diff --git a/src/lib/block/blowfish/blowfish.cpp b/src/lib/block/blowfish/blowfish.cpp index 11a96cdb50a..077a6fb8140 100644 --- a/src/lib/block/blowfish/blowfish.cpp +++ b/src/lib/block/blowfish/blowfish.cpp @@ -350,12 +350,8 @@ void Blowfish::eks_key_schedule(const uint8_t key[], size_t length, * time being. * Bcrypt allows up to work factor 31 (2^31 iterations) */ - if(workfactor > 18) - throw Invalid_Argument("Requested Bcrypt work factor " + - std::to_string(workfactor) + " too large"); - - if(workfactor < 4) - throw Invalid_Argument("Bcrypt requires work factor at least 4"); + BOTAN_ARG_CHECK(workfactor >= 4 && workfactor <= 18, + "Invalid bcrypt work factor"); if(length > 72) { diff --git a/src/lib/block/gost_28147/gost_28147.cpp b/src/lib/block/gost_28147/gost_28147.cpp index b46d162de2e..45b23d55fb7 100644 --- a/src/lib/block/gost_28147/gost_28147.cpp +++ b/src/lib/block/gost_28147/gost_28147.cpp @@ -6,6 +6,7 @@ */ #include +#include #include namespace Botan { diff --git a/src/lib/block/lion/lion.cpp b/src/lib/block/lion/lion.cpp index cd7d25d9cc6..c9589a46ac0 100644 --- a/src/lib/block/lion/lion.cpp +++ b/src/lib/block/lion/lion.cpp @@ -6,6 +6,7 @@ */ #include +#include namespace Botan { diff --git a/src/lib/block/threefish_512/threefish_512.cpp b/src/lib/block/threefish_512/threefish_512.cpp index 0e6ba8889ec..7c368b409fc 100644 --- a/src/lib/block/threefish_512/threefish_512.cpp +++ b/src/lib/block/threefish_512/threefish_512.cpp @@ -239,8 +239,8 @@ void Threefish_512::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) void Threefish_512::set_tweak(const uint8_t tweak[], size_t len) { - if(len != 16) - throw Exception("Threefish-512 requires 128 bit tweak"); + BOTAN_ARG_CHECK(len == 16, "Threefish-512 requires 128 bit tweak"); + m_T.resize(3); m_T[0] = load_le(tweak, 0); m_T[1] = load_le(tweak, 1); diff --git a/src/lib/hash/sha3/sha3.cpp b/src/lib/hash/sha3/sha3.cpp index cf45e69031b..b69ef515a7d 100644 --- a/src/lib/hash/sha3/sha3.cpp +++ b/src/lib/hash/sha3/sha3.cpp @@ -146,7 +146,7 @@ void SHA_3::finish(size_t bitrate, secure_vector& S, size_t S_pos, uint8_t init_pad, uint8_t fini_pad) { - BOTAN_ARG_CHECK(bitrate % 64 == 0); + BOTAN_ARG_CHECK(bitrate % 64 == 0, "SHA-3 bitrate must be multiple of 64"); S[S_pos / 8] ^= static_cast(init_pad) << (8 * (S_pos % 8)); S[(bitrate / 64) - 1] ^= static_cast(fini_pad) << 56; @@ -158,7 +158,7 @@ void SHA_3::expand(size_t bitrate, secure_vector& S, uint8_t output[], size_t output_length) { - BOTAN_ARG_CHECK(bitrate % 64 == 0); + BOTAN_ARG_CHECK(bitrate % 64 == 0, "SHA-3 bitrate must be multiple of 64"); const size_t byterate = bitrate / 8; diff --git a/src/lib/kdf/hkdf/hkdf.cpp b/src/lib/kdf/hkdf/hkdf.cpp index 6ccd786c3d9..4b2ee1b3df4 100644 --- a/src/lib/kdf/hkdf/hkdf.cpp +++ b/src/lib/kdf/hkdf/hkdf.cpp @@ -80,18 +80,13 @@ hkdf_expand_label(const std::string& hash_fn, const uint8_t hash_val[], size_t hash_val_len, size_t length) { - if(length > 0xFFFF) - throw Invalid_Argument("HKDF-Expand-Label requested output too large"); - if(label.size() > 0xFF) - throw Invalid_Argument("HKDF-Expand-Label label too long"); - if(hash_val_len > 0xFF) - throw Invalid_Argument("HKDF-Expand-Label hash too long"); + BOTAN_ARG_CHECK(length <= 0xFFFF, "HKDF-Expand-Label requested output too large"); + BOTAN_ARG_CHECK(label.size() <= 0xFF, "HKDF-Expand-Label label too long"); + BOTAN_ARG_CHECK(hash_val_len <= 0xFF, "HKDF-Expand-Label hash too long"); const uint16_t length16 = static_cast(length); - auto mac = MessageAuthenticationCode::create("HMAC(" + hash_fn + ")"); - if(!mac) - throw Invalid_Argument("HKDF-Expand-Label with HMAC(" + hash_fn + ") not available"); + auto mac = MessageAuthenticationCode::create_or_throw("HMAC(" + hash_fn + ")"); HKDF_Expand hkdf(mac.release()); diff --git a/src/lib/kdf/prf_tls/prf_tls.cpp b/src/lib/kdf/prf_tls/prf_tls.cpp index d914df77e89..4fde5ea58a7 100644 --- a/src/lib/kdf/prf_tls/prf_tls.cpp +++ b/src/lib/kdf/prf_tls/prf_tls.cpp @@ -6,6 +6,7 @@ */ #include +#include namespace Botan { diff --git a/src/lib/kdf/sp800_108/sp800_108.cpp b/src/lib/kdf/sp800_108/sp800_108.cpp index 137ade10617..990e1038608 100644 --- a/src/lib/kdf/sp800_108/sp800_108.cpp +++ b/src/lib/kdf/sp800_108/sp800_108.cpp @@ -6,7 +6,7 @@ */ #include - +#include #include namespace Botan { diff --git a/src/lib/mac/cmac/cmac.cpp b/src/lib/mac/cmac/cmac.cpp index bd2a53a7215..38752471dd5 100644 --- a/src/lib/mac/cmac/cmac.cpp +++ b/src/lib/mac/cmac/cmac.cpp @@ -6,6 +6,7 @@ */ #include +#include #include namespace Botan { diff --git a/src/lib/mac/gmac/gmac.cpp b/src/lib/mac/gmac/gmac.cpp index a4e84f57b63..27eccdde3f3 100644 --- a/src/lib/mac/gmac/gmac.cpp +++ b/src/lib/mac/gmac/gmac.cpp @@ -8,6 +8,7 @@ #include #include +#include #include namespace Botan { diff --git a/src/lib/mac/hmac/hmac.cpp b/src/lib/mac/hmac/hmac.cpp index 532c982742b..72c617c5b46 100644 --- a/src/lib/mac/hmac/hmac.cpp +++ b/src/lib/mac/hmac/hmac.cpp @@ -100,8 +100,8 @@ MessageAuthenticationCode* HMAC::clone() const */ HMAC::HMAC(HashFunction* hash) : m_hash(hash) { - if(m_hash->hash_block_size() == 0) - throw Invalid_Argument("HMAC cannot be used with " + m_hash->name()); + BOTAN_ARG_CHECK(m_hash->hash_block_size() > 0, + "HMAC is not compatible with this hash function"); } } diff --git a/src/lib/mac/mac.cpp b/src/lib/mac/mac.cpp index 65107470bc3..4c3fc5230e8 100644 --- a/src/lib/mac/mac.cpp +++ b/src/lib/mac/mac.cpp @@ -6,6 +6,7 @@ */ #include +#include #include #include @@ -147,6 +148,13 @@ MessageAuthenticationCode::create_or_throw(const std::string& algo, throw Lookup_Error("MAC", algo, provider); } +void MessageAuthenticationCode::start_msg(const uint8_t nonce[], size_t nonce_len) + { + BOTAN_UNUSED(nonce); + if(nonce_len > 0) + throw Invalid_IV_Length(name(), nonce_len); + } + /* * Default (deterministic) MAC verification operation */ diff --git a/src/lib/mac/mac.h b/src/lib/mac/mac.h index 1e358a4c56d..de30b7dbb2c 100644 --- a/src/lib/mac/mac.h +++ b/src/lib/mac/mac.h @@ -64,12 +64,7 @@ class BOTAN_PUBLIC_API(2,0) MessageAuthenticationCode : public Buffered_Computat * Default implementation simply rejects all non-empty nonces * since most hash/MAC algorithms do not support randomization */ - virtual void start_msg(const uint8_t nonce[], size_t nonce_len) - { - BOTAN_UNUSED(nonce); - if(nonce_len > 0) - throw Invalid_IV_Length(name(), nonce_len); - } + virtual void start_msg(const uint8_t nonce[], size_t nonce_len); /** * Begin processing a message with a nonce diff --git a/src/lib/math/mp/mp_monty.cpp b/src/lib/math/mp/mp_monty.cpp index 5a28526ff4a..3231c610bff 100644 --- a/src/lib/math/mp/mp_monty.cpp +++ b/src/lib/math/mp/mp_monty.cpp @@ -25,8 +25,7 @@ void bigint_monty_redc(word z[], { const size_t z_size = 2*(p_size+1); - if(ws_size < z_size) - throw Invalid_Argument("bigint_monty_redc workspace too small"); + BOTAN_ARG_CHECK(ws_size >= z_size, "workspace too small"); CT::poison(z, z_size); CT::poison(p, p_size); diff --git a/src/lib/misc/hotp/hotp.cpp b/src/lib/misc/hotp/hotp.cpp index f07c11c9f0c..e4dc6e5e336 100644 --- a/src/lib/misc/hotp/hotp.cpp +++ b/src/lib/misc/hotp/hotp.cpp @@ -6,19 +6,20 @@ */ #include +#include namespace Botan { HOTP::HOTP(const SymmetricKey& key, const std::string& hash_algo, size_t digits) { + BOTAN_ARG_CHECK(digits == 6 || digits == 7 || digits == 8, "Invalid HOTP digits"); + if(digits == 6) m_digit_mod = 1000000; else if(digits == 7) m_digit_mod = 10000000; else if(digits == 8) m_digit_mod = 100000000; - else - throw Invalid_Argument("Invalid HOTP digits"); /* RFC 4228 only supports SHA-1 but TOTP allows SHA-256 and SHA-512 diff --git a/src/lib/misc/hotp/totp.cpp b/src/lib/misc/hotp/totp.cpp index c3203c32a4e..02bc42aa6dd 100644 --- a/src/lib/misc/hotp/totp.cpp +++ b/src/lib/misc/hotp/totp.cpp @@ -20,8 +20,7 @@ TOTP::TOTP(const SymmetricKey& key, const std::string& hash_algo, * Technically any time step except 0 is valid, but 30 is typical * and over 5 minutes seems unlikely. */ - if(m_time_step == 0 || m_time_step > 300) - throw Invalid_Argument("Invalid TOTP time step"); + BOTAN_ARG_CHECK(m_time_step > 0 && m_time_step < 300, "Invalid TOTP time step"); } uint32_t TOTP::generate_totp(std::chrono::system_clock::time_point current_time) diff --git a/src/lib/misc/rfc3394/rfc3394.cpp b/src/lib/misc/rfc3394/rfc3394.cpp index 8e69933c717..cb248099846 100644 --- a/src/lib/misc/rfc3394/rfc3394.cpp +++ b/src/lib/misc/rfc3394/rfc3394.cpp @@ -14,8 +14,8 @@ namespace Botan { secure_vector rfc3394_keywrap(const secure_vector& key, const SymmetricKey& kek) { - if(kek.size() != 16 && kek.size() != 24 && kek.size() != 32) - throw Invalid_Argument("Bad KEK length " + std::to_string(kek.size()) + " for NIST key wrap"); + BOTAN_ARG_CHECK(kek.size() == 16 || kek.size() == 24 || kek.size() == 32, + "Invalid KEK length for NIST key wrap"); const std::string cipher_name = "AES-" + std::to_string(8*kek.size()); std::unique_ptr aes(BlockCipher::create_or_throw(cipher_name)); @@ -28,11 +28,11 @@ secure_vector rfc3394_keywrap(const secure_vector& key, secure_vector rfc3394_keyunwrap(const secure_vector& key, const SymmetricKey& kek) { - if(key.size() < 16 || key.size() % 8 != 0) - throw Invalid_Argument("Bad input key size for NIST key unwrap"); + BOTAN_ARG_CHECK(kek.size() == 16 || kek.size() == 24 || kek.size() == 32, + "Invalid KEK length for NIST key wrap"); - if(kek.size() != 16 && kek.size() != 24 && kek.size() != 32) - throw Invalid_Argument("Bad KEK length " + std::to_string(kek.size()) + " for NIST key unwrap"); + BOTAN_ARG_CHECK(key.size() >= 16 && key.size() % 8 == 0, + "Bad input key size for NIST key unwrap"); const std::string cipher_name = "AES-" + std::to_string(8*kek.size()); std::unique_ptr aes(BlockCipher::create_or_throw(cipher_name)); diff --git a/src/lib/modes/aead/ccm/ccm.cpp b/src/lib/modes/aead/ccm/ccm.cpp index 6149718f0a1..410bd6910b7 100644 --- a/src/lib/modes/aead/ccm/ccm.cpp +++ b/src/lib/modes/aead/ccm/ccm.cpp @@ -88,7 +88,7 @@ void CCM_Mode::set_associated_data(const uint8_t ad[], size_t length) if(length) { // FIXME: support larger AD using length encoding rules - BOTAN_ASSERT(length < (0xFFFF - 0xFF), "Supported CCM AD length"); + BOTAN_ARG_CHECK(length < (0xFFFF - 0xFF), "Supported CCM AD length"); m_ad_buf.push_back(get_byte(0, static_cast(length))); m_ad_buf.push_back(get_byte(1, static_cast(length))); @@ -160,7 +160,7 @@ secure_vector CCM_Mode::format_c0() void CCM_Encryption::finish(secure_vector& buffer, size_t offset) { - BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); + BOTAN_ARG_CHECK(buffer.size() >= offset, "Offset is sane"); buffer.insert(buffer.begin() + offset, msg_buf().begin(), msg_buf().end()); @@ -168,7 +168,7 @@ void CCM_Encryption::finish(secure_vector& buffer, size_t offset) uint8_t* buf = buffer.data() + offset; const secure_vector& ad = ad_buf(); - BOTAN_ASSERT(ad.size() % CCM_BS == 0, "AD is block size multiple"); + BOTAN_ARG_CHECK(ad.size() % CCM_BS == 0, "AD is block size multiple"); const BlockCipher& E = cipher(); @@ -211,7 +211,7 @@ void CCM_Encryption::finish(secure_vector& buffer, size_t offset) void CCM_Decryption::finish(secure_vector& buffer, size_t offset) { - BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); + BOTAN_ARG_CHECK(buffer.size() >= offset, "Offset is sane"); buffer.insert(buffer.begin() + offset, msg_buf().begin(), msg_buf().end()); @@ -221,7 +221,7 @@ void CCM_Decryption::finish(secure_vector& buffer, size_t offset) BOTAN_ASSERT(sz >= tag_size(), "We have the tag"); const secure_vector& ad = ad_buf(); - BOTAN_ASSERT(ad.size() % CCM_BS == 0, "AD is block size multiple"); + BOTAN_ARG_CHECK(ad.size() % CCM_BS == 0, "AD is block size multiple"); const BlockCipher& E = cipher(); diff --git a/src/lib/modes/aead/gcm/gcm.cpp b/src/lib/modes/aead/gcm/gcm.cpp index b0240eb7ff8..2bdae3a6fff 100644 --- a/src/lib/modes/aead/gcm/gcm.cpp +++ b/src/lib/modes/aead/gcm/gcm.cpp @@ -110,7 +110,7 @@ void GCM_Mode::start_msg(const uint8_t nonce[], size_t nonce_len) size_t GCM_Encryption::process(uint8_t buf[], size_t sz) { - BOTAN_ARG_CHECK(sz % update_granularity() == 0); + BOTAN_ARG_CHECK(sz % update_granularity() == 0, "Invalid buffer size"); m_ctr->cipher(buf, buf, sz); m_ghash->update(buf, sz); return sz; @@ -118,7 +118,7 @@ size_t GCM_Encryption::process(uint8_t buf[], size_t sz) void GCM_Encryption::finish(secure_vector& buffer, size_t offset) { - BOTAN_ARG_CHECK(offset <= buffer.size()); + BOTAN_ARG_CHECK(offset <= buffer.size(), "Invalid offset"); const size_t sz = buffer.size() - offset; uint8_t* buf = buffer.data() + offset; @@ -130,7 +130,7 @@ void GCM_Encryption::finish(secure_vector& buffer, size_t offset) size_t GCM_Decryption::process(uint8_t buf[], size_t sz) { - BOTAN_ARG_CHECK(sz % update_granularity() == 0); + BOTAN_ARG_CHECK(sz % update_granularity() == 0, "Invalid buffer size"); m_ghash->update(buf, sz); m_ctr->cipher(buf, buf, sz); return sz; @@ -138,7 +138,7 @@ size_t GCM_Decryption::process(uint8_t buf[], size_t sz) void GCM_Decryption::finish(secure_vector& buffer, size_t offset) { - BOTAN_ARG_CHECK(offset <= buffer.size()); + BOTAN_ARG_CHECK(offset <= buffer.size(), "Invalid offset"); const size_t sz = buffer.size() - offset; uint8_t* buf = buffer.data() + offset; diff --git a/src/lib/modes/aead/ocb/ocb.cpp b/src/lib/modes/aead/ocb/ocb.cpp index 23af75e8f8c..317b417b3fc 100644 --- a/src/lib/modes/aead/ocb/ocb.cpp +++ b/src/lib/modes/aead/ocb/ocb.cpp @@ -171,11 +171,13 @@ OCB_Mode::OCB_Mode(BlockCipher* cipher, size_t tag_size) : * sizes but only 128, 192, 256 and 512 bit are currently supported * by this implementation. */ - if(BS != 16 && BS != 24 && BS != 32 && BS != 64) - throw Invalid_Argument("OCB does not support cipher " + m_cipher->name()); + BOTAN_ARG_CHECK(BS == 16 || BS == 24 || BS == 32 || BS == 64, + "Invalid block size for OCB"); - if(m_tag_size % 4 != 0 || m_tag_size < 8 || m_tag_size > BS || m_tag_size > 32) - throw Invalid_Argument("Invalid OCB tag length"); + BOTAN_ARG_CHECK(m_tag_size % 4 == 0 && + m_tag_size >= 8 && m_tag_size <= BS && + m_tag_size <= 32, + "Invalid OCB tag length"); } OCB_Mode::~OCB_Mode() { /* for unique_ptr destructor */ } diff --git a/src/lib/pbkdf/pbkdf.cpp b/src/lib/pbkdf/pbkdf.cpp index d2dfc3d4163..73b482725c7 100644 --- a/src/lib/pbkdf/pbkdf.cpp +++ b/src/lib/pbkdf/pbkdf.cpp @@ -6,6 +6,7 @@ */ #include +#include #include #if defined(BOTAN_HAS_PBKDF1) diff --git a/src/lib/pbkdf/pbkdf.h b/src/lib/pbkdf/pbkdf.h index 181195dad0c..7d3bceffcf8 100644 --- a/src/lib/pbkdf/pbkdf.h +++ b/src/lib/pbkdf/pbkdf.h @@ -9,7 +9,6 @@ #define BOTAN_PBKDF_H_ #include -#include #include namespace Botan { @@ -230,10 +229,7 @@ typedef PBKDF S2K; inline PBKDF* get_pbkdf(const std::string& algo_spec, const std::string& provider = "") { - std::unique_ptr p(PBKDF::create(algo_spec, provider)); - if(p) - return p.release(); - throw Algorithm_Not_Found(algo_spec); + return PBKDF::create_or_throw(algo_spec, provider).release(); } inline PBKDF* get_s2k(const std::string& algo_spec) diff --git a/src/lib/pbkdf/pbkdf2/pbkdf2.cpp b/src/lib/pbkdf/pbkdf2/pbkdf2.cpp index d4388bd10e7..cc2982f6e93 100644 --- a/src/lib/pbkdf/pbkdf2/pbkdf2.cpp +++ b/src/lib/pbkdf/pbkdf2/pbkdf2.cpp @@ -6,6 +6,7 @@ */ #include +#include #include namespace Botan { diff --git a/src/lib/pbkdf/pgp_s2k/pgp_s2k.cpp b/src/lib/pbkdf/pgp_s2k/pgp_s2k.cpp index 14f21eae2e8..df659de3c86 100644 --- a/src/lib/pbkdf/pgp_s2k/pgp_s2k.cpp +++ b/src/lib/pbkdf/pgp_s2k/pgp_s2k.cpp @@ -6,6 +6,7 @@ */ #include +#include namespace Botan { diff --git a/src/lib/psk_db/psk_db.cpp b/src/lib/psk_db/psk_db.cpp index af59d2954a2..4851f6bd284 100644 --- a/src/lib/psk_db/psk_db.cpp +++ b/src/lib/psk_db/psk_db.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include #include diff --git a/src/lib/pubkey/ec_group/point_gfp.h b/src/lib/pubkey/ec_group/point_gfp.h index cce2adcc639..39188ba217f 100644 --- a/src/lib/pubkey/ec_group/point_gfp.h +++ b/src/lib/pubkey/ec_group/point_gfp.h @@ -11,6 +11,7 @@ #define BOTAN_POINT_GFP_H_ #include +#include #include namespace Botan { diff --git a/src/lib/stream/chacha/chacha.cpp b/src/lib/stream/chacha/chacha.cpp index 0f1e082cfe5..acf79cbd92c 100644 --- a/src/lib/stream/chacha/chacha.cpp +++ b/src/lib/stream/chacha/chacha.cpp @@ -6,6 +6,7 @@ */ #include +#include #include #include @@ -13,8 +14,8 @@ namespace Botan { ChaCha::ChaCha(size_t rounds) : m_rounds(rounds) { - if(m_rounds != 8 && m_rounds != 12 && m_rounds != 20) - throw Invalid_Argument("ChaCha only supports 8, 12 or 20 rounds"); + BOTAN_ARG_CHECK(m_rounds == 8 || m_rounds == 12 || m_rounds == 20, + "ChaCha only supports 8, 12 or 20 rounds"); } std::string ChaCha::provider() const diff --git a/src/lib/stream/ctr/ctr.cpp b/src/lib/stream/ctr/ctr.cpp index c63bdebdcbf..26164634432 100644 --- a/src/lib/stream/ctr/ctr.cpp +++ b/src/lib/stream/ctr/ctr.cpp @@ -6,6 +6,7 @@ */ #include +#include #include namespace Botan { @@ -30,8 +31,8 @@ CTR_BE::CTR_BE(BlockCipher* cipher, size_t ctr_size) : m_pad(m_counter.size()), m_pad_pos(0) { - if(m_ctr_size < 4 || m_ctr_size > m_block_size) - throw Invalid_Argument("Invalid CTR-BE counter size"); + BOTAN_ARG_CHECK(m_ctr_size >= 4 && m_ctr_size <= m_block_size, + "Invalid CTR-BE counter size"); } void CTR_BE::clear() diff --git a/src/lib/stream/ofb/ofb.cpp b/src/lib/stream/ofb/ofb.cpp index 75b7048aaf6..ca3971dc230 100644 --- a/src/lib/stream/ofb/ofb.cpp +++ b/src/lib/stream/ofb/ofb.cpp @@ -6,6 +6,7 @@ */ #include +#include namespace Botan { diff --git a/src/lib/stream/salsa20/salsa20.cpp b/src/lib/stream/salsa20/salsa20.cpp index ce22adcb745..46499e69e87 100644 --- a/src/lib/stream/salsa20/salsa20.cpp +++ b/src/lib/stream/salsa20/salsa20.cpp @@ -6,6 +6,7 @@ */ #include +#include #include namespace Botan { diff --git a/src/lib/stream/shake_cipher/shake_cipher.cpp b/src/lib/stream/shake_cipher/shake_cipher.cpp index 72a8fd8858d..f6cac8354d7 100644 --- a/src/lib/stream/shake_cipher/shake_cipher.cpp +++ b/src/lib/stream/shake_cipher/shake_cipher.cpp @@ -6,6 +6,7 @@ */ #include +#include #include #include diff --git a/src/lib/stream/stream_cipher.cpp b/src/lib/stream/stream_cipher.cpp index 77e68d129db..692464723c8 100644 --- a/src/lib/stream/stream_cipher.cpp +++ b/src/lib/stream/stream_cipher.cpp @@ -7,6 +7,7 @@ #include #include +#include #if defined(BOTAN_HAS_CHACHA) #include diff --git a/src/lib/tls/tls_ciphersuite.cpp b/src/lib/tls/tls_ciphersuite.cpp index d1a509d78f5..b8a7e70d7fe 100644 --- a/src/lib/tls/tls_ciphersuite.cpp +++ b/src/lib/tls/tls_ciphersuite.cpp @@ -6,6 +6,7 @@ */ #include +#include #include #include #include diff --git a/src/lib/utils/assert.cpp b/src/lib/utils/assert.cpp index d729a836855..cd957e00d1d 100644 --- a/src/lib/utils/assert.cpp +++ b/src/lib/utils/assert.cpp @@ -1,6 +1,6 @@ /* * Runtime assertion checking -* (C) 2010,2012 Jack Lloyd +* (C) 2010,2012,2018 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -10,6 +10,17 @@ namespace Botan { +void throw_invalid_argument(const char* message, + const char* func, + const char* file) + { + std::ostringstream format; + + format << message << " in " << func << ":" << file; + + throw Invalid_Argument(format.str()); + } + void assertion_failure(const char* expr_str, const char* assertion_made, const char* func, diff --git a/src/lib/utils/assert.h b/src/lib/utils/assert.h index d23558cd03e..a12872f2bc8 100644 --- a/src/lib/utils/assert.h +++ b/src/lib/utils/assert.h @@ -16,6 +16,7 @@ namespace Botan { /** * Called when an assertion fails +* Throws an Exception object */ BOTAN_NORETURN void BOTAN_PUBLIC_API(2,0) assertion_failure(const char* expr_str, @@ -24,6 +25,18 @@ BOTAN_NORETURN void BOTAN_PUBLIC_API(2,0) const char* file, int line); +/** +* Called when an invalid argument is used +* Throws Invalid_Argument +*/ +BOTAN_NORETURN void BOTAN_UNSTABLE_API throw_invalid_argument(const char* message, + const char* func, + const char* file); + + +#define BOTAN_ARG_CHECK(expr, msg) \ + do { if(!(expr)) Botan::throw_invalid_argument(msg, BOTAN_CURRENT_FUNCTION, __FILE__); } while(0) + /** * Make an assertion */ diff --git a/src/lib/utils/donna128.h b/src/lib/utils/donna128.h index 90ced395d26..ff571906d88 100644 --- a/src/lib/utils/donna128.h +++ b/src/lib/utils/donna128.h @@ -82,7 +82,7 @@ class donna128 final inline donna128 operator*(const donna128& x, uint64_t y) { - BOTAN_ASSERT(x.hi() == 0, "High 64 bits of donna128 set to zero during multiply"); + BOTAN_ARG_CHECK(x.hi() == 0, "High 64 bits of donna128 set to zero during multiply"); uint64_t lo = 0, hi = 0; mul64x64_128(x.lo(), y, &lo, &hi); diff --git a/src/lib/utils/exceptn.h b/src/lib/utils/exceptn.h index 2d242339dfa..f2896aa83b2 100644 --- a/src/lib/utils/exceptn.h +++ b/src/lib/utils/exceptn.h @@ -38,9 +38,6 @@ class BOTAN_PUBLIC_API(2,0) Invalid_Argument : public Exception explicit Invalid_Argument(const std::string& msg, const std::string& where); }; -#define BOTAN_ARG_CHECK(expr) \ - do { if(!(expr)) throw Invalid_Argument(#expr, BOTAN_CURRENT_FUNCTION); } while(0) - /** * Unsupported_Argument Exception * diff --git a/src/lib/utils/rounding.h b/src/lib/utils/rounding.h index a06626b88d1..a03e3a4ee27 100644 --- a/src/lib/utils/rounding.h +++ b/src/lib/utils/rounding.h @@ -20,7 +20,7 @@ namespace Botan { */ inline size_t round_up(size_t n, size_t align_to) { - BOTAN_ASSERT(align_to != 0, "align_to must not be 0"); + BOTAN_ARG_CHECK(align_to != 0, "align_to must not be 0"); if(n % align_to) n += align_to - (n % align_to); From 05abe208647f6ae112bed0a1a8cee794a55fcfa5 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Sun, 13 May 2018 12:54:12 -0400 Subject: [PATCH 090/174] Apple Clang requires min/max be constexpr Add BOTAN_CONSTEXPR since we are still stuck with VC2013 for a while. --- src/lib/utils/compiler.h | 11 ++++++++++- src/tests/test_x509_path.cpp | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/lib/utils/compiler.h b/src/lib/utils/compiler.h index 68fc51e6d63..202b5cb755e 100644 --- a/src/lib/utils/compiler.h +++ b/src/lib/utils/compiler.h @@ -137,7 +137,7 @@ /* * Define BOTAN_CURRENT_FUNCTION */ -#if defined(_MSC_VER) +#if defined(BOTAN_BUILD_COMPILER_IS_MSVC_2013) #define BOTAN_CURRENT_FUNCTION __FUNCTION__ #else #define BOTAN_CURRENT_FUNCTION __func__ @@ -154,6 +154,15 @@ #define BOTAN_NOEXCEPT noexcept #endif +/* +* Define BOTAN_CONSTEXPR (for MSVC 2013) +*/ +#if defined(BOTAN_BUILD_COMPILER_IS_MSVC_2013) + #define BOTAN_CONSTEXPR /**/ +#else + #define BOTAN_CONSTEXPR constexpr +#endif + /* * Define BOTAN_ALIGNAS (for MSVC 2013) */ diff --git a/src/tests/test_x509_path.cpp b/src/tests/test_x509_path.cpp index 080a78e5800..22d6f1407e4 100644 --- a/src/tests/test_x509_path.cpp +++ b/src/tests/test_x509_path.cpp @@ -14,16 +14,16 @@ #include #include #include + #include + + #include + #include + #include + #include + #include + #include #endif -#include - -#include -#include -#include -#include -#include - namespace Botan_Tests { namespace { @@ -580,8 +580,8 @@ std::vector BSI_Path_Validation_Tests::run() */ struct random_bit_generator { using result_type = size_t; - static result_type min() { return 0; } - static result_type max() { return std::numeric_limits::max(); } + static BOTAN_CONSTEXPR result_type min() { return 0; } + static BOTAN_CONSTEXPR result_type max() { return std::numeric_limits::max(); } result_type operator()() { size_t s; From cc6f46322c01f39c428d36250d8348e777e5440f Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 14 May 2018 12:09:26 -0400 Subject: [PATCH 091/174] Always use 1/2^-128 error bounds with Miller-Rabin Simplifies the code and makes it easy to see we never use the weaker bounds even if the application expicitly requested it. GH #1569 --- src/lib/math/numbertheory/numthry.cpp | 38 ++++++++++----------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/src/lib/math/numbertheory/numthry.cpp b/src/lib/math/numbertheory/numthry.cpp index 10f44a1ee08..0e0893dd0c2 100644 --- a/src/lib/math/numbertheory/numthry.cpp +++ b/src/lib/math/numbertheory/numthry.cpp @@ -474,33 +474,23 @@ size_t mr_test_iterations(size_t n_bits, size_t prob, bool random) * These values are derived from the inequality for p(k,t) given on * the second page. */ - if(random) + if(prob <= 128) { - if(prob <= 80) - { - if(n_bits >= 1536) - return 2; // < 2^-89 - if(n_bits >= 1024) - return 3; // < 2^-89 - if(n_bits >= 512) - return 5; // < 2^-80 - if(n_bits >= 256) - return 11; // < 2^-80 - } - - if(prob <= 128) - { - if(n_bits >= 1536) - return 4; // < 2^-133 - if(n_bits >= 1024) - return 6; // < 2^-133 - if(n_bits >= 512) - return 12; // < 2^-129 - if(n_bits >= 256) - return 28; // < 2^-128 - } + if(n_bits >= 1536) + return 4; // < 2^-133 + if(n_bits >= 1024) + return 6; // < 2^-133 + if(n_bits >= 512) + return 12; // < 2^-129 + if(n_bits >= 256) + return 28; // < 2^-128 } + /* + If the user desires a smaller error probability than we have + precomputed error estimates for, just fall back to using the worst + case error rate. + */ return base; } From 006d926d17f4490d1cad8c8204d734fa683bf01d Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 15 May 2018 12:26:52 -0400 Subject: [PATCH 092/174] Add clarifying comments and increase M-R tests for 256-bit integers See #1542 and #1569 --- src/lib/math/numbertheory/numthry.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/lib/math/numbertheory/numthry.cpp b/src/lib/math/numbertheory/numthry.cpp index 0e0893dd0c2..1458a8943c7 100644 --- a/src/lib/math/numbertheory/numthry.cpp +++ b/src/lib/math/numbertheory/numthry.cpp @@ -449,11 +449,15 @@ bool mr_witness(BigInt&& y, if(y == 1) // found a non-trivial square root return true; - if(y == n_minus_1) // -1, trivial square root, so give up + /* + -1 is the trivial square root of unity, so ``a`` is not a + witness for this number - give up + */ + if(y == n_minus_1) return false; } - return true; // fails Fermat test + return true; // is a witness } size_t mr_test_iterations(size_t n_bits, size_t prob, bool random) @@ -483,7 +487,7 @@ size_t mr_test_iterations(size_t n_bits, size_t prob, bool random) if(n_bits >= 512) return 12; // < 2^-129 if(n_bits >= 256) - return 28; // < 2^-128 + return 29; // < 2^-128 } /* From 1edd844d4b59867e2dbbf135bc754dc220f375e3 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 15 May 2018 20:57:01 -0400 Subject: [PATCH 093/174] Doc updates [ci skip] --- doc/manual/block_cipher.rst | 6 +- doc/manual/contents.rst | 1 + doc/manual/ecc.rst | 284 ++++++++++++++++++++++++++++++++++++ 3 files changed, 288 insertions(+), 3 deletions(-) create mode 100644 doc/manual/ecc.rst diff --git a/doc/manual/block_cipher.rst b/doc/manual/block_cipher.rst index 3168846822e..6c8fa9c4503 100644 --- a/doc/manual/block_cipher.rst +++ b/doc/manual/block_cipher.rst @@ -5,10 +5,10 @@ Block ciphers are a n-bit permutation for some small n, typically 64 or 128 bits. They are a cryptographic primitive used to generate higher level operations such as authenticated encryption. -.. note:: +.. warning:: - In general a bare block cipher is not what you should be using. You probably - want a cipher mode instead (see :ref:`cipher_modes`) + In almost all cases, a bare block cipher is not what you should be using. + You probably want an authenticated cipher mode instead (see :ref:`cipher_modes`) .. cpp:class:: BlockCipher diff --git a/doc/manual/contents.rst b/doc/manual/contents.rst index f3c89cc1983..8fff7655067 100644 --- a/doc/manual/contents.rst +++ b/doc/manual/contents.rst @@ -30,6 +30,7 @@ Contents psk_db filters fpe + ecc compression pkcs11 tpm diff --git a/doc/manual/ecc.rst b/doc/manual/ecc.rst new file mode 100644 index 00000000000..72c90a3106f --- /dev/null +++ b/doc/manual/ecc.rst @@ -0,0 +1,284 @@ +Elliptic Curve Operations +============================ + +In addition to high level operations for signatures, key agreement, +and message encryption using elliptic curve cryptography, the library +contains lower level interfaces for performing operations such as +elliptic curve point multiplication. + +Only curves over prime fields are supported. + +Many of these functions take a workspace, either a vector of words or +a vector of BigInts. These are used to minimize memory allocations +during common operations. + +.. warning:: + You should only use these interfaces if you know what you are doing. + +.. cpp:class:: EC_Group + + .. cpp:function:: EC_Group(const OID& oid) + + Initialize an ``EC_Group`` using an OID referencing the curve + parameters. + + .. cpp:function:: EC_Group(const std::string& name) + + Initialize an ``EC_Group`` using a name or OID (for example + "secp256r1", or "1.2.840.10045.3.1.7") + + .. cpp:function:: EC_Group(const BigInt& p, \ + const BigInt& a, \ + const BigInt& b, \ + const BigInt& base_x, \ + const BigInt& base_y, \ + const BigInt& order, \ + const BigInt& cofactor, \ + const OID& oid = OID()) + + Initialize an elliptic curve group from the relevant parameters. This + is used for example to create custom (application-specific) curves. + + .. cpp:function:: EC_Group(const std::vector& ber_encoding) + + Initialize an ``EC_Group`` by decoding a DER encoded parameter block. + + .. cpp:function:: std::vector DER_encode(EC_Group_Encoding form) const + + Return the DER encoding of this group. + + .. cpp:function:: std::string PEM_encode() const + + Return the PEM encoding of this group (base64 of DER encoding plus + header/trailer). + + .. cpp:function:: bool a_is_minus_3() const + + Return true if the ``a`` parameter is congruent to -3 mod p. + + .. cpp:function:: bool a_is_zero() const + + Return true if the ``a`` parameter is congruent to 0 mod p. + + .. cpp:function:: size_t get_p_bits() const + + Return size of the prime in bits. + + .. cpp:function:: size_t get_p_bytes() const + + Return size of the prime in bytes. + + .. cpp:function:: size_t get_order_bits() const + + Return size of the group order in bits. + + .. cpp:function:: size_t get_order_bytes() const + + Return size of the group order in bytes. + + .. cpp:function:: const BigInt& get_p() const + + Return the prime modulus. + + .. cpp:function:: const BigInt& get_a() const + + Return the ``a`` parameter of the elliptic curve equation. + + .. cpp:function:: const BigInt& get_b() const + + Return the ``b`` parameter of the elliptic curve equation. + + .. cpp:function:: const PointGFp& get_base_point() const + + Return the groups base point element. + + .. cpp:function:: const BigInt& get_g_x() const + + Return the x coordinate of the base point element. + + .. cpp:function:: const BigInt& get_g_y() const + + Return the y coordinate of the base point element. + + .. cpp:function:: const BigInt& get_order() const + + Return the order of the group generated by the base point. + + .. cpp:function:: const BigInt& get_cofactor() const + + Return the cofactor of the curve. In most cases this will be 1. + + .. cpp:function:: BigInt mod_order(const BigInt& x) const + + Reduce argument ``x`` modulo the curve order. + + .. cpp:function:: BigInt inverse_mod_order(const BigInt& x) const + + Return inverse of argument ``x`` modulo the curve order. + + .. cpp:function:: BigInt multiply_mod_order(const BigInt& x, const BigInt& y) const + + Multiply ``x`` and ``y`` and reduce the result modulo the curve order. + + .. cpp:function:: bool verify_public_element(const PointGFp& y) const + + Return true if ``y`` seems to be a valid group element. + + .. cpp:function:: const OID& get_curve_oid() const + + Return the OID used to identify the curve. May be empty. + + .. cpp:function:: PointGFp point(const BigInt& x, const BigInt& y) const + + Create and return a point with affine elements ``x`` and ``y``. Note + this function *does not* verify that ``x`` and ``y`` satisfy the curve + equation. + + .. cpp:function:: PointGFp point_multiply(const BigInt& x, const PointGFp& pt, const BigInt& y) const + + Multi-exponentation. Returns base_point*x + pt*y. Not constant time. + (Ordinarily used for signature verification.) + + .. cpp:function:: PointGFp blinded_base_point_multiply(const BigInt& k, \ + RandomNumberGenerator& rng, \ + std::vector& ws) const + + Return ``base_point*k`` in a way that attempts to resist side channels. + + .. cpp:function:: BigInt blinded_base_point_multiply_x(const BigInt& k, \ + RandomNumberGenerator& rng, \ + std::vector& ws) const + + Like `blinded_base_point_multiply` but returns only the x coordinate. + + .. cpp:function:: PointGFp blinded_var_point_multiply(const PointGFp& point, \ + const BigInt& k, \ + RandomNumberGenerator& rng, \ + std::vector& ws) const + + Return ``point*k`` in a way that attempts to resist side channels. + + .. cpp:function:: BigInt random_scalar(RandomNumberGenerator& rng) const + + Return a random scalar (ie an integer between 1 and the group order). + + .. cpp:function:: PointGFp zero_point() const + + Return the zero point (aka the point at infinity). + + .. cpp:function:: PointGFp OS2ECP(const uint8_t bits[], size_t len) const + + Decode a point from the binary encoding. This function verifies that + the decoded point is a valid element on the curve. + + .. cpp:function:: bool verify_group(RandomNumberGenerator& rng, bool strong = false) const + + Attempt to verify the group seems valid. + + .. cpp:function:: static const std::set& known_named_groups() + + Return a list of known groups, ie groups for which ``EC_Group(name)`` + will succeed. + +.. cpp:class:: PointGFp + + Stores elliptic curve points in Jacobian representation. + + .. cpp:function:: std::vector encode(PointGFp::Compression_Type format) const + + Encode a point in a way that can later be decoded with `EC_Group::OS2ECP`. + + .. cpp:function:: PointGFp& operator+=(const PointGFp& rhs) + + Point addition. + + .. cpp:function:: PointGFp& operator-=(const PointGFp& rhs) + + Point subtraction. + + .. cpp:function:: PointGFp& operator*=(const BigInt& scalar) + + Point multiplication using Montgomery ladder. + + .. warning:: + Prefer the blinded functions in ``EC_Group`` + + .. cpp:function:: PointGFp& negate() + + Negate this point. + + .. cpp:function:: BigInt get_affine_x() const + + Return the affine ``x`` coordinate of the point. + + .. cpp:function:: BigInt get_affine_y() const + + Return the affine ``y`` coordinate of the point. + + .. cpp:function:: void force_affine() + + Convert the point to its equivalent affine coordinates. Throws + if this is the point at infinity. + + .. cpp:function:: static void force_all_affine(std::vector& points, \ + secure_vector& ws) + + Force several points to be affine at once. Uses Montgomery's + trick to reduce number of inversions required, so this is much + faster than calling ``force_affine`` on each point in sequence. + + .. cpp:function:: bool is_affine() const + + Return true if this point is in affine coordinates. + + .. cpp:function:: bool is_zero() const + + Return true if this point is zero (aka point at infinity). + + .. cpp:function:: bool on_the_curve() const + + Return true if this point is on the curve. + + .. cpp:function:: void randomize_repr(RandomNumberGenerator& rng) + + Randomize the point representation. + + .. cpp:function:: bool operator==(const PointGFp& other) const + + Point equality. This compares the affine representations. + + .. cpp:function:: void add(const PointGFp& other, std::vector& workspace) + + Point addition, taking a workspace. + + .. cpp:function:: void add_affine(const PointGFp& other, std::vector& workspace) + + Mixed (Jacobian+affine) addition, taking a workspace. + + .. warning:: + + This function assumes that ``other`` is affine, if this is + not correct the result will be invalid. + + .. cpp:function:: void mult2(std::vector& workspace) + + Point doubling. + + .. cpp:function:: void mult2i(size_t i, std::vector& workspace) + + Repeated point doubling. + + .. cpp:function:: PointGFp plus(const PointGFp& other, std::vector& workspace) const + + Point addition, returning the result. + + .. cpp:function:: PointGFp double_of(std::vector& workspace) const + + Point doubling, returning the result. + + .. cpp:function:: PointGFp zero() const + + Return the point at infinity + + + From 556aac9cd7362d959ada085222f1e0e940f94cdd Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 15 May 2018 22:24:59 -0400 Subject: [PATCH 094/174] Add Scrypt key dervation function --- doc/manual/pbkdf.rst | 33 +++++++++ doc/todo.rst | 2 +- src/build-data/oids.txt | 2 + src/cli/speed.cpp | 32 +++++++++ src/lib/asn1/oid_maps.cpp | 4 +- src/lib/pbkdf/scrypt/info.txt | 10 +++ src/lib/pbkdf/scrypt/scrypt.cpp | 98 +++++++++++++++++++++++++ src/lib/pbkdf/scrypt/scrypt.h | 38 ++++++++++ src/lib/stream/salsa20/salsa20.cpp | 17 +++-- src/lib/stream/salsa20/salsa20.h | 2 + src/tests/data/scrypt.vec | 112 +++++++++++++++++++++++++++++ src/tests/test_pbkdf.cpp | 41 +++++++++++ 12 files changed, 382 insertions(+), 9 deletions(-) create mode 100644 src/lib/pbkdf/scrypt/info.txt create mode 100644 src/lib/pbkdf/scrypt/scrypt.cpp create mode 100644 src/lib/pbkdf/scrypt/scrypt.h create mode 100644 src/tests/data/scrypt.vec diff --git a/doc/manual/pbkdf.rst b/doc/manual/pbkdf.rst index c2a6f95c4e2..1a0ece3e872 100644 --- a/doc/manual/pbkdf.rst +++ b/doc/manual/pbkdf.rst @@ -86,3 +86,36 @@ be about right). Using both a reasonably sized salt and a large iteration count is highly recommended to prevent password guessing attempts. +Scrypt +---------- + +Scrypt is a relatively newer design which is "memory hard" - in +addition to requiring large amounts of CPU power it uses a large block +of memory to compute the hash. This makes brute force attacks using +ASICs substantially more expensive. + +Currently Scrypt uses a different interface from the standard PBKDF +functions. This will be remedied in a future major release which +redesigns the PBKDF interfaces. + +.. cpp:function:: void scrypt(uint8_t output[], size_t output_len, \ + const std::string& password, \ + const uint8_t salt[], size_t salt_len, \ + size_t N, size_t r, size_t p) + + Computes the Scrypt using the password and salt, and produces an output + of arbitrary length. + + The N, r, p parameters control how much work and memory Scrypt + uses. N is the primary control of the workfactor, and must be a + power of 2. For interactive logins use 32768, for protection of + secret keys or backups use 1048576. + + The r parameter controls how 'wide' the internal hashing operation + is. It also increases the amount of memory that is used. Values + from 1 to 8 are reasonable. + + Setting p parameter to greater than one splits up the work in a way + that up to p processors can work in parallel. + + As a general recommendation, use N=32768, r=8, p=1 diff --git a/doc/todo.rst b/doc/todo.rst index 0006e1132a5..7fcc693eb25 100644 --- a/doc/todo.rst +++ b/doc/todo.rst @@ -19,7 +19,6 @@ Ciphers, Hashes, PBKDF * XSalsa20-Poly1305 AEAD compatible with NaCl * ASCON 1.2 (CAESAR) * NORX-64 3.0 (CAESAR) -* scrypt PBKDF * Argon2 PBKDF (draft-irtf-cfrg-argon2) * bcrypt PBKDF * Skein-MAC @@ -36,6 +35,7 @@ Public Key Crypto, Math * Curves for pairings (BN-256 is widely implemented) * Identity based encryption * BBS group signatures +* Support Scrypt for private key encryption (RFC 7914) * Paillier homomorphic cryptosystem * Hashing onto an elliptic curve * SPHINCS-256 diff --git a/src/build-data/oids.txt b/src/build-data/oids.txt index 0cf3d8d5d2a..314e4e44f14 100644 --- a/src/build-data/oids.txt +++ b/src/build-data/oids.txt @@ -196,6 +196,8 @@ 1.2.840.113549.1.5.12 = PKCS5.PBKDF2 1.2.840.113549.1.5.13 = PBE-PKCS5v20 +1.3.6.1.4.1.11591.4.11 = Scrypt + [pkcs9] 1.2.840.113549.1.9.1 = PKCS9.EmailAddress 1.2.840.113549.1.9.2 = PKCS9.UnstructuredName diff --git a/src/cli/speed.cpp b/src/cli/speed.cpp index ecd810ba2ce..80ac352728a 100644 --- a/src/cli/speed.cpp +++ b/src/cli/speed.cpp @@ -110,6 +110,10 @@ #include #endif +#if defined(BOTAN_HAS_SCRYPT) + #include +#endif + namespace Botan_CLI { namespace { @@ -892,6 +896,12 @@ class Speed final : public Command bench_newhope(provider, msec); } #endif +#if defined(BOTAN_HAS_SCRYPT) + else if(algo == "scrypt") + { + bench_scrypt(provider, msec); + } +#endif #if defined(BOTAN_HAS_DL_GROUP) else if(algo == "modexp") @@ -2135,6 +2145,28 @@ class Speed final : public Command } #endif +#if defined(BOTAN_HAS_SCRYPT) + + void bench_scrypt(const std::string& /*provider*/, + std::chrono::milliseconds msec) + { + std::unique_ptr scrypt_timer = make_timer("scrypt"); + + uint8_t out[64]; + uint8_t salt[8] = { 0 }; + + while(scrypt_timer->under(msec)) + { + scrypt_timer->run([&] { + Botan::scrypt(out, sizeof(out), "password", + salt, sizeof(salt), 16384, 8, 1); + }); + } + + record_result(scrypt_timer); + } + +#endif #if defined(BOTAN_HAS_NEWHOPE) && defined(BOTAN_HAS_CHACHA_RNG) void bench_newhope(const std::string& /*provider*/, diff --git a/src/lib/asn1/oid_maps.cpp b/src/lib/asn1/oid_maps.cpp index e9c671d169c..7ba7dda70e5 100644 --- a/src/lib/asn1/oid_maps.cpp +++ b/src/lib/asn1/oid_maps.cpp @@ -1,7 +1,7 @@ /* * OID maps * -* This file was automatically generated by ./src/scripts/oids.py on 2018-05-02 +* This file was automatically generated by ./src/scripts/oids.py on 2018-05-16 * * All manual edits to this file will be lost. Edit the script * then regenerate this source file. @@ -115,6 +115,7 @@ std::unordered_map OIDS::load_oid2str_map() { "1.3.36.3.3.2.8.1.1.9", "brainpool320r1" }, { "1.3.6.1.4.1.11591.12.2", "Tiger(24,3)" }, { "1.3.6.1.4.1.11591.15.1", "OpenPGP.Ed25519" }, + { "1.3.6.1.4.1.11591.4.11", "Scrypt" }, { "1.3.6.1.4.1.25258.1.3", "McEliece" }, { "1.3.6.1.4.1.25258.1.5", "XMSS" }, { "1.3.6.1.4.1.25258.1.6.1", "GOST-34.10/EMSA1(SHA-256)" }, @@ -351,6 +352,7 @@ std::unordered_map OIDS::load_str2oid_map() { "SM2_Kex", OID({1,2,156,10197,1,301,2}) }, { "SM2_Sig", OID({1,2,156,10197,1,301,1}) }, { "SM3", OID({1,2,156,10197,1,401}) }, + { "Scrypt", OID({1,3,6,1,4,1,11591,4,11}) }, { "Serpent/CBC", OID({1,3,6,1,4,1,25258,3,1}) }, { "Serpent/GCM", OID({1,3,6,1,4,1,25258,3,101}) }, { "Serpent/OCB", OID({1,3,6,1,4,1,25258,3,2,4}) }, diff --git a/src/lib/pbkdf/scrypt/info.txt b/src/lib/pbkdf/scrypt/info.txt new file mode 100644 index 00000000000..cd1551d3b87 --- /dev/null +++ b/src/lib/pbkdf/scrypt/info.txt @@ -0,0 +1,10 @@ + +SCRYPT -> 20180515 + + + +salsa20 +pbkdf2 +hmac +sha2_32 + diff --git a/src/lib/pbkdf/scrypt/scrypt.cpp b/src/lib/pbkdf/scrypt/scrypt.cpp new file mode 100644 index 00000000000..81170bf896b --- /dev/null +++ b/src/lib/pbkdf/scrypt/scrypt.cpp @@ -0,0 +1,98 @@ +/** +* (C) 2018 Jack Lloyd +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include +#include +#include +#include +#include + +namespace Botan { + +namespace { + +void scryptBlockMix(size_t r, uint8_t* B, uint8_t* Y) + { + uint32_t B32[16]; + secure_vector X(64); + copy_mem(X.data(), &B[(2*r-1)*64], 64); + + for(size_t i = 0; i != 2*r; i++) + { + xor_buf(X.data(), &B[64*i], 64); + load_le(B32, X.data(), 16); + Salsa20::salsa_core(X.data(), B32, 8); + copy_mem(&Y[64*i], X.data(), 64); + } + + for(size_t i = 0; i < r; ++i) + { + copy_mem(&B[i*64], &Y[(i * 2) * 64], 64); + } + + for(size_t i = 0; i < r; ++i) + { + copy_mem(&B[(i + r) * 64], &Y[(i * 2 + 1) * 64], 64); + } + } + +void scryptROMmix(size_t r, size_t N, uint8_t* B, secure_vector& V) + { + const size_t S = 128 * r; + + for(size_t i = 0; i != N; ++i) + { + copy_mem(&V[S*i], B, S); + scryptBlockMix(r, B, &V[N*S]); + } + + for(size_t i = 0; i != N; ++i) + { + // compiler doesn't know here that N is power of 2 + const size_t j = load_le(&B[(2*r-1)*64], 0) & (N - 1); + xor_buf(B, &V[j*S], S); + scryptBlockMix(r, B, &V[N*S]); + } + } + +} + +void scrypt(uint8_t output[], size_t output_len, + const std::string& password, + const uint8_t salt[], size_t salt_len, + size_t N, size_t r, size_t p) + { + // Upper bounds here are much lower than scrypt maximums yet seem sufficient + BOTAN_ARG_CHECK(p <= 128, "Invalid scrypt p"); + BOTAN_ARG_CHECK(N <= 4194304 && is_power_of_2(N), "Invalid scrypt N"); + BOTAN_ARG_CHECK(r <= 64, "Invalid scrypt r"); + + const size_t S = 128 * r; + secure_vector B(p * S); + + PKCS5_PBKDF2 pbkdf2(MessageAuthenticationCode::create_or_throw("HMAC(SHA-256)").release()); + + pbkdf2.pbkdf(B.data(), B.size(), + password, + salt, salt_len, + 1, std::chrono::milliseconds(0)); + + // temp space + secure_vector V((N+1) * S); + + // these can be parallel + for(size_t i = 0; i != p; ++i) + { + scryptROMmix(r, N, &B[128*r*i], V); + } + + pbkdf2.pbkdf(output, output_len, + password, + B.data(), B.size(), + 1, std::chrono::milliseconds(0)); + } + +} diff --git a/src/lib/pbkdf/scrypt/scrypt.h b/src/lib/pbkdf/scrypt/scrypt.h new file mode 100644 index 00000000000..5eaa3a4fc60 --- /dev/null +++ b/src/lib/pbkdf/scrypt/scrypt.h @@ -0,0 +1,38 @@ +/** +* (C) 2018 Jack Lloyd +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#ifndef BOTAN_SCRYPT_H_ +#define BOTAN_SCRYPT_H_ + +#include +#include + +namespace Botan { + +/** +* Scrypt key derivation function (RFC 7914) +* +* @param output the output will be placed here +* @param output_len length of output +* @param password the user password +* @param salt the salt +* @param salt_len length of salt +* @param N the CPU/Memory cost parameter, must be power of 2 +* @param r the block size parameter +* @param p the parallelization parameter +* +* Suitable parameters for most uses would be N = 16384, r = 8, p = 1 +* +* Scrypt uses approximately (p + N + 1) * 128 * r bytes of memory +*/ +void BOTAN_UNSTABLE_API scrypt(uint8_t output[], size_t output_len, + const std::string& password, + const uint8_t salt[], size_t salt_len, + size_t N, size_t r, size_t p); + +} + +#endif diff --git a/src/lib/stream/salsa20/salsa20.cpp b/src/lib/stream/salsa20/salsa20.cpp index 46499e69e87..faba12cdd2d 100644 --- a/src/lib/stream/salsa20/salsa20.cpp +++ b/src/lib/stream/salsa20/salsa20.cpp @@ -54,17 +54,22 @@ void hsalsa20(uint32_t output[8], const uint32_t input[16]) output[7] = x09; } +} + /* * Generate Salsa20 cipher stream */ -void salsa20(uint8_t output[64], const uint32_t input[16]) +//static +void Salsa20::salsa_core(uint8_t output[64], const uint32_t input[16], size_t rounds) { + BOTAN_ASSERT_NOMSG(rounds % 2 == 0); + uint32_t 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]; - for(size_t i = 0; i != 10; ++i) + for(size_t i = 0; i != rounds / 2; ++i) { SALSA20_QUARTER_ROUND(x00, x04, x08, x12); SALSA20_QUARTER_ROUND(x05, x09, x13, x01); @@ -95,8 +100,6 @@ void salsa20(uint8_t output[64], const uint32_t input[16]) store_le(x15 + input[15], output + 4 * 15); } -} - #undef SALSA20_QUARTER_ROUND /* @@ -112,7 +115,7 @@ void Salsa20::cipher(const uint8_t in[], uint8_t out[], size_t length) length -= (m_buffer.size() - m_position); in += (m_buffer.size() - m_position); out += (m_buffer.size() - m_position); - salsa20(m_buffer.data(), m_state.data()); + salsa_core(m_buffer.data(), m_state.data(), 20); ++m_state[8]; m_state[9] += (m_state[8] == 0); @@ -210,7 +213,7 @@ void Salsa20::set_iv(const uint8_t iv[], size_t length) m_state[8] = 0; m_state[9] = 0; - salsa20(m_buffer.data(), m_state.data()); + salsa_core(m_buffer.data(), m_state.data(), 20); ++m_state[8]; m_state[9] += (m_state[8] == 0); @@ -247,7 +250,7 @@ void Salsa20::seek(uint64_t offset) m_state[8] = load_le(counter8, 0); m_state[9] += load_le(counter8, 1); - salsa20(m_buffer.data(), m_state.data()); + salsa_core(m_buffer.data(), m_state.data(), 20); ++m_state[8]; m_state[9] += (m_state[8] == 0); diff --git a/src/lib/stream/salsa20/salsa20.h b/src/lib/stream/salsa20/salsa20.h index a9a68c537f2..d21ee318ea2 100644 --- a/src/lib/stream/salsa20/salsa20.h +++ b/src/lib/stream/salsa20/salsa20.h @@ -34,6 +34,8 @@ class BOTAN_PUBLIC_API(2,0) Salsa20 final : public StreamCipher std::string name() const override; StreamCipher* clone() const override { return new Salsa20; } + static void salsa_core(uint8_t output[64], const uint32_t input[16], size_t rounds); + void seek(uint64_t offset) override; private: void key_schedule(const uint8_t key[], size_t key_len) override; diff --git a/src/tests/data/scrypt.vec b/src/tests/data/scrypt.vec new file mode 100644 index 00000000000..e63e7d6fab0 --- /dev/null +++ b/src/tests/data/scrypt.vec @@ -0,0 +1,112 @@ + +# From RFC 7914 + +Passphrase = +Salt = +N = 16 +R = 1 +P = 1 +Output = 77D6576238657B203B19CA42C18A0497F16B4844E3074AE8DFDFFA3FEDE21442FCD0069DED0948F8326A753A0FC81F17E8D3E0FB2E0D3628CF35E20C38D18906 + +Passphrase = password +Salt = 4E61436C +N = 1024 +R = 8 +P = 16 +Output = FDBABE1C9D3472007856E7190D01E9FE7C6AD7CBC8237830E77376634B3731622EAF30D92E22A3886FF109279D9830DAC727AFB94A83EE6D8360CBDFA2CC0640 + +Passphrase = pleaseletmein +Salt = 536F6469756D43686C6F72696465 +N = 16384 +R = 8 +P = 1 +Output = 7023BDCB3AFD7348461C06CD81FD38EBFDA8FBBA904F8E3EA9B543F6545DA1F2D5432955613F0FCF62D49705242A9AF9E61E85DC0D651E40DFCF017B45575887 + +# Uses 1G memory +Passphrase = pleaseletmein +Salt = 536F6469756D43686C6F72696465 +N = 1048576 +R = 8 +P = 1 +Output = 2101CB9B6A511AAEADDBBE09CF70F881EC568D574A2FFD4DABE5EE9820ADAA478E56FD8F4BA5D09FFA1C6D927C40F4C337304049E8A952FBCBF45C6FA77A41A4 + +# From PKCS#8 test +Passphrase = Rabbit +Salt = 4D6F757365 +N = 1048576 +R = 8 +P = 1 +Output = E277EA2CACB23EDAFC039D229B79DC13ECEDB601D99B182A9FEDBA1E2BFB4F58 + +# Generated by OpenSSL 1.1.0 via Python hashlib + +Passphrase = password +Salt = ce3b79848f2a254df1d60e1a3146165a +N = 8192 +R = 5 +P = 1 +Output = a19e1c5ce6e0da022c64a7205da125dc + +Passphrase = password +Salt = ce3b79848f2a254df1d60e1a3146165a +N = 8192 +R = 6 +P = 1 +Output = c9060cb775114c0688df86e9990c62ab + +Passphrase = password +Salt = ce3b79848f2a254df1d60e1a3146165a +N = 8192 +R = 7 +P = 1 +Output = 424e439dafcc0fc438469241e9d6bdf8 + +Passphrase = password +Salt = ce3b79848f2a254df1d60e1a3146165a +N = 8192 +R = 8 +P = 1 +Output = 18f3116479374acd05755a1bf43a3af2 + +Passphrase = password +Salt = ce3b79848f2a254df1d60e1a3146165a +N = 4096 +R = 16 +P = 1 +Output = 485d55c1267e1afa60349fe28c4aa2d9 + +Passphrase = password +Salt = ce3b79848f2a254df1d60e1a3146165a +N = 4096 +R = 32 +P = 1 +Output = a43d75bb3b899852c8297fe2cd3b9681 + +Passphrase = password +Salt = ce3b79848f2a254df1d60e1a3146165a +N = 2 +R = 64 +P = 64 +Output = a1c68ee1a41bc4e8dcfdc3fa93700426 + +Passphrase = password +Salt = ce3b79848f2a254df1d60e1a3146165a +N = 2 +R = 64 +P = 128 +Output = b58b8ec24738af168b4e24de079102f1 + +Passphrase = password +Salt = ce3b79848f2a254df1d60e1a3146165a +N = 2 +R = 63 +P = 128 +Output = 61de26be0f6609462bf66d88dece2d3c + +Passphrase = password +Salt = ce3b79848f2a254df1d60e1a3146165a +N = 4 +R = 19 +P = 17 +Output = b21fc99ae1dd4067c2d2b906af62518e + diff --git a/src/tests/test_pbkdf.cpp b/src/tests/test_pbkdf.cpp index 37d3c3125a4..6694e0522a2 100644 --- a/src/tests/test_pbkdf.cpp +++ b/src/tests/test_pbkdf.cpp @@ -14,6 +14,10 @@ #include #endif +#if defined(BOTAN_HAS_SCRYPT) + #include +#endif + namespace Botan_Tests { namespace { @@ -57,6 +61,43 @@ BOTAN_REGISTER_TEST("pbkdf", PBKDF_KAT_Tests); #endif +#if defined(BOTAN_HAS_SCRYPT) + +class Scrypt_KAT_Tests final : public Text_Based_Test + { + public: + Scrypt_KAT_Tests() : Text_Based_Test("scrypt.vec", "Passphrase,Salt,N,R,P,Output") {} + + Test::Result run_one_test(const std::string&, const VarMap& vars) override + { + const size_t N = get_req_sz(vars, "N"); + const size_t R = get_req_sz(vars, "R"); + const size_t P = get_req_sz(vars, "P"); + const std::vector salt = get_req_bin(vars, "Salt"); + const std::string passphrase = get_req_str(vars, "Passphrase"); + const std::vector expected = get_req_bin(vars, "Output"); + + Test::Result result("scrypt"); + + if(N >= 1048576 && Test::run_long_tests() == false) + return result; + + std::vector output(expected.size()); + Botan::scrypt(output.data(), output.size(), + passphrase, salt.data(), salt.size(), + N, R, P); + + result.test_eq("derived key", output, expected); + + return result; + } + + }; + +BOTAN_REGISTER_TEST("scrypt", Scrypt_KAT_Tests); + +#endif + #if defined(BOTAN_HAS_PGP_S2K) class PGP_S2K_Iter_Test final : public Test From dc026ac105f3e240d963486013d255424534d52e Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 16 May 2018 11:28:47 -0400 Subject: [PATCH 095/174] Unroll DES to encrypt/decrypt 2 rounds in parallel About 50% faster for CBC decrypt --- news.rst | 3 + src/lib/block/des/des.cpp | 320 +++++++++++++++++++++++--------------- 2 files changed, 201 insertions(+), 122 deletions(-) diff --git a/news.rst b/news.rst index 5171f2cdd98..fd68ae68861 100644 --- a/news.rst +++ b/news.rst @@ -21,6 +21,9 @@ Version 2.7.0, Not Yet Released * Allow the year to be up to 2200 in ASN.1 time objects. Previously this was limited to 2100. (GH #1536) +* Optimizations for DES/3DES, approx 50% faster when used in certain + modes such as CBC decrypt or CTR. + * XMSS signature verification did not check that the signature was of the expected length which could lead to a crash. (GH #1537) diff --git a/src/lib/block/des/des.cpp b/src/lib/block/des/des.cpp index 2881cfa9a1d..634a1a683f3 100644 --- a/src/lib/block/des/des.cpp +++ b/src/lib/block/des/des.cpp @@ -1,6 +1,6 @@ /* * DES -* (C) 1999-2008 Jack Lloyd +* (C) 1999-2008,2018 Jack Lloyd * * Based on a public domain implemenation by Phil Karn (who in turn * credited Richard Outerbridge and Jim Gillogly) @@ -24,33 +24,33 @@ void des_key_schedule(uint32_t round_key[32], const uint8_t key[8]) 1, 2, 2, 2, 2, 2, 2, 1 }; uint32_t C = ((key[7] & 0x80) << 20) | ((key[6] & 0x80) << 19) | - ((key[5] & 0x80) << 18) | ((key[4] & 0x80) << 17) | - ((key[3] & 0x80) << 16) | ((key[2] & 0x80) << 15) | - ((key[1] & 0x80) << 14) | ((key[0] & 0x80) << 13) | - ((key[7] & 0x40) << 13) | ((key[6] & 0x40) << 12) | - ((key[5] & 0x40) << 11) | ((key[4] & 0x40) << 10) | - ((key[3] & 0x40) << 9) | ((key[2] & 0x40) << 8) | - ((key[1] & 0x40) << 7) | ((key[0] & 0x40) << 6) | - ((key[7] & 0x20) << 6) | ((key[6] & 0x20) << 5) | - ((key[5] & 0x20) << 4) | ((key[4] & 0x20) << 3) | - ((key[3] & 0x20) << 2) | ((key[2] & 0x20) << 1) | - ((key[1] & 0x20) ) | ((key[0] & 0x20) >> 1) | - ((key[7] & 0x10) >> 1) | ((key[6] & 0x10) >> 2) | - ((key[5] & 0x10) >> 3) | ((key[4] & 0x10) >> 4); + ((key[5] & 0x80) << 18) | ((key[4] & 0x80) << 17) | + ((key[3] & 0x80) << 16) | ((key[2] & 0x80) << 15) | + ((key[1] & 0x80) << 14) | ((key[0] & 0x80) << 13) | + ((key[7] & 0x40) << 13) | ((key[6] & 0x40) << 12) | + ((key[5] & 0x40) << 11) | ((key[4] & 0x40) << 10) | + ((key[3] & 0x40) << 9) | ((key[2] & 0x40) << 8) | + ((key[1] & 0x40) << 7) | ((key[0] & 0x40) << 6) | + ((key[7] & 0x20) << 6) | ((key[6] & 0x20) << 5) | + ((key[5] & 0x20) << 4) | ((key[4] & 0x20) << 3) | + ((key[3] & 0x20) << 2) | ((key[2] & 0x20) << 1) | + ((key[1] & 0x20) ) | ((key[0] & 0x20) >> 1) | + ((key[7] & 0x10) >> 1) | ((key[6] & 0x10) >> 2) | + ((key[5] & 0x10) >> 3) | ((key[4] & 0x10) >> 4); uint32_t D = ((key[7] & 0x02) << 26) | ((key[6] & 0x02) << 25) | - ((key[5] & 0x02) << 24) | ((key[4] & 0x02) << 23) | - ((key[3] & 0x02) << 22) | ((key[2] & 0x02) << 21) | - ((key[1] & 0x02) << 20) | ((key[0] & 0x02) << 19) | - ((key[7] & 0x04) << 17) | ((key[6] & 0x04) << 16) | - ((key[5] & 0x04) << 15) | ((key[4] & 0x04) << 14) | - ((key[3] & 0x04) << 13) | ((key[2] & 0x04) << 12) | - ((key[1] & 0x04) << 11) | ((key[0] & 0x04) << 10) | - ((key[7] & 0x08) << 8) | ((key[6] & 0x08) << 7) | - ((key[5] & 0x08) << 6) | ((key[4] & 0x08) << 5) | - ((key[3] & 0x08) << 4) | ((key[2] & 0x08) << 3) | - ((key[1] & 0x08) << 2) | ((key[0] & 0x08) << 1) | - ((key[3] & 0x10) >> 1) | ((key[2] & 0x10) >> 2) | - ((key[1] & 0x10) >> 3) | ((key[0] & 0x10) >> 4); + ((key[5] & 0x02) << 24) | ((key[4] & 0x02) << 23) | + ((key[3] & 0x02) << 22) | ((key[2] & 0x02) << 21) | + ((key[1] & 0x02) << 20) | ((key[0] & 0x02) << 19) | + ((key[7] & 0x04) << 17) | ((key[6] & 0x04) << 16) | + ((key[5] & 0x04) << 15) | ((key[4] & 0x04) << 14) | + ((key[3] & 0x04) << 13) | ((key[2] & 0x04) << 12) | + ((key[1] & 0x04) << 11) | ((key[0] & 0x04) << 10) | + ((key[7] & 0x08) << 8) | ((key[6] & 0x08) << 7) | + ((key[5] & 0x08) << 6) | ((key[4] & 0x08) << 5) | + ((key[3] & 0x08) << 4) | ((key[2] & 0x08) << 3) | + ((key[1] & 0x08) << 2) | ((key[0] & 0x08) << 1) | + ((key[3] & 0x10) >> 1) | ((key[2] & 0x10) >> 2) | + ((key[1] & 0x10) >> 3) | ((key[0] & 0x10) >> 4); for(size_t i = 0; i != 16; ++i) { @@ -81,60 +81,117 @@ void des_key_schedule(uint32_t round_key[32], const uint8_t key[8]) } } +inline uint32_t spbox(uint32_t T0, uint32_t T1) + { + return DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ + DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ + DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ + DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; + } + /* * DES Encryption */ -void des_encrypt(uint32_t& L, uint32_t& R, - const uint32_t round_key[32]) +inline void des_encrypt(uint32_t& Lr, uint32_t& Rr, + const uint32_t round_key[32]) { + uint32_t L = Lr; + uint32_t R = Rr; for(size_t i = 0; i != 16; i += 2) { - uint32_t T0, T1; + L ^= spbox(rotr<4>(R) ^ round_key[2*i ], R ^ round_key[2*i+1]); + R ^= spbox(rotr<4>(L) ^ round_key[2*i+2], L ^ round_key[2*i+3]); + } - T0 = rotr<4>(R) ^ round_key[2*i]; - T1 = R ^ round_key[2*i + 1]; + Lr = L; + Rr = R; + } - L ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ - DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ - DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ - DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; +inline void des_encrypt_x2(uint32_t& L0r, uint32_t& R0r, + uint32_t& L1r, uint32_t& R1r, + const uint32_t round_key[32]) + { + uint32_t L0 = L0r; + uint32_t R0 = R0r; + uint32_t L1 = L1r; + uint32_t R1 = R1r; - T0 = rotr<4>(L) ^ round_key[2*i + 2]; - T1 = L ^ round_key[2*i + 3]; + for(size_t i = 0; i != 16; i += 2) + { + L0 ^= spbox(rotr<4>(R0) ^ round_key[2*i ], R0 ^ round_key[2*i+1]); + L1 ^= spbox(rotr<4>(R1) ^ round_key[2*i ], R1 ^ round_key[2*i+1]); - R ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ - DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ - DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ - DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; + R0 ^= spbox(rotr<4>(L0) ^ round_key[2*i+2], L0 ^ round_key[2*i+3]); + R1 ^= spbox(rotr<4>(L1) ^ round_key[2*i+2], L1 ^ round_key[2*i+3]); } + + L0r = L0; + R0r = R0; + L1r = L1; + R1r = R1; } /* * DES Decryption */ -void des_decrypt(uint32_t& L, uint32_t& R, - const uint32_t round_key[32]) +inline void des_decrypt(uint32_t& Lr, uint32_t& Rr, + const uint32_t round_key[32]) { + uint32_t L = Lr; + uint32_t R = Rr; for(size_t i = 16; i != 0; i -= 2) { - uint32_t T0, T1; - - T0 = rotr<4>(R) ^ round_key[2*i - 2]; - T1 = R ^ round_key[2*i - 1]; + L ^= spbox(rotr<4>(R) ^ round_key[2*i - 2], R ^ round_key[2*i - 1]); + R ^= spbox(rotr<4>(L) ^ round_key[2*i - 4], L ^ round_key[2*i - 3]); + } + Lr = L; + Rr = R; + } - L ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ - DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ - DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ - DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; +inline void des_decrypt_x2(uint32_t& L0r, uint32_t& R0r, + uint32_t& L1r, uint32_t& R1r, + const uint32_t round_key[32]) + { + uint32_t L0 = L0r; + uint32_t R0 = R0r; + uint32_t L1 = L1r; + uint32_t R1 = R1r; - T0 = rotr<4>(L) ^ round_key[2*i - 4]; - T1 = L ^ round_key[2*i - 3]; + for(size_t i = 0; i != 16; i += 2) + { + L0 ^= spbox(rotr<4>(R0) ^ round_key[2*i - 2], R0 ^ round_key[2*i - 1]); + L1 ^= spbox(rotr<4>(R1) ^ round_key[2*i - 2], R1 ^ round_key[2*i - 1]); - R ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ - DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ - DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ - DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; + R0 ^= spbox(rotr<4>(L0) ^ round_key[2*i - 4], L0 ^ round_key[2*i - 3]); + R1 ^= spbox(rotr<4>(L1) ^ round_key[2*i - 4], L1 ^ round_key[2*i - 3]); } + + L0r = L0; + R0r = R0; + L1r = L1; + R1r = R1; + } + +inline void des_IP(uint32_t& L, uint32_t& R, const uint8_t block[]) + { + uint64_t T = (DES_IPTAB1[block[0]] ) | (DES_IPTAB1[block[1]] << 1) | + (DES_IPTAB1[block[2]] << 2) | (DES_IPTAB1[block[3]] << 3) | + (DES_IPTAB1[block[4]] << 4) | (DES_IPTAB1[block[5]] << 5) | + (DES_IPTAB1[block[6]] << 6) | (DES_IPTAB2[block[7]] ); + + L = static_cast(T >> 32); + R = static_cast(T); + } + +inline void des_FP(uint32_t L, uint32_t R, uint8_t out[]) + { + uint64_t T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | + (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | + (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | + (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); + T = rotl<32>(T); + + store_be(T, out); } } @@ -146,25 +203,30 @@ void DES::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_round_key.empty() == false); - for(size_t i = 0; i < blocks; ++i) + while(blocks >= 2) { - uint64_t T = (DES_IPTAB1[in[8*i+0]] ) | (DES_IPTAB1[in[8*i+1]] << 1) | - (DES_IPTAB1[in[8*i+2]] << 2) | (DES_IPTAB1[in[8*i+3]] << 3) | - (DES_IPTAB1[in[8*i+4]] << 4) | (DES_IPTAB1[in[8*i+5]] << 5) | - (DES_IPTAB1[in[8*i+6]] << 6) | (DES_IPTAB2[in[8*i+7]] ); + uint32_t L0, R0; + uint32_t L1, R1; - uint32_t L = static_cast(T >> 32); - uint32_t R = static_cast(T); + des_IP(L0, R0, in); + des_IP(L1, R1, in + BLOCK_SIZE); - des_encrypt(L, R, m_round_key.data()); + des_encrypt_x2(L0, R0, L1, R1, m_round_key.data()); - T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | - (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | - (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | - (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); - T = rotl<32>(T); + des_FP(L0, R0, out); + des_FP(L1, R1, out + BLOCK_SIZE); - store_be(T, out + 8*i); + in += 2*BLOCK_SIZE; + out += 2*BLOCK_SIZE; + blocks -= 2; + } + + for(size_t i = 0; i < blocks; ++i) + { + uint32_t L, R; + des_IP(L, R, in + BLOCK_SIZE*i); + des_encrypt(L, R, m_round_key.data()); + des_FP(L, R, out + BLOCK_SIZE*i); } } @@ -175,26 +237,30 @@ void DES::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_round_key.empty() == false); - for(size_t i = 0; i < blocks; ++i) + while(blocks >= 2) { - uint64_t T = (DES_IPTAB1[in[BLOCK_SIZE*i+0]] ) | (DES_IPTAB1[in[BLOCK_SIZE*i+1]] << 1) | - (DES_IPTAB1[in[BLOCK_SIZE*i+2]] << 2) | (DES_IPTAB1[in[BLOCK_SIZE*i+3]] << 3) | - (DES_IPTAB1[in[BLOCK_SIZE*i+4]] << 4) | (DES_IPTAB1[in[BLOCK_SIZE*i+5]] << 5) | - (DES_IPTAB1[in[BLOCK_SIZE*i+6]] << 6) | (DES_IPTAB2[in[BLOCK_SIZE*i+7]] ); + uint32_t L0, R0; + uint32_t L1, R1; - uint32_t L = static_cast(T >> 32); - uint32_t R = static_cast(T); + des_IP(L0, R0, in); + des_IP(L1, R1, in + BLOCK_SIZE); - des_decrypt(L, R, m_round_key.data()); + des_decrypt_x2(L0, R0, L1, R1, m_round_key.data()); - T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | - (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | - (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | - (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); + des_FP(L0, R0, out); + des_FP(L1, R1, out + BLOCK_SIZE); - T = rotl<32>(T); + in += 2*BLOCK_SIZE; + out += 2*BLOCK_SIZE; + blocks -= 2; + } - store_be(T, out + BLOCK_SIZE*i); + for(size_t i = 0; i < blocks; ++i) + { + uint32_t L, R; + des_IP(L, R, in + BLOCK_SIZE*i); + des_decrypt(L, R, m_round_key.data()); + des_FP(L, R, out + BLOCK_SIZE*i); } } @@ -219,31 +285,36 @@ void TripleDES::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) cons { verify_key_set(m_round_key.empty() == false); - for(size_t i = 0; i != blocks; ++i) + while(blocks >= 2) { - uint64_t T = (DES_IPTAB1[in[0]] ) | (DES_IPTAB1[in[1]] << 1) | - (DES_IPTAB1[in[2]] << 2) | (DES_IPTAB1[in[3]] << 3) | - (DES_IPTAB1[in[4]] << 4) | (DES_IPTAB1[in[5]] << 5) | - (DES_IPTAB1[in[6]] << 6) | (DES_IPTAB2[in[7]] ); + uint32_t L0, R0; + uint32_t L1, R1; - uint32_t L = static_cast(T >> 32); - uint32_t R = static_cast(T); + des_IP(L0, R0, in); + des_IP(L1, R1, in + BLOCK_SIZE); - des_encrypt(L, R, &m_round_key[0]); - des_decrypt(R, L, &m_round_key[32]); - des_encrypt(L, R, &m_round_key[64]); + des_encrypt_x2(L0, R0, L1, R1, m_round_key.data()); + des_decrypt_x2(L0, R0, L1, R1, m_round_key.data()); + des_encrypt_x2(L0, R0, L1, R1, m_round_key.data()); - T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | - (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | - (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | - (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); + des_FP(L0, R0, out); + des_FP(L1, R1, out + BLOCK_SIZE); - T = rotl<32>(T); + in += 2*BLOCK_SIZE; + out += 2*BLOCK_SIZE; + blocks -= 2; + } - store_be(T, out); + for(size_t i = 0; i != blocks; ++i) + { + uint32_t L, R; + des_IP(L, R, in + BLOCK_SIZE*i); - in += BLOCK_SIZE; - out += BLOCK_SIZE; + des_encrypt(L, R, &m_round_key[0]); + des_decrypt(R, L, &m_round_key[32]); + des_encrypt(L, R, &m_round_key[64]); + + des_FP(L, R, out + BLOCK_SIZE*i); } } @@ -254,31 +325,36 @@ void TripleDES::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) cons { verify_key_set(m_round_key.empty() == false); - for(size_t i = 0; i != blocks; ++i) + while(blocks >= 2) { - uint64_t T = (DES_IPTAB1[in[0]] ) | (DES_IPTAB1[in[1]] << 1) | - (DES_IPTAB1[in[2]] << 2) | (DES_IPTAB1[in[3]] << 3) | - (DES_IPTAB1[in[4]] << 4) | (DES_IPTAB1[in[5]] << 5) | - (DES_IPTAB1[in[6]] << 6) | (DES_IPTAB2[in[7]] ); + uint32_t L0, R0; + uint32_t L1, R1; - uint32_t L = static_cast(T >> 32); - uint32_t R = static_cast(T); + des_IP(L0, R0, in); + des_IP(L1, R1, in + BLOCK_SIZE); - des_decrypt(L, R, &m_round_key[64]); - des_encrypt(R, L, &m_round_key[32]); - des_decrypt(L, R, &m_round_key[0]); + des_decrypt_x2(L0, R0, L1, R1, m_round_key.data()); + des_encrypt_x2(L0, R0, L1, R1, m_round_key.data()); + des_decrypt_x2(L0, R0, L1, R1, m_round_key.data()); - T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | - (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | - (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | - (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); + des_FP(L0, R0, out); + des_FP(L1, R1, out + BLOCK_SIZE); - T = rotl<32>(T); + in += 2*BLOCK_SIZE; + out += 2*BLOCK_SIZE; + blocks -= 2; + } + + for(size_t i = 0; i != blocks; ++i) + { + uint32_t L, R; + des_IP(L, R, in + BLOCK_SIZE*i); - store_be(T, out); + des_decrypt(L, R, &m_round_key[64]); + des_encrypt(R, L, &m_round_key[32]); + des_decrypt(L, R, &m_round_key[0]); - in += BLOCK_SIZE; - out += BLOCK_SIZE; + des_FP(L, R, out + BLOCK_SIZE*i); } } From e6f72bdd9445536684dfb06e6f81a0a9639f5a23 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 16 May 2018 11:45:54 -0400 Subject: [PATCH 096/174] Update news --- news.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/news.rst b/news.rst index fd68ae68861..9353d771818 100644 --- a/news.rst +++ b/news.rst @@ -21,6 +21,8 @@ Version 2.7.0, Not Yet Released * Allow the year to be up to 2200 in ASN.1 time objects. Previously this was limited to 2100. (GH #1536) +* Add support for Scrypt password hashing (GH #1570) + * Optimizations for DES/3DES, approx 50% faster when used in certain modes such as CBC decrypt or CTR. From ef5514617197974bbe07840fce6b5789b3b143fa Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 16 May 2018 15:25:44 -0400 Subject: [PATCH 097/174] Fixes for DES/3DES --- src/lib/block/des/des.cpp | 14 +++++++------- src/tests/data/block/des.vec | 20 ++++---------------- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/lib/block/des/des.cpp b/src/lib/block/des/des.cpp index 634a1a683f3..885daa05ca5 100644 --- a/src/lib/block/des/des.cpp +++ b/src/lib/block/des/des.cpp @@ -157,7 +157,7 @@ inline void des_decrypt_x2(uint32_t& L0r, uint32_t& R0r, uint32_t L1 = L1r; uint32_t R1 = R1r; - for(size_t i = 0; i != 16; i += 2) + for(size_t i = 16; i != 0; i -= 2) { L0 ^= spbox(rotr<4>(R0) ^ round_key[2*i - 2], R0 ^ round_key[2*i - 1]); L1 ^= spbox(rotr<4>(R1) ^ round_key[2*i - 2], R1 ^ round_key[2*i - 1]); @@ -293,9 +293,9 @@ void TripleDES::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) cons des_IP(L0, R0, in); des_IP(L1, R1, in + BLOCK_SIZE); - des_encrypt_x2(L0, R0, L1, R1, m_round_key.data()); - des_decrypt_x2(L0, R0, L1, R1, m_round_key.data()); - des_encrypt_x2(L0, R0, L1, R1, m_round_key.data()); + des_encrypt_x2(L0, R0, L1, R1, &m_round_key[0]); + des_decrypt_x2(R0, L0, R1, L1, &m_round_key[32]); + des_encrypt_x2(L0, R0, L1, R1, &m_round_key[64]); des_FP(L0, R0, out); des_FP(L1, R1, out + BLOCK_SIZE); @@ -333,9 +333,9 @@ void TripleDES::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) cons des_IP(L0, R0, in); des_IP(L1, R1, in + BLOCK_SIZE); - des_decrypt_x2(L0, R0, L1, R1, m_round_key.data()); - des_encrypt_x2(L0, R0, L1, R1, m_round_key.data()); - des_decrypt_x2(L0, R0, L1, R1, m_round_key.data()); + des_decrypt_x2(L0, R0, L1, R1, &m_round_key[64]); + des_encrypt_x2(R0, L0, R1, L1, &m_round_key[32]); + des_decrypt_x2(L0, R0, L1, R1, &m_round_key[0]); des_FP(L0, R0, out); des_FP(L1, R1, out + BLOCK_SIZE); diff --git a/src/tests/data/block/des.vec b/src/tests/data/block/des.vec index df221428b01..80324bf3495 100644 --- a/src/tests/data/block/des.vec +++ b/src/tests/data/block/des.vec @@ -8,12 +8,8 @@ In = 4E6F772069732074 Out = 3FA40E8A984D4815 Key = 0123456789ABCDEF -In = 666F7220616C6C20 -Out = 893D51EC4B563B53 - -Key = 0123456789ABCDEF -In = 68652074696D6520 -Out = 6A271787AB8883F9 +In = 666F7220616C6C2068652074696D6520 +Out = 893D51EC4B563B536A271787AB8883F9 Key = 0131D9619DC1376E In = 5CD54CA83DEF57DA @@ -1446,16 +1442,8 @@ In = 12864DDE8E694BD1 Out = 5B4DDE8F000A5A9B Key = 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF -In = 0123456789ABCDE7 -Out = C95744256A5ED31D - -Key = 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF -In = 68652074696D6520 -Out = 6A271787AB8883F9 - -Key = 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF -In = 4E6F772069732074 -Out = 3FA40E8A984D4815 +In = 0123456789ABCDE768652074696D65204E6F772069732074 +Out = C95744256A5ED31D6A271787AB8883F93FA40E8A984D4815 Key = C9B6D82EF93DD4C7AC365AB2D9280EB39DD92C0CE3F72BDE In = 94A8A0655AF71024 From dca4e87d941c2a5e10e4cd0b48a52c0fe8cd71db Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 17 May 2018 13:45:34 -0400 Subject: [PATCH 098/174] Fix typo in comment [ci skip] --- src/lib/math/numbertheory/numthry.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/math/numbertheory/numthry.cpp b/src/lib/math/numbertheory/numthry.cpp index 1458a8943c7..a5c7a40ab80 100644 --- a/src/lib/math/numbertheory/numthry.cpp +++ b/src/lib/math/numbertheory/numthry.cpp @@ -501,7 +501,7 @@ size_t mr_test_iterations(size_t n_bits, size_t prob, bool random) } /* -* Test for primaility using Miller-Rabin +* Test for primality using Miller-Rabin */ bool is_prime(const BigInt& n, RandomNumberGenerator& rng, size_t prob, bool is_random) From 6e3cef104ac3c1108779d7fb494cba672e44da35 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 21 May 2018 10:58:07 -0400 Subject: [PATCH 099/174] Move the roadmap into the handbook so end-users can find it. --- doc/manual/contents.rst | 1 + doc/{ => manual}/roadmap.rst | 12 ++++++++---- doc/manual/support.rst | 10 +++++----- 3 files changed, 14 insertions(+), 9 deletions(-) rename doc/{ => manual}/roadmap.rst (91%) diff --git a/doc/manual/contents.rst b/doc/manual/contents.rst index 8fff7655067..6b97f7a02a0 100644 --- a/doc/manual/contents.rst +++ b/doc/manual/contents.rst @@ -43,3 +43,4 @@ Contents fuzzing deprecated abi + roadmap diff --git a/doc/roadmap.rst b/doc/manual/roadmap.rst similarity index 91% rename from doc/roadmap.rst rename to doc/manual/roadmap.rst index e2bd9f869b5..03461da206f 100644 --- a/doc/roadmap.rst +++ b/doc/manual/roadmap.rst @@ -1,5 +1,5 @@ -Botan Development Roadmap +Development Roadmap ======================================== Near Term Plans @@ -31,6 +31,7 @@ ECC Refactoring Refactoring how elliptic curve groups are stored, sharing representation and allowing better precomputations (eg precomputing base point multiples). +[Completed in 2.5.0] Performance Improvements ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -38,6 +39,9 @@ Performance Improvements The eventual goal would be performance parity with OpenSSL, but initial target is probably more like "no worse than 30% slower for any algorithm". +[Major improvements were made in ECC and RSA performance were made +between 2.4.0 and 2.7.0, measurement and optimization work is ongoing.] + Elliptic Curve Pairings ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -58,15 +62,15 @@ Initial work is focused on features which are included in TLS v1.3 but also available for TLS v1.2 (such as PSS signatures and FFDHE) as well as refactorings which will make the eventual implementation of v1.3 simpler. Assuming no source of dedicated funding appears, a full v1.3 implementation will -likely not available until late in 2018. +likely not available until sometime in 2019. ASN.1 Redesign ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. note:: - This project has been deferred to 3.x as constexpr will likely make it - much easier to implement. + This project has been deferred to 3.x as C++14 extended constexpr + will likely make it much easier to implement. The current ASN.1 library (DER_Encoder/BER_Decoder) does make it roughly possible to write C++ code matching the ASN.1 structures. But diff --git a/doc/manual/support.rst b/doc/manual/support.rst index 209f0d6c7da..ca135173652 100644 --- a/doc/manual/support.rst +++ b/doc/manual/support.rst @@ -50,17 +50,17 @@ properly. Branch Support Status ------------------------- -Following table provides the support status for Botan branches. Any branch not -listed here (including 1.11) is no longer supported. Dates in the future are -approximate. +Following table provides the support status for Botan branches as of May 2018. +Any branch not listed here (including 1.11) is no longer supported. +Dates in the future are approximate. ============== ============== ========================== ============ Branch First Release End of Active Development End of Life ============== ============== ========================== ============ 1.8 2008-12-08 2010-08-31 2016-02-13 1.10 2011-06-20 2012-07-10 2018-12-31 -2 2017-01-06 2019-01-01 2021-12-31 -3 (planned) 2019-04-01 2022-01-01 2023-12-31 +2.x 2017-01-06 2019-01-01 2021-12-31 +3.x (planned) 2019-07-01 2022-01-01 2023-12-31 ============== ============== ========================== ============ "Active development" refers to adding new features and optimizations. At the From be6a008a769f9477de5423d507875a03604a0d2a Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 21 May 2018 12:20:34 -0400 Subject: [PATCH 100/174] Cleanups and optimizations in DER_Encoder --- src/build-data/version.txt | 2 +- src/lib/asn1/der_enc.cpp | 130 ++++++++++++++++++------------------- src/lib/asn1/der_enc.h | 63 +++++++++++++----- 3 files changed, 111 insertions(+), 84 deletions(-) diff --git a/src/build-data/version.txt b/src/build-data/version.txt index 8c3f4ce52c3..dd9d59e3446 100644 --- a/src/build-data/version.txt +++ b/src/build-data/version.txt @@ -2,7 +2,7 @@ release_major = 2 release_minor = 7 release_patch = 0 -release_so_abi_rev = 5 +release_so_abi_rev = 7 # These are set by the distribution script release_vc_rev = None diff --git a/src/lib/asn1/der_enc.cpp b/src/lib/asn1/der_enc.cpp index 1ed51d5939b..4617681803e 100644 --- a/src/lib/asn1/der_enc.cpp +++ b/src/lib/asn1/der_enc.cpp @@ -1,6 +1,6 @@ /* * DER Encoder -* (C) 1999-2007 Jack Lloyd +* (C) 1999-2007,2018 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -19,39 +19,40 @@ namespace { /* * DER encode an ASN.1 type tag */ -secure_vector encode_tag(ASN1_Tag type_tag, ASN1_Tag class_tag) +void encode_tag(std::vector& encoded_tag, + ASN1_Tag type_tag, ASN1_Tag class_tag) { if((class_tag | 0xE0) != 0xE0) throw Encoding_Error("DER_Encoder: Invalid class tag " + std::to_string(class_tag)); - secure_vector encoded_tag; if(type_tag <= 30) + { encoded_tag.push_back(static_cast(type_tag | class_tag)); + } else { size_t blocks = high_bit(type_tag) + 6; blocks = (blocks - (blocks % 7)) / 7; - BOTAN_ASSERT(blocks > 0, "Math works"); + BOTAN_ASSERT_NOMSG(blocks > 0); encoded_tag.push_back(static_cast(class_tag | 0x1F)); for(size_t i = 0; i != blocks - 1; ++i) encoded_tag.push_back(0x80 | ((type_tag >> 7*(blocks-i-1)) & 0x7F)); encoded_tag.push_back(type_tag & 0x7F); } - - return encoded_tag; } /* * DER encode an ASN.1 length field */ -secure_vector encode_length(size_t length) +void encode_length(std::vector& encoded_length, size_t length) { - secure_vector encoded_length; if(length <= 127) + { encoded_length.push_back(static_cast(length)); + } else { const size_t bytes_needed = significant_bytes(length); @@ -61,15 +62,14 @@ secure_vector encode_length(size_t length) for(size_t i = sizeof(length) - bytes_needed; i < sizeof(length); ++i) encoded_length.push_back(get_byte(i, length)); } - return encoded_length; } } /* -* Return the encoded SEQUENCE/SET +* Push the encoded SEQUENCE/SET to the encoder stream */ -secure_vector DER_Encoder::DER_Sequence::get_contents() +void DER_Encoder::DER_Sequence::push_contents(DER_Encoder& der) { const ASN1_Tag real_class_tag = ASN1_Tag(m_class_tag | CONSTRUCTED); @@ -81,13 +81,8 @@ secure_vector DER_Encoder::DER_Sequence::get_contents() m_set_contents.clear(); } - secure_vector result; - result += encode_tag(m_type_tag, real_class_tag); - result += encode_length(m_contents.size()); - result += m_contents; + der.add_object(m_type_tag, real_class_tag, m_contents.data(), m_contents.size()); m_contents.clear(); - - return result; } /* @@ -101,6 +96,24 @@ void DER_Encoder::DER_Sequence::add_bytes(const uint8_t data[], size_t length) m_contents += std::make_pair(data, length); } +void DER_Encoder::DER_Sequence::add_bytes(const uint8_t hdr[], size_t hdr_len, + const uint8_t val[], size_t val_len) + { + if(m_type_tag == SET) + { + secure_vector m; + m.reserve(hdr_len + val_len); + m += std::make_pair(hdr, hdr_len); + m += std::make_pair(val, val_len); + m_set_contents.push_back(std::move(m)); + } + else + { + m_contents += std::make_pair(hdr, hdr_len); + m_contents += std::make_pair(val, val_len); + } + } + /* * Return the type and class taggings */ @@ -130,6 +143,16 @@ secure_vector DER_Encoder::get_contents() return output; } +std::vector DER_Encoder::get_contents_unlocked() + { + if(m_subsequences.size() != 0) + throw Invalid_State("DER_Encoder: Sequence hasn't been marked done"); + + std::vector output(m_contents.begin(), m_contents.end()); + m_contents.clear(); + return output; + } + /* * Start a new ASN.1 SEQUENCE/SET/EXPLICIT */ @@ -148,9 +171,10 @@ DER_Encoder& DER_Encoder::end_cons() if(m_subsequences.empty()) throw Invalid_State("DER_Encoder::end_cons: No such sequence"); - secure_vector seq = m_subsequences[m_subsequences.size()-1].get_contents(); + DER_Sequence last_seq = std::move(m_subsequences[m_subsequences.size()-1]); m_subsequences.pop_back(); - raw_bytes(seq); + last_seq.push_contents(*this); + return (*this); } @@ -161,8 +185,9 @@ DER_Encoder& DER_Encoder::start_explicit(uint16_t type_no) { ASN1_Tag type_tag = static_cast(type_no); + // This would confuse DER_Sequence if(type_tag == SET) - throw Internal_Error("DER_Encoder.start_explicit(SET); cannot perform"); + throw Internal_Error("DER_Encoder.start_explicit(SET) not supported"); return start_cons(type_tag, CONTEXT_SPECIFIC); } @@ -181,9 +206,13 @@ DER_Encoder& DER_Encoder::end_explicit() DER_Encoder& DER_Encoder::raw_bytes(const uint8_t bytes[], size_t length) { if(m_subsequences.size()) + { m_subsequences[m_subsequences.size()-1].add_bytes(bytes, length); + } else + { m_contents += std::make_pair(bytes, length); + } return (*this); } @@ -272,28 +301,6 @@ DER_Encoder& DER_Encoder::encode(const BigInt& n, return add_object(type_tag, class_tag, contents); } -/* -* DER encode an OCTET STRING or BIT STRING -*/ -DER_Encoder& DER_Encoder::encode(const secure_vector& bytes, - ASN1_Tag real_type, - ASN1_Tag type_tag, ASN1_Tag class_tag) - { - return encode(bytes.data(), bytes.size(), - real_type, type_tag, class_tag); - } - -/* -* DER encode an OCTET STRING or BIT STRING -*/ -DER_Encoder& DER_Encoder::encode(const std::vector& bytes, - ASN1_Tag real_type, - ASN1_Tag type_tag, ASN1_Tag class_tag) - { - return encode(bytes.data(), bytes.size(), - real_type, type_tag, class_tag); - } - /* * DER encode an OCTET STRING or BIT STRING */ @@ -315,26 +322,6 @@ DER_Encoder& DER_Encoder::encode(const uint8_t bytes[], size_t length, return add_object(type_tag, class_tag, bytes, length); } -/* -* Conditionally write some values to the stream -*/ -DER_Encoder& DER_Encoder::encode_if(bool cond, DER_Encoder& codec) - { - if(cond) - return raw_bytes(codec.get_contents()); - return (*this); - } - -DER_Encoder& DER_Encoder::encode_if(bool cond, const ASN1_Object& obj) - { - if(cond) - encode(obj); - return (*this); - } - -/* -* Request for an object to encode itself -*/ DER_Encoder& DER_Encoder::encode(const ASN1_Object& obj) { obj.encode_into(*this); @@ -347,12 +334,21 @@ DER_Encoder& DER_Encoder::encode(const ASN1_Object& obj) DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, const uint8_t rep[], size_t length) { - secure_vector buffer; - buffer += encode_tag(type_tag, class_tag); - buffer += encode_length(length); - buffer += std::make_pair(rep, length); + std::vector hdr; + encode_tag(hdr, type_tag, class_tag); + encode_length(hdr, length); - return raw_bytes(buffer); + if(m_subsequences.size()) + { + m_subsequences[m_subsequences.size()-1].add_bytes(hdr.data(), hdr.size(), rep, length); + } + else + { + m_contents += hdr; + m_contents += std::make_pair(rep, length); + } + + return (*this); } /* diff --git a/src/lib/asn1/der_enc.h b/src/lib/asn1/der_enc.h index f76391ae5c7..65b19e4c743 100644 --- a/src/lib/asn1/der_enc.h +++ b/src/lib/asn1/der_enc.h @@ -1,6 +1,6 @@ /* * DER Encoder -* (C) 1999-2007 Jack Lloyd +* (C) 1999-2007,2018 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -24,8 +24,7 @@ class BOTAN_PUBLIC_API(2,0) DER_Encoder final public: secure_vector get_contents(); - std::vector get_contents_unlocked() - { return unlock(get_contents()); } + std::vector get_contents_unlocked(); DER_Encoder& start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag = UNIVERSAL); @@ -69,20 +68,19 @@ class BOTAN_PUBLIC_API(2,0) DER_Encoder final ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); - DER_Encoder& encode(const std::vector& v, - ASN1_Tag real_type, - ASN1_Tag type_tag, - ASN1_Tag class_tag = CONTEXT_SPECIFIC); - - DER_Encoder& encode(const secure_vector& v, + DER_Encoder& encode(const uint8_t v[], size_t len, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); - DER_Encoder& encode(const uint8_t v[], size_t len, + template + DER_Encoder& encode(const std::vector& bytes, ASN1_Tag real_type, - ASN1_Tag type_tag, - ASN1_Tag class_tag = CONTEXT_SPECIFIC); + ASN1_Tag type_tag, ASN1_Tag class_tag) + { + return encode(bytes.data(), bytes.size(), + real_type, type_tag, class_tag); + } template DER_Encoder& encode_optional(const T& value, const T& default_value) @@ -100,9 +98,27 @@ class BOTAN_PUBLIC_API(2,0) DER_Encoder final return (*this); } + /* + * Request for an object to encode itself to this stream + */ DER_Encoder& encode(const ASN1_Object& obj); - DER_Encoder& encode_if(bool pred, DER_Encoder& enc); - DER_Encoder& encode_if(bool pred, const ASN1_Object& obj); + + /* + * Conditionally write some values to the stream + */ + DER_Encoder& encode_if(bool pred, DER_Encoder& enc) + { + if(pred) + return raw_bytes(enc.get_contents()); + return (*this); + } + + DER_Encoder& encode_if(bool pred, const ASN1_Object& obj) + { + if(pred) + encode(obj); + return (*this); + } DER_Encoder& add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, const uint8_t rep[], size_t length); @@ -130,9 +146,24 @@ class BOTAN_PUBLIC_API(2,0) DER_Encoder final { public: ASN1_Tag tag_of() const; - secure_vector get_contents(); - void add_bytes(const uint8_t[], size_t); + + void push_contents(DER_Encoder& der); + + void add_bytes(const uint8_t val[], size_t len); + + void add_bytes(const uint8_t hdr[], size_t hdr_len, + const uint8_t val[], size_t val_len); + DER_Sequence(ASN1_Tag, ASN1_Tag); + + DER_Sequence(DER_Sequence&& seq) + { + std::swap(m_type_tag, seq.m_type_tag); + std::swap(m_class_tag, seq.m_class_tag); + std::swap(m_contents, seq.m_contents); + std::swap(m_set_contents, seq.m_set_contents); + } + private: ASN1_Tag m_type_tag, m_class_tag; secure_vector m_contents; From 0bdf86a57f2e64610c214f429fe5b21418866bcc Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 21 May 2018 13:12:11 -0400 Subject: [PATCH 101/174] Make MSVC happy --- src/lib/asn1/der_enc.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/lib/asn1/der_enc.h b/src/lib/asn1/der_enc.h index 65b19e4c743..ebca73d33c7 100644 --- a/src/lib/asn1/der_enc.h +++ b/src/lib/asn1/der_enc.h @@ -164,6 +164,19 @@ class BOTAN_PUBLIC_API(2,0) DER_Encoder final std::swap(m_set_contents, seq.m_set_contents); } + DER_Sequence& operator=(DER_Sequence&& seq) + { + std::swap(m_type_tag, seq.m_type_tag); + std::swap(m_class_tag, seq.m_class_tag); + std::swap(m_contents, seq.m_contents); + std::swap(m_set_contents, seq.m_set_contents); + return (*this); + } + + DER_Sequence(const DER_Sequence& seq) = default; + + DER_Sequence& operator=(const DER_Sequence& seq) = default; + private: ASN1_Tag m_type_tag, m_class_tag; secure_vector m_contents; From d08ce3d912343a9571d81b605ca04763560f8a00 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 21 May 2018 17:50:27 -0400 Subject: [PATCH 102/174] In gen_dl_group cmdlet let --seed be optional for DSA params --- src/cli/pubkey.cpp | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/cli/pubkey.cpp b/src/cli/pubkey.cpp index a72ff68e66a..339a0fa6e59 100644 --- a/src/cli/pubkey.cpp +++ b/src/cli/pubkey.cpp @@ -450,27 +450,24 @@ class Gen_DL_Group final : public Command const size_t qbits = get_arg_sz("qbits"); const std::string type = get_arg("type"); + const std::string seed_str = get_arg("seed"); if(type == "strong") { + if(seed_str.size() > 0) + throw CLI_Usage_Error("Seed only supported for DSA param gen"); Botan::DL_Group grp(rng(), Botan::DL_Group::Strong, pbits); output() << grp.PEM_encode(Botan::DL_Group::ANSI_X9_42); } else if(type == "subgroup") { + if(seed_str.size() > 0) + throw CLI_Usage_Error("Seed only supported for DSA param gen"); Botan::DL_Group grp(rng(), Botan::DL_Group::Prime_Subgroup, pbits, qbits); output() << grp.PEM_encode(Botan::DL_Group::ANSI_X9_42); } else if(type == "dsa") { - const std::string seed_str = get_arg("seed"); - const std::vector seed = Botan::hex_decode(seed_str); - - if(seed.empty()) - { - throw CLI_Usage_Error("Generating DSA parameter set requires providing seed"); - } - size_t dsa_qbits = qbits; if(dsa_qbits == 0) { @@ -482,8 +479,18 @@ class Gen_DL_Group final : public Command throw CLI_Usage_Error("Invalid DSA p/q sizes"); } - Botan::DL_Group grp(rng(), seed, pbits, dsa_qbits); - output() << grp.PEM_encode(Botan::DL_Group::ANSI_X9_42); + if(seed_str.empty()) + { + Botan::DL_Group grp(rng(), Botan::DL_Group::DSA_Kosherizer, pbits, dsa_qbits); + output() << grp.PEM_encode(Botan::DL_Group::ANSI_X9_42); + } + else + { + const std::vector seed = Botan::hex_decode(seed_str); + Botan::DL_Group grp(rng(), seed, pbits, dsa_qbits); + output() << grp.PEM_encode(Botan::DL_Group::ANSI_X9_42); + } + } else { From e37b58c1099d909a26060120512537938fdc4287 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 21 May 2018 17:50:59 -0400 Subject: [PATCH 103/174] Speed up DSA param gen Using Barrett reduction instead of division is ~10x faster. --- src/lib/math/numbertheory/dsa_gen.cpp | 9 ++++++--- src/tests/test_bigint.cpp | 6 ------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/lib/math/numbertheory/dsa_gen.cpp b/src/lib/math/numbertheory/dsa_gen.cpp index 383c24d5ccb..a5efbc2662c 100644 --- a/src/lib/math/numbertheory/dsa_gen.cpp +++ b/src/lib/math/numbertheory/dsa_gen.cpp @@ -7,6 +7,7 @@ #include #include +#include #include namespace Botan { @@ -80,7 +81,7 @@ bool generate_dsa_primes(RandomNumberGenerator& rng, q.set_bit(qbits-1); q.set_bit(0); - if(!is_prime(q, rng, 126)) + if(!is_prime(q, rng, 128, true)) return false; const size_t n = (pbits-1) / (HASH_SIZE * 8), @@ -89,6 +90,8 @@ bool generate_dsa_primes(RandomNumberGenerator& rng, BigInt X; std::vector V(HASH_SIZE * (n+1)); + Modular_Reducer mod_2q(2*q); + for(size_t j = 0; j != 4*pbits; ++j) { for(size_t k = 0; k <= n; ++k) @@ -104,9 +107,9 @@ bool generate_dsa_primes(RandomNumberGenerator& rng, V.size() - (HASH_SIZE - 1 - b/8)); X.set_bit(pbits-1); - p = X - (X % (2*q) - 1); + p = X - (mod_2q.reduce(X) - 1); - if(p.bits() == pbits && is_prime(p, rng, 126)) + if(p.bits() == pbits && is_prime(p, rng, 128, true)) return true; } } diff --git a/src/tests/test_bigint.cpp b/src/tests/test_bigint.cpp index a0012819d28..c7547194b6c 100644 --- a/src/tests/test_bigint.cpp +++ b/src/tests/test_bigint.cpp @@ -682,12 +682,6 @@ class DSA_ParamGen_Test final : public Text_Based_Test Test::Result result("DSA Parameter Generation"); - // These tests are very slow so skip in normal runs - if(p_bits > 1024 && Test::run_long_tests() == false) - { - return result; - } - try { Botan::BigInt gen_P, gen_Q; From ac7354da6788e31a77af6908f289a0724363da84 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 21 May 2018 17:51:59 -0400 Subject: [PATCH 104/174] Use smaller error bound when generating subgroups-style DL groups --- src/lib/pubkey/dl_group/dl_group.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/pubkey/dl_group/dl_group.cpp b/src/lib/pubkey/dl_group/dl_group.cpp index e3c7ac65bb1..9bab123cbc7 100644 --- a/src/lib/pubkey/dl_group/dl_group.cpp +++ b/src/lib/pubkey/dl_group/dl_group.cpp @@ -240,7 +240,7 @@ DL_Group::DL_Group(RandomNumberGenerator& rng, Modular_Reducer mod_2q(2*q); BigInt X; BigInt p; - while(p.bits() != pbits || !is_prime(p, rng)) + while(p.bits() != pbits || !is_prime(p, rng, 128, true)) { X.randomize(rng, pbits); p = X - mod_2q.reduce(X) + 1; From ea8c01fddc8197bfdc453d3c4c76e98c9f3149cd Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 21 May 2018 17:53:33 -0400 Subject: [PATCH 105/174] Use BER_Decoder::get_next to cleanup X.509 cert decoding code --- src/lib/asn1/ber_dec.cpp | 10 +++++++++- src/lib/asn1/ber_dec.h | 2 ++ src/lib/x509/x509cert.cpp | 27 +++++++++++++-------------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/lib/asn1/ber_dec.cpp b/src/lib/asn1/ber_dec.cpp index 28443f2d8c7..35f1a53b5bd 100644 --- a/src/lib/asn1/ber_dec.cpp +++ b/src/lib/asn1/ber_dec.cpp @@ -161,9 +161,17 @@ bool BER_Decoder::more_items() const * Verify that no bytes remain in the source */ BER_Decoder& BER_Decoder::verify_end() + { + return verify_end("BER_Decoder::verify_end called, but data remains"); + } + +/* +* Verify that no bytes remain in the source +*/ +BER_Decoder& BER_Decoder::verify_end(const std::string& err) { if(!m_source->end_of_data() || m_pushed.is_set()) - throw Invalid_State("BER_Decoder::verify_end called, but data remains"); + throw Decoding_Error(err); return (*this); } diff --git a/src/lib/asn1/ber_dec.h b/src/lib/asn1/ber_dec.h index ab251617561..d454c45d65b 100644 --- a/src/lib/asn1/ber_dec.h +++ b/src/lib/asn1/ber_dec.h @@ -27,6 +27,8 @@ class BOTAN_PUBLIC_API(2,0) BER_Decoder final bool more_items() const; BER_Decoder& verify_end(); + BER_Decoder& verify_end(const std::string& err_msg); + BER_Decoder& discard_remaining(); BER_Decoder start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag = UNIVERSAL); diff --git a/src/lib/x509/x509cert.cpp b/src/lib/x509/x509cert.cpp index 8d74d614e27..ddfe5d5b2b2 100644 --- a/src/lib/x509/x509cert.cpp +++ b/src/lib/x509/x509cert.cpp @@ -106,11 +106,12 @@ std::unique_ptr parse_x509_cert_body(const X509_Object& o { std::unique_ptr data(new X509_Certificate_Data); - BER_Decoder tbs_cert(obj.signed_body()); BigInt serial_bn; + BER_Object public_key; + BER_Object v3_exts_data; - tbs_cert.decode_optional(data->m_version, ASN1_Tag(0), - ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) + BER_Decoder(obj.signed_body()) + .decode_optional(data->m_version, ASN1_Tag(0), ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) .decode(serial_bn) .decode(data->m_sig_algo_inner) .decode(data->m_issuer_dn) @@ -118,12 +119,20 @@ std::unique_ptr parse_x509_cert_body(const X509_Object& o .decode(data->m_not_before) .decode(data->m_not_after) .end_cons() - .decode(data->m_subject_dn); + .decode(data->m_subject_dn) + .get_next(public_key) + .decode_optional_string(data->m_v2_issuer_key_id, BIT_STRING, 1) + .decode_optional_string(data->m_v2_subject_key_id, BIT_STRING, 2) + .get_next(v3_exts_data) + .verify_end("TBSCertificate has extra data after extensions block"); if(data->m_version > 2) throw Decoding_Error("Unknown X.509 cert version " + std::to_string(data->m_version)); if(obj.signature_algorithm() != data->m_sig_algo_inner) throw Decoding_Error("X.509 Certificate had differing algorithm identifers in inner and outer ID fields"); + + public_key.assert_is_a(SEQUENCE, CONSTRUCTED, "X.509 certificate public key"); + // crude method to save the serial's sign; will get lost during decoding, otherwise data->m_serial_negative = serial_bn.is_negative(); @@ -134,9 +143,6 @@ std::unique_ptr parse_x509_cert_body(const X509_Object& o data->m_subject_dn_bits = ASN1::put_in_sequence(data->m_subject_dn.get_bits()); data->m_issuer_dn_bits = ASN1::put_in_sequence(data->m_issuer_dn.get_bits()); - BER_Object public_key = tbs_cert.get_next_object(); - public_key.assert_is_a(SEQUENCE, CONSTRUCTED, "X.509 certificate public key"); - // validate_public_key_params(public_key.value); AlgorithmIdentifier public_key_alg_id; BER_Decoder(public_key).decode(public_key_alg_id).discard_remaining(); @@ -193,10 +199,6 @@ std::unique_ptr parse_x509_cert_body(const X509_Object& o .decode(data->m_subject_public_key_algid) .decode(data->m_subject_public_key_bitstring, BIT_STRING); - tbs_cert.decode_optional_string(data->m_v2_issuer_key_id, BIT_STRING, 1); - tbs_cert.decode_optional_string(data->m_v2_subject_key_id, BIT_STRING, 2); - - BER_Object v3_exts_data = tbs_cert.get_next_object(); if(v3_exts_data.is_a(3, ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC))) { BER_Decoder(v3_exts_data).decode(data->m_v3_extensions).verify_end(); @@ -204,9 +206,6 @@ std::unique_ptr parse_x509_cert_body(const X509_Object& o else if(v3_exts_data.is_set()) throw BER_Bad_Tag("Unknown tag in X.509 cert", v3_exts_data.tagging()); - if(tbs_cert.more_items()) - throw Decoding_Error("TBSCertificate has extra data after extensions block"); - // Now cache some fields from the extensions if(auto ext = data->m_v3_extensions.get_extension_object_as()) { From 0c9ff2333c2c80868fbc3ec6aa763259bb5bf9dd Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 21 May 2018 19:52:02 -0400 Subject: [PATCH 106/174] Inline SymmetricAlgorithm::verify_key_set Instead just put the throw into a compiled function. --- src/lib/base/sym_algo.cpp | 5 ++--- src/lib/base/sym_algo.h | 8 +++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/lib/base/sym_algo.cpp b/src/lib/base/sym_algo.cpp index c6062667b27..fff4afbd14a 100644 --- a/src/lib/base/sym_algo.cpp +++ b/src/lib/base/sym_algo.cpp @@ -9,10 +9,9 @@ namespace Botan { -void SymmetricAlgorithm::verify_key_set(bool cond) const +void SymmetricAlgorithm::throw_key_not_set_error() const { - if(cond == false) - throw Key_Not_Set(name()); + throw Key_Not_Set(name()); } void SymmetricAlgorithm::set_key(const uint8_t key[], size_t length) diff --git a/src/lib/base/sym_algo.h b/src/lib/base/sym_algo.h index 2dff9c40d37..e69d4f81eb9 100644 --- a/src/lib/base/sym_algo.h +++ b/src/lib/base/sym_algo.h @@ -86,9 +86,15 @@ class BOTAN_PUBLIC_API(2,0) SymmetricAlgorithm virtual std::string name() const = 0; protected: - void verify_key_set(bool cond) const; + void verify_key_set(bool cond) const + { + if(cond == false) + throw_key_not_set_error(); + } private: + void throw_key_not_set_error() const; + /** * Run the key schedule * @param key the key From cd0bcd90817ece3e4fcba32e06a372580bbe3008 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 21 May 2018 20:01:13 -0400 Subject: [PATCH 107/174] Tweak default `speed` targets --- src/cli/speed.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cli/speed.cpp b/src/cli/speed.cpp index 80ac352728a..9a7a1379443 100644 --- a/src/cli/speed.cpp +++ b/src/cli/speed.cpp @@ -638,6 +638,7 @@ class Speed final : public Command "AES-128/OCB", "AES-128/GCM", "AES-128/XTS", + "AES-128/SIV", "Serpent/CBC", "Serpent/CTR-BE", @@ -645,37 +646,36 @@ class Speed final : public Command "Serpent/OCB", "Serpent/GCM", "Serpent/XTS", + "Serpent/SIV", "ChaCha20Poly1305", /* Stream ciphers */ "RC4", "Salsa20", + "ChaCha20", /* Hashes */ - "Tiger", - "RIPEMD-160", "SHA-160", "SHA-256", "SHA-512", + "SHA-3(256)", + "SHA-3(512)", + "RIPEMD-160", "Skein-512", - "Keccak-1600(512)", + "Blake2b", + "Tiger", "Whirlpool", /* MACs */ "CMAC(AES-128)", "HMAC(SHA-256)", - /* Misc */ - "random_prime", - /* pubkey */ "RSA", "DH", "ECDH", "ECDSA", - "ECKCDSA", - "ECGDSA", "Ed25519", "Curve25519", "NEWHOPE", From 8c84e39d31ab3147ce35969a23ea03f6ef841986 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 22 May 2018 08:57:43 -0400 Subject: [PATCH 108/174] Correct outdated material in filter doc [ci skip] --- doc/manual/filters.rst | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/doc/manual/filters.rst b/doc/manual/filters.rst index cae50cc3381..f62d78ce2f6 100644 --- a/doc/manual/filters.rst +++ b/doc/manual/filters.rst @@ -85,16 +85,13 @@ generator. If you want to, you can explicitly set up the random number generators and entropy sources you want to, however for 99% of cases ``AutoSeeded_RNG`` is preferable. -``Pipe`` also has convenience methods for dealing with -``std::iostream``. Here is an example of those, using the -``Bzip_Compression`` filter (included as a module; if you have bzlib -available, check the build instructions for how to enable it) to -compress a file:: +``Pipe`` also has convenience methods for dealing with ``std::iostream``. +Here is an example of this, using the bzip2 compression filter:: std::ifstream in("data.bin", std::ios::binary) std::ofstream out("data.bin.bz2", std::ios::binary) - Pipe pipe(new Bzip_Compression); + Pipe pipe(new Compression_Filter("bzip2", 9)); pipe.start_msg(); in >> pipe; @@ -113,7 +110,7 @@ reading it out later, we divert it directly to the file:: std::ifstream in("data.bin", std::ios::binary) std::ofstream out("data.bin.bz2", std::ios::binary) - Pipe pipe(new Bzip_Compression, new DataSink_Stream(out)); + Pipe pipe(new Compression_Filter("bzip2", 9), new DataSink_Stream(out)); pipe.start_msg(); in >> pipe; From 9535a0d01d3491b1383c48554e67e06bf9803451 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 22 May 2018 08:57:58 -0400 Subject: [PATCH 109/174] Add list of available KDFs --- doc/manual/kdf.rst | 69 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/doc/manual/kdf.rst b/doc/manual/kdf.rst index e5d6a99d754..984a25f15f1 100644 --- a/doc/manual/kdf.rst +++ b/doc/manual/kdf.rst @@ -35,3 +35,72 @@ You can create a :cpp:class:`KDF` using .. cpp:function:: KDF* get_kdf(const std::string& algo_spec) + +Available KDFs +------------------- + +Botan includes many different KDFs simply because different protocols and +standards have created subtly different approaches to this problem. For new +code, use HKDF which is conservative, well studied, widely implemented and NIST +approved. + +HKDF +~~~~~ + +Defined in RFC 5869, HKDF uses HMAC to process inputs. Also available +are variants HKDF-Extract and HKDF-Expand. HKDF is the combined +Extract+Expand operation. Use the combined HKDF unless you need +compatability with some other system. + +Available if ``BOTAN_HAS_HKDF`` is defined. + +KDF2 +~~~~~ + +KDF2 comes from IEEE 1363. It uses a hash function. + +Available if ``BOTAN_HAS_KDF2`` is defined. + +KDF1-18033 +~~~~~~~~~~~~ + +KDF1 from ISO 18033-2. Very similar to (but incompatible with) KDF2. + +Available if ``BOTAN_HAS_KDF1_18033`` is defined. + +KDF1 +~~~~~~ + +KDF1 from IEEE 1363. It can only produce an output at most the length +of the hash function used. + +Available if ``BOTAN_HAS_KDF1`` is defined. + +X9.42 PRF +~~~~~~~~~~ + +A KDF from ANSI X9.42. Sometimes used for Diffie-Hellman. + +Available if ``BOTAN_HAS_X942_PRF`` is defined. + +SP800-108 +~~~~~~~~~~ + +KDFs from NIST SP 800-108. Variants include "SP800-108-Counter", +"SP800-108-Feedback" and "SP800-108-Pipeline". + +Available if ``BOTAN_HAS_SP800_108`` is defined. + +SP800-56A +~~~~~~~~~~ + +KDF from NIST SP 800-56A. + +Available if ``BOTAN_HAS_SP800_56A`` is defined. + +SP800-56C +~~~~~~~~~~ + +KDF from NIST SP 800-56C. + +Available if ``BOTAN_HAS_SP800_56C`` is defined. From 3789138906cecbcc5e33bb0d5784e6b576171080 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 22 May 2018 11:04:15 -0400 Subject: [PATCH 110/174] DER improvements Let DER_Encoder write to a user specified vector instead of only to an internal vector. This allows encoding to a std::vector without having to first write to a locked vector and then copying out the result. Add ASN1_Object::BER_encode convenience method. Replaces X509_Object::BER_encode which had the same logic but was restricted to a subtype. This replaces many cases where DER_Encoder was just used to encode a single object (X509_DN, AlgorithmIdentifier, etc). --- src/lib/asn1/asn1_obj.cpp | 17 ++++- src/lib/asn1/asn1_obj.h | 9 ++- src/lib/asn1/asn1_print.cpp | 5 +- src/lib/asn1/der_enc.cpp | 85 +++++++++++++++------- src/lib/asn1/der_enc.h | 23 +++++- src/lib/kdf/prf_x942/prf_x942.cpp | 5 +- src/lib/pk_pad/emsa_pssr/pssr.cpp | 28 +++---- src/lib/pubkey/dl_algo/dl_algo.cpp | 4 +- src/lib/pubkey/dl_group/dl_group.cpp | 25 +++---- src/lib/pubkey/ec_group/ec_group.cpp | 20 +++-- src/lib/pubkey/gost_3410/gost_3410.cpp | 13 ++-- src/lib/pubkey/mce/mceliece_key.cpp | 7 +- src/lib/pubkey/pbes2/pbes2.cpp | 35 ++++----- src/lib/pubkey/pk_keys.cpp | 14 ++-- src/lib/pubkey/pkcs8.cpp | 43 ++++++----- src/lib/pubkey/pubkey.cpp | 7 +- src/lib/pubkey/rsa/rsa.cpp | 10 ++- src/lib/x509/certstor_sql/certstor_sql.cpp | 37 ++++------ src/lib/x509/ocsp.cpp | 7 +- src/lib/x509/x509_ext.cpp | 60 +++++++++------ src/lib/x509/x509_obj.cpp | 28 +++---- src/lib/x509/x509_obj.h | 5 -- 22 files changed, 287 insertions(+), 200 deletions(-) diff --git a/src/lib/asn1/asn1_obj.cpp b/src/lib/asn1/asn1_obj.cpp index bbe469f5cf5..98f44d40762 100644 --- a/src/lib/asn1/asn1_obj.cpp +++ b/src/lib/asn1/asn1_obj.cpp @@ -1,6 +1,6 @@ /* * ASN.1 Internals -* (C) 1999-2007 Jack Lloyd +* (C) 1999-2007,2018 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -12,6 +12,14 @@ namespace Botan { +std::vector ASN1_Object::BER_encode() const + { + std::vector output; + DER_Encoder der(output); + this->encode_into(der); + return output; + } + /* * Check a type invariant on BER data */ @@ -132,11 +140,12 @@ std::vector put_in_sequence(const std::vector& contents) std::vector put_in_sequence(const uint8_t bits[], size_t len) { - return DER_Encoder() + std::vector output; + DER_Encoder(output) .start_cons(SEQUENCE) .raw_bytes(bits, len) - .end_cons() - .get_contents_unlocked(); + .end_cons(); + return output; } /* diff --git a/src/lib/asn1/asn1_obj.h b/src/lib/asn1/asn1_obj.h index 2c2a3097a00..b9477da092c 100644 --- a/src/lib/asn1/asn1_obj.h +++ b/src/lib/asn1/asn1_obj.h @@ -1,6 +1,6 @@ /* * ASN.1 Internals -* (C) 1999-2007 Jack Lloyd +* (C) 1999-2007,2018 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -76,6 +76,13 @@ class BOTAN_PUBLIC_API(2,0) ASN1_Object */ virtual void decode_from(BER_Decoder& from) = 0; + /** + * Return the encoding of this object. This is a convenience + * method when just one object needs to be serialized. Use + * DER_Encoder for complicated encodings. + */ + std::vector BER_encode() const; + ASN1_Object() = default; ASN1_Object(const ASN1_Object&) = default; ASN1_Object & operator=(const ASN1_Object&) = default; diff --git a/src/lib/asn1/asn1_print.cpp b/src/lib/asn1/asn1_print.cpp index cb223e1307d..1f917826651 100644 --- a/src/lib/asn1/asn1_print.cpp +++ b/src/lib/asn1/asn1_print.cpp @@ -87,9 +87,8 @@ void ASN1_Formatter::decode(std::ostream& output, /* hack to insert the tag+length back in front of the stuff now that we've gotten the type info */ - DER_Encoder encoder; - encoder.add_object(type_tag, class_tag, obj.bits(), obj.length()); - const std::vector bits = encoder.get_contents_unlocked(); + std::vector bits; + DER_Encoder(bits).add_object(type_tag, class_tag, obj.bits(), obj.length()); BER_Decoder data(bits); diff --git a/src/lib/asn1/der_enc.cpp b/src/lib/asn1/der_enc.cpp index 4617681803e..c1ec010a04e 100644 --- a/src/lib/asn1/der_enc.cpp +++ b/src/lib/asn1/der_enc.cpp @@ -66,6 +66,22 @@ void encode_length(std::vector& encoded_length, size_t length) } +DER_Encoder::DER_Encoder(secure_vector& vec) + { + m_append_output_fn = [&vec](const uint8_t b[], size_t l) + { + vec.insert(vec.end(), b, b + l); + }; + } + +DER_Encoder::DER_Encoder(std::vector& vec) + { + m_append_output_fn = [&vec](const uint8_t b[], size_t l) + { + vec.insert(vec.end(), b, b + l); + }; + } + /* * Push the encoded SEQUENCE/SET to the encoder stream */ @@ -138,8 +154,11 @@ secure_vector DER_Encoder::get_contents() if(m_subsequences.size() != 0) throw Invalid_State("DER_Encoder: Sequence hasn't been marked done"); + if(m_append_output_fn) + throw Invalid_State("DER_Encoder Cannot get contents when using output vector"); + secure_vector output; - std::swap(output, m_contents); + std::swap(output, m_default_outbuf); return output; } @@ -148,8 +167,11 @@ std::vector DER_Encoder::get_contents_unlocked() if(m_subsequences.size() != 0) throw Invalid_State("DER_Encoder: Sequence hasn't been marked done"); - std::vector output(m_contents.begin(), m_contents.end()); - m_contents.clear(); + if(m_append_output_fn) + throw Invalid_State("DER_Encoder Cannot get contents when using output vector"); + + std::vector output(m_default_outbuf.begin(), m_default_outbuf.end()); + m_default_outbuf.clear(); return output; } @@ -209,9 +231,41 @@ DER_Encoder& DER_Encoder::raw_bytes(const uint8_t bytes[], size_t length) { m_subsequences[m_subsequences.size()-1].add_bytes(bytes, length); } + else if(m_append_output_fn) + { + m_append_output_fn(bytes, length); + } else { - m_contents += std::make_pair(bytes, length); + m_default_outbuf += std::make_pair(bytes, length); + } + + return (*this); + } + +/* +* Write the encoding of the byte(s) +*/ +DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, + const uint8_t rep[], size_t length) + { + std::vector hdr; + encode_tag(hdr, type_tag, class_tag); + encode_length(hdr, length); + + if(m_subsequences.size()) + { + m_subsequences[m_subsequences.size()-1].add_bytes(hdr.data(), hdr.size(), rep, length); + } + else if(m_append_output_fn) + { + m_append_output_fn(hdr.data(), hdr.size()); + m_append_output_fn(rep, length); + } + else + { + m_default_outbuf += hdr; + m_default_outbuf += std::make_pair(rep, length); } return (*this); @@ -328,29 +382,6 @@ DER_Encoder& DER_Encoder::encode(const ASN1_Object& obj) return (*this); } -/* -* Write the encoding of the byte(s) -*/ -DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, - const uint8_t rep[], size_t length) - { - std::vector hdr; - encode_tag(hdr, type_tag, class_tag); - encode_length(hdr, length); - - if(m_subsequences.size()) - { - m_subsequences[m_subsequences.size()-1].add_bytes(hdr.data(), hdr.size(), rep, length); - } - else - { - m_contents += hdr; - m_contents += std::make_pair(rep, length); - } - - return (*this); - } - /* * Write the encoding of the byte(s) */ diff --git a/src/lib/asn1/der_enc.h b/src/lib/asn1/der_enc.h index ebca73d33c7..f351817f91e 100644 --- a/src/lib/asn1/der_enc.h +++ b/src/lib/asn1/der_enc.h @@ -10,6 +10,7 @@ #include #include +#include namespace Botan { @@ -22,6 +23,25 @@ class ASN1_Object; class BOTAN_PUBLIC_API(2,0) DER_Encoder final { public: + /** + * DER encode, writing to an internal buffer + * Use get_contents or get_contents_unlocked to read the results + * after all encoding is completed. + */ + DER_Encoder() = default; + + /** + * DER encode, writing to @param vec + * If this constructor is used, get_contents* may not be called. + */ + DER_Encoder(secure_vector& vec); + + /** + * DER encode, writing to @param vec + * If this constructor is used, get_contents* may not be called. + */ + DER_Encoder(std::vector& vec); + secure_vector get_contents(); std::vector get_contents_unlocked(); @@ -183,7 +203,8 @@ class BOTAN_PUBLIC_API(2,0) DER_Encoder final std::vector< secure_vector > m_set_contents; }; - secure_vector m_contents; + std::function m_append_output_fn; + secure_vector m_default_outbuf; std::vector m_subsequences; }; diff --git a/src/lib/kdf/prf_x942/prf_x942.cpp b/src/lib/kdf/prf_x942/prf_x942.cpp index 1abb4e77ee7..978892ef04b 100644 --- a/src/lib/kdf/prf_x942/prf_x942.cpp +++ b/src/lib/kdf/prf_x942/prf_x942.cpp @@ -23,7 +23,10 @@ std::vector encode_x942_int(uint32_t n) { uint8_t n_buf[4] = { 0 }; store_be(n, n_buf); - return DER_Encoder().encode(n_buf, 4, OCTET_STRING).get_contents_unlocked(); + + std::vector output; + DER_Encoder(output).encode(n_buf, 4, OCTET_STRING); + return output; } } diff --git a/src/lib/pk_pad/emsa_pssr/pssr.cpp b/src/lib/pk_pad/emsa_pssr/pssr.cpp index abe84f455f2..97b229be35a 100644 --- a/src/lib/pk_pad/emsa_pssr/pssr.cpp +++ b/src/lib/pk_pad/emsa_pssr/pssr.cpp @@ -186,24 +186,16 @@ AlgorithmIdentifier PSSR::config_for_x509(const Private_Key& key, // hardcoded as RSA is the only valid algorithm for EMSA4 at the moment sig_algo.oid = OIDS::lookup( "RSA/EMSA4" ); - sig_algo.parameters = DER_Encoder() - .start_cons( SEQUENCE ) - .start_cons( ASN1_Tag(0), CONTEXT_SPECIFIC ) - .encode( AlgorithmIdentifier( cert_hash_name, AlgorithmIdentifier::USE_NULL_PARAM ) ) - .end_cons() - .start_cons( ASN1_Tag(1), CONTEXT_SPECIFIC ) - .encode( AlgorithmIdentifier( "MGF1", DER_Encoder() - .encode( AlgorithmIdentifier( cert_hash_name, AlgorithmIdentifier::USE_NULL_PARAM ) ) - .get_contents_unlocked() ) ) - .end_cons() - .start_cons( ASN1_Tag(2), CONTEXT_SPECIFIC ) - .encode( size_t( m_SALT_SIZE ) ) - .end_cons() - .start_cons( ASN1_Tag(3), CONTEXT_SPECIFIC ) - .encode( size_t( 1 ) ) // trailer field - .end_cons() - .end_cons() - .get_contents_unlocked(); + const AlgorithmIdentifier hash_id(cert_hash_name, AlgorithmIdentifier::USE_NULL_PARAM); + const AlgorithmIdentifier mgf_id("MGF1", hash_id.BER_encode()); + + DER_Encoder(sig_algo.parameters) + .start_cons(SEQUENCE) + .start_cons(ASN1_Tag(0), CONTEXT_SPECIFIC).encode(hash_id).end_cons() + .start_cons(ASN1_Tag(1), CONTEXT_SPECIFIC).encode(mgf_id).end_cons() + .start_cons(ASN1_Tag(2), CONTEXT_SPECIFIC).encode(m_SALT_SIZE).end_cons() + .start_cons(ASN1_Tag(3), CONTEXT_SPECIFIC).encode(size_t(1)).end_cons() // trailer field + .end_cons(); return sig_algo; } diff --git a/src/lib/pubkey/dl_algo/dl_algo.cpp b/src/lib/pubkey/dl_algo/dl_algo.cpp index f9d6178b053..15b0b175e42 100644 --- a/src/lib/pubkey/dl_algo/dl_algo.cpp +++ b/src/lib/pubkey/dl_algo/dl_algo.cpp @@ -30,7 +30,9 @@ AlgorithmIdentifier DL_Scheme_PublicKey::algorithm_identifier() const std::vector DL_Scheme_PublicKey::public_key_bits() const { - return DER_Encoder().encode(m_y).get_contents_unlocked(); + std::vector output; + DER_Encoder(output).encode(m_y); + return output; } DL_Scheme_PublicKey::DL_Scheme_PublicKey(const DL_Group& group, const BigInt& y) : diff --git a/src/lib/pubkey/dl_group/dl_group.cpp b/src/lib/pubkey/dl_group/dl_group.cpp index 9bab123cbc7..6a2d21c8bbb 100644 --- a/src/lib/pubkey/dl_group/dl_group.cpp +++ b/src/lib/pubkey/dl_group/dl_group.cpp @@ -457,37 +457,36 @@ std::vector DL_Group::DER_encode(Format format) const if(get_q().is_zero() && (format == ANSI_X9_57 || format == ANSI_X9_42)) throw Encoding_Error("Cannot encode DL_Group in ANSI formats when q param is missing"); + std::vector output; + DER_Encoder der(output); + if(format == ANSI_X9_57) { - return DER_Encoder() - .start_cons(SEQUENCE) + der.start_cons(SEQUENCE) .encode(get_p()) .encode(get_q()) .encode(get_g()) - .end_cons() - .get_contents_unlocked(); + .end_cons(); } else if(format == ANSI_X9_42) { - return DER_Encoder() - .start_cons(SEQUENCE) + der.start_cons(SEQUENCE) .encode(get_p()) .encode(get_g()) .encode(get_q()) - .end_cons() - .get_contents_unlocked(); + .end_cons(); } else if(format == PKCS_3) { - return DER_Encoder() - .start_cons(SEQUENCE) + der.start_cons(SEQUENCE) .encode(get_p()) .encode(get_g()) - .end_cons() - .get_contents_unlocked(); + .end_cons(); } + else + throw Invalid_Argument("Unknown DL_Group encoding " + std::to_string(format)); - throw Invalid_Argument("Unknown DL_Group encoding " + std::to_string(format)); + return output; } /* diff --git a/src/lib/pubkey/ec_group/ec_group.cpp b/src/lib/pubkey/ec_group/ec_group.cpp index ac23aa151e8..004708c7cc0 100644 --- a/src/lib/pubkey/ec_group/ec_group.cpp +++ b/src/lib/pubkey/ec_group/ec_group.cpp @@ -550,6 +550,10 @@ PointGFp EC_Group::zero_point() const std::vector EC_Group::DER_encode(EC_Group_Encoding form) const { + std::vector output; + + DER_Encoder der(output); + if(form == EC_DOMPAR_ENC_EXPLICIT) { const size_t ecpVers1 = 1; @@ -557,8 +561,7 @@ EC_Group::DER_encode(EC_Group_Encoding form) const const size_t p_bytes = get_p_bytes(); - return DER_Encoder() - .start_cons(SEQUENCE) + der.start_cons(SEQUENCE) .encode(ecpVers1) .start_cons(SEQUENCE) .encode(curve_type) @@ -573,8 +576,7 @@ EC_Group::DER_encode(EC_Group_Encoding form) const .encode(get_base_point().encode(PointGFp::UNCOMPRESSED), OCTET_STRING) .encode(get_order()) .encode(get_cofactor()) - .end_cons() - .get_contents_unlocked(); + .end_cons(); } else if(form == EC_DOMPAR_ENC_OID) { @@ -583,12 +585,18 @@ EC_Group::DER_encode(EC_Group_Encoding form) const { throw Encoding_Error("Cannot encode EC_Group as OID because OID not set"); } - return DER_Encoder().encode(oid).get_contents_unlocked(); + der.encode(oid); } else if(form == EC_DOMPAR_ENC_IMPLICITCA) - return DER_Encoder().encode_null().get_contents_unlocked(); + { + der.encode_null(); + } else + { throw Internal_Error("EC_Group::DER_encode: Unknown encoding"); + } + + return output; } std::string EC_Group::PEM_encode() const diff --git a/src/lib/pubkey/gost_3410/gost_3410.cpp b/src/lib/pubkey/gost_3410/gost_3410.cpp index 1d1b0d75e7f..d6e8874ab47 100644 --- a/src/lib/pubkey/gost_3410/gost_3410.cpp +++ b/src/lib/pubkey/gost_3410/gost_3410.cpp @@ -35,16 +35,19 @@ std::vector GOST_3410_PublicKey::public_key_bits() const std::swap(bits[part_size+i], bits[2*part_size-1-i]); } - return DER_Encoder().encode(bits, OCTET_STRING).get_contents_unlocked(); + std::vector output; + DER_Encoder(output).encode(bits, OCTET_STRING); + return output; } AlgorithmIdentifier GOST_3410_PublicKey::algorithm_identifier() const { - std::vector params = - DER_Encoder().start_cons(SEQUENCE) + std::vector params; + + DER_Encoder(params) + .start_cons(SEQUENCE) .encode(domain().get_curve_oid()) - .end_cons() - .get_contents_unlocked(); + .end_cons(); return AlgorithmIdentifier(get_oid(), params); } diff --git a/src/lib/pubkey/mce/mceliece_key.cpp b/src/lib/pubkey/mce/mceliece_key.cpp index 67ff8f63534..4fe78d2a1bb 100644 --- a/src/lib/pubkey/mce/mceliece_key.cpp +++ b/src/lib/pubkey/mce/mceliece_key.cpp @@ -72,15 +72,16 @@ AlgorithmIdentifier McEliece_PublicKey::algorithm_identifier() const std::vector McEliece_PublicKey::public_key_bits() const { - return DER_Encoder() + std::vector output; + DER_Encoder(output) .start_cons(SEQUENCE) .start_cons(SEQUENCE) .encode(static_cast(get_code_length())) .encode(static_cast(get_t())) .end_cons() .encode(m_public_matrix, OCTET_STRING) - .end_cons() - .get_contents_unlocked(); + .end_cons(); + return output; } size_t McEliece_PublicKey::key_length() const diff --git a/src/lib/pubkey/pbes2/pbes2.cpp b/src/lib/pubkey/pbes2/pbes2.cpp index e7bdf96ec7d..a6590938ad9 100644 --- a/src/lib/pubkey/pbes2/pbes2.cpp +++ b/src/lib/pubkey/pbes2/pbes2.cpp @@ -29,29 +29,30 @@ std::vector encode_pbes2_params(const std::string& cipher, size_t iterations, size_t key_length) { - return DER_Encoder() + std::vector output; + + std::vector pbkdf2_params; + + DER_Encoder(pbkdf2_params) .start_cons(SEQUENCE) - .encode( - AlgorithmIdentifier("PKCS5.PBKDF2", - DER_Encoder() - .start_cons(SEQUENCE) - .encode(salt, OCTET_STRING) - .encode(iterations) - .encode(key_length) - .encode_if( - prf != "HMAC(SHA-160)", - AlgorithmIdentifier(prf, AlgorithmIdentifier::USE_NULL_PARAM)) - .end_cons() - .get_contents_unlocked() - ) - ) + .encode(salt, OCTET_STRING) + .encode(iterations) + .encode(key_length) + .encode_if(prf != "HMAC(SHA-160)", + AlgorithmIdentifier(prf, AlgorithmIdentifier::USE_NULL_PARAM)) + .end_cons(); + + DER_Encoder(output) + .start_cons(SEQUENCE) + .encode(AlgorithmIdentifier("PKCS5.PBKDF2", pbkdf2_params)) .encode( AlgorithmIdentifier(cipher, DER_Encoder().encode(iv, OCTET_STRING).get_contents_unlocked() ) ) - .end_cons() - .get_contents_unlocked(); + .end_cons(); + + return output; } /* diff --git a/src/lib/pubkey/pk_keys.cpp b/src/lib/pubkey/pk_keys.cpp index cdf8ae8ff91..fbbc6f7dd49 100644 --- a/src/lib/pubkey/pk_keys.cpp +++ b/src/lib/pubkey/pk_keys.cpp @@ -37,12 +37,14 @@ std::string create_hex_fingerprint(const uint8_t bits[], std::vector Public_Key::subject_public_key() const { - return DER_Encoder() - .start_cons(SEQUENCE) - .encode(algorithm_identifier()) - .encode(public_key_bits(), BIT_STRING) - .end_cons() - .get_contents_unlocked(); + std::vector output; + + DER_Encoder(output).start_cons(SEQUENCE) + .encode(algorithm_identifier()) + .encode(public_key_bits(), BIT_STRING) + .end_cons(); + + return output; } /* diff --git a/src/lib/pubkey/pkcs8.cpp b/src/lib/pubkey/pkcs8.cpp index bea3beec0f3..1034dfa990a 100644 --- a/src/lib/pubkey/pkcs8.cpp +++ b/src/lib/pubkey/pkcs8.cpp @@ -192,12 +192,14 @@ std::vector BER_encode(const Private_Key& key, pbes2_encrypt_msec(PKCS8::BER_encode(key), pass, msec, nullptr, pbe_params.first, pbe_params.second, rng); - return DER_Encoder() - .start_cons(SEQUENCE) - .encode(pbe_info.first) - .encode(pbe_info.second, OCTET_STRING) - .end_cons() - .get_contents_unlocked(); + std::vector output; + DER_Encoder der(output); + der.start_cons(SEQUENCE) + .encode(pbe_info.first) + .encode(pbe_info.second, OCTET_STRING) + .end_cons(); + + return output; #else BOTAN_UNUSED(key, rng, pass, msec, pbe_algo); throw Encoding_Error("PKCS8::BER_encode cannot encrypt because PBES2 was disabled in build"); @@ -238,12 +240,15 @@ std::vector BER_encode_encrypted_pbkdf_iter(const Private_Key& key, pbkdf_hash.empty() ? "SHA-256" : pbkdf_hash, rng); - return DER_Encoder() - .start_cons(SEQUENCE) - .encode(pbe_info.first) - .encode(pbe_info.second, OCTET_STRING) - .end_cons() - .get_contents_unlocked(); + std::vector output; + DER_Encoder der(output); + der.start_cons(SEQUENCE) + .encode(pbe_info.first) + .encode(pbe_info.second, OCTET_STRING) + .end_cons(); + + return output; + #else BOTAN_UNUSED(key, rng, pass, pbkdf_iterations, cipher, pbkdf_hash); throw Encoding_Error("PKCS8::BER_encode_encrypted_pbkdf_iter cannot encrypt because PBES2 disabled in build"); @@ -284,12 +289,14 @@ std::vector BER_encode_encrypted_pbkdf_msec(const Private_Key& key, pbkdf_hash.empty() ? "SHA-256" : pbkdf_hash, rng); - return DER_Encoder() - .start_cons(SEQUENCE) - .encode(pbe_info.first) - .encode(pbe_info.second, OCTET_STRING) - .end_cons() - .get_contents_unlocked(); + std::vector output; + DER_Encoder(output) + .start_cons(SEQUENCE) + .encode(pbe_info.first) + .encode(pbe_info.second, OCTET_STRING) + .end_cons(); + + return output; #else BOTAN_UNUSED(key, rng, pass, pbkdf_msec, pbkdf_iterations, cipher, pbkdf_hash); throw Encoding_Error("BER_encode_encrypted_pbkdf_msec cannot encrypt because PBES2 disabled in build"); diff --git a/src/lib/pubkey/pubkey.cpp b/src/lib/pubkey/pubkey.cpp index d9b2cc8f6db..bc476b30de6 100644 --- a/src/lib/pubkey/pubkey.cpp +++ b/src/lib/pubkey/pubkey.cpp @@ -246,11 +246,12 @@ std::vector PK_Signer::signature(RandomNumberGenerator& rng) for(size_t i = 0; i != sig_parts.size(); ++i) sig_parts[i].binary_decode(&sig[m_part_size*i], m_part_size); - return DER_Encoder() + std::vector output; + DER_Encoder(output) .start_cons(SEQUENCE) .encode_list(sig_parts) - .end_cons() - .get_contents_unlocked(); + .end_cons(); + return output; } else throw Internal_Error("PK_Signer: Invalid signature format enum"); diff --git a/src/lib/pubkey/rsa/rsa.cpp b/src/lib/pubkey/rsa/rsa.cpp index fdc5b63d03c..b58724c6394 100644 --- a/src/lib/pubkey/rsa/rsa.cpp +++ b/src/lib/pubkey/rsa/rsa.cpp @@ -45,12 +45,14 @@ AlgorithmIdentifier RSA_PublicKey::algorithm_identifier() const std::vector RSA_PublicKey::public_key_bits() const { - return DER_Encoder() - .start_cons(SEQUENCE) + std::vector output; + DER_Encoder der(output); + der.start_cons(SEQUENCE) .encode(m_n) .encode(m_e) - .end_cons() - .get_contents_unlocked(); + .end_cons(); + + return output; } RSA_PublicKey::RSA_PublicKey(const AlgorithmIdentifier&, diff --git a/src/lib/x509/certstor_sql/certstor_sql.cpp b/src/lib/x509/certstor_sql/certstor_sql.cpp index d2991a0190d..1ffa2e8ca55 100644 --- a/src/lib/x509/certstor_sql/certstor_sql.cpp +++ b/src/lib/x509/certstor_sql/certstor_sql.cpp @@ -1,6 +1,7 @@ /* * Certificate Store in SQL * (C) 2016 Kai Michaelis, Rohde & Schwarz Cybersecurity +* (C) 2018 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -8,7 +9,6 @@ #include #include #include -#include #include #include @@ -46,21 +46,20 @@ Certificate_Store_In_SQL::Certificate_Store_In_SQL(std::shared_ptr std::shared_ptr Certificate_Store_In_SQL::find_cert(const X509_DN& subject_dn, const std::vector& key_id) const { - DER_Encoder enc; std::shared_ptr stmt; - subject_dn.encode_into(enc); + const std::vector dn_encoding = subject_dn.BER_encode(); if(key_id.empty()) { stmt = m_database->new_statement("SELECT certificate FROM " + m_prefix + "certificates WHERE subject_dn == ?1"); - stmt->bind(1,enc.get_contents_unlocked()); + stmt->bind(1, dn_encoding); } else { stmt = m_database->new_statement("SELECT certificate FROM " + m_prefix + "certificates WHERE\ subject_dn == ?1 AND (key_id == NULL OR key_id == ?2)"); - stmt->bind(1,enc.get_contents_unlocked()); + stmt->bind(1, dn_encoding); stmt->bind(2,key_id); } @@ -81,22 +80,21 @@ Certificate_Store_In_SQL::find_all_certs(const X509_DN& subject_dn, const std::v { std::vector> certs; - DER_Encoder enc; std::shared_ptr stmt; - subject_dn.encode_into(enc); + const std::vector dn_encoding = subject_dn.BER_encode(); if(key_id.empty()) { stmt = m_database->new_statement("SELECT certificate FROM " + m_prefix + "certificates WHERE subject_dn == ?1"); - stmt->bind(1,enc.get_contents_unlocked()); + stmt->bind(1, dn_encoding); } else { stmt = m_database->new_statement("SELECT certificate FROM " + m_prefix + "certificates WHERE\ subject_dn == ?1 AND (key_id == NULL OR key_id == ?2)"); - stmt->bind(1,enc.get_contents_unlocked()); - stmt->bind(2,key_id); + stmt->bind(1, dn_encoding); + stmt->bind(2, key_id); } std::shared_ptr cert; @@ -113,13 +111,13 @@ Certificate_Store_In_SQL::find_all_certs(const X509_DN& subject_dn, const std::v std::shared_ptr Certificate_Store_In_SQL::find_cert_by_pubkey_sha1(const std::vector& /*key_hash*/) const { - throw Not_Implemented("TODO!"); + throw Not_Implemented("Certificate_Store_In_SQL::find_cert_by_pubkey_sha1"); } std::shared_ptr Certificate_Store_In_SQL::find_cert_by_raw_subject_dn_sha256(const std::vector& /*subject_hash*/) const { - throw Not_Implemented("TODO!"); + throw Not_Implemented("Certificate_Store_In_SQL::find_cert_by_raw_subject_dn_sha256"); } std::shared_ptr @@ -157,7 +155,9 @@ std::vector Certificate_Store_In_SQL::all_subjects() const bool Certificate_Store_In_SQL::insert_cert(const X509_Certificate& cert) { - DER_Encoder enc; + const std::vector dn_encoding = cert.subject_dn().BER_encode(); + const std::vector cert_encoding = cert.BER_encode(); + auto stmt = m_database->new_statement("INSERT OR REPLACE INTO " + m_prefix + "certificates (\ fingerprint, \ @@ -168,13 +168,10 @@ bool Certificate_Store_In_SQL::insert_cert(const X509_Certificate& cert) ) VALUES ( ?1, ?2, ?3, ?4, ?5 )"); stmt->bind(1,cert.fingerprint("SHA-256")); - cert.subject_dn().encode_into(enc); - stmt->bind(2,enc.get_contents_unlocked()); + stmt->bind(2,dn_encoding); stmt->bind(3,cert.subject_key_id()); stmt->bind(4,std::vector()); - enc = DER_Encoder(); - cert.encode_into(enc); - stmt->bind(5,enc.get_contents_unlocked()); + stmt->bind(5,cert_encoding); stmt->spin(); return true; @@ -281,9 +278,7 @@ void Certificate_Store_In_SQL::revoke_cert(const X509_Certificate& cert, CRL_Cod if(time.time_is_set()) { - DER_Encoder der; - time.encode_into(der); - stmt1->bind(3,der.get_contents_unlocked()); + stmt1->bind(3, time.BER_encode()); } else { diff --git a/src/lib/x509/ocsp.cpp b/src/lib/x509/ocsp.cpp index 751f858a589..115c4117ac3 100644 --- a/src/lib/x509/ocsp.cpp +++ b/src/lib/x509/ocsp.cpp @@ -68,7 +68,8 @@ Request::Request(const X509_Certificate& issuer_cert, std::vector Request::BER_encode() const { - return DER_Encoder().start_cons(SEQUENCE) + std::vector output; + DER_Encoder(output).start_cons(SEQUENCE) .start_cons(SEQUENCE) .start_explicit(0) .encode(static_cast(0)) // version # @@ -79,7 +80,9 @@ std::vector Request::BER_encode() const .end_cons() .end_cons() .end_cons() - .end_cons().get_contents_unlocked(); + .end_cons(); + + return output; } std::string Request::base64_encode() const diff --git a/src/lib/x509/x509_ext.cpp b/src/lib/x509/x509_ext.cpp index 9686eacda45..122be2885d5 100644 --- a/src/lib/x509/x509_ext.cpp +++ b/src/lib/x509/x509_ext.cpp @@ -300,15 +300,16 @@ size_t Basic_Constraints::get_path_limit() const */ std::vector Basic_Constraints::encode_inner() const { - return DER_Encoder() + std::vector output; + DER_Encoder(output) .start_cons(SEQUENCE) .encode_if(m_is_ca, DER_Encoder() .encode(m_is_ca) .encode_optional(m_path_limit, NO_CERT_PATH_LIMIT) ) - .end_cons() - .get_contents_unlocked(); + .end_cons(); + return output; } /* @@ -404,7 +405,9 @@ void Key_Usage::contents_to(Data_Store& subject, Data_Store&) const */ std::vector Subject_Key_ID::encode_inner() const { - return DER_Encoder().encode(m_key_id, OCTET_STRING).get_contents_unlocked(); + std::vector output; + DER_Encoder(output).encode(m_key_id, OCTET_STRING); + return output; } /* @@ -446,11 +449,12 @@ Subject_Key_ID::Subject_Key_ID(const std::vector& pub_key, const std::s */ std::vector Authority_Key_ID::encode_inner() const { - return DER_Encoder() - .start_cons(SEQUENCE) - .encode(m_key_id, OCTET_STRING, ASN1_Tag(0), CONTEXT_SPECIFIC) - .end_cons() - .get_contents_unlocked(); + std::vector output; + DER_Encoder(output) + .start_cons(SEQUENCE) + .encode(m_key_id, OCTET_STRING, ASN1_Tag(0), CONTEXT_SPECIFIC) + .end_cons(); + return output; } /* @@ -477,7 +481,9 @@ void Authority_Key_ID::contents_to(Data_Store&, Data_Store& issuer) const */ std::vector Subject_Alternative_Name::encode_inner() const { - return DER_Encoder().encode(m_alt_name).get_contents_unlocked(); + std::vector output; + DER_Encoder(output).encode(m_alt_name); + return output; } /* @@ -485,7 +491,9 @@ std::vector Subject_Alternative_Name::encode_inner() const */ std::vector Issuer_Alternative_Name::encode_inner() const { - return DER_Encoder().encode(m_alt_name).get_contents_unlocked(); + std::vector output; + DER_Encoder(output).encode(m_alt_name); + return output; } /* @@ -526,11 +534,12 @@ void Issuer_Alternative_Name::contents_to(Data_Store&, Data_Store& issuer_info) */ std::vector Extended_Key_Usage::encode_inner() const { - return DER_Encoder() + std::vector output; + DER_Encoder(output) .start_cons(SEQUENCE) .encode_list(m_oids) - .end_cons() - .get_contents_unlocked(); + .end_cons(); + return output; } /* @@ -724,11 +733,12 @@ std::vector Certificate_Policies::encode_inner() const for(size_t i = 0; i != m_oids.size(); ++i) policies.push_back(Policy_Information(m_oids[i])); - return DER_Encoder() + std::vector output; + DER_Encoder(output) .start_cons(SEQUENCE) .encode_list(policies) - .end_cons() - .get_contents_unlocked(); + .end_cons(); + return output; } /* @@ -771,13 +781,15 @@ std::vector Authority_Information_Access::encode_inner() const { ASN1_String url(m_ocsp_responder, IA5_STRING); - return DER_Encoder() + std::vector output; + DER_Encoder(output) .start_cons(SEQUENCE) .start_cons(SEQUENCE) .encode(OIDS::lookup("PKIX.OCSP")) .add_object(ASN1_Tag(6), CONTEXT_SPECIFIC, url.value()) .end_cons() - .end_cons().get_contents_unlocked(); + .end_cons(); + return output; } void Authority_Information_Access::decode_inner(const std::vector& in) @@ -847,7 +859,9 @@ CRL_Number* CRL_Number::copy() const */ std::vector CRL_Number::encode_inner() const { - return DER_Encoder().encode(m_crl_number).get_contents_unlocked(); + std::vector output; + DER_Encoder(output).encode(m_crl_number); + return output; } /* @@ -872,9 +886,9 @@ void CRL_Number::contents_to(Data_Store& info, Data_Store&) const */ std::vector CRL_ReasonCode::encode_inner() const { - return DER_Encoder() - .encode(static_cast(m_reason), ENUMERATED, UNIVERSAL) - .get_contents_unlocked(); + std::vector output; + DER_Encoder(output).encode(static_cast(m_reason), ENUMERATED, UNIVERSAL); + return output; } /* diff --git a/src/lib/x509/x509_obj.cpp b/src/lib/x509/x509_obj.cpp index 41cf74acc5f..0604530729c 100644 --- a/src/lib/x509/x509_obj.cpp +++ b/src/lib/x509/x509_obj.cpp @@ -29,14 +29,14 @@ struct Pss_params Pss_params decode_pss_params(const std::vector& encoded_pss_params) { + const AlgorithmIdentifier default_hash("SHA-160", AlgorithmIdentifier::USE_NULL_PARAM); + const AlgorithmIdentifier default_mgf("MGF1", default_hash.BER_encode()); + Pss_params pss_parameter; BER_Decoder(encoded_pss_params) .start_cons(SEQUENCE) - .decode_optional(pss_parameter.hash_algo, ASN1_Tag(0), PRIVATE, AlgorithmIdentifier("SHA-160", - AlgorithmIdentifier::USE_NULL_PARAM)) - .decode_optional(pss_parameter.mask_gen_algo, ASN1_Tag(1), PRIVATE, - AlgorithmIdentifier("MGF1", DER_Encoder().encode(AlgorithmIdentifier("SHA-160", - AlgorithmIdentifier::USE_NULL_PARAM)).get_contents_unlocked())) + .decode_optional(pss_parameter.hash_algo, ASN1_Tag(0), PRIVATE, default_hash) + .decode_optional(pss_parameter.mask_gen_algo, ASN1_Tag(1), PRIVATE, default_mgf) .decode_optional(pss_parameter.salt_len, ASN1_Tag(2), PRIVATE, size_t(20)) .decode_optional(pss_parameter.trailer_field, ASN1_Tag(3), PRIVATE, size_t(1)) .end_cons(); @@ -117,16 +117,6 @@ void X509_Object::decode_from(BER_Decoder& from) force_decode(); } -/* -* Return a BER encoded X.509 object -*/ -std::vector X509_Object::BER_encode() const - { - DER_Encoder der; - encode_into(der); - return der.get_contents_unlocked(); - } - /* * Return a PEM encoded X.509 object */ @@ -284,13 +274,15 @@ std::vector X509_Object::make_signed(PK_Signer* signer, { const std::vector signature = signer->sign_message(tbs_bits, rng); - return DER_Encoder() + std::vector output; + DER_Encoder(output) .start_cons(SEQUENCE) .raw_bytes(tbs_bits) .encode(algo) .encode(signature, BIT_STRING) - .end_cons() - .get_contents_unlocked(); + .end_cons(); + + return output; } namespace { diff --git a/src/lib/x509/x509_obj.h b/src/lib/x509/x509_obj.h index 1e4abe00b1c..a0c8e5b3984 100644 --- a/src/lib/x509/x509_obj.h +++ b/src/lib/x509/x509_obj.h @@ -101,11 +101,6 @@ class BOTAN_PUBLIC_API(2,0) X509_Object : public ASN1_Object */ void decode_from(class BER_Decoder& from) override; - /** - * @return BER encoding of this - */ - std::vector BER_encode() const; - /** * @return PEM encoding of this */ From b57839c5a303f4c1ba9b49f489dbdd12d26023a5 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 22 May 2018 18:12:42 -0400 Subject: [PATCH 111/174] Sphinx: Avoid formatting problems in PDF index Fixes #1573 --- src/configs/sphinx/conf.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/configs/sphinx/conf.py b/src/configs/sphinx/conf.py index 92fb78ba719..2d675ab0e5d 100644 --- a/src/configs/sphinx/conf.py +++ b/src/configs/sphinx/conf.py @@ -213,3 +213,7 @@ def parse_version_file(version_path): # If false, no module index is generated. latex_domain_indices = False + +latex_elements = { + 'printindex': '\\footnotesize\\raggedright\\printindex' +} From c97b3406f544ba98ae9b579d711b887b247032a7 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 22 May 2018 22:43:58 -0400 Subject: [PATCH 112/174] Test speed of different scrypt params --- src/cli/speed.cpp | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/cli/speed.cpp b/src/cli/speed.cpp index 9a7a1379443..d586e68ee3c 100644 --- a/src/cli/speed.cpp +++ b/src/cli/speed.cpp @@ -2150,20 +2150,34 @@ class Speed final : public Command void bench_scrypt(const std::string& /*provider*/, std::chrono::milliseconds msec) { - std::unique_ptr scrypt_timer = make_timer("scrypt"); - uint8_t out[64]; - uint8_t salt[8] = { 0 }; - - while(scrypt_timer->under(msec)) + for(size_t N : { 8192, 16384, 32768 }) { - scrypt_timer->run([&] { - Botan::scrypt(out, sizeof(out), "password", - salt, sizeof(salt), 16384, 8, 1); - }); + for(size_t r : { 1, 8 }) + { + for(size_t p : { 1, 2, 4 }) + { + std::unique_ptr scrypt_timer = make_timer( + "scrypt-" + std::to_string(N) + "-" + + std::to_string(r) + "-" + std::to_string(p)); + + uint8_t out[64]; + uint8_t salt[8]; + rng().randomize(salt, sizeof(salt)); + + while(scrypt_timer->under(msec)) + { + scrypt_timer->run([&] { + Botan::scrypt(out, sizeof(out), "password", + salt, sizeof(salt), N, r, p); + }); + } + + record_result(scrypt_timer); + } + } } - record_result(scrypt_timer); } #endif From 4314e368d2638878d2e885e7599bd45b48c87c9a Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 22 May 2018 22:47:49 -0400 Subject: [PATCH 113/174] Fix PBE decoding and fix test macro check --- src/lib/pubkey/pkcs8.cpp | 2 +- src/tests/test_pubkey.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/pubkey/pkcs8.cpp b/src/lib/pubkey/pkcs8.cpp index 1034dfa990a..8d3eba6dc74 100644 --- a/src/lib/pubkey/pkcs8.cpp +++ b/src/lib/pubkey/pkcs8.cpp @@ -169,7 +169,7 @@ choose_pbe_params(const std::string& pbe_algo, const std::string& key_algo) SCAN_Name request(pbe_algo); if(request.algo_name() != "PBE-PKCS5v20" || request.arg_count() != 2) throw Exception("Unsupported PBE " + pbe_algo); - return std::make_pair(request.arg(1), request.arg(0)); + return std::make_pair(request.arg(0), request.arg(1)); } } diff --git a/src/tests/test_pubkey.cpp b/src/tests/test_pubkey.cpp index 2d4113c6de9..38bfaf3a8c8 100644 --- a/src/tests/test_pubkey.cpp +++ b/src/tests/test_pubkey.cpp @@ -613,9 +613,9 @@ std::vector PK_Key_Generation_Test::run() result.test_failure("roundtrip BER private key", e.what()); } -#if defined(BOTAN_HAS_PKCS5_PBE2) && defined(BOTAN_HAS_AES) && defined(BOTAN_HAS_SHA2_32) +#if defined(BOTAN_HAS_PKCS5_PBES2) && defined(BOTAN_HAS_AES) && defined(BOTAN_HAS_SHA2_32) - const std::string pbe_algo = "PBE-PKCS5v20(AES-128,SHA-256)"; + const std::string pbe_algo = "PBE-PKCS5v20(AES-128/CBC,SHA-256)"; const std::string passphrase = Test::random_password(); try From 5df1042ea95e27b58c2a4a96d036a9492e22ef67 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 22 May 2018 23:26:14 -0400 Subject: [PATCH 114/174] Remove debug printf --- src/lib/utils/socket/socket.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/utils/socket/socket.cpp b/src/lib/utils/socket/socket.cpp index b75b4981c94..1caeb2413fe 100644 --- a/src/lib/utils/socket/socket.cpp +++ b/src/lib/utils/socket/socket.cpp @@ -83,7 +83,7 @@ class Asio_Socket final : public OS::Socket boost::system::error_code ec = boost::asio::error::would_block; boost::asio::async_write(m_tcp, boost::asio::buffer(buf, len), - [&ec](boost::system::error_code e, size_t got) { printf("wrote %d\n", got); ec = e; }); + [&ec](boost::system::error_code e, size_t got) { ec = e; }); while(ec == boost::asio::error::would_block) { m_io.run_one(); } From f87b9e4128698951c10e47dca01811a677577ca0 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 22 May 2018 22:43:45 -0400 Subject: [PATCH 115/174] Support scrypt for encrypting private keys --- src/cli/speed.cpp | 4 +- src/lib/pbkdf/scrypt/scrypt.cpp | 73 ++++++++++ src/lib/pbkdf/scrypt/scrypt.h | 22 +++ src/lib/pubkey/pbes2/pbes2.cpp | 249 +++++++++++++++++++++----------- src/tests/test_pubkey.cpp | 109 ++++++++------ 5 files changed, 323 insertions(+), 134 deletions(-) diff --git a/src/cli/speed.cpp b/src/cli/speed.cpp index d586e68ee3c..56de27ca876 100644 --- a/src/cli/speed.cpp +++ b/src/cli/speed.cpp @@ -2151,11 +2151,11 @@ class Speed final : public Command std::chrono::milliseconds msec) { - for(size_t N : { 8192, 16384, 32768 }) + for(size_t N : { 8192, 16384, 32768, 65536 }) { for(size_t r : { 1, 8 }) { - for(size_t p : { 1, 2, 4 }) + for(size_t p : { 1, 4, 8 }) { std::unique_ptr scrypt_timer = make_timer( "scrypt-" + std::to_string(N) + "-" + diff --git a/src/lib/pbkdf/scrypt/scrypt.cpp b/src/lib/pbkdf/scrypt/scrypt.cpp index 81170bf896b..e258f391df0 100644 --- a/src/lib/pbkdf/scrypt/scrypt.cpp +++ b/src/lib/pbkdf/scrypt/scrypt.cpp @@ -60,6 +60,79 @@ void scryptROMmix(size_t r, size_t N, uint8_t* B, secure_vector& V) } +Scrypt_Params::Scrypt_Params(size_t N, size_t r, size_t p) : + m_N(N), m_r(r), m_p(p) + { + BOTAN_ARG_CHECK(p <= 128, "Invalid scrypt p"); + BOTAN_ARG_CHECK(N <= 4194304 && is_power_of_2(N), "Invalid scrypt N"); + BOTAN_ARG_CHECK(r <= 64, "Invalid scrypt r"); + } + +Scrypt_Params::Scrypt_Params(std::chrono::milliseconds msec) + { + /* + This mapping is highly subjective and machine specific + For simplicity we fix r=8 and p=4 + */ + m_r = 8; + m_p = 4; + + if(msec.count() <= 10) + { + m_N = 4096; + m_p = 1; + } + else if(msec.count() <= 50) + { + m_N = 8192; + } + else if(msec.count() <= 100) + { + m_N = 16384; + } + else if(msec.count() <= 500) + { + m_N = 32768; + } + else + { + m_N = 65536; + } + } + +Scrypt_Params::Scrypt_Params(size_t iterations) + { + // This mapping is highly subjective and machine specific + m_r = 8; + m_p = 4; + + if(iterations < 1000) + { + m_N = 8192; + } + else if(iterations < 5000) + { + m_N = 16384; + } + else if(iterations < 10000) + { + m_N = 32768; + } + else + { + m_N = 65536; + } + } + +void scrypt(uint8_t output[], size_t output_len, + const std::string& password, + const uint8_t salt[], size_t salt_len, + const Scrypt_Params& params) + { + scrypt(output, output_len, password, salt, salt_len, + params.N(), params.r(), params.p()); + } + void scrypt(uint8_t output[], size_t output_len, const std::string& password, const uint8_t salt[], size_t salt_len, diff --git a/src/lib/pbkdf/scrypt/scrypt.h b/src/lib/pbkdf/scrypt/scrypt.h index 5eaa3a4fc60..199caa4c8a2 100644 --- a/src/lib/pbkdf/scrypt/scrypt.h +++ b/src/lib/pbkdf/scrypt/scrypt.h @@ -8,10 +8,27 @@ #define BOTAN_SCRYPT_H_ #include +#include #include namespace Botan { +class Scrypt_Params + { + public: + Scrypt_Params(size_t N, size_t r, size_t p); + + Scrypt_Params(std::chrono::milliseconds msec); + + Scrypt_Params(size_t iterations); + + size_t N() const { return m_N; } + size_t r() const { return m_r; } + size_t p() const { return m_p; } + private: + size_t m_N, m_r, m_p; + }; + /** * Scrypt key derivation function (RFC 7914) * @@ -33,6 +50,11 @@ void BOTAN_UNSTABLE_API scrypt(uint8_t output[], size_t output_len, const uint8_t salt[], size_t salt_len, size_t N, size_t r, size_t p); +void BOTAN_UNSTABLE_API scrypt(uint8_t output[], size_t output_len, + const std::string& password, + const uint8_t salt[], size_t salt_len, + const Scrypt_Params& params); + } #endif diff --git a/src/lib/pubkey/pbes2/pbes2.cpp b/src/lib/pubkey/pbes2/pbes2.cpp index a6590938ad9..384fb1e6aa6 100644 --- a/src/lib/pubkey/pbes2/pbes2.cpp +++ b/src/lib/pubkey/pbes2/pbes2.cpp @@ -15,44 +15,154 @@ #include #include +#if defined(BOTAN_HAS_SCRYPT) + #include +#endif + namespace Botan { namespace { -/* -* Encode PKCS#5 PBES2 parameters -*/ -std::vector encode_pbes2_params(const std::string& cipher, - const std::string& prf, - const secure_vector& salt, - const secure_vector& iv, - size_t iterations, - size_t key_length) +SymmetricKey derive_key(const std::string& passphrase, + const AlgorithmIdentifier& kdf_algo, + size_t default_key_size) { - std::vector output; + if(kdf_algo.get_oid() == OIDS::lookup("PKCS5.PBKDF2")) + { + secure_vector salt; + size_t iterations = 0, key_length = 0; - std::vector pbkdf2_params; + AlgorithmIdentifier prf_algo; + BER_Decoder(kdf_algo.get_parameters()) + .start_cons(SEQUENCE) + .decode(salt, OCTET_STRING) + .decode(iterations) + .decode_optional(key_length, INTEGER, UNIVERSAL) + .decode_optional(prf_algo, SEQUENCE, CONSTRUCTED, + AlgorithmIdentifier("HMAC(SHA-160)", + AlgorithmIdentifier::USE_NULL_PARAM)) + .end_cons(); - DER_Encoder(pbkdf2_params) - .start_cons(SEQUENCE) - .encode(salt, OCTET_STRING) - .encode(iterations) - .encode(key_length) - .encode_if(prf != "HMAC(SHA-160)", - AlgorithmIdentifier(prf, AlgorithmIdentifier::USE_NULL_PARAM)) - .end_cons(); + if(salt.size() < 8) + throw Decoding_Error("PBE-PKCS5 v2.0: Encoded salt is too small"); - DER_Encoder(output) - .start_cons(SEQUENCE) - .encode(AlgorithmIdentifier("PKCS5.PBKDF2", pbkdf2_params)) - .encode( - AlgorithmIdentifier(cipher, - DER_Encoder().encode(iv, OCTET_STRING).get_contents_unlocked() - ) - ) - .end_cons(); + const std::string prf = OIDS::lookup(prf_algo.get_oid()); + + std::unique_ptr pbkdf(get_pbkdf("PBKDF2(" + prf + ")")); + + if(key_length == 0) + key_length = default_key_size; - return output; + return pbkdf->pbkdf_iterations(key_length, passphrase, salt.data(), salt.size(), iterations); + } +#if defined(BOTAN_HAS_SCRYPT) + else if(kdf_algo.get_oid() == OIDS::lookup("Scrypt")) + { + secure_vector salt; + size_t N = 0, r = 0, p = 0; + size_t key_length = 0; + + AlgorithmIdentifier prf_algo; + BER_Decoder(kdf_algo.get_parameters()) + .start_cons(SEQUENCE) + .decode(salt, OCTET_STRING) + .decode(N) + .decode(r) + .decode(p) + .decode_optional(key_length, INTEGER, UNIVERSAL) + .end_cons(); + + if(key_length == 0) + key_length = default_key_size; + + secure_vector output(key_length); + scrypt(output.data(), output.size(), passphrase, + salt.data(), salt.size(), N, r, p); + + return SymmetricKey(output); + } +#endif + else + throw Decoding_Error("PBE-PKCS5 v2.0: Unknown KDF algorithm " + + kdf_algo.get_oid().as_string()); + } + +secure_vector derive_key(const std::string& passphrase, + const std::string& digest, + RandomNumberGenerator& rng, + size_t* msec_in_iterations_out, + size_t iterations_if_msec_null, + size_t key_length, + AlgorithmIdentifier& kdf_algo) + { + const secure_vector salt = rng.random_vec(12); + + if(digest == "Scrypt") + { +#if defined(BOTAN_HAS_SCRYPT) + + Scrypt_Params params(32768, 8, 4); + + if(msec_in_iterations_out) + params = Scrypt_Params(std::chrono::milliseconds(*msec_in_iterations_out)); + else + params = Scrypt_Params(iterations_if_msec_null); + + secure_vector key(key_length); + scrypt(key.data(), key.size(), passphrase, + salt.data(), salt.size(), params); + + std::vector scrypt_params; + DER_Encoder(scrypt_params) + .start_cons(SEQUENCE) + .encode(salt, OCTET_STRING) + .encode(params.N()) + .encode(params.r()) + .encode(params.p()) + .encode(key_length) + .end_cons(); + + kdf_algo = AlgorithmIdentifier(OIDS::lookup("Scrypt"), scrypt_params); + return key; +#else + throw Not_Implemented("Scrypt is not available in this build"); +#endif + } + else + { + const std::string prf = "HMAC(" + digest + ")"; + + std::unique_ptr pbkdf(get_pbkdf("PBKDF2(" + prf + ")")); + + size_t iterations = iterations_if_msec_null; + + secure_vector key; + + if(msec_in_iterations_out) + { + std::chrono::milliseconds msec(*msec_in_iterations_out); + key = pbkdf->derive_key(key_length, passphrase, salt.data(), salt.size(), msec, iterations).bits_of(); + *msec_in_iterations_out = iterations; + } + else + { + key = pbkdf->pbkdf_iterations(key_length, passphrase, salt.data(), salt.size(), iterations); + } + + std::vector pbkdf2_params; + + DER_Encoder(pbkdf2_params) + .start_cons(SEQUENCE) + .encode(salt, OCTET_STRING) + .encode(iterations) + .encode(key_length) + .encode_if(prf != "HMAC(SHA-160)", + AlgorithmIdentifier(prf, AlgorithmIdentifier::USE_NULL_PARAM)) + .end_cons(); + + kdf_algo = AlgorithmIdentifier("PKCS5.PBKDF2", pbkdf2_params); + return key; + } } /* @@ -64,17 +174,13 @@ pbes2_encrypt_shared(const secure_vector& key_bits, size_t* msec_in_iterations_out, size_t iterations_if_msec_null, const std::string& cipher, - const std::string& digest, + const std::string& prf, RandomNumberGenerator& rng) { - const std::string prf = "HMAC(" + digest + ")"; - const std::vector cipher_spec = split_on(cipher, '/'); if(cipher_spec.size() != 2) throw Decoding_Error("PBE-PKCS5 v2.0: Invalid cipher spec " + cipher); - const secure_vector salt = rng.random_vec(12); - if(cipher_spec[1] != "CBC" && cipher_spec[1] != "GCM") throw Decoding_Error("PBE-PKCS5 v2.0: Don't know param format for " + cipher); @@ -83,35 +189,37 @@ pbes2_encrypt_shared(const secure_vector& key_bits, if(!enc) throw Decoding_Error("PBE-PKCS5 cannot encrypt no cipher " + cipher); - std::unique_ptr pbkdf(get_pbkdf("PBKDF2(" + prf + ")")); - const size_t key_length = enc->key_spec().maximum_keylength(); + const secure_vector iv = rng.random_vec(enc->default_nonce_length()); - secure_vector iv = rng.random_vec(enc->default_nonce_length()); - - size_t iterations = iterations_if_msec_null; + AlgorithmIdentifier kdf_algo; - if(msec_in_iterations_out) - { - std::chrono::milliseconds msec(*msec_in_iterations_out); - enc->set_key(pbkdf->derive_key(key_length, passphrase, salt.data(), salt.size(), msec, iterations).bits_of()); - *msec_in_iterations_out = iterations; - } - else - { - enc->set_key(pbkdf->pbkdf_iterations(key_length, passphrase, salt.data(), salt.size(), iterations)); - } + const secure_vector derived_key = + derive_key(passphrase, prf, rng, + msec_in_iterations_out, iterations_if_msec_null, + key_length, kdf_algo); + enc->set_key(derived_key); enc->start(iv); - secure_vector buf = key_bits; - enc->finish(buf); + secure_vector ctext = key_bits; + enc->finish(ctext); + + std::vector pbes2_params; + + DER_Encoder(pbes2_params) + .start_cons(SEQUENCE) + .encode(kdf_algo) + .encode( + AlgorithmIdentifier(cipher, + DER_Encoder().encode(iv, OCTET_STRING).get_contents_unlocked() + ) + ) + .end_cons(); - AlgorithmIdentifier id( - OIDS::lookup("PBE-PKCS5v20"), - encode_pbes2_params(cipher, prf, salt, iv, iterations, key_length)); + AlgorithmIdentifier id(OIDS::lookup("PBE-PKCS5v20"), pbes2_params); - return std::make_pair(id, unlock(buf)); + return std::make_pair(id, unlock(ctext)); } @@ -173,25 +281,6 @@ pbes2_decrypt(const secure_vector& key_bits, .decode(enc_algo) .end_cons(); - AlgorithmIdentifier prf_algo; - - if(kdf_algo.get_oid() != OIDS::lookup("PKCS5.PBKDF2")) - throw Decoding_Error("PBE-PKCS5 v2.0: Unknown KDF algorithm " + - kdf_algo.get_oid().as_string()); - - secure_vector salt; - size_t iterations = 0, key_length = 0; - - BER_Decoder(kdf_algo.get_parameters()) - .start_cons(SEQUENCE) - .decode(salt, OCTET_STRING) - .decode(iterations) - .decode_optional(key_length, INTEGER, UNIVERSAL) - .decode_optional(prf_algo, SEQUENCE, CONSTRUCTED, - AlgorithmIdentifier("HMAC(SHA-160)", - AlgorithmIdentifier::USE_NULL_PARAM)) - .end_cons(); - const std::string cipher = OIDS::lookup(enc_algo.get_oid()); const std::vector cipher_spec = split_on(cipher, '/'); if(cipher_spec.size() != 2) @@ -199,24 +288,14 @@ pbes2_decrypt(const secure_vector& key_bits, if(cipher_spec[1] != "CBC" && cipher_spec[1] != "GCM") throw Decoding_Error("PBE-PKCS5 v2.0: Don't know param format for " + cipher); - if(salt.size() < 8) - throw Decoding_Error("PBE-PKCS5 v2.0: Encoded salt is too small"); - secure_vector iv; BER_Decoder(enc_algo.get_parameters()).decode(iv, OCTET_STRING).verify_end(); - const std::string prf = OIDS::lookup(prf_algo.get_oid()); - - std::unique_ptr pbkdf(get_pbkdf("PBKDF2(" + prf + ")")); - std::unique_ptr dec = Cipher_Mode::create(cipher, DECRYPTION); if(!dec) throw Decoding_Error("PBE-PKCS5 cannot decrypt no cipher " + cipher); - if(key_length == 0) - key_length = dec->key_spec().maximum_keylength(); - - dec->set_key(pbkdf->pbkdf_iterations(key_length, passphrase, salt.data(), salt.size(), iterations)); + dec->set_key(derive_key(passphrase, kdf_algo, dec->key_spec().maximum_keylength())); dec->start(iv); diff --git a/src/tests/test_pubkey.cpp b/src/tests/test_pubkey.cpp index 38bfaf3a8c8..ea794b9bad4 100644 --- a/src/tests/test_pubkey.cpp +++ b/src/tests/test_pubkey.cpp @@ -500,6 +500,63 @@ std::vector PK_Key_Generation_Test::possible_providers( return Test::provider_filter(pk_provider); } +namespace { + +void test_pbe_roundtrip(Test::Result& result, + const Botan::Private_Key& key, + const std::string& pbe_algo, + const std::string& passphrase) + { + try + { + Botan::DataSource_Memory data_src( + Botan::PKCS8::PEM_encode(key, Test::rng(), passphrase, + std::chrono::milliseconds(10), + pbe_algo)); + + std::unique_ptr loaded( + Botan::PKCS8::load_key(data_src, Test::rng(), passphrase)); + + result.confirm("recovered private key from encrypted blob", loaded.get() != nullptr); + result.test_eq("reloaded key has same type", loaded->algo_name(), key.algo_name()); + try + { + result.confirm("private key passes self tests", loaded->check_key(Test::rng(), true)); + } + catch(Botan::Lookup_Error&) {} + } + catch(std::exception& e) + { + result.test_failure("roundtrip encrypted PEM private key", e.what()); + } + + try + { + Botan::DataSource_Memory data_src( + Botan::PKCS8::BER_encode(key, Test::rng(), passphrase, + std::chrono::milliseconds(10), + pbe_algo)); + + std::unique_ptr loaded( + Botan::PKCS8::load_key(data_src, Test::rng(), passphrase)); + + result.confirm("recovered private key from BER blob", loaded.get() != nullptr); + result.test_eq("reloaded key has same type", loaded->algo_name(), key.algo_name()); + + try + { + result.confirm("private key passes self tests", loaded->check_key(Test::rng(), true)); + } + catch(Botan::Lookup_Error&) {} + } + catch(std::exception& e) + { + result.test_failure("roundtrip encrypted BER private key", e.what()); + } + } + +} + std::vector PK_Key_Generation_Test::run() { std::vector results; @@ -615,56 +672,14 @@ std::vector PK_Key_Generation_Test::run() #if defined(BOTAN_HAS_PKCS5_PBES2) && defined(BOTAN_HAS_AES) && defined(BOTAN_HAS_SHA2_32) - const std::string pbe_algo = "PBE-PKCS5v20(AES-128/CBC,SHA-256)"; - const std::string passphrase = Test::random_password(); - - try - { - Botan::DataSource_Memory data_src( - Botan::PKCS8::PEM_encode(key, Test::rng(), passphrase, - std::chrono::milliseconds(10), - pbe_algo)); - - std::unique_ptr loaded( - Botan::PKCS8::load_key(data_src, Test::rng(), passphrase)); - - result.confirm("recovered private key from encrypted blob", loaded.get() != nullptr); - result.test_eq("reloaded key has same type", loaded->algo_name(), key.algo_name()); - try - { - result.confirm("private key passes self tests", loaded->check_key(Test::rng(), true)); - } - catch(Botan::Lookup_Error&) {} - } - catch(std::exception& e) - { - result.test_failure("roundtrip encrypted PEM private key", e.what()); - } - - try - { - Botan::DataSource_Memory data_src( - Botan::PKCS8::BER_encode(key, Test::rng(), passphrase, - std::chrono::milliseconds(10), - pbe_algo)); - - std::unique_ptr loaded( - Botan::PKCS8::load_key(data_src, Test::rng(), passphrase)); + test_pbe_roundtrip(result, key, "PBE-PKCS5v20(AES-128/CBC,SHA-256)", Test::random_password()); +#endif - result.confirm("recovered private key from BER blob", loaded.get() != nullptr); - result.test_eq("reloaded key has same type", loaded->algo_name(), key.algo_name()); +#if defined(BOTAN_HAS_PKCS5_PBES2) && defined(BOTAN_HAS_AES) && defined(BOTAN_HAS_SCRYPT) - try - { - result.confirm("private key passes self tests", loaded->check_key(Test::rng(), true)); - } - catch(Botan::Lookup_Error&) {} - } - catch(std::exception& e) - { - result.test_failure("roundtrip encrypted BER private key", e.what()); - } + test_pbe_roundtrip(result, key, "PBE-PKCS5v20(AES-128/CBC,Scrypt)", Test::random_password()); #endif + } result.end_timer(); From 2b19386ae79141377f0b3026a5705884da397b92 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 22 May 2018 23:49:45 -0400 Subject: [PATCH 116/174] Add OIDS for Camellia and SM4 in GCM and CBC modes Making them usable for private key encryption --- src/build-data/oids.txt | 18 +++++++++++++++--- src/lib/asn1/oid_maps.cpp | 18 +++++++++++++++++- src/lib/pubkey/pbes2/pbes2.cpp | 8 ++++++-- src/scripts/oids.py | 2 +- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/build-data/oids.txt b/src/build-data/oids.txt index 314e4e44f14..45fb80d5876 100644 --- a/src/build-data/oids.txt +++ b/src/build-data/oids.txt @@ -46,9 +46,7 @@ 2.16.840.1.101.3.4.1.22 = AES-192/CBC 2.16.840.1.101.3.4.1.42 = AES-256/CBC 1.2.410.200004.1.4 = SEED/CBC -1.3.6.1.4.1.25258.3.1 = Serpent/CBC -1.3.6.1.4.1.25258.3.2 = Threefish-512/CBC -1.3.6.1.4.1.25258.3.3 = Twofish/CBC +1.2.156.10197.1.104.2 = SM4/CBC 2.16.840.1.101.3.4.1.6 = AES-128/GCM 2.16.840.1.101.3.4.1.26 = AES-192/GCM @@ -58,6 +56,20 @@ 2.16.840.1.101.3.4.1.27 = AES-192/CCM 2.16.840.1.101.3.4.1.47 = AES-256/CCM +1.2.392.200011.61.1.1.1.2 = Camellia-128/CBC +1.2.392.200011.61.1.1.1.3 = Camellia-192/CBC +1.2.392.200011.61.1.1.1.4 = Camellia-256/CBC + +0.3.4401.5.3.1.9.6 = Camellia-128/GCM +0.3.4401.5.3.1.9.26 = Camellia-192/GCM +0.3.4401.5.3.1.9.46 = Camellia-256/GCM + +1.2.156.10197.1.104.8 = SM4/GCM + +1.3.6.1.4.1.25258.3.1 = Serpent/CBC +1.3.6.1.4.1.25258.3.2 = Threefish-512/CBC +1.3.6.1.4.1.25258.3.3 = Twofish/CBC + 1.3.6.1.4.1.25258.3.101 = Serpent/GCM 1.3.6.1.4.1.25258.3.102 = Twofish/GCM diff --git a/src/lib/asn1/oid_maps.cpp b/src/lib/asn1/oid_maps.cpp index 7ba7dda70e5..6cc105b4766 100644 --- a/src/lib/asn1/oid_maps.cpp +++ b/src/lib/asn1/oid_maps.cpp @@ -1,7 +1,7 @@ /* * OID maps * -* This file was automatically generated by ./src/scripts/oids.py on 2018-05-16 +* This file was automatically generated by ./src/scripts/oids.py on 2018-05-22 * * All manual edits to this file will be lost. Edit the script * then regenerate this source file. @@ -17,7 +17,12 @@ namespace Botan { std::unordered_map OIDS::load_oid2str_map() { return std::unordered_map{ + { "0.3.4401.5.3.1.9.26", "Camellia-192/GCM" }, + { "0.3.4401.5.3.1.9.46", "Camellia-256/GCM" }, + { "0.3.4401.5.3.1.9.6", "Camellia-128/GCM" }, { "1.0.14888.3.0.5", "ECKCDSA" }, + { "1.2.156.10197.1.104.2", "SM4/CBC" }, + { "1.2.156.10197.1.104.8", "SM4/GCM" }, { "1.2.156.10197.1.301", "sm2p256v1" }, { "1.2.156.10197.1.301.1", "SM2_Sig" }, { "1.2.156.10197.1.301.2", "SM2_Kex" }, @@ -25,6 +30,9 @@ std::unordered_map OIDS::load_oid2str_map() { "1.2.156.10197.1.401", "SM3" }, { "1.2.156.10197.1.504", "RSA/EMSA3(SM3)" }, { "1.2.250.1.223.101.256.1", "frp256v1" }, + { "1.2.392.200011.61.1.1.1.2", "Camellia-128/CBC" }, + { "1.2.392.200011.61.1.1.1.3", "Camellia-192/CBC" }, + { "1.2.392.200011.61.1.1.1.4", "Camellia-256/CBC" }, { "1.2.410.200004.1.100.4.3", "ECKCDSA/EMSA1(SHA-1)" }, { "1.2.410.200004.1.100.4.4", "ECKCDSA/EMSA1(SHA-224)" }, { "1.2.410.200004.1.100.4.5", "ECKCDSA/EMSA1(SHA-256)" }, @@ -237,6 +245,12 @@ std::unordered_map OIDS::load_str2oid_map() { "AES-256/GCM", OID({2,16,840,1,101,3,4,1,46}) }, { "AES-256/OCB", OID({1,3,6,1,4,1,25258,3,2,3}) }, { "CAST-128/CBC", OID({1,2,840,113533,7,66,10}) }, + { "Camellia-128/CBC", OID({1,2,392,200011,61,1,1,1,2}) }, + { "Camellia-128/GCM", OID({0,3,4401,5,3,1,9,6}) }, + { "Camellia-192/CBC", OID({1,2,392,200011,61,1,1,1,3}) }, + { "Camellia-192/GCM", OID({0,3,4401,5,3,1,9,26}) }, + { "Camellia-256/CBC", OID({1,2,392,200011,61,1,1,1,4}) }, + { "Camellia-256/GCM", OID({0,3,4401,5,3,1,9,46}) }, { "Compression.Zlib", OID({1,2,840,113549,1,9,16,3,8}) }, { "Curve25519", OID({1,3,101,110}) }, { "DES/CBC", OID({1,3,14,3,2,7}) }, @@ -352,6 +366,8 @@ std::unordered_map OIDS::load_str2oid_map() { "SM2_Kex", OID({1,2,156,10197,1,301,2}) }, { "SM2_Sig", OID({1,2,156,10197,1,301,1}) }, { "SM3", OID({1,2,156,10197,1,401}) }, + { "SM4/CBC", OID({1,2,156,10197,1,104,2}) }, + { "SM4/GCM", OID({1,2,156,10197,1,104,8}) }, { "Scrypt", OID({1,3,6,1,4,1,11591,4,11}) }, { "Serpent/CBC", OID({1,3,6,1,4,1,25258,3,1}) }, { "Serpent/GCM", OID({1,3,6,1,4,1,25258,3,101}) }, diff --git a/src/lib/pubkey/pbes2/pbes2.cpp b/src/lib/pubkey/pbes2/pbes2.cpp index 384fb1e6aa6..cfac722d7c6 100644 --- a/src/lib/pubkey/pbes2/pbes2.cpp +++ b/src/lib/pubkey/pbes2/pbes2.cpp @@ -179,10 +179,14 @@ pbes2_encrypt_shared(const secure_vector& key_bits, { const std::vector cipher_spec = split_on(cipher, '/'); if(cipher_spec.size() != 2) - throw Decoding_Error("PBE-PKCS5 v2.0: Invalid cipher spec " + cipher); + throw Encoding_Error("PBE-PKCS5 v2.0: Invalid cipher spec " + cipher); if(cipher_spec[1] != "CBC" && cipher_spec[1] != "GCM") - throw Decoding_Error("PBE-PKCS5 v2.0: Don't know param format for " + cipher); + throw Encoding_Error("PBE-PKCS5 v2.0: Don't know param format for " + cipher); + + const OID cipher_oid = OIDS::lookup(cipher); + if(cipher_oid.empty()) + throw Encoding_Error("PBE-PKCS5 v2.0: No OID assigned for " + cipher); std::unique_ptr enc = Cipher_Mode::create(cipher, ENCRYPTION); diff --git a/src/scripts/oids.py b/src/scripts/oids.py index 8b9d8ba3efd..5de224f79bd 100755 --- a/src/scripts/oids.py +++ b/src/scripts/oids.py @@ -262,7 +262,7 @@ def main(args = None): oid_lines = open('./src/build-data/oids.txt').readlines() - oid_re = re.compile("^([1-9][0-9.]+) = ([A-Za-z0-9_\./\(\), -]+)(?: = )?([0-9]+)?$") + oid_re = re.compile("^([0-9][0-9.]+) = ([A-Za-z0-9_\./\(\), -]+)(?: = )?([0-9]+)?$") hdr_re = re.compile("^\[([a-z0-9_]+)\]$") pad_re = re.compile("^([A-Za-z0-9_\., -]+)/([A-Za-z0-9_-]+)[A-Za-z0-9_\.\(\), -]*$") From 90623401fd9bfb2d91debf301e26d6d43b6c0e3f Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 23 May 2018 12:49:51 -0400 Subject: [PATCH 117/174] Update news --- news.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/news.rst b/news.rst index 9353d771818..557e4d8b755 100644 --- a/news.rst +++ b/news.rst @@ -23,6 +23,8 @@ Version 2.7.0, Not Yet Released * Add support for Scrypt password hashing (GH #1570) +* Add support for using Scrypt for private key encryption (GH #1574) + * Optimizations for DES/3DES, approx 50% faster when used in certain modes such as CBC decrypt or CTR. From 25fa206c197449ac4d076ea30baf08bf28988b22 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Wed, 23 May 2018 20:22:59 -0400 Subject: [PATCH 118/174] Don't ignore files that actually live in the top level dir Fixes GH #1575 --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index e022539e5c5..1a5d5100c99 100644 --- a/.gitignore +++ b/.gitignore @@ -77,3 +77,7 @@ callgrind.* /*.pub /*.crt /*.txt + +# Add back files from the toplevel +!configure.py +!license.txt From cf40ae57ad5e59161316a217a1305d4e519ff25c Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 24 May 2018 11:36:32 -0400 Subject: [PATCH 119/174] Document PBE better [ci skip] --- doc/manual/pubkey.rst | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/doc/manual/pubkey.rst b/doc/manual/pubkey.rst index 17ebea231de..767cb1552b7 100644 --- a/doc/manual/pubkey.rst +++ b/doc/manual/pubkey.rst @@ -105,6 +105,22 @@ encrypted storage. password based encryption (or PBE) algorithm. If you don't specify a PBE, a sensible default will be used. + The currently supported PBE is PBES2 from PKCS5. Format is as follows: + `PBE-PKCS5v20(CIPHER,PBKDF)`. Cipher can be any block cipher with /CBC or /GCM + appended, for example "AES-128/CBC" or "Camellia-256/GCM". For best interop + with other systems, use AES in CBC mode. The PBKDF can be either the name of a + hash function (in which case PBKDF2 is used with that hash) or "Scrypt", which + causes the scrypt memory hard password hashing function to be used. Scrypt is + supported since version 2.7.0. + + Use `PBE-PKCS5v20(AES-256/CBC,SHA-256)` if you want to ensure the keys can + be imported by different software packages. Use + `PBE-PKCS5v20(AES-256/GCM,Scrypt)` for best security assuming you do not + care about interop. + + For ciphers you can use anything which has an OID defined for CBC or GCM mode. + Currently this includes 3DES, AES, Camellia, SM4, Serpent, and Twofish. + .. cpp:function:: std::string PKCS8::PEM_encode(const Private_Key& key, \ RandomNumberGenerator& rng, const std::string& pass, const std::string& pbe_algo = "") From 14ea9c0395dd5861fbe457165c95fa789bd3acef Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 24 May 2018 11:50:40 -0400 Subject: [PATCH 120/174] Improve error message on BER decoding error --- src/lib/asn1/asn1_obj.cpp | 53 +++++++++++++++++++++++++--- src/lib/asn1/asn1_obj.h | 3 +- src/tests/data/x509/bsi/expected.txt | 4 +-- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/src/lib/asn1/asn1_obj.cpp b/src/lib/asn1/asn1_obj.cpp index 98f44d40762..987c89d964b 100644 --- a/src/lib/asn1/asn1_obj.cpp +++ b/src/lib/asn1/asn1_obj.cpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace Botan { @@ -28,11 +29,34 @@ void BER_Object::assert_is_a(ASN1_Tag type_tag_, ASN1_Tag class_tag_, { if(this->is_a(type_tag_, class_tag_) == false) { - throw BER_Decoding_Error("Tag mismatch when decoding " + descr + " got " + - std::to_string(type_tag) + "/" + - std::to_string(class_tag) + " expected " + - std::to_string(type_tag_) + "/" + - std::to_string(class_tag_)); + std::stringstream msg; + + msg << "Tag mismatch when decoding " << descr << " got "; + + if(class_tag == UNIVERSAL || class_tag == CONSTRUCTED) + { + msg << asn1_tag_to_string(type_tag); + } + else + { + msg << std::to_string(type_tag); + } + + msg << "/" << asn1_class_to_string(class_tag); + msg << " expected "; + + if(class_tag_ == UNIVERSAL || class_tag_ == CONSTRUCTED) + { + msg << asn1_tag_to_string(type_tag_); + } + else + { + msg << std::to_string(type_tag_); + } + + msg << "/" << asn1_class_to_string(class_tag_); + + throw BER_Decoding_Error(msg.str()); } } @@ -52,6 +76,25 @@ void BER_Object::set_tagging(ASN1_Tag t, ASN1_Tag c) class_tag = c; } +std::string asn1_class_to_string(ASN1_Tag type) + { + switch(type) + { + case UNIVERSAL: + return "UNIVERSAL"; + case CONSTRUCTED: + return "CONSTRUCTED"; + case CONTEXT_SPECIFIC: + return "CONTEXT_SPECIFIC"; + case APPLICATION: + return "APPLICATION"; + case CONSTRUCTED | CONTEXT_SPECIFIC: + return "PRIVATE"; + default: + return "CLASS(" + std::to_string(static_cast(type)) + ")"; + } + } + std::string asn1_tag_to_string(ASN1_Tag type) { switch(type) diff --git a/src/lib/asn1/asn1_obj.h b/src/lib/asn1/asn1_obj.h index b9477da092c..7ae694977ae 100644 --- a/src/lib/asn1/asn1_obj.h +++ b/src/lib/asn1/asn1_obj.h @@ -56,7 +56,8 @@ enum ASN1_Tag : uint32_t { DIRECTORY_STRING = 0xFF01 }; -std::string BOTAN_DLL asn1_tag_to_string(ASN1_Tag type); +std::string BOTAN_UNSTABLE_API asn1_tag_to_string(ASN1_Tag type); +std::string BOTAN_UNSTABLE_API asn1_class_to_string(ASN1_Tag type); /** * Basic ASN.1 Object Interface diff --git a/src/tests/data/x509/bsi/expected.txt b/src/tests/data/x509/bsi/expected.txt index fefb42bc54b..7abee2dd772 100644 --- a/src/tests/data/x509/bsi/expected.txt +++ b/src/tests/data/x509/bsi/expected.txt @@ -28,7 +28,7 @@ cert_path_CRL_10$Certificate is revoked cert_path_CRL_11$Certificate is revoked cert_path_CRL_12$No revocation data cert_path_CRL_13$No CRL with matching distribution point for certificate -cert_path_CRL_14$Invalid argument Decoding error: X509 CRL decoding failed: Invalid argument Decoding error: BER: Tag mismatch when decoding object got 65280/65280 expected 3/0 +cert_path_CRL_14$Invalid argument Decoding error: X509 CRL decoding failed: Invalid argument Decoding error: BER: Tag mismatch when decoding object got 65280/CLASS(65280) expected BIT STRING/UNIVERSAL cert_path_CRL_15$No CRL with matching distribution point for certificate cert_path_CRL_16$Certificate is revoked cert_path_crypt_01$Signature error @@ -42,7 +42,7 @@ cert_path_ext_06$CA certificate not allowed to issue certs cert_path_ext_07$CA certificate not allowed to issue certs cert_path_ext_08$Certificate chain too long cert_path_ext_09$Verified -cert_path_ext_10$Invalid argument Decoding error: CERTIFICATE decoding failed: Invalid argument Decoding error: Decoding X.509 extension 2.5.29.15 failed failed with exception Invalid argument Decoding error: BER: Tag mismatch when decoding usage constraint got 16/32 expected 3/0 +cert_path_ext_10$Invalid argument Decoding error: CERTIFICATE decoding failed: Invalid argument Decoding error: Decoding X.509 extension 2.5.29.15 failed failed with exception Invalid argument Decoding error: BER: Tag mismatch when decoding usage constraint got SEQUENCE/CONSTRUCTED expected BIT STRING/UNIVERSAL cert_path_ext_11$CA certificate not allowed to issue certs cert_path_ext_12$Certificate contains duplicate policy cert_path_ext_13$Unknown critical extension encountered From b596fa2766ac947144e31c8db37c45a7cad254c4 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 24 May 2018 15:17:30 -0400 Subject: [PATCH 121/174] Ignore also *.rst in top level --- .gitignore | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 1a5d5100c99..8c7a071b785 100644 --- a/.gitignore +++ b/.gitignore @@ -77,7 +77,10 @@ callgrind.* /*.pub /*.crt /*.txt +/*.rst # Add back files from the toplevel -!configure.py -!license.txt +!/news.rst +!/readme.rst +!/configure.py +!/license.txt From 7db21f4b103128f817cb982252ccd08d9f80a9c6 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 24 May 2018 13:08:23 -0400 Subject: [PATCH 122/174] Small tweaks to the build docs --- doc/manual/building.rst | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/doc/manual/building.rst b/doc/manual/building.rst index 6da09c214cc..c8f27c97943 100644 --- a/doc/manual/building.rst +++ b/doc/manual/building.rst @@ -53,12 +53,12 @@ system, and use that. It will print a display at the end showing which algorithms have and have not been enabled. For instance on one system we might see lines like:: - INFO: Skipping, dependency failure - sessions_sqlite3 - INFO: Skipping, incompatible CPU - mp_x86_32 simd_altivec - INFO: Skipping, incompatible OS - beos_stats cryptoapi_rng darwin_secrandom win32_stats - INFO: Skipping, incompatible compiler - mp_x86_32_msvc - INFO: Skipping, loaded only if needed by dependency - dyn_load mp_generic simd_scalar - INFO: Skipping, requires external dependency - boost bzip2 lzma sqlite3 tpm + INFO: Skipping (dependency failure): certstor_sqlite3 sessions_sqlite3 + INFO: Skipping (incompatible CPU): aes_power8 + INFO: Skipping (incompatible OS): darwin_secrandom getentropy win32_stats + INFO: Skipping (incompatible compiler): aes_armv8 pmull sha1_armv8 sha2_32_armv8 + INFO: Skipping (no enabled compression schemes): compression + INFO: Skipping (requires external dependency): bearssl boost bzip2 lzma openssl sqlite3 tpm zlib The ones that are skipped because they are require an external dependency have to be explicitly asked for, because they rely on third @@ -69,7 +69,7 @@ All available modules can be listed with ``--list-modules``. You can control which algorithms and modules are built using the options ``--enable-modules=MODS`` and ``--disable-modules=MODS``, for -instance ``--enable-modules=zlib`` and ``--disable-modules=rc5,idea``. +instance ``--enable-modules=zlib`` and ``--disable-modules=xtea,idea``. Modules not listed on the command line will simply be loaded if needed or if configured to load by default. If you use ``--minimized-build``, only the most core modules will be included; you can then explicitly @@ -83,11 +83,10 @@ For instance:: $ ./configure.py --minimized-build --enable-modules=rsa,eme_oaep,emsa_pssr will set up a build that only includes RSA, OAEP, PSS along with any -required dependencies. A small subset of core features, including AES, -SHA-2, HMAC, and the multiple precision integer library, are always -loaded. Note that a minimized build does not include any random number -generator, which is needed for example to generate keys, nonces and IVs. -See :doc:`rng` on which random number generators are available. +required dependencies. Note that a minimized build does not by default +include any random number generator, which is needed for example to +generate keys, nonces and IVs. See :doc:`rng` on which random number +generators are available. The option ``--module-policy=POL`` enables modules required by and disables modules prohibited by a text policy in ``src/build-data/policy``. @@ -102,7 +101,7 @@ Cross Compiling Cross compiling refers to building software on one type of host (say Linux x86-64) but creating a binary for some other type (say MinGW x86-32). This is completely supported by the build system. To extend the example, we must tell -`configure.py` to use the MinGW tools: +`configure.py` to use the MinGW tools:: $ ./configure.py --os=mingw --cpu=x86_32 --cc-bin=i686-w64-mingw32-g++ --ar=i686-w64-mingw32-ar ... @@ -315,6 +314,8 @@ by the user using and public key operations. OpenSSL 1.0.2 or later is supported. LibreSSL can also be used. + - ``--with-tpm`` adds support for using TPM hardware via the TrouSerS library. + - ``--with-boost`` enables using some Boost libraries. In particular Boost.Filesystem is used for a few operations (but on most platforms, a native API equivalent is available), and Boost.Asio is used to provide a few From 0d11526e5979e979b6dc3569714e651f2486bb0f Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 24 May 2018 15:35:19 -0400 Subject: [PATCH 123/174] Small cleanup in dist script --- src/scripts/dist.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/scripts/dist.py b/src/scripts/dist.py index d12ce8d05ea..36237c42cf4 100755 --- a/src/scripts/dist.py +++ b/src/scripts/dist.py @@ -355,14 +355,18 @@ def output_name(): all_files += [os.path.join(curdir, f) for f in files] all_files.sort(key=lambda f: (os.path.dirname(f), os.path.basename(f))) - version_file = None - - # location of file with version information has moved over time - for possible_version_file in ['src/build-data/version.txt', 'version.txt', 'botan_version.py']: - full_path = os.path.join(output_basename, possible_version_file) - if os.access(full_path, os.R_OK): - version_file = full_path - break + def find_version_file(): + + # location of file with version information has moved over time + for possible_version_file in ['src/build-data/version.txt', 'version.txt', 'botan_version.py']: + full_path = os.path.join(output_basename, possible_version_file) + if os.access(full_path, os.R_OK): + return full_path + + logging.error('Cannot locate version file') + return None + + version_file = find_version_file() if not os.access(version_file, os.R_OK): logging.error('Cannot read %s' % (version_file)) From d8b909e3c7823e17b7fe9c405393f7d9a19aa7b9 Mon Sep 17 00:00:00 2001 From: Lauri Nurmi Date: Tue, 22 May 2018 16:56:39 +0300 Subject: [PATCH 124/174] Keep cxx_abi_flags out of CXX, which may get overridden Overriding CXX with the make command results in cxx_abi_flags being ignored, which in turn may lead to a linking error. --- src/build-data/makefile.in | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/build-data/makefile.in b/src/build-data/makefile.in index 5b408c01679..6dc438d0cd7 100644 --- a/src/build-data/makefile.in +++ b/src/build-data/makefile.in @@ -1,12 +1,13 @@ # Paths to relevant programs -CXX = %{cxx} %{cxx_abi_flags} +CXX = %{cxx} LINKER = %{linker} AR = %{ar_command} PYTHON_EXE = %{python_exe} # Compiler Flags +ABI_FLAGS = %{cxx_abi_flags} LANG_FLAGS = %{cc_lang_flags} CXXFLAGS = %{cc_compile_flags} WARN_FLAGS = %{cc_warning_flags} @@ -19,7 +20,7 @@ POST_LINK_CMD = %{post_link_cmd} LIB_LINKS_TO = %{link_to} EXE_LINKS_TO = %{link_to_botan} $(LIB_LINKS_TO) -BUILD_FLAGS = $(LANG_FLAGS) $(CXXFLAGS) $(WARN_FLAGS) +BUILD_FLAGS = $(ABI_FLAGS) $(LANG_FLAGS) $(CXXFLAGS) $(WARN_FLAGS) SCRIPTS_DIR = %{scripts_dir} INSTALLED_LIB_DIR = %{prefix}/%{libdir} @@ -65,11 +66,11 @@ TESTOBJS = %{join test_objs} # Executable targets $(CLI): $(LIBRARIES) $(CLIOBJS) - $(EXE_LINK_CMD) $(LDFLAGS) $(CLIOBJS) $(EXE_LINKS_TO) %{output_to_exe}$@ + $(EXE_LINK_CMD) $(ABI_FLAGS) $(LDFLAGS) $(CLIOBJS) $(EXE_LINKS_TO) %{output_to_exe}$@ $(POST_LINK_CMD) $(TEST): $(LIBRARIES) $(TESTOBJS) - $(EXE_LINK_CMD) $(LDFLAGS) $(TESTOBJS) $(EXE_LINKS_TO) %{output_to_exe}$@ + $(EXE_LINK_CMD) $(ABI_FLAGS) $(LDFLAGS) $(TESTOBJS) $(EXE_LINKS_TO) %{output_to_exe}$@ $(POST_LINK_CMD) %{if build_fuzzers} @@ -98,7 +99,7 @@ fuzzer_corpus_zip: fuzzer_corpus %{if build_shared_lib} %{out_dir}/%{shared_lib_name}: $(LIBOBJS) - %{lib_link_cmd} $(LDFLAGS) $(LIBOBJS) $(LIB_LINKS_TO) %{output_to_exe}$@ + %{lib_link_cmd} $(ABI_FLAGS) $(LDFLAGS) $(LIBOBJS) $(LIB_LINKS_TO) %{output_to_exe}$@ %{endif} %{if symlink_shared_lib} cd %{out_dir} && ln -fs %{shared_lib_name} %{soname_base} @@ -127,5 +128,5 @@ fuzzer_corpus_zip: fuzzer_corpus $(CXX) $(BUILD_FLAGS) %{isa_flags} %{include_paths} %{dash_c} %{src} %{dash_o}$@ %{exe}: %{obj} $(LIBRARIES) - $(EXE_LINK_CMD) %{obj} $(EXE_LINKS_TO) %{fuzzer_lib} %{output_to_exe}$@ + $(EXE_LINK_CMD) $(ABI_FLAGS) %{obj} $(EXE_LINKS_TO) %{fuzzer_lib} %{output_to_exe}$@ %{endfor} From 154b1cb7326f70ad5f9692c004f0711ca0c4e2b1 Mon Sep 17 00:00:00 2001 From: Matthias Gierlings Date: Fri, 25 May 2018 21:05:11 +0200 Subject: [PATCH 125/174] Fixes XMSS leaf index bounds sanity check Prior to this patch the sanity check for XMSS leaf indices was wrongly based on the tree height. As a result only half of the one-time keys could be used. Instead base leaf index sanity check on the number of levels in a tree which equals tree height + 1. (see also: https://tools.ietf.org/html/draft-irtf-cfrg-xmss-hash-based-signatures-12#section-4.1.1) --- src/lib/pubkey/xmss/xmss_privatekey.cpp | 3 +-- src/lib/pubkey/xmss/xmss_privatekey.h | 4 ++-- src/lib/pubkey/xmss/xmss_signature.cpp | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/lib/pubkey/xmss/xmss_privatekey.cpp b/src/lib/pubkey/xmss/xmss_privatekey.cpp index 37dbd61e340..426ebeb61bf 100644 --- a/src/lib/pubkey/xmss/xmss_privatekey.cpp +++ b/src/lib/pubkey/xmss/xmss_privatekey.cpp @@ -50,8 +50,7 @@ XMSS_PrivateKey::XMSS_PrivateKey(const secure_vector& raw_key) unused_leaf = ((unused_leaf << 8) | *i); } - if(unused_leaf >= (1ull << (XMSS_PublicKey::m_xmss_params.tree_height() - - 1))) + if(unused_leaf >= (1ull << XMSS_PublicKey::m_xmss_params.tree_height())) { throw Integrity_Failure("XMSS private key leaf index out of " "bounds."); diff --git a/src/lib/pubkey/xmss/xmss_privatekey.h b/src/lib/pubkey/xmss/xmss_privatekey.h index 3cd9f75f4af..d66933724a0 100644 --- a/src/lib/pubkey/xmss/xmss_privatekey.h +++ b/src/lib/pubkey/xmss/xmss_privatekey.h @@ -113,7 +113,7 @@ class BOTAN_PUBLIC_API(2,0) XMSS_PrivateKey final : public virtual XMSS_PublicKe **/ void set_unused_leaf_index(size_t idx) { - if(idx >= (1ull << (XMSS_PublicKey::m_xmss_params.tree_height() - 1))) + if(idx >= (1ull << XMSS_PublicKey::m_xmss_params.tree_height())) { throw Integrity_Failure("XMSS private key leaf index out of " "bounds."); @@ -138,7 +138,7 @@ class BOTAN_PUBLIC_API(2,0) XMSS_PrivateKey final : public virtual XMSS_PublicKe { size_t idx = (static_cast&>( *recover_global_leaf_index())).fetch_add(1); - if(idx >= (1ull << (XMSS_PublicKey::m_xmss_params.tree_height() - 1))) + if(idx >= (1ull << XMSS_PublicKey::m_xmss_params.tree_height())) { throw Integrity_Failure("XMSS private key, one time signatures " "exhausted."); diff --git a/src/lib/pubkey/xmss/xmss_signature.cpp b/src/lib/pubkey/xmss/xmss_signature.cpp index 88809cf7ba8..f2d1ba4f1b2 100644 --- a/src/lib/pubkey/xmss/xmss_signature.cpp +++ b/src/lib/pubkey/xmss/xmss_signature.cpp @@ -25,7 +25,7 @@ XMSS_Signature::XMSS_Signature(XMSS_Parameters::xmss_algorithm_t oid, for(size_t i = 0; i < 8; i++) { m_leaf_idx = ((m_leaf_idx << 8) | raw_sig[i]); } - if(m_leaf_idx >= (1ull << (xmss_params.tree_height() - 1))) + if(m_leaf_idx >= (1ull << xmss_params.tree_height())) { throw Integrity_Failure("XMSS signature leaf index out of bounds."); } From 501e524c886cdafd797a81c5c11410c71426e225 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Sat, 26 May 2018 09:12:23 -0400 Subject: [PATCH 126/174] Wording tweaks --- doc/manual/roadmap.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/manual/roadmap.rst b/doc/manual/roadmap.rst index 03461da206f..18052381dc8 100644 --- a/doc/manual/roadmap.rst +++ b/doc/manual/roadmap.rst @@ -39,8 +39,8 @@ Performance Improvements The eventual goal would be performance parity with OpenSSL, but initial target is probably more like "no worse than 30% slower for any algorithm". -[Major improvements were made in ECC and RSA performance were made -between 2.4.0 and 2.7.0, measurement and optimization work is ongoing.] +[Major improvements to ECC and RSA performance were made between 2.4.0 +and 2.7.0, measurement and optimization work is ongoing.] Elliptic Curve Pairings ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -62,7 +62,7 @@ Initial work is focused on features which are included in TLS v1.3 but also available for TLS v1.2 (such as PSS signatures and FFDHE) as well as refactorings which will make the eventual implementation of v1.3 simpler. Assuming no source of dedicated funding appears, a full v1.3 implementation will -likely not available until sometime in 2019. +likely not be available until sometime in 2019. ASN.1 Redesign ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 804cad526303be7d75c3ad4c06dc1c8ffbbd1ba7 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Sun, 27 May 2018 11:41:57 -0400 Subject: [PATCH 127/174] Avoid repeated allocations in XMSS chain function This is the core hotspot of XMSS signatures. Avoiding the secure_vector allocation for the PRF output improves performance quite noticably. Before: XMSS_SHA2-256_W16_H10 1940.74 ms/op XMSS_SHA2-512_W16_H10 3985.98 ms/op XMSS_SHAKE128_W16_H10 1910.48 ms/op XMSS_SHAKE256_W16_H10 4074.65 ms/op After: XMSS_SHA2-256_W16_H10 1204.34 ms/op XMSS_SHA2-512_W16_H10 2498.17 ms/op XMSS_SHAKE128_W16_H10 1176.55 ms/op XMSS_SHAKE256_W16_H10 2689.76 ms/op --- src/lib/pubkey/xmss/xmss_wots_publickey.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lib/pubkey/xmss/xmss_wots_publickey.cpp b/src/lib/pubkey/xmss/xmss_wots_publickey.cpp index c944d6b1087..9207a2c574a 100644 --- a/src/lib/pubkey/xmss/xmss_wots_publickey.cpp +++ b/src/lib/pubkey/xmss/xmss_wots_publickey.cpp @@ -20,6 +20,8 @@ XMSS_WOTS_PublicKey::chain(secure_vector& result, const secure_vector& seed, XMSS_Hash& hash) { + secure_vector prf_output(hash.output_length()); + for(size_t i = start_idx; i < (start_idx + steps) && i < m_wots_params.wots_parameter(); i++) @@ -34,7 +36,8 @@ XMSS_WOTS_PublicKey::chain(secure_vector& result, adrs.set_key_mask_mode(XMSS_Address::Key_Mask::Key_Mode); //Calculate f(key, tmp XOR bitmask) - hash.f(result, hash.prf(seed, adrs.bytes()), result); + hash.prf(prf_output, seed, adrs.bytes()); + hash.f(result, prf_output, result); } } From 8df48e74987fb2ab3c97adb2b48c2cafc0ea381b Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Sun, 27 May 2018 11:38:30 -0400 Subject: [PATCH 128/174] Add BMI2-specific SHA-256 Currently just a copy of the baseline compression function, but compiled with BMI2 flags. On Skylake improves performance by about 40%. --- src/build-data/cc/clang.txt | 2 +- src/build-data/cc/gcc.txt | 2 +- src/lib/hash/sha2_32/sha2_32.cpp | 14 +- src/lib/hash/sha2_32/sha2_32.h | 6 + src/lib/hash/sha2_32/sha2_32_bmi2/info.txt | 10 ++ .../sha2_32/sha2_32_bmi2/sha2_32_bmi2.cpp | 139 ++++++++++++++++++ src/lib/utils/cpuid/cpuid.cpp | 5 + src/lib/utils/cpuid/cpuid.h | 7 + src/lib/utils/cpuid/cpuid_x86.cpp | 15 +- src/tests/data/hash/sha2_32.vec | 2 +- 10 files changed, 195 insertions(+), 7 deletions(-) create mode 100644 src/lib/hash/sha2_32/sha2_32_bmi2/info.txt create mode 100644 src/lib/hash/sha2_32/sha2_32_bmi2/sha2_32_bmi2.cpp diff --git a/src/build-data/cc/clang.txt b/src/build-data/cc/clang.txt index d8c02819170..65586088bc2 100644 --- a/src/build-data/cc/clang.txt +++ b/src/build-data/cc/clang.txt @@ -48,7 +48,7 @@ ssse3 -> "-mssse3" sse41 -> "-msse4.1" sse42 -> "-msse4.2" avx2 -> "-mavx2" -bmi2 -> "-mbmi2" +bmi2 -> "-mbmi -mbmi2" aesni -> "-maes -mpclmul -mssse3" rdrand -> "-mrdrnd" rdseed -> "-mrdseed" diff --git a/src/build-data/cc/gcc.txt b/src/build-data/cc/gcc.txt index 0b12e00bcf4..a1e45b42810 100644 --- a/src/build-data/cc/gcc.txt +++ b/src/build-data/cc/gcc.txt @@ -53,7 +53,7 @@ ssse3 -> "-mssse3" sse41 -> "-msse4.1" sse42 -> "-msse4.2" avx2 -> "-mavx2" -bmi2 -> "-mbmi2" +bmi2 -> "-mbmi -mbmi2" aesni -> "-maes -mpclmul -mssse3" rdrand -> "-mrdrnd" rdseed -> "-mrdseed" diff --git a/src/lib/hash/sha2_32/sha2_32.cpp b/src/lib/hash/sha2_32/sha2_32.cpp index 0710747d0ed..99cc2a6ffbc 100644 --- a/src/lib/hash/sha2_32/sha2_32.cpp +++ b/src/lib/hash/sha2_32/sha2_32.cpp @@ -51,6 +51,13 @@ void SHA_256::compress_digest(secure_vector& digest, } #endif +#if defined(BOTAN_HAS_SHA2_32_X86_BMI2) + if(CPUID::has_bmi2()) + { + return SHA_256::compress_digest_x86_bmi2(digest, input, blocks); + } +#endif + #if defined(BOTAN_HAS_SHA2_32_ARMV8) if(CPUID::has_arm_sha2()) { @@ -59,8 +66,8 @@ void SHA_256::compress_digest(secure_vector& digest, #endif uint32_t A = digest[0], B = digest[1], C = digest[2], - D = digest[3], E = digest[4], F = digest[5], - G = digest[6], H = digest[7]; + D = digest[3], E = digest[4], F = digest[5], + G = digest[6], H = digest[7]; for(size_t i = 0; i != blocks; ++i) { @@ -97,6 +104,7 @@ void SHA_256::compress_digest(secure_vector& digest, SHA2_32_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0x80DEB1FE); SHA2_32_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x9BDC06A7); SHA2_32_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0xC19BF174); + SHA2_32_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0xE49B69C1); SHA2_32_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0xEFBE4786); SHA2_32_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x0FC19DC6); @@ -113,6 +121,7 @@ void SHA_256::compress_digest(secure_vector& digest, SHA2_32_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD5A79147); SHA2_32_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x06CA6351); SHA2_32_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x14292967); + SHA2_32_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x27B70A85); SHA2_32_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x2E1B2138); SHA2_32_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x4D2C6DFC); @@ -129,6 +138,7 @@ void SHA_256::compress_digest(secure_vector& digest, SHA2_32_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD6990624); SHA2_32_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0xF40E3585); SHA2_32_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x106AA070); + SHA2_32_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x19A4C116); SHA2_32_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x1E376C08); SHA2_32_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x2748774C); diff --git a/src/lib/hash/sha2_32/sha2_32.h b/src/lib/hash/sha2_32/sha2_32.h index 6a0d87ac7cf..bc883f77ac2 100644 --- a/src/lib/hash/sha2_32/sha2_32.h +++ b/src/lib/hash/sha2_32/sha2_32.h @@ -66,6 +66,12 @@ class BOTAN_PUBLIC_API(2,0) SHA_256 final : public MDx_HashFunction size_t blocks); #endif +#if defined(BOTAN_HAS_SHA2_32_X86_BMI2) + static void compress_digest_x86_bmi2(secure_vector& digest, + const uint8_t input[], + size_t blocks); +#endif + #if defined(BOTAN_HAS_SHA2_32_X86) static void compress_digest_x86(secure_vector& digest, const uint8_t input[], diff --git a/src/lib/hash/sha2_32/sha2_32_bmi2/info.txt b/src/lib/hash/sha2_32/sha2_32_bmi2/info.txt new file mode 100644 index 00000000000..dc734971633 --- /dev/null +++ b/src/lib/hash/sha2_32/sha2_32_bmi2/info.txt @@ -0,0 +1,10 @@ + +SHA2_32_X86_BMI2 -> 20180526 + + +need_isa bmi2 + + +gcc +clang + diff --git a/src/lib/hash/sha2_32/sha2_32_bmi2/sha2_32_bmi2.cpp b/src/lib/hash/sha2_32/sha2_32_bmi2/sha2_32_bmi2.cpp new file mode 100644 index 00000000000..12ceb11c490 --- /dev/null +++ b/src/lib/hash/sha2_32/sha2_32_bmi2/sha2_32_bmi2.cpp @@ -0,0 +1,139 @@ +/* +* (C) 2018 Jack Lloyd +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include +#include + +namespace Botan { + +/* +Your eyes do not decieve you; this is currently just a copy of the +baseline SHA-256 implementation. Because we compile it with BMI2 +flags, GCC and Clang use the BMI2 instructions without further help. + +Likely instruction scheduling could be improved by using inline asm. +*/ + +#define SHA2_32_F(A, B, C, D, E, F, G, H, M1, M2, M3, M4, magic) do { \ + uint32_t A_rho = rotr<2>(A) ^ rotr<13>(A) ^ rotr<22>(A); \ + uint32_t E_rho = rotr<6>(E) ^ rotr<11>(E) ^ rotr<25>(E); \ + uint32_t M2_sigma = rotr<17>(M2) ^ rotr<19>(M2) ^ (M2 >> 10); \ + uint32_t M4_sigma = rotr<7>(M4) ^ rotr<18>(M4) ^ (M4 >> 3); \ + H += magic + E_rho + ((E & F) ^ (~E & G)) + M1; \ + D += H; \ + H += A_rho + ((A & B) | ((A | B) & C)); \ + M1 += M2_sigma + M3 + M4_sigma; \ + } while(0); + +void SHA_256::compress_digest_x86_bmi2(secure_vector& digest, + const uint8_t input[], + size_t blocks) + { + uint32_t A = digest[0], B = digest[1], C = digest[2], + D = digest[3], E = digest[4], F = digest[5], + G = digest[6], H = digest[7]; + + for(size_t i = 0; i != blocks; ++i) + { + uint32_t W00 = load_be(input, 0); + uint32_t W01 = load_be(input, 1); + uint32_t W02 = load_be(input, 2); + uint32_t W03 = load_be(input, 3); + uint32_t W04 = load_be(input, 4); + uint32_t W05 = load_be(input, 5); + uint32_t W06 = load_be(input, 6); + uint32_t W07 = load_be(input, 7); + uint32_t W08 = load_be(input, 8); + uint32_t W09 = load_be(input, 9); + uint32_t W10 = load_be(input, 10); + uint32_t W11 = load_be(input, 11); + uint32_t W12 = load_be(input, 12); + uint32_t W13 = load_be(input, 13); + uint32_t W14 = load_be(input, 14); + uint32_t W15 = load_be(input, 15); + + SHA2_32_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x428A2F98); + SHA2_32_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x71374491); + SHA2_32_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0xB5C0FBCF); + SHA2_32_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0xE9B5DBA5); + SHA2_32_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x3956C25B); + SHA2_32_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x59F111F1); + SHA2_32_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x923F82A4); + SHA2_32_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0xAB1C5ED5); + SHA2_32_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0xD807AA98); + SHA2_32_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x12835B01); + SHA2_32_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x243185BE); + SHA2_32_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x550C7DC3); + SHA2_32_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x72BE5D74); + SHA2_32_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0x80DEB1FE); + SHA2_32_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x9BDC06A7); + SHA2_32_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0xC19BF174); + + SHA2_32_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0xE49B69C1); + SHA2_32_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0xEFBE4786); + SHA2_32_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x0FC19DC6); + SHA2_32_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x240CA1CC); + SHA2_32_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x2DE92C6F); + SHA2_32_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x4A7484AA); + SHA2_32_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x5CB0A9DC); + SHA2_32_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x76F988DA); + SHA2_32_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x983E5152); + SHA2_32_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0xA831C66D); + SHA2_32_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0xB00327C8); + SHA2_32_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0xBF597FC7); + SHA2_32_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0xC6E00BF3); + SHA2_32_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD5A79147); + SHA2_32_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x06CA6351); + SHA2_32_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x14292967); + + SHA2_32_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x27B70A85); + SHA2_32_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x2E1B2138); + SHA2_32_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x4D2C6DFC); + SHA2_32_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x53380D13); + SHA2_32_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x650A7354); + SHA2_32_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x766A0ABB); + SHA2_32_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x81C2C92E); + SHA2_32_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x92722C85); + SHA2_32_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0xA2BFE8A1); + SHA2_32_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0xA81A664B); + SHA2_32_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0xC24B8B70); + SHA2_32_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0xC76C51A3); + SHA2_32_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0xD192E819); + SHA2_32_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD6990624); + SHA2_32_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0xF40E3585); + SHA2_32_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x106AA070); + + SHA2_32_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x19A4C116); + SHA2_32_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x1E376C08); + SHA2_32_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x2748774C); + SHA2_32_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x34B0BCB5); + SHA2_32_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x391C0CB3); + SHA2_32_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x4ED8AA4A); + SHA2_32_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x5B9CCA4F); + SHA2_32_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x682E6FF3); + SHA2_32_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x748F82EE); + SHA2_32_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x78A5636F); + SHA2_32_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x84C87814); + SHA2_32_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x8CC70208); + SHA2_32_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x90BEFFFA); + SHA2_32_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xA4506CEB); + SHA2_32_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0xBEF9A3F7); + SHA2_32_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0xC67178F2); + + A = (digest[0] += A); + B = (digest[1] += B); + C = (digest[2] += C); + D = (digest[3] += D); + E = (digest[4] += E); + F = (digest[5] += F); + G = (digest[6] += G); + H = (digest[7] += H); + + input += 64; + } + } + +} diff --git a/src/lib/utils/cpuid/cpuid.cpp b/src/lib/utils/cpuid/cpuid.cpp index 9dc56d59c54..d0489cb6701 100644 --- a/src/lib/utils/cpuid/cpuid.cpp +++ b/src/lib/utils/cpuid/cpuid.cpp @@ -46,6 +46,7 @@ std::string CPUID::to_string() CPUID_PRINT(avx512f); CPUID_PRINT(rdtsc); + CPUID_PRINT(bmi1); CPUID_PRINT(bmi2); CPUID_PRINT(adx); @@ -145,6 +146,10 @@ CPUID::bit_from_string(const std::string& tok) return {Botan::CPUID::CPUID_AVX2_BIT}; if(tok == "sha") return {Botan::CPUID::CPUID_SHA_BIT}; + if(tok == "bmi2") + return {Botan::CPUID::CPUID_BMI2_BIT}; + if(tok == "adx") + return {Botan::CPUID::CPUID_ADX_BIT}; #elif defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY) if(tok == "altivec" || tok == "simd") diff --git a/src/lib/utils/cpuid/cpuid.h b/src/lib/utils/cpuid/cpuid.h index 4c0f1668bce..633824a6ccd 100644 --- a/src/lib/utils/cpuid/cpuid.h +++ b/src/lib/utils/cpuid/cpuid.h @@ -98,6 +98,7 @@ class BOTAN_PUBLIC_API(2,1) CPUID final CPUID_RDTSC_BIT = (1ULL << 10), CPUID_BMI2_BIT = (1ULL << 11), CPUID_ADX_BIT = (1ULL << 12), + CPUID_BMI1_BIT = (1ULL << 13), // Crypto-specific ISAs CPUID_AESNI_BIT = (1ULL << 16), @@ -214,6 +215,12 @@ class BOTAN_PUBLIC_API(2,1) CPUID final static bool has_avx512f() { return has_cpuid_bit(CPUID_AVX512F_BIT); } + /** + * Check if the processor supports BMI1 + */ + static bool has_bmi1() + { return has_cpuid_bit(CPUID_BMI1_BIT); } + /** * Check if the processor supports BMI2 */ diff --git a/src/lib/utils/cpuid/cpuid_x86.cpp b/src/lib/utils/cpuid/cpuid_x86.cpp index be6c75a55b9..5387a801ec3 100644 --- a/src/lib/utils/cpuid/cpuid_x86.cpp +++ b/src/lib/utils/cpuid/cpuid_x86.cpp @@ -121,6 +121,7 @@ uint64_t CPUID::detect_cpu_features(size_t* cache_line_size) X86_CPUID_SUBLEVEL(7, 0, cpuid); enum x86_CPUID_7_bits : uint64_t { + BMI1 = (1ULL << 3), AVX2 = (1ULL << 5), BMI2 = (1ULL << 8), AVX512F = (1ULL << 16), @@ -132,8 +133,18 @@ uint64_t CPUID::detect_cpu_features(size_t* cache_line_size) if(flags7 & x86_CPUID_7_bits::AVX2) features_detected |= CPUID::CPUID_AVX2_BIT; - if(flags7 & x86_CPUID_7_bits::BMI2) - features_detected |= CPUID::CPUID_BMI2_BIT; + if(flags7 & x86_CPUID_7_bits::BMI1) + { + features_detected |= CPUID::CPUID_BMI1_BIT; + /* + We only set the BMI2 bit if BMI1 is also supported, so BMI2 + code can safely use both extensions. No known processor + implements BMI2 but not BMI1. + */ + if(flags7 & x86_CPUID_7_bits::BMI2) + features_detected |= CPUID::CPUID_BMI2_BIT; + } + if(flags7 & x86_CPUID_7_bits::AVX512F) features_detected |= CPUID::CPUID_AVX512F_BIT; if(flags7 & x86_CPUID_7_bits::RDSEED) diff --git a/src/tests/data/hash/sha2_32.vec b/src/tests/data/hash/sha2_32.vec index 3ff472e8980..af2491fd638 100644 --- a/src/tests/data/hash/sha2_32.vec +++ b/src/tests/data/hash/sha2_32.vec @@ -1,4 +1,4 @@ -#test cpuid sha armv8sha2 +#test cpuid sha armv8sha2 bmi2 [SHA-224] In = From 5c29254742fb62373c4d74a106d8c460cbbcb52c Mon Sep 17 00:00:00 2001 From: Matthias Gierlings Date: Sun, 27 May 2018 18:36:29 +0200 Subject: [PATCH 129/174] Improves "Avoid repeated allocations in XMSS chain function" --- src/lib/pubkey/xmss/xmss_wots_publickey.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/pubkey/xmss/xmss_wots_publickey.cpp b/src/lib/pubkey/xmss/xmss_wots_publickey.cpp index 9207a2c574a..68a8c5ad35d 100644 --- a/src/lib/pubkey/xmss/xmss_wots_publickey.cpp +++ b/src/lib/pubkey/xmss/xmss_wots_publickey.cpp @@ -30,7 +30,8 @@ XMSS_WOTS_PublicKey::chain(secure_vector& result, //Calculate tmp XOR bitmask adrs.set_key_mask_mode(XMSS_Address::Key_Mask::Mask_Mode); - xor_buf(result, hash.prf(seed, adrs.bytes()), result.size()); + hash.prf(prf_output, seed, adrs.bytes()); + xor_buf(result, prf_output, result.size()); // Calculate key adrs.set_key_mask_mode(XMSS_Address::Key_Mask::Key_Mode); From 446faa269f693ba2c9d738b95474f853ac66e761 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Sun, 27 May 2018 13:21:00 -0400 Subject: [PATCH 130/174] Update news --- news.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/news.rst b/news.rst index 557e4d8b755..be6b60a0a0c 100644 --- a/news.rst +++ b/news.rst @@ -18,6 +18,10 @@ Version 2.7.0, Not Yet Released * Improved performance of signature verification in ECGDSA, ECKCDSA, SM2 and GOST by 10-15%. +* XMSS optimizations (GH #1583 #1585) + +* Add BMI2 optimized version of SHA-256, 40% faster on Skylake (GH #1584) + * Allow the year to be up to 2200 in ASN.1 time objects. Previously this was limited to 2100. (GH #1536) From 88e0d910dc283018ec5e8c17d1d1fae69fe04207 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 28 May 2018 09:42:52 -0400 Subject: [PATCH 131/174] Readme tweaks [ci skip] --- readme.rst | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/readme.rst b/readme.rst index e4189dacfde..394f06c525b 100644 --- a/readme.rst +++ b/readme.rst @@ -5,15 +5,13 @@ Botan (Japanese for peony) is a cryptography library written in C++11 and released under the permissive `Simplified BSD `_ license. -Botan's goal is to be the best option for cryptography in new C++ code by -offering the tools necessary to implement a range of practical systems, such as -TLS/DTLS, PKIX certificate handling, PKCS#11 and TPM hardware support, password -hashing, and post quantum crypto schemes. In addition to the C++, botan has a -C89 API specifically designed to be easy to call from other languages. A Python -binding using ctypes is included, and several other -`language bindings `_ -are available. - +Botan's goal is to be the best option for cryptography in C++ by offering the +tools necessary to implement a range of practical systems, such as TLS/DTLS, +X.509 certificates, modern AEAD ciphers, PKCS#11 and TPM hardware support, +password hashing, and post quantum crypto schemes. Botan also has a C89 API +specifically designed to be easy to call from other languages. A Python binding +using ctypes is included, and several other `language bindings +`_ are available. Find the full feature list below. Development is coordinated on `GitHub `_ @@ -114,7 +112,7 @@ Old Release The 1.10 branch is the last version of the library written in C++98. It is no longer supported except for critical security updates (with all support ending -in 2018), and the developers do not recommend its use anymore. +in December 2018), and the developers do not recommend its use anymore. The latest 1.10 release is `1.10.17 `_ @@ -133,8 +131,8 @@ Transport Layer Security (TLS) Protocol side only right now), encrypt-then-mac CBC, and extended master secret. * Supports authentication using preshared keys (PSK) or passwords (SRP) * Supports record encryption with ChaCha20Poly1305, AES/OCB, AES/GCM, AES/CCM, - Camellia/GCM, and legacy CBC ciphersuites with AES, Camellia, SEED, or 3DES. -* Key exchange using Diffie-Hellman, ECDH, RSA, or CECPQ1 + Camellia/GCM as well as legacy CBC ciphersuites. +* Key exchange using CECPQ1, ECDH, FFDHE, or RSA Public Key Infrastructure ---------------------------------------- @@ -179,7 +177,7 @@ Other Useful Things * Simple compression API wrapping zlib, bzip2, and lzma libraries * RNG wrappers for system RNG and hardware RNGs * HMAC_DRBG and entropy collection system for userspace RNGs -* PBKDF2 password based key derivation +* Password based key derivation functions PBKDF2 and Scrypt * Password hashing function bcrypt and passhash9 (custom PBKDF scheme) * SRP-6a password authenticated key exchange * Key derivation functions including HKDF, KDF2, SP 800-108, SP 800-56A, SP 800-56C From eee4aa867fab83853155503d2a35c4018f6725a0 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 28 May 2018 09:43:46 -0400 Subject: [PATCH 132/174] Remove completed todo [ci skip] --- doc/todo.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/todo.rst b/doc/todo.rst index 7fcc693eb25..4680745760d 100644 --- a/doc/todo.rst +++ b/doc/todo.rst @@ -35,7 +35,6 @@ Public Key Crypto, Math * Curves for pairings (BN-256 is widely implemented) * Identity based encryption * BBS group signatures -* Support Scrypt for private key encryption (RFC 7914) * Paillier homomorphic cryptosystem * Hashing onto an elliptic curve * SPHINCS-256 From 69fb023ffbaead5b136cc7a21af484a3c3b9691e Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 28 May 2018 12:46:44 -0400 Subject: [PATCH 133/174] Tiny optimization in MDx_HashFunction::final_result Typically not a bottleneck but this shows up in XMSS profiling --- src/lib/hash/mdx_hash/mdx_hash.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib/hash/mdx_hash/mdx_hash.cpp b/src/lib/hash/mdx_hash/mdx_hash.cpp index 8c668874a83..7d163dbfb01 100644 --- a/src/lib/hash/mdx_hash/mdx_hash.cpp +++ b/src/lib/hash/mdx_hash/mdx_hash.cpp @@ -71,9 +71,8 @@ void MDx_HashFunction::add_data(const uint8_t input[], size_t length) */ void MDx_HashFunction::final_result(uint8_t output[]) { + clear_mem(&m_buffer[m_position], m_buffer.size() - m_position); m_buffer[m_position] = (BIG_BIT_ENDIAN ? 0x80 : 0x01); - for(size_t i = m_position+1; i != m_buffer.size(); ++i) - m_buffer[i] = 0; if(m_position >= m_buffer.size() - COUNT_SIZE) { From ab127f2636cd3c21a6fd942b04d268d8d3c72625 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 28 May 2018 14:25:59 -0400 Subject: [PATCH 134/174] Correct comment on XMSS speeds Not sure where I got the hour+ figure from. This may have been true with the initial release. --- src/cli/speed.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/cli/speed.cpp b/src/cli/speed.cpp index 56de27ca876..40d9397dd7d 100644 --- a/src/cli/speed.cpp +++ b/src/cli/speed.cpp @@ -2121,13 +2121,17 @@ class Speed final : public Command void bench_xmss(const std::string& provider, std::chrono::milliseconds msec) { - // H16 and H20 signatures take an hour or more to generate + /* + We only test H10 signatures here since already they are quite slow (a + few seconds per signature). On a fast machine, H16 signatures take 1-2 + minutes to generate and H20 signatures take 5-10 minutes to generate + */ std::vector xmss_params { - "XMSS_SHA2-256_W16_H10", - "XMSS_SHA2-512_W16_H10", - "XMSS_SHAKE128_W16_H10", - "XMSS_SHAKE256_W16_H10", + "XMSS_SHA2-256_W16_H20", + "XMSS_SHA2-512_W16_H20", + "XMSS_SHAKE128_W16_H20", + "XMSS_SHAKE256_W16_H20", }; for(std::string params : xmss_params) From c6a95c62236cdbc0feaae21715900fe9ee45039a Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 28 May 2018 16:22:11 -0400 Subject: [PATCH 135/174] Todo updates --- doc/todo.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/todo.rst b/doc/todo.rst index 4680745760d..fb5a7391687 100644 --- a/doc/todo.rst +++ b/doc/todo.rst @@ -10,6 +10,7 @@ Request a new feature by opening a pull request to update this file. Ciphers, Hashes, PBKDF ---------------------------------------- +* Stiched AES-NI GCM mode * Bitsliced AES or Camellia * Compressed tables for AES * AES using vector permutes for NEON or AltiVec @@ -36,6 +37,7 @@ Public Key Crypto, Math * Identity based encryption * BBS group signatures * Paillier homomorphic cryptosystem +* Socialist Millionaires Protocol * Hashing onto an elliptic curve * SPHINCS-256 * X448 and Ed448 @@ -54,7 +56,6 @@ Multiparty Protocols * Distributed key generation for DL, RSA * Threshold signing, decryption -* Socialist Millionaires Protocol External Providers, Hardware Support ---------------------------------------- @@ -83,7 +84,6 @@ TLS * Certificate pinning (using TACK?) * Certificate Transparency * TLS supplemental authorization data (RFC 4680, RFC 5878) -* OpenPGP authentication (RFC 5081) * DTLS-SCTP (RFC 6083) * Perspectives (http://perspectives-project.org/) * Support for server key stored in TPM or PKCS #11 From f6c35f47ff4b3bca03f2a6f057aa5a49712539e4 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 28 May 2018 17:46:14 -0400 Subject: [PATCH 136/174] Add back support for Windows Phone RNG, undeprecate UWP See #1586. Reverts part of #1494 --- doc/manual/deprecated.rst | 2 - doc/os.rst | 12 +++--- news.rst | 3 ++ src/build-data/os/{winphone.txt => uwp.txt} | 5 +++ src/lib/rng/system_rng/info.txt | 5 +++ src/lib/rng/system_rng/system_rng.cpp | 44 +++++++++++++++++++++ 6 files changed, 64 insertions(+), 7 deletions(-) rename src/build-data/os/{winphone.txt => uwp.txt} (82%) diff --git a/doc/manual/deprecated.rst b/doc/manual/deprecated.rst index 4170a0c3032..30c26d503d8 100644 --- a/doc/manual/deprecated.rst +++ b/doc/manual/deprecated.rst @@ -38,8 +38,6 @@ in the source. - Platform support for Google Native Client -- Platform support for Windows Phone - - Support for PathScale and HP compilers - TLS: 3DES and SEED ciphersuites diff --git a/doc/os.rst b/doc/os.rst index a4edd564bb4..ad7b5a894a6 100644 --- a/doc/os.rst +++ b/doc/os.rst @@ -27,28 +27,30 @@ A summary of OS features as defined in ``src/build-data/os``. o: openbsd q: qnx s: solaris + u: uwp w: windows - w: winphone .. csv-table:: - :header: "Feature", "a", "a", "c", "d", "d", "f", "h", "h", "h", "i", "i", "l", "l", "m", "n", "n", "o", "q", "s", "w", "w" + :header: "Feature", "a", "a", "c", "d", "d", "f", "h", "h", "h", "i", "i", "l", "l", "m", "n", "n", "o", "q", "s", "u", "w" "arc4random", " ", " ", " ", "X", "X", "X", " ", " ", " ", " ", "X", " ", " ", " ", " ", "X", "X", " ", " ", " ", " " "clock_gettime", "X", "X", " ", " ", "X", "X", "X", "X", "X", " ", " ", "X", " ", " ", " ", "X", "X", "X", "X", " ", " " + "crypto_ng", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " " "dev_random", "X", "X", "X", "X", "X", "X", "X", "X", "X", "X", " ", "X", " ", " ", " ", "X", "X", "X", "X", " ", " " "explicit_bzero", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " ", " ", " ", " " "filesystem", "X", "X", "X", "X", "X", "X", "X", "X", "X", " ", "X", "X", "X", "X", " ", "X", "X", "X", "X", "X", "X" "getauxval", " ", "X", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " ", " ", " ", " ", " ", " ", " ", " ", " " "getentropy", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " ", " ", " ", " " "posix1", "X", "X", "X", "X", "X", "X", "X", "X", "X", "X", "X", "X", " ", " ", " ", "X", "X", "X", "X", " ", " " + "posix_mlock", "X", "X", " ", "X", "X", "X", " ", "X", "X", " ", "X", "X", " ", " ", " ", "X", "X", "X", "X", " ", " " "proc_fs", "X", " ", " ", " ", "X", " ", " ", " ", " ", " ", " ", "X", " ", " ", " ", " ", " ", " ", "X", " ", " " - "rtlgenrandom", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " ", " ", " ", " ", " ", "X", " " + "rtlgenrandom", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " ", " ", " ", " ", " ", " ", "X" "rtlsecurezeromemory", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", "X" "security_framework", " ", " ", " ", "X", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " " "sockets", "X", "X", "X", "X", "X", "X", "X", "X", "X", " ", "X", "X", " ", " ", " ", "X", "X", "X", "X", " ", " " - "stl_filesystem_msvc", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " " + "stl_filesystem_msvc", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X" "threads", "X", "X", "X", "X", "X", "X", "X", "X", "X", " ", "X", "X", " ", "X", "X", "X", "X", "X", "X", "X", "X" - "virtual_lock", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " ", " ", " ", " ", " ", "X", " " + "virtual_lock", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " ", " ", " ", " ", " ", " ", "X" "win32", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " ", " ", " ", " ", " ", "X", "X" "winsock2", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", "X" diff --git a/news.rst b/news.rst index be6b60a0a0c..5cdc6c68f9a 100644 --- a/news.rst +++ b/news.rst @@ -47,6 +47,9 @@ Version 2.7.0, Not Yet Released * The ``factor`` command runs much faster on larger inputs now. +* Support for Windows Phone/UWP was deprecated starting in 2.5. This + deprecation has been reversed as it seems UWP is still actively used. + * Support for Visual C++ 2013 is deprecated, and will be removed in Jan 2019. Version 2.6.0, 2018-04-10 diff --git a/src/build-data/os/winphone.txt b/src/build-data/os/uwp.txt similarity index 82% rename from src/build-data/os/winphone.txt rename to src/build-data/os/uwp.txt index fdeae6783ef..df156f0a0b5 100644 --- a/src/build-data/os/winphone.txt +++ b/src/build-data/os/uwp.txt @@ -10,9 +10,14 @@ doc_dir docs win32 winsock2 +crypto_ng rtlsecurezeromemory threads filesystem + + +winphone + diff --git a/src/lib/rng/system_rng/info.txt b/src/lib/rng/system_rng/info.txt index 4dc5be7587e..da4fce4e366 100644 --- a/src/lib/rng/system_rng/info.txt +++ b/src/lib/rng/system_rng/info.txt @@ -6,8 +6,13 @@ SYSTEM_RNG -> 20141202 dev_random,posix1 arc4random rtlgenrandom +crypto_ng + +uwp -> bcrypt.lib + + rtlgenrandom?dyn_load diff --git a/src/lib/rng/system_rng/system_rng.cpp b/src/lib/rng/system_rng/system_rng.cpp index 3c2e98661a4..c3b37ea9cc1 100644 --- a/src/lib/rng/system_rng/system_rng.cpp +++ b/src/lib/rng/system_rng/system_rng.cpp @@ -13,6 +13,9 @@ #define _WINSOCKAPI_ // stop windows.h including winsock.h #include +#elif defined(BOTAN_TARGET_OS_HAS_CRYPTO_NG) + #include + #elif defined(BOTAN_TARGET_OS_HAS_ARC4RANDOM) #include @@ -60,6 +63,47 @@ class System_RNG_Impl final : public RandomNumberGenerator RtlGenRandom_fptr m_rtlgenrandom; }; +#elif defined(BOTAN_TARGET_OS_HAS_CRYPTO_NG) + +class System_RNG_Impl final : public RandomNumberGenerator + { + public: + System_RNG_Impl() + { + NTSTATUS ret = ::BCryptOpenAlgorithmProvider(&m_prov, + BCRYPT_RNG_ALGORITHM, + MS_PRIMITIVE_PROVIDER, 0); + if(ret != STATUS_SUCCESS) + throw Exception("System_RNG failed to acquire crypto provider"); + } + + ~System_RNG_Impl() + { + ::BCryptCloseAlgorithmProvider(m_prov, 0); + } + + void randomize(uint8_t buf[], size_t len) override + { + NTSTATUS ret = ::BCryptGenRandom(m_prov, static_cast(buf), static_cast(len), 0); + if(ret != STATUS_SUCCESS) + throw Exception("System_RNG call to BCryptGenRandom failed"); + } + + void add_entropy(const uint8_t in[], size_t length) override + { + /* + There is a flag BCRYPT_RNG_USE_ENTROPY_IN_BUFFER to provide + entropy inputs, but it is ignored in Windows 8 and later. + */ + } + + bool is_seeded() const override { return true; } + void clear() override { /* not possible */ } + std::string name() const override { return "crypto_ng"; } + private: + BCRYPT_ALG_HANDLE m_handle; + }; + #elif defined(BOTAN_TARGET_OS_HAS_ARC4RANDOM) class System_RNG_Impl final : public RandomNumberGenerator From 47709170170a1f707fcd9fc24c88e3c0a730afea Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 28 May 2018 18:16:05 -0400 Subject: [PATCH 137/174] Benchmark only H10 XMSS signatures --- src/cli/speed.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cli/speed.cpp b/src/cli/speed.cpp index 40d9397dd7d..d549253a79f 100644 --- a/src/cli/speed.cpp +++ b/src/cli/speed.cpp @@ -2128,10 +2128,10 @@ class Speed final : public Command */ std::vector xmss_params { - "XMSS_SHA2-256_W16_H20", - "XMSS_SHA2-512_W16_H20", - "XMSS_SHAKE128_W16_H20", - "XMSS_SHAKE256_W16_H20", + "XMSS_SHA2-256_W16_H10", + "XMSS_SHA2-512_W16_H10", + "XMSS_SHAKE128_W16_H10", + "XMSS_SHAKE256_W16_H10", }; for(std::string params : xmss_params) From 8572b74e18b340df449db39b9946efeeb832e803 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 28 May 2018 19:16:45 -0400 Subject: [PATCH 138/174] Avoid problem with Sphinx 1.7.5 --- src/scripts/ci/setup_travis.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/scripts/ci/setup_travis.sh b/src/scripts/ci/setup_travis.sh index 4427631fd9e..04d03b6d691 100755 --- a/src/scripts/ci/setup_travis.sh +++ b/src/scripts/ci/setup_travis.sh @@ -80,7 +80,8 @@ if [ "$TRAVIS_OS_NAME" = "linux" ]; then # problem in Ubuntu packaged version, see # http://stackoverflow.com/questions/32779919/no-module-named-for-requests sudo apt-get remove python-requests python-openssl - sudo pip install requests sphinx pyopenssl + sudo pip install requests pyopenssl + sudo pip install sphinx==1.7.4 fi elif [ "$TRAVIS_OS_NAME" = "osx" ]; then From 5b60dae056a652c9eb0b480db8bfa020ead9d4e1 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 29 May 2018 13:08:13 -0400 Subject: [PATCH 139/174] Fix allowing to use Sphinx 1.7.5 --- src/scripts/ci/setup_travis.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/scripts/ci/setup_travis.sh b/src/scripts/ci/setup_travis.sh index 04d03b6d691..52661494fa9 100755 --- a/src/scripts/ci/setup_travis.sh +++ b/src/scripts/ci/setup_travis.sh @@ -79,9 +79,12 @@ if [ "$TRAVIS_OS_NAME" = "linux" ]; then # all C++ features used in the manual. Install python-requests to avoid # problem in Ubuntu packaged version, see # http://stackoverflow.com/questions/32779919/no-module-named-for-requests - sudo apt-get remove python-requests python-openssl - sudo pip install requests pyopenssl - sudo pip install sphinx==1.7.4 + # + # Reinstall roman due to https://github.com/sphinx-doc/sphinx/issues/5022 + # + + sudo apt-get remove python-requests python-openssl python-roman + sudo pip install requests pyopenssl roman sphinx fi elif [ "$TRAVIS_OS_NAME" = "osx" ]; then From 48fb47c2aad3d39c51d971685b0be3f6a9292e15 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 29 May 2018 14:48:15 -0400 Subject: [PATCH 140/174] Make the tests VarMap an actual type instead of a hashmap typedef. --- src/tests/test_aead.cpp | 10 ++-- src/tests/test_asn1.cpp | 2 +- src/tests/test_bigint.cpp | 90 +++++++++++++++--------------- src/tests/test_block.cpp | 8 +-- src/tests/test_c25519.cpp | 6 +- src/tests/test_dh.cpp | 24 ++++---- src/tests/test_dlies.cpp | 18 +++--- src/tests/test_dsa.cpp | 18 +++--- src/tests/test_ecc_pointmul.cpp | 6 +- src/tests/test_ecdh.cpp | 4 +- src/tests/test_ecdsa.cpp | 18 +++--- src/tests/test_ecgdsa.cpp | 6 +- src/tests/test_ecies.cpp | 62 ++++++++++----------- src/tests/test_eckcdsa.cpp | 6 +- src/tests/test_ed25519.cpp | 6 +- src/tests/test_elg.cpp | 6 +- src/tests/test_fpe.cpp | 10 ++-- src/tests/test_gost_3410.cpp | 38 ++++++------- src/tests/test_hash.cpp | 4 +- src/tests/test_kdf.cpp | 16 +++--- src/tests/test_keywrap.cpp | 16 +++--- src/tests/test_mac.cpp | 8 +-- src/tests/test_mceliece.cpp | 16 +++--- src/tests/test_modes.cpp | 8 +-- src/tests/test_newhope.cpp | 10 ++-- src/tests/test_ocb.cpp | 18 +++--- src/tests/test_otp.cpp | 18 +++--- src/tests/test_pad.cpp | 6 +- src/tests/test_passhash.cpp | 10 ++-- src/tests/test_pbkdf.cpp | 22 ++++---- src/tests/test_pk_pad.cpp | 6 +- src/tests/test_pubkey.cpp | 48 ++++++++-------- src/tests/test_rfc6979.cpp | 8 +-- src/tests/test_rng_kat.cpp | 20 +++---- src/tests/test_rsa.cpp | 56 +++++++++---------- src/tests/test_siv.cpp | 10 ++-- src/tests/test_sm2.cpp | 36 ++++++------ src/tests/test_stream.cpp | 10 ++-- src/tests/test_tls.cpp | 12 ++-- src/tests/test_tls_messages.cpp | 14 ++--- src/tests/test_utils.cpp | 30 +++++----- src/tests/test_workfactor.cpp | 4 +- src/tests/test_x509_dn.cpp | 4 +- src/tests/test_xmss.cpp | 14 ++--- src/tests/tests.cpp | 97 ++++++++++++++++----------------- src/tests/tests.h | 58 +++++++++++++------- src/tests/unit_ecc.cpp | 2 +- 47 files changed, 467 insertions(+), 452 deletions(-) diff --git a/src/tests/test_aead.cpp b/src/tests/test_aead.cpp index afd16939674..e92d8f4b66c 100644 --- a/src/tests/test_aead.cpp +++ b/src/tests/test_aead.cpp @@ -319,11 +319,11 @@ class AEAD_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { - const std::vector key = get_req_bin(vars, "Key"); - const std::vector nonce = get_opt_bin(vars, "Nonce"); - const std::vector input = get_req_bin(vars, "In"); - const std::vector expected = get_req_bin(vars, "Out"); - const std::vector ad = get_opt_bin(vars, "AD"); + const std::vector key = vars.get_req_bin("Key"); + const std::vector nonce = vars.get_opt_bin("Nonce"); + const std::vector input = vars.get_req_bin("In"); + const std::vector expected = vars.get_req_bin("Out"); + const std::vector ad = vars.get_opt_bin("AD"); Test::Result result(algo); diff --git a/src/tests/test_asn1.cpp b/src/tests/test_asn1.cpp index d025fe9f5c2..71432851415 100644 --- a/src/tests/test_asn1.cpp +++ b/src/tests/test_asn1.cpp @@ -301,7 +301,7 @@ class ASN1_Time_Parsing_Tests final : public Text_Based_Test { Test::Result result("ASN.1 date parsing"); - const std::string tspec = get_req_str(vars, "Tspec"); + const std::string tspec = vars.get_req_str("Tspec"); if(tag_str != "UTC" && tag_str != "UTC.invalid" && diff --git a/src/tests/test_bigint.cpp b/src/tests/test_bigint.cpp index c7547194b6c..b62fa307d9c 100644 --- a/src/tests/test_bigint.cpp +++ b/src/tests/test_bigint.cpp @@ -256,9 +256,9 @@ class BigInt_Add_Test final : public Text_Based_Test using Botan::BigInt; - const BigInt a = get_req_bn(vars, "In1"); - const BigInt b = get_req_bn(vars, "In2"); - const BigInt c = get_req_bn(vars, "Output"); + const BigInt a = vars.get_req_bn("In1"); + const BigInt b = vars.get_req_bn("In2"); + const BigInt c = vars.get_req_bn("Output"); result.test_eq("a + b", a + b, c); result.test_eq("b + a", b + a, c); @@ -287,9 +287,9 @@ class BigInt_Sub_Test final : public Text_Based_Test { Test::Result result("BigInt Subtraction"); - const BigInt a = get_req_bn(vars, "In1"); - const BigInt b = get_req_bn(vars, "In2"); - const BigInt c = get_req_bn(vars, "Output"); + const BigInt a = vars.get_req_bn("In1"); + const BigInt b = vars.get_req_bn("In2"); + const BigInt c = vars.get_req_bn("Output"); result.test_eq("a - b", a - b, c); @@ -312,9 +312,9 @@ class BigInt_Mul_Test final : public Text_Based_Test { Test::Result result("BigInt Multiply"); - const BigInt a = get_req_bn(vars, "In1"); - const BigInt b = get_req_bn(vars, "In2"); - const BigInt c = get_req_bn(vars, "Output"); + const BigInt a = vars.get_req_bn("In1"); + const BigInt b = vars.get_req_bn("In2"); + const BigInt c = vars.get_req_bn("Output"); result.test_eq("a * b", a * b, c); result.test_eq("b * a", b * a, c); @@ -342,8 +342,8 @@ class BigInt_Sqr_Test final : public Text_Based_Test { Test::Result result("BigInt Square"); - const BigInt input = get_req_bn(vars, "Input"); - const BigInt output = get_req_bn(vars, "Output"); + const BigInt input = vars.get_req_bn("Input"); + const BigInt output = vars.get_req_bn("Output"); result.test_eq("a * a", input * input, output); result.test_eq("sqr(a)", square(input), output); @@ -363,9 +363,9 @@ class BigInt_Div_Test final : public Text_Based_Test { Test::Result result("BigInt Divide"); - const BigInt a = get_req_bn(vars, "In1"); - const BigInt b = get_req_bn(vars, "In2"); - const BigInt c = get_req_bn(vars, "Output"); + const BigInt a = vars.get_req_bn("In1"); + const BigInt b = vars.get_req_bn("In2"); + const BigInt c = vars.get_req_bn("Output"); result.test_eq("a / b", a / b, c); @@ -388,9 +388,9 @@ class BigInt_Mod_Test final : public Text_Based_Test { Test::Result result("BigInt Mod"); - const BigInt a = get_req_bn(vars, "In1"); - const BigInt b = get_req_bn(vars, "In2"); - const BigInt c = get_req_bn(vars, "Output"); + const BigInt a = vars.get_req_bn("In1"); + const BigInt b = vars.get_req_bn("In2"); + const BigInt c = vars.get_req_bn("Output"); result.test_eq("a % b", a % b, c); @@ -422,9 +422,9 @@ class BigInt_GCD_Test final : public Text_Based_Test { Test::Result result("BigInt Mod"); - const BigInt x = get_req_bn(vars, "X"); - const BigInt y = get_req_bn(vars, "Y"); - const BigInt expected = get_req_bn(vars, "GCD"); + const BigInt x = vars.get_req_bn("X"); + const BigInt y = vars.get_req_bn("Y"); + const BigInt expected = vars.get_req_bn("GCD"); const BigInt g = Botan::gcd(x, y); @@ -444,9 +444,9 @@ class BigInt_Lshift_Test final : public Text_Based_Test { Test::Result result("BigInt Lshift"); - const BigInt value = get_req_bn(vars, "Value"); - const size_t shift = get_req_bn(vars, "Shift").to_u32bit(); - const BigInt output = get_req_bn(vars, "Output"); + const BigInt value = vars.get_req_bn("Value"); + const size_t shift = vars.get_req_bn("Shift").to_u32bit(); + const BigInt output = vars.get_req_bn("Output"); result.test_eq("a << s", value << shift, output); @@ -469,9 +469,9 @@ class BigInt_Rshift_Test final : public Text_Based_Test { Test::Result result("BigInt Rshift"); - const BigInt value = get_req_bn(vars, "Value"); - const size_t shift = get_req_bn(vars, "Shift").to_u32bit(); - const BigInt output = get_req_bn(vars, "Output"); + const BigInt value = vars.get_req_bn("Value"); + const size_t shift = vars.get_req_bn("Shift").to_u32bit(); + const BigInt output = vars.get_req_bn("Output"); result.test_eq("a >> s", value >> shift, output); @@ -494,10 +494,10 @@ class BigInt_Powmod_Test final : public Text_Based_Test { Test::Result result("BigInt Powmod"); - const BigInt base = get_req_bn(vars, "Base"); - const BigInt exponent = get_req_bn(vars, "Exponent"); - const BigInt modulus = get_req_bn(vars, "Modulus"); - const BigInt expected = get_req_bn(vars, "Output"); + const BigInt base = vars.get_req_bn("Base"); + const BigInt exponent = vars.get_req_bn("Exponent"); + const BigInt modulus = vars.get_req_bn("Modulus"); + const BigInt expected = vars.get_req_bn("Output"); result.test_eq("power_mod", Botan::power_mod(base, exponent, modulus), expected); @@ -550,7 +550,7 @@ class BigInt_IsPrime_Test final : public Text_Based_Test throw Test_Error("Bad header for prime test " + header); } - const BigInt value = get_req_bn(vars, "X"); + const BigInt value = vars.get_req_bn("X"); const bool is_prime = (header == "Prime"); Test::Result result("BigInt Test " + header); @@ -570,9 +570,9 @@ class BigInt_Ressol_Test final : public Text_Based_Test { Test::Result result("BigInt Ressol"); - const Botan::BigInt a = get_req_bn(vars, "Input"); - const Botan::BigInt p = get_req_bn(vars, "Modulus"); - const Botan::BigInt exp = get_req_bn(vars, "Output"); + const Botan::BigInt a = vars.get_req_bn("Input"); + const Botan::BigInt p = vars.get_req_bn("Modulus"); + const Botan::BigInt exp = vars.get_req_bn("Output"); const Botan::BigInt a_sqrt = Botan::ressol(a, p); @@ -599,9 +599,9 @@ class BigInt_InvMod_Test final : public Text_Based_Test { Test::Result result("BigInt InvMod"); - const Botan::BigInt a = get_req_bn(vars, "Input"); - const Botan::BigInt mod = get_req_bn(vars, "Modulus"); - const Botan::BigInt expected = get_req_bn(vars, "Output"); + const Botan::BigInt a = vars.get_req_bn("Input"); + const Botan::BigInt mod = vars.get_req_bn("Modulus"); + const Botan::BigInt expected = vars.get_req_bn("Output"); const Botan::BigInt a_inv = Botan::inverse_euclid(a, mod); @@ -641,10 +641,10 @@ class BigInt_Rand_Test final : public Text_Based_Test { Test::Result result("BigInt Random"); - const std::vector seed = get_req_bin(vars, "Seed"); - const Botan::BigInt min = get_req_bn(vars, "Min"); - const Botan::BigInt max = get_req_bn(vars, "Max"); - const Botan::BigInt expected = get_req_bn(vars, "Output"); + const std::vector seed = vars.get_req_bin("Seed"); + const Botan::BigInt min = vars.get_req_bn("Min"); + const Botan::BigInt max = vars.get_req_bn("Max"); + const Botan::BigInt expected = vars.get_req_bn("Output"); Fixed_Output_RNG rng(seed); Botan::BigInt generated = BigInt::random_integer(rng, min, max); @@ -664,11 +664,11 @@ class DSA_ParamGen_Test final : public Text_Based_Test Test::Result run_one_test(const std::string& header, const VarMap& vars) override { - const std::vector seed = get_req_bin(vars, "Seed"); - const size_t offset = get_req_sz(vars, "Counter"); + const std::vector seed = vars.get_req_bin("Seed"); + const size_t offset = vars.get_req_sz("Counter"); - const Botan::BigInt exp_P = get_req_bn(vars, "P"); - const Botan::BigInt exp_Q = get_req_bn(vars, "Q"); + const Botan::BigInt exp_P = vars.get_req_bn("P"); + const Botan::BigInt exp_Q = vars.get_req_bn("Q"); const std::vector header_parts = Botan::split_on(header, ','); diff --git a/src/tests/test_block.cpp b/src/tests/test_block.cpp index cb2eff80779..111e79b4b97 100644 --- a/src/tests/test_block.cpp +++ b/src/tests/test_block.cpp @@ -24,10 +24,10 @@ class Block_Cipher_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { - const std::vector key = get_req_bin(vars, "Key"); - const std::vector input = get_req_bin(vars, "In"); - const std::vector expected = get_req_bin(vars, "Out"); - const size_t iterations = get_opt_sz(vars, "Iterations", 1); + const std::vector key = vars.get_req_bin("Key"); + const std::vector input = vars.get_req_bin("In"); + const std::vector expected = vars.get_req_bin("Out"); + const size_t iterations = vars.get_opt_sz("Iterations", 1); Test::Result result(algo); diff --git a/src/tests/test_c25519.cpp b/src/tests/test_c25519.cpp index 8c8129a18b9..9fa1a955b00 100644 --- a/src/tests/test_c25519.cpp +++ b/src/tests/test_c25519.cpp @@ -27,9 +27,9 @@ class Curve25519_Sclarmult_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string&, const VarMap& vars) override { - const std::vector secret = get_req_bin(vars, "Secret"); - const std::vector basepoint = get_req_bin(vars, "Basepoint"); - const std::vector expected = get_req_bin(vars, "Out"); + const std::vector secret = vars.get_req_bin("Secret"); + const std::vector basepoint = vars.get_req_bin("Basepoint"); + const std::vector expected = vars.get_req_bin("Out"); std::vector got(32); Botan::curve25519_donna(got.data(), secret.data(), basepoint.data()); diff --git a/src/tests/test_dh.cpp b/src/tests/test_dh.cpp index 8a7fb169c09..77778925f3c 100644 --- a/src/tests/test_dh.cpp +++ b/src/tests/test_dh.cpp @@ -35,10 +35,10 @@ class Diffie_Hellman_KAT_Tests final : public PK_Key_Agreement_Test std::unique_ptr load_our_key(const std::string&, const VarMap& vars) override { - const Botan::BigInt p = get_req_bn(vars, "P"); - const Botan::BigInt q = get_opt_bn(vars, "Q", 0); - const Botan::BigInt g = get_req_bn(vars, "G"); - const Botan::BigInt x = get_req_bn(vars, "X"); + const Botan::BigInt p = vars.get_req_bn("P"); + const Botan::BigInt q = vars.get_opt_bn("Q", 0); + const Botan::BigInt g = vars.get_req_bn("G"); + const Botan::BigInt x = vars.get_req_bn("X"); Botan::DL_Group grp; if(q == 0) @@ -56,10 +56,10 @@ class Diffie_Hellman_KAT_Tests final : public PK_Key_Agreement_Test std::vector load_their_key(const std::string&, const VarMap& vars) override { - const Botan::BigInt p = get_req_bn(vars, "P"); - const Botan::BigInt q = get_opt_bn(vars, "Q", 0); - const Botan::BigInt g = get_req_bn(vars, "G"); - const Botan::BigInt y = get_req_bn(vars, "Y"); + const Botan::BigInt p = vars.get_req_bn("P"); + const Botan::BigInt q = vars.get_opt_bn("Q", 0); + const Botan::BigInt g = vars.get_req_bn("G"); + const Botan::BigInt y = vars.get_req_bn("Y"); Botan::DL_Group grp; if(q == 0) @@ -124,10 +124,10 @@ class DH_Invalid_Key_Tests final : public Text_Based_Test { Test::Result result("DH invalid keys"); - 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 pubkey = get_req_bn(vars, "InvalidKey"); + const Botan::BigInt p = vars.get_req_bn("P"); + const Botan::BigInt q = vars.get_req_bn("Q"); + const Botan::BigInt g = vars.get_req_bn("G"); + const Botan::BigInt pubkey = vars.get_req_bn("InvalidKey"); Botan::DL_Group grp(p, q, g); std::unique_ptr key(new Botan::DH_PublicKey(grp, pubkey)); diff --git a/src/tests/test_dlies.cpp b/src/tests/test_dlies.cpp index d3fb76498d0..de1dfbd259c 100644 --- a/src/tests/test_dlies.cpp +++ b/src/tests/test_dlies.cpp @@ -29,18 +29,18 @@ class DLIES_KAT_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& cipher_algo, const VarMap& vars) override { - const Botan::BigInt x1 = get_req_bn(vars, "X1"); - const Botan::BigInt x2 = get_req_bn(vars, "X2"); + const Botan::BigInt x1 = vars.get_req_bn("X1"); + const Botan::BigInt x2 = vars.get_req_bn("X2"); - const std::vector input = get_req_bin(vars, "Msg"); - const std::vector expected = get_req_bin(vars, "Ciphertext"); + const std::vector input = vars.get_req_bin("Msg"); + const std::vector expected = vars.get_req_bin("Ciphertext"); - const std::string kdf_algo = get_req_str(vars, "Kdf"); - const std::string mac_algo = get_req_str(vars, "Mac"); - const size_t mac_key_len = get_req_sz(vars, "MacKeyLen"); - const std::string group_name = get_req_str(vars, "Group"); + const std::string kdf_algo = vars.get_req_str("Kdf"); + const std::string mac_algo = vars.get_req_str("Mac"); + const size_t mac_key_len = vars.get_req_sz("MacKeyLen"); + const std::string group_name = vars.get_req_str("Group"); - const std::vector iv = get_opt_bin(vars, "IV"); + const std::vector iv = vars.get_opt_bin("IV"); Test::Result result("DLIES " + cipher_algo); diff --git a/src/tests/test_dsa.cpp b/src/tests/test_dsa.cpp index c0b2508c00d..86a9714b8e2 100644 --- a/src/tests/test_dsa.cpp +++ b/src/tests/test_dsa.cpp @@ -38,10 +38,10 @@ class DSA_KAT_Tests final : public PK_Signature_Generation_Test std::unique_ptr 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::BigInt p = vars.get_req_bn("P"); + const Botan::BigInt q = vars.get_req_bn("Q"); + const Botan::BigInt g = vars.get_req_bn("G"); + const Botan::BigInt x = vars.get_req_bn("X"); const Botan::DL_Group grp(p, q, g); @@ -51,7 +51,7 @@ class DSA_KAT_Tests final : public PK_Signature_Generation_Test std::string default_padding(const VarMap& vars) const override { - return "EMSA1(" + get_req_str(vars, "Hash") + ")"; + return "EMSA1(" + vars.get_req_str("Hash") + ")"; } }; @@ -70,10 +70,10 @@ class DSA_Verification_Tests final : public PK_Signature_Verification_Test std::unique_ptr load_public_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 y = get_req_bn(vars, "Y"); + const Botan::BigInt p = vars.get_req_bn("P"); + const Botan::BigInt q = vars.get_req_bn("Q"); + const Botan::BigInt g = vars.get_req_bn("G"); + const Botan::BigInt y = vars.get_req_bn("Y"); const Botan::DL_Group grp(p, q, g); diff --git a/src/tests/test_ecc_pointmul.cpp b/src/tests/test_ecc_pointmul.cpp index 6ee0034a084..2a3c1727c0d 100644 --- a/src/tests/test_ecc_pointmul.cpp +++ b/src/tests/test_ecc_pointmul.cpp @@ -23,9 +23,9 @@ class ECC_Pointmult_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& group_id, const VarMap& vars) override { - const Botan::BigInt m = get_req_bn(vars, "m"); - const Botan::BigInt X = get_req_bn(vars, "X"); - const Botan::BigInt Y = get_req_bn(vars, "Y"); + const Botan::BigInt m = vars.get_req_bn("m"); + const Botan::BigInt X = vars.get_req_bn("X"); + const Botan::BigInt Y = vars.get_req_bn("Y"); Botan::EC_Group group(Botan::OIDS::lookup(group_id)); diff --git a/src/tests/test_ecdh.cpp b/src/tests/test_ecdh.cpp index 7ea19eb53cc..50ff7c53e30 100644 --- a/src/tests/test_ecdh.cpp +++ b/src/tests/test_ecdh.cpp @@ -36,14 +36,14 @@ class ECDH_KAT_Tests final : public PK_Key_Agreement_Test const VarMap& vars) override { Botan::EC_Group group(group_id); - const Botan::BigInt secret = get_req_bn(vars, "Secret"); + const Botan::BigInt secret = vars.get_req_bn("Secret"); std::unique_ptr key(new Botan::ECDH_PrivateKey(Test::rng(), group, secret)); return key; } std::vector load_their_key(const std::string&, const VarMap& vars) override { - return get_req_bin(vars, "CounterKey"); + return vars.get_req_bin("CounterKey"); } }; diff --git a/src/tests/test_ecdsa.cpp b/src/tests/test_ecdsa.cpp index 331a1dcaf1a..6464bc7a0b6 100644 --- a/src/tests/test_ecdsa.cpp +++ b/src/tests/test_ecdsa.cpp @@ -36,9 +36,9 @@ class ECDSA_Verification_Tests final : public PK_Signature_Verification_Test std::unique_ptr load_public_key(const VarMap& vars) override { - const std::string group_id = get_req_str(vars, "Group"); - const BigInt px = get_req_bn(vars, "Px"); - const BigInt py = get_req_bn(vars, "Py"); + const std::string group_id = vars.get_req_str("Group"); + const BigInt px = vars.get_req_bn("Px"); + const BigInt py = vars.get_req_bn("Py"); Botan::EC_Group group(Botan::OIDS::lookup(group_id)); const Botan::PointGFp public_point = group.point(px, py); @@ -73,8 +73,8 @@ class ECDSA_Signature_KAT_Tests final : public PK_Signature_Generation_Test std::unique_ptr load_private_key(const VarMap& vars) override { - const std::string group_id = get_req_str(vars, "Group"); - const BigInt x = get_req_bn(vars, "X"); + const std::string group_id = vars.get_req_str("Group"); + const BigInt x = vars.get_req_bn("X"); Botan::EC_Group group(Botan::OIDS::lookup(group_id)); std::unique_ptr key(new Botan::ECDSA_PrivateKey(Test::rng(), group, x)); @@ -83,7 +83,7 @@ class ECDSA_Signature_KAT_Tests final : public PK_Signature_Generation_Test std::string default_padding(const VarMap& vars) const override { - const std::string hash = get_req_str(vars, "Hash"); + const std::string hash = vars.get_req_str("Hash"); if(hash.substr(0,3) == "Raw") return hash; return "EMSA1(" + hash + ")"; @@ -127,10 +127,10 @@ class ECDSA_Invalid_Key_Tests final : public Text_Based_Test { Test::Result result("ECDSA invalid keys"); - const std::string group_id = get_req_str(vars, "Group"); + const std::string group_id = vars.get_req_str("Group"); Botan::EC_Group group(Botan::OIDS::lookup(group_id)); - const Botan::BigInt x = get_req_bn(vars, "InvalidKeyX"); - const Botan::BigInt y = get_req_bn(vars, "InvalidKeyY"); + const Botan::BigInt x = vars.get_req_bn("InvalidKeyX"); + const Botan::BigInt y = vars.get_req_bn("InvalidKeyY"); std::unique_ptr public_point; diff --git a/src/tests/test_ecgdsa.cpp b/src/tests/test_ecgdsa.cpp index 325c53b5530..5ddb5b9f810 100644 --- a/src/tests/test_ecgdsa.cpp +++ b/src/tests/test_ecgdsa.cpp @@ -35,8 +35,8 @@ class ECGDSA_Signature_KAT_Tests final : public PK_Signature_Generation_Test std::unique_ptr load_private_key(const VarMap& vars) override { - const std::string group_id = get_req_str(vars, "Group"); - const BigInt x = get_req_bn(vars, "X"); + const std::string group_id = vars.get_req_str("Group"); + const BigInt x = vars.get_req_bn("X"); Botan::EC_Group group(Botan::OIDS::lookup(group_id)); std::unique_ptr key(new Botan::ECGDSA_PrivateKey(Test::rng(), group, x)); @@ -45,7 +45,7 @@ class ECGDSA_Signature_KAT_Tests final : public PK_Signature_Generation_Test std::string default_padding(const VarMap& vars) const override { - return "EMSA1(" + get_req_str(vars, "Hash") + ")"; + return "EMSA1(" + vars.get_req_str("Hash") + ")"; } Botan::RandomNumberGenerator* test_rng(const std::vector& nonce) const override diff --git a/src/tests/test_ecies.cpp b/src/tests/test_ecies.cpp index 911d0c3a39d..63619a8a404 100644 --- a/src/tests/test_ecies.cpp +++ b/src/tests/test_ecies.cpp @@ -112,20 +112,20 @@ class ECIES_ISO_Tests final : public Text_Based_Test Test::Result result("ECIES-ISO"); // get test vectors defined by ISO 18033 - const Botan::PointGFp::Compression_Type compression_type = get_compression_type(get_req_str(vars, "format")); - const Botan::BigInt p = get_req_bn(vars, "p"); - const Botan::BigInt a = get_req_bn(vars, "a"); - const Botan::BigInt b = get_req_bn(vars, "b"); - const Botan::BigInt mu = get_req_bn(vars, "mu"); // order - const Botan::BigInt nu = get_req_bn(vars, "nu"); // cofactor - const Botan::BigInt gx = get_req_bn(vars, "gx"); // base point x - const Botan::BigInt gy = get_req_bn(vars, "gy"); // base point y - const Botan::BigInt hx = get_req_bn(vars, "hx"); // x of public point of bob - const Botan::BigInt hy = get_req_bn(vars, "hy"); // y of public point of bob - const Botan::BigInt x = get_req_bn(vars, "x"); // private key of bob - const Botan::BigInt r = get_req_bn(vars, "r"); // (ephemeral) private key of alice - const std::vector c0 = get_req_bin(vars, "C0"); // expected encoded (ephemeral) public key - const std::vector k = get_req_bin(vars, "K"); // expected derived secret + const Botan::PointGFp::Compression_Type compression_type = get_compression_type(vars.get_req_str("format")); + const Botan::BigInt p = vars.get_req_bn("p"); + const Botan::BigInt a = vars.get_req_bn("a"); + const Botan::BigInt b = vars.get_req_bn("b"); + const Botan::BigInt mu = vars.get_req_bn("mu"); // order + const Botan::BigInt nu = vars.get_req_bn("nu"); // cofactor + const Botan::BigInt gx = vars.get_req_bn("gx"); // base point x + const Botan::BigInt gy = vars.get_req_bn("gy"); // base point y + const Botan::BigInt hx = vars.get_req_bn("hx"); // x of public point of bob + const Botan::BigInt hy = vars.get_req_bn("hy"); // y of public point of bob + const Botan::BigInt x = vars.get_req_bn("x"); // private key of bob + const Botan::BigInt r = vars.get_req_bn("r"); // (ephemeral) private key of alice + const std::vector c0 = vars.get_req_bin("C0"); // expected encoded (ephemeral) public key + const std::vector k = vars.get_req_bin("K"); // expected derived secret const Botan::EC_Group domain(p, a, b, gx, gy, mu, nu); @@ -203,23 +203,23 @@ class ECIES_Tests final : public Text_Based_Test { Test::Result result("ECIES"); - const std::string curve = get_req_str(vars, "Curve"); - const Botan::BigInt private_key_value = get_req_bn(vars, "PrivateKey"); - const Botan::BigInt other_private_key_value = get_req_bn(vars, "OtherPrivateKey"); - const std::string kdf = get_req_str(vars, "Kdf"); - const std::string dem = get_req_str(vars, "Dem"); - const size_t dem_key_len = get_req_sz(vars, "DemKeyLen"); - const std::vector iv = get_req_bin(vars, "Iv"); - const std::string mac = get_req_str(vars, "Mac"); - const size_t mac_key_len = get_req_sz(vars, "MacKeyLen"); - const Botan::PointGFp::Compression_Type compression_type = get_compression_type(get_req_str(vars, "Format")); - const bool cofactor_mode = get_req_sz(vars, "CofactorMode") != 0; - const bool old_cofactor_mode = get_req_sz(vars, "OldCofactorMode") != 0; - const bool check_mode = get_req_sz(vars, "CheckMode") != 0; - const bool single_hash_mode = get_req_sz(vars, "SingleHashMode") != 0; - const std::string label = get_req_str(vars, "Label"); - const std::vector plaintext = get_req_bin(vars, "Plaintext"); - const std::vector ciphertext = get_req_bin(vars, "Ciphertext"); + const std::string curve = vars.get_req_str("Curve"); + const Botan::BigInt private_key_value = vars.get_req_bn("PrivateKey"); + const Botan::BigInt other_private_key_value = vars.get_req_bn("OtherPrivateKey"); + const std::string kdf = vars.get_req_str("Kdf"); + const std::string dem = vars.get_req_str("Dem"); + const size_t dem_key_len = vars.get_req_sz("DemKeyLen"); + const std::vector iv = vars.get_req_bin("Iv"); + const std::string mac = vars.get_req_str("Mac"); + const size_t mac_key_len = vars.get_req_sz("MacKeyLen"); + const Botan::PointGFp::Compression_Type compression_type = get_compression_type(vars.get_req_str("Format")); + const bool cofactor_mode = vars.get_req_sz("CofactorMode") != 0; + const bool old_cofactor_mode = vars.get_req_sz("OldCofactorMode") != 0; + const bool check_mode = vars.get_req_sz("CheckMode") != 0; + const bool single_hash_mode = vars.get_req_sz("SingleHashMode") != 0; + const std::string label = vars.get_req_str("Label"); + const std::vector plaintext = vars.get_req_bin("Plaintext"); + const std::vector ciphertext = vars.get_req_bin("Ciphertext"); const Flags flags = ecies_flags(cofactor_mode, old_cofactor_mode, check_mode, single_hash_mode); const Botan::EC_Group domain(curve); diff --git a/src/tests/test_eckcdsa.cpp b/src/tests/test_eckcdsa.cpp index f32ef92dba2..c6a8cdd7b4b 100644 --- a/src/tests/test_eckcdsa.cpp +++ b/src/tests/test_eckcdsa.cpp @@ -36,8 +36,8 @@ class ECKCDSA_Signature_KAT_Tests final : public PK_Signature_Generation_Test std::unique_ptr load_private_key(const VarMap& vars) override { - const std::string group_id = get_req_str(vars, "Group"); - const BigInt x = get_req_bn(vars, "X"); + const std::string group_id = vars.get_req_str("Group"); + const BigInt x = vars.get_req_bn("X"); Botan::EC_Group group(Botan::OIDS::lookup(group_id)); std::unique_ptr key(new Botan::ECKCDSA_PrivateKey(Test::rng(), group, x)); @@ -46,7 +46,7 @@ class ECKCDSA_Signature_KAT_Tests final : public PK_Signature_Generation_Test std::string default_padding(const VarMap& vars) const override { - return "EMSA1(" + get_req_str(vars, "Hash") + ")"; + return "EMSA1(" + vars.get_req_str("Hash") + ")"; } Botan::RandomNumberGenerator* test_rng(const std::vector& nonce) const override diff --git a/src/tests/test_ed25519.cpp b/src/tests/test_ed25519.cpp index c822fb32035..05a5ce30c3e 100644 --- a/src/tests/test_ed25519.cpp +++ b/src/tests/test_ed25519.cpp @@ -30,7 +30,7 @@ class Ed25519_Verification_Tests : public PK_Signature_Verification_Test std::unique_ptr load_public_key(const VarMap& vars) override { - const std::vector pubkey = get_req_bin(vars, "Pubkey"); + const std::vector pubkey = vars.get_req_bin("Pubkey"); std::unique_ptr key(new Botan::Ed25519_PublicKey(pubkey)); @@ -49,8 +49,8 @@ class Ed25519_Signature_Tests final : public PK_Signature_Generation_Test std::unique_ptr load_private_key(const VarMap& vars) override { - const std::vector privkey = get_req_bin(vars, "Privkey"); - const std::vector pubkey = get_req_bin(vars, "Pubkey"); + const std::vector privkey = vars.get_req_bin("Privkey"); + const std::vector pubkey = vars.get_req_bin("Pubkey"); Botan::secure_vector seed(privkey.begin(), privkey.end()); diff --git a/src/tests/test_elg.cpp b/src/tests/test_elg.cpp index abd4dd5fcfd..5bdd88c931a 100644 --- a/src/tests/test_elg.cpp +++ b/src/tests/test_elg.cpp @@ -29,9 +29,9 @@ class ElGamal_KAT_Tests final : public PK_Encryption_Decryption_Test std::unique_ptr load_private_key(const VarMap& vars) override { - const Botan::BigInt p = get_req_bn(vars, "P"); - const Botan::BigInt g = get_req_bn(vars, "G"); - const Botan::BigInt x = get_req_bn(vars, "X"); + const Botan::BigInt p = vars.get_req_bn("P"); + const Botan::BigInt g = vars.get_req_bn("G"); + const Botan::BigInt x = vars.get_req_bn("X"); const Botan::DL_Group grp(p, g); diff --git a/src/tests/test_fpe.cpp b/src/tests/test_fpe.cpp index e0cc1de01cc..dc2e82afc07 100644 --- a/src/tests/test_fpe.cpp +++ b/src/tests/test_fpe.cpp @@ -21,11 +21,11 @@ class FPE_FE1_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string&, const VarMap& vars) override { - const Botan::BigInt modulus = get_req_bn(vars, "Mod"); - const Botan::BigInt input = get_req_bn(vars, "In"); - const Botan::BigInt expected = get_req_bn(vars, "Out"); - const std::vector key = get_req_bin(vars, "Key"); - const std::vector tweak = get_req_bin(vars, "Tweak"); + const Botan::BigInt modulus = vars.get_req_bn("Mod"); + const Botan::BigInt input = vars.get_req_bn("In"); + const Botan::BigInt expected = vars.get_req_bn("Out"); + const std::vector key = vars.get_req_bin("Key"); + const std::vector tweak = vars.get_req_bin("Tweak"); Test::Result result("FPE_FE1"); diff --git a/src/tests/test_gost_3410.cpp b/src/tests/test_gost_3410.cpp index f5b2e1ec895..d99251075a9 100644 --- a/src/tests/test_gost_3410.cpp +++ b/src/tests/test_gost_3410.cpp @@ -28,16 +28,16 @@ class GOST_3410_2001_Verification_Tests final : public PK_Signature_Verification std::unique_ptr load_public_key(const VarMap& vars) override { - const BigInt p = get_req_bn(vars, "P"); - const BigInt a = get_req_bn(vars, "A"); - const BigInt b = get_req_bn(vars, "B"); - const BigInt Gx = get_req_bn(vars, "Gx"); - const BigInt Gy = get_req_bn(vars, "Gy"); - const BigInt order = get_req_bn(vars, "Order"); - const BigInt cofactor = get_req_bn(vars, "Cofactor"); + const BigInt p = vars.get_req_bn("P"); + const BigInt a = vars.get_req_bn("A"); + const BigInt b = vars.get_req_bn("B"); + const BigInt Gx = vars.get_req_bn("Gx"); + const BigInt Gy = vars.get_req_bn("Gy"); + const BigInt order = vars.get_req_bn("Order"); + const BigInt cofactor = vars.get_req_bn("Cofactor"); - const BigInt Px = get_req_bn(vars, "Px"); - const BigInt Py = get_req_bn(vars, "Py"); + const BigInt Px = vars.get_req_bn("Px"); + const BigInt Py = vars.get_req_bn("Py"); Botan::EC_Group group(p, a, b, Gx, Gy, order, cofactor); @@ -49,7 +49,7 @@ class GOST_3410_2001_Verification_Tests final : public PK_Signature_Verification std::string default_padding(const VarMap& vars) const override { - const std::string hash = get_req_str(vars, "Hash"); + const std::string hash = vars.get_req_str("Hash"); if(hash == "Raw") return hash; return "EMSA1(" + hash + ")"; @@ -66,15 +66,15 @@ class GOST_3410_2001_Signature_Tests final : public PK_Signature_Generation_Test std::unique_ptr load_private_key(const VarMap& vars) override { - const BigInt p = get_req_bn(vars, "P"); - const BigInt a = get_req_bn(vars, "A"); - const BigInt b = get_req_bn(vars, "B"); - const BigInt Gx = get_req_bn(vars, "Gx"); - const BigInt Gy = get_req_bn(vars, "Gy"); - const BigInt order = get_req_bn(vars, "Order"); - const BigInt cofactor = get_req_bn(vars, "Cofactor"); + const BigInt p = vars.get_req_bn("P"); + const BigInt a = vars.get_req_bn("A"); + const BigInt b = vars.get_req_bn("B"); + const BigInt Gx = vars.get_req_bn("Gx"); + const BigInt Gy = vars.get_req_bn("Gy"); + const BigInt order = vars.get_req_bn("Order"); + const BigInt cofactor = vars.get_req_bn("Cofactor"); - const BigInt x = get_req_bn(vars, "X"); + const BigInt x = vars.get_req_bn("X"); const Botan::OID oid("1.3.6.1.4.1.25258.2"); @@ -86,7 +86,7 @@ class GOST_3410_2001_Signature_Tests final : public PK_Signature_Generation_Test std::string default_padding(const VarMap& vars) const override { - const std::string hash = get_req_str(vars, "Hash"); + const std::string hash = vars.get_req_str("Hash"); if(hash == "Raw") return hash; return "EMSA1(" + hash + ")"; diff --git a/src/tests/test_hash.cpp b/src/tests/test_hash.cpp index 009d93ea150..b3d2d259955 100644 --- a/src/tests/test_hash.cpp +++ b/src/tests/test_hash.cpp @@ -81,8 +81,8 @@ class Hash_Function_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { - const std::vector input = get_req_bin(vars, "In"); - const std::vector expected = get_req_bin(vars, "Out"); + const std::vector input = vars.get_req_bin("In"); + const std::vector expected = vars.get_req_bin("Out"); Test::Result result(algo); diff --git a/src/tests/test_kdf.cpp b/src/tests/test_kdf.cpp index 6bc910d2a19..24211a32d45 100644 --- a/src/tests/test_kdf.cpp +++ b/src/tests/test_kdf.cpp @@ -36,10 +36,10 @@ class KDF_KAT_Tests final : public Text_Based_Test return result; } - const std::vector salt = get_opt_bin(vars, "Salt"); - const std::vector secret = get_req_bin(vars, "Secret"); - const std::vector label = get_opt_bin(vars, "Label"); - const std::vector expected = get_req_bin(vars, "Output"); + const std::vector salt = vars.get_opt_bin("Salt"); + const std::vector secret = vars.get_req_bin("Secret"); + const std::vector label = vars.get_opt_bin("Label"); + const std::vector expected = vars.get_req_bin("Output"); result.test_eq("name", kdf->name(), kdf_name); result.test_eq("derived key", kdf->derive_key(expected.size(), secret, salt, label), expected); @@ -69,10 +69,10 @@ class HKDF_Expand_Label_Tests final : public Text_Based_Test { Test::Result result("HKDF-Expand-Label(" + hash_name + ")"); - const std::vector secret = get_req_bin(vars, "Secret"); - const std::vector hashval = get_req_bin(vars, "HashValue"); - const std::string label = get_req_str(vars, "Label"); - const std::vector expected = get_req_bin(vars, "Output"); + const std::vector secret = vars.get_req_bin("Secret"); + const std::vector hashval = vars.get_req_bin("HashValue"); + const std::string label = vars.get_req_str("Label"); + const std::vector expected = vars.get_req_bin("Output"); Botan::secure_vector output = Botan::hkdf_expand_label(hash_name, diff --git a/src/tests/test_keywrap.cpp b/src/tests/test_keywrap.cpp index de63d8067a6..49e84ebcfbc 100644 --- a/src/tests/test_keywrap.cpp +++ b/src/tests/test_keywrap.cpp @@ -31,9 +31,9 @@ class RFC3394_Keywrap_Tests final : public Text_Based_Test try { - const std::vector expected = get_req_bin(vars, "Output"); - const std::vector key = get_req_bin(vars, "Key"); - const std::vector kek = get_req_bin(vars, "KEK"); + const std::vector expected = vars.get_req_bin("Output"); + const std::vector key = vars.get_req_bin("Key"); + const std::vector kek = vars.get_req_bin("KEK"); const Botan::SymmetricKey kek_sym(kek); const Botan::secure_vector key_l(key.begin(), key.end()); @@ -71,9 +71,9 @@ class NIST_Keywrap_Tests final : public Text_Based_Test if(typ != "KW" && typ != "KWP") throw Test_Error("Unknown type in NIST key wrap tests"); - const std::vector expected = get_req_bin(vars, "Output"); - const std::vector input = get_req_bin(vars, "Input"); - const std::vector key = get_req_bin(vars, "Key"); + const std::vector expected = vars.get_req_bin("Output"); + const std::vector input = vars.get_req_bin("Input"); + const std::vector key = vars.get_req_bin("Key"); std::unique_ptr bc = Botan::BlockCipher::create_or_throw("AES-" + std::to_string(key.size()*8)); @@ -138,8 +138,8 @@ class NIST_Keywrap_Invalid_Tests final : public Text_Based_Test if(typ != "KW" && typ != "KWP") throw Test_Error("Unknown type in NIST key wrap tests"); - const std::vector input = get_req_bin(vars, "Input"); - const std::vector key = get_req_bin(vars, "Key"); + const std::vector input = vars.get_req_bin("Input"); + const std::vector key = vars.get_req_bin("Key"); std::unique_ptr bc = Botan::BlockCipher::create_or_throw("AES-" + std::to_string(key.size()*8)); diff --git a/src/tests/test_mac.cpp b/src/tests/test_mac.cpp index 2f5afe78335..e92736b6d60 100644 --- a/src/tests/test_mac.cpp +++ b/src/tests/test_mac.cpp @@ -29,10 +29,10 @@ class Message_Auth_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { - const std::vector key = get_req_bin(vars, "Key"); - const std::vector input = get_req_bin(vars, "In"); - const std::vector expected = get_req_bin(vars, "Out"); - const std::vector iv = get_opt_bin(vars, "IV"); + const std::vector key = vars.get_req_bin("Key"); + const std::vector input = vars.get_req_bin("In"); + const std::vector expected = vars.get_req_bin("Out"); + const std::vector iv = vars.get_opt_bin("IV"); Test::Result result(algo); diff --git a/src/tests/test_mceliece.cpp b/src/tests/test_mceliece.cpp index bcc46734481..ba463ebcda1 100644 --- a/src/tests/test_mceliece.cpp +++ b/src/tests/test_mceliece.cpp @@ -44,14 +44,14 @@ class McEliece_Keygen_Encrypt_Test final : public Text_Based_Test Test::Result run_one_test(const std::string&, const VarMap& vars) override { - const std::vector keygen_seed = get_req_bin(vars, "McElieceSeed"); - const std::vector fprint_pub = get_req_bin(vars, "PublicKeyFingerprint"); - const std::vector fprint_priv = get_req_bin(vars, "PrivateKeyFingerprint"); - const std::vector encrypt_seed = get_req_bin(vars, "EncryptPRNGSeed"); - const std::vector ciphertext = get_req_bin(vars, "Ciphertext"); - const std::vector shared_key = get_req_bin(vars, "SharedKey"); - const size_t keygen_n = get_req_sz(vars, "KeyN"); - const size_t keygen_t = get_req_sz(vars, "KeyT"); + const std::vector keygen_seed = vars.get_req_bin("McElieceSeed"); + const std::vector fprint_pub = vars.get_req_bin("PublicKeyFingerprint"); + const std::vector fprint_priv = vars.get_req_bin("PrivateKeyFingerprint"); + const std::vector encrypt_seed = vars.get_req_bin("EncryptPRNGSeed"); + const std::vector ciphertext = vars.get_req_bin("Ciphertext"); + const std::vector shared_key = vars.get_req_bin("SharedKey"); + const size_t keygen_n = vars.get_req_sz("KeyN"); + const size_t keygen_t = vars.get_req_sz("KeyT"); Test::Result result("McEliece keygen"); result.start_timer(); diff --git a/src/tests/test_modes.cpp b/src/tests/test_modes.cpp index 6cdcd73b0e1..5fd0fc606e5 100644 --- a/src/tests/test_modes.cpp +++ b/src/tests/test_modes.cpp @@ -28,10 +28,10 @@ class Cipher_Mode_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { - const std::vector key = get_req_bin(vars, "Key"); - const std::vector nonce = get_opt_bin(vars, "Nonce"); - const std::vector input = get_req_bin(vars, "In"); - const std::vector expected = get_req_bin(vars, "Out"); + const std::vector key = vars.get_req_bin("Key"); + const std::vector nonce = vars.get_opt_bin("Nonce"); + const std::vector input = vars.get_req_bin("In"); + const std::vector expected = vars.get_req_bin("Out"); Test::Result result(algo); diff --git a/src/tests/test_newhope.cpp b/src/tests/test_newhope.cpp index 171ddd22e80..38e1539ce6e 100644 --- a/src/tests/test_newhope.cpp +++ b/src/tests/test_newhope.cpp @@ -112,12 +112,12 @@ class NEWHOPE_Tests final : public Text_Based_Test { Test::Result result("NEWHOPE"); - const std::vector h_output_a = get_req_bin(vars, "H_OutputA"); - const std::vector h_output_b = get_req_bin(vars, "H_OutputB"); - const std::vector shared_key = get_req_bin(vars, "SharedKey"); + const std::vector h_output_a = vars.get_req_bin("H_OutputA"); + const std::vector h_output_b = vars.get_req_bin("H_OutputB"); + const std::vector shared_key = vars.get_req_bin("SharedKey"); - NEWHOPE_RNG drbg_a(get_req_bin(vars, "DRBG_SeedA")); - NEWHOPE_RNG drbg_b(get_req_bin(vars, "DRBG_SeedB")); + NEWHOPE_RNG drbg_a(vars.get_req_bin("DRBG_SeedA")); + NEWHOPE_RNG drbg_b(vars.get_req_bin("DRBG_SeedB")); Botan::SHA_3_256 sha3; diff --git a/src/tests/test_ocb.cpp b/src/tests/test_ocb.cpp index 490a52f4fe8..169a86dd9b2 100644 --- a/src/tests/test_ocb.cpp +++ b/src/tests/test_ocb.cpp @@ -121,11 +121,11 @@ class OCB_Wide_KAT_Tests final : public Text_Based_Test { Test::Result result("OCB wide block KAT"); - const std::vector key = get_req_bin(vars, "Key"); - const std::vector nonce = get_req_bin(vars, "Nonce"); - const std::vector ad = get_req_bin(vars, "AD"); - const std::vector input = get_req_bin(vars, "In"); - const std::vector expected = get_req_bin(vars, "Out"); + const std::vector key = vars.get_req_bin("Key"); + const std::vector nonce = vars.get_req_bin("Nonce"); + const std::vector ad = vars.get_req_bin("AD"); + const std::vector input = vars.get_req_bin("In"); + const std::vector expected = vars.get_req_bin("Out"); const size_t bs = key.size(); Botan::secure_vector buf(input.begin(), input.end()); @@ -160,7 +160,7 @@ class OCB_Wide_Long_KAT_Tests final : public Text_Based_Test { Test::Result result("OCB wide block long test"); - const std::vector expected = get_req_bin(vars, "Output"); + const std::vector expected = vars.get_req_bin("Output"); std::unique_ptr cipher; size_t bs = 0; @@ -272,9 +272,9 @@ class OCB_Long_KAT_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string&, const VarMap& vars) override { - const size_t keylen = get_req_sz(vars, "Keylen"); - const size_t taglen = get_req_sz(vars, "Taglen"); - const std::vector expected = get_req_bin(vars, "Output"); + const size_t keylen = vars.get_req_sz("Keylen"); + const size_t taglen = vars.get_req_sz("Taglen"); + const std::vector expected = vars.get_req_bin("Output"); // Test from RFC 7253 Appendix A diff --git a/src/tests/test_otp.cpp b/src/tests/test_otp.cpp index 4604356f91b..cc96eea0f0b 100644 --- a/src/tests/test_otp.cpp +++ b/src/tests/test_otp.cpp @@ -40,10 +40,10 @@ class HOTP_KAT_Tests final : public Text_Based_Test if(!hash_test) return {result}; - const std::vector key = get_req_bin(vars, "Key"); - const size_t otp = get_req_sz(vars, "OTP"); - const uint64_t counter = get_req_sz(vars, "Counter"); - const size_t digits = get_req_sz(vars, "Digits"); + const std::vector key = vars.get_req_bin("Key"); + const size_t otp = vars.get_req_sz("OTP"); + const uint64_t counter = vars.get_req_sz("Counter"); + const size_t digits = vars.get_req_sz("Digits"); Botan::HOTP hotp(key, hash_algo, digits); @@ -95,11 +95,11 @@ class TOTP_KAT_Tests final : public Text_Based_Test if(!hash_test) return {result}; - const std::vector key = get_req_bin(vars, "Key"); - const size_t otp = get_req_sz(vars, "OTP"); - const size_t digits = get_req_sz(vars, "Digits"); - const size_t timestep = get_req_sz(vars, "Timestep"); - const std::string timestamp = get_req_str(vars, "Timestamp"); + const std::vector key = vars.get_req_bin("Key"); + const size_t otp = vars.get_req_sz("OTP"); + const size_t digits = vars.get_req_sz("Digits"); + const size_t timestep = vars.get_req_sz("Timestep"); + const std::string timestamp = vars.get_req_str("Timestamp"); Botan::TOTP totp(key, hash_algo, digits, timestep); diff --git a/src/tests/test_pad.cpp b/src/tests/test_pad.cpp index 2cf914600c0..c1f054ae4cb 100644 --- a/src/tests/test_pad.cpp +++ b/src/tests/test_pad.cpp @@ -21,9 +21,9 @@ class Cipher_Mode_Padding_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& header, const VarMap& vars) override { - const std::vector input = get_req_bin(vars, "In"); - const std::vector expected = get_opt_bin(vars, "Out"); - const size_t block_size = get_req_sz(vars, "Blocksize"); + const std::vector input = vars.get_req_bin("In"); + const std::vector expected = vars.get_opt_bin("Out"); + const size_t block_size = vars.get_req_sz("Blocksize"); std::string algo = header; diff --git a/src/tests/test_passhash.cpp b/src/tests/test_passhash.cpp index be194b553ef..7f8d6a4f991 100644 --- a/src/tests/test_passhash.cpp +++ b/src/tests/test_passhash.cpp @@ -27,11 +27,11 @@ class Bcrypt_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string&, const VarMap& vars) override { // Encoded as binary so we can test binary inputs - const std::vector password_vec = get_req_bin(vars, "Password"); + const std::vector password_vec = vars.get_req_bin("Password"); const std::string password(reinterpret_cast(password_vec.data()), password_vec.size()); - const std::string passhash = get_req_str(vars, "Passhash"); + const std::string passhash = vars.get_req_str("Passhash"); Test::Result result("bcrypt"); result.test_eq("correct hash accepted", Botan::check_bcrypt(password, passhash), true); @@ -81,12 +81,12 @@ class Passhash9_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string&, const VarMap& vars) override { // Encoded as binary so we can test binary inputs - const std::vector password_vec = get_req_bin(vars, "Password"); + const std::vector password_vec = vars.get_req_bin("Password"); const std::string password(reinterpret_cast(password_vec.data()), password_vec.size()); - const std::string passhash = get_req_str(vars, "Passhash"); - const std::size_t prf = get_req_sz(vars, "PRF"); + const std::string passhash = vars.get_req_str("Passhash"); + const std::size_t prf = vars.get_req_sz("PRF"); Test::Result result("passhash9"); diff --git a/src/tests/test_pbkdf.cpp b/src/tests/test_pbkdf.cpp index 6694e0522a2..eb344b2ea20 100644 --- a/src/tests/test_pbkdf.cpp +++ b/src/tests/test_pbkdf.cpp @@ -30,11 +30,11 @@ class PBKDF_KAT_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& pbkdf_name, const VarMap& vars) override { - const size_t iterations = get_req_sz(vars, "Iterations"); - const std::vector salt = get_req_bin(vars, "Salt"); - const std::string passphrase = get_req_str(vars, "Passphrase"); - const std::vector expected = get_req_bin(vars, "Output"); - const size_t outlen = get_opt_sz(vars, "OutputLen", expected.size()); + const size_t iterations = vars.get_req_sz("Iterations"); + const std::vector salt = vars.get_req_bin("Salt"); + const std::string passphrase = vars.get_req_str("Passphrase"); + const std::vector expected = vars.get_req_bin("Output"); + const size_t outlen = vars.get_opt_sz("OutputLen", expected.size()); Test::Result result(pbkdf_name); std::unique_ptr pbkdf(Botan::PBKDF::create(pbkdf_name)); @@ -70,12 +70,12 @@ class Scrypt_KAT_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string&, const VarMap& vars) override { - const size_t N = get_req_sz(vars, "N"); - const size_t R = get_req_sz(vars, "R"); - const size_t P = get_req_sz(vars, "P"); - const std::vector salt = get_req_bin(vars, "Salt"); - const std::string passphrase = get_req_str(vars, "Passphrase"); - const std::vector expected = get_req_bin(vars, "Output"); + const size_t N = vars.get_req_sz("N"); + const size_t R = vars.get_req_sz("R"); + const size_t P = vars.get_req_sz("P"); + const std::vector salt = vars.get_req_bin("Salt"); + const std::string passphrase = vars.get_req_str("Passphrase"); + const std::vector expected = vars.get_req_bin("Output"); Test::Result result("scrypt"); diff --git a/src/tests/test_pk_pad.cpp b/src/tests/test_pk_pad.cpp index ecfdba5d514..babe5242d99 100644 --- a/src/tests/test_pk_pad.cpp +++ b/src/tests/test_pk_pad.cpp @@ -40,9 +40,9 @@ class EME_Decoding_Tests final : public Text_Based_Test return result; } - const std::vector ciphertext = get_req_bin(vars, "RawCiphertext"); - const std::vector plaintext = get_opt_bin(vars, "Plaintext"); - const bool is_valid = get_req_bool(vars, "ValidInput"); + const std::vector ciphertext = vars.get_req_bin("RawCiphertext"); + const std::vector plaintext = vars.get_opt_bin("Plaintext"); + const bool is_valid = vars.get_req_bool("ValidInput"); if(is_valid == false) { diff --git a/src/tests/test_pubkey.cpp b/src/tests/test_pubkey.cpp index ea794b9bad4..8860aeed263 100644 --- a/src/tests/test_pubkey.cpp +++ b/src/tests/test_pubkey.cpp @@ -88,7 +88,7 @@ std::string PK_Test::choose_padding(const VarMap& vars, { if(pad_hdr != "") return pad_hdr; - return get_opt_str(vars, "Padding", this->default_padding(vars)); + return vars.get_opt_str("Padding", this->default_padding(vars)); } std::vector PK_Test::possible_providers(const std::string& /*params*/) @@ -99,8 +99,8 @@ std::vector PK_Test::possible_providers(const std::string& /*params Test::Result PK_Signature_Generation_Test::run_one_test(const std::string& pad_hdr, const VarMap& vars) { - const std::vector message = get_req_bin(vars, "Msg"); - const std::vector signature = get_req_bin(vars, "Signature"); + const std::vector message = vars.get_req_bin("Msg"); + const std::vector signature = vars.get_req_bin("Signature"); const std::string padding = choose_padding(vars, pad_hdr); Test::Result result(algo_name() + "/" + padding + " signature generation"); @@ -143,9 +143,9 @@ PK_Signature_Generation_Test::run_one_test(const std::string& pad_hdr, const Var for(auto const& sign_provider : possible_providers(algo_name())) { std::unique_ptr rng; - if(vars.count("Nonce")) + if(vars.has_key("Nonce")) { - rng.reset(test_rng(get_req_bin(vars, "Nonce"))); + rng.reset(test_rng(vars.get_req_bin("Nonce"))); } std::unique_ptr signer; @@ -187,11 +187,11 @@ PK_Signature_Generation_Test::run_one_test(const std::string& pad_hdr, const Var Test::Result PK_Signature_Verification_Test::run_one_test(const std::string& pad_hdr, const VarMap& vars) { - const std::vector message = get_req_bin(vars, "Msg"); - const std::vector signature = get_req_bin(vars, "Signature"); + const std::vector message = vars.get_req_bin("Msg"); + const std::vector signature = vars.get_req_bin("Signature"); const std::string padding = choose_padding(vars, pad_hdr); - const bool expected_valid = (get_opt_sz(vars, "Valid", 1) == 1); + const bool expected_valid = (vars.get_opt_sz("Valid", 1) == 1); std::unique_ptr pubkey = load_public_key(vars); @@ -231,10 +231,10 @@ Test::Result PK_Signature_NonVerification_Test::run_one_test(const std::string& pad_hdr, const VarMap& vars) { const std::string padding = choose_padding(vars, pad_hdr); - const std::vector message = get_req_bin(vars, "Msg"); + const std::vector message = vars.get_req_bin("Msg"); std::unique_ptr pubkey = load_public_key(vars); - const std::vector invalid_signature = get_req_bin(vars, "InvalidSignature"); + const std::vector invalid_signature = vars.get_req_bin("InvalidSignature"); Test::Result result(algo_name() + "/" + padding + " verify invalid signature"); @@ -259,8 +259,8 @@ PK_Signature_NonVerification_Test::run_one_test(const std::string& pad_hdr, cons Test::Result PK_Encryption_Decryption_Test::run_one_test(const std::string& pad_hdr, const VarMap& vars) { - const std::vector plaintext = get_req_bin(vars, "Msg"); - const std::vector ciphertext = get_req_bin(vars, "Ciphertext"); + const std::vector plaintext = vars.get_req_bin("Msg"); + const std::vector ciphertext = vars.get_req_bin("Ciphertext"); const std::string padding = choose_padding(vars, pad_hdr); Test::Result result(algo_name() + (padding.empty() ? padding : "/" + padding) + " encryption"); @@ -315,9 +315,9 @@ PK_Encryption_Decryption_Test::run_one_test(const std::string& pad_hdr, const Va } std::unique_ptr kat_rng; - if(vars.count("Nonce")) + if(vars.has_key("Nonce")) { - kat_rng.reset(test_rng(get_req_bin(vars, "Nonce"))); + kat_rng.reset(test_rng(vars.get_req_bin("Nonce"))); } if(padding == "Raw") @@ -360,8 +360,8 @@ PK_Encryption_Decryption_Test::run_one_test(const std::string& pad_hdr, const Va Test::Result PK_Decryption_Test::run_one_test(const std::string& pad_hdr, const VarMap& vars) { - const std::vector plaintext = get_req_bin(vars, "Msg"); - const std::vector ciphertext = get_req_bin(vars, "Ciphertext"); + const std::vector plaintext = vars.get_req_bin("Msg"); + const std::vector ciphertext = vars.get_req_bin("Ciphertext"); const std::string padding = choose_padding(vars, pad_hdr); Test::Result result(algo_name() + (padding.empty() ? padding : "/" + padding) + " decryption"); @@ -402,10 +402,10 @@ PK_Decryption_Test::run_one_test(const std::string& pad_hdr, const VarMap& vars) Test::Result PK_KEM_Test::run_one_test(const std::string&, const VarMap& vars) { - const std::vector K = get_req_bin(vars, "K"); - const std::vector C0 = get_req_bin(vars, "C0"); - const std::vector salt = get_opt_bin(vars, "Salt"); - const std::string kdf = get_req_str(vars, "KDF"); + const std::vector K = vars.get_req_bin("K"); + const std::vector C0 = vars.get_req_bin("C0"); + const std::vector salt = vars.get_opt_bin("Salt"); + const std::string kdf = vars.get_req_str("KDF"); Test::Result result(algo_name() + "/" + kdf + " KEM"); @@ -426,7 +426,7 @@ Test::Result PK_KEM_Test::run_one_test(const std::string&, const VarMap& vars) return result; } - Fixed_Output_RNG fixed_output_rng(get_req_bin(vars, "R")); + Fixed_Output_RNG fixed_output_rng(vars.get_req_bin("R")); Botan::secure_vector produced_encap_key, shared_key; enc->encrypt(produced_encap_key, @@ -462,8 +462,8 @@ Test::Result PK_KEM_Test::run_one_test(const std::string&, const VarMap& vars) Test::Result PK_Key_Agreement_Test::run_one_test(const std::string& header, const VarMap& vars) { - const std::vector shared = get_req_bin(vars, "K"); - const std::string kdf = get_opt_str(vars, "KDF", default_kdf(vars)); + const std::vector shared = vars.get_req_bin("K"); + const std::string kdf = vars.get_opt_str("KDF", default_kdf(vars)); Test::Result result(algo_name() + "/" + kdf + (header.empty() ? header : " " + header) + @@ -472,7 +472,7 @@ Test::Result PK_Key_Agreement_Test::run_one_test(const std::string& header, cons std::unique_ptr privkey = load_our_key(header, vars); const std::vector pubkey = load_their_key(header, vars); - const size_t key_len = get_opt_sz(vars, "OutLen", 0); + const size_t key_len = vars.get_opt_sz("OutLen", 0); for(auto const& provider : possible_providers(algo_name())) { diff --git a/src/tests/test_rfc6979.cpp b/src/tests/test_rfc6979.cpp index b9de7fcb9f7..e65d94c7845 100644 --- a/src/tests/test_rfc6979.cpp +++ b/src/tests/test_rfc6979.cpp @@ -24,10 +24,10 @@ class RFC6979_KAT_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& hash, const VarMap& vars) override { - const BigInt Q = get_req_bn(vars, "Q"); - const BigInt X = get_req_bn(vars, "X"); - const BigInt H = get_req_bn(vars, "H"); - const BigInt K = get_req_bn(vars, "K"); + const BigInt Q = vars.get_req_bn("Q"); + const BigInt X = vars.get_req_bn("X"); + const BigInt H = vars.get_req_bn("H"); + const BigInt K = vars.get_req_bn("K"); Test::Result result("RFC 6979 nonce generation"); diff --git a/src/tests/test_rng_kat.cpp b/src/tests/test_rng_kat.cpp index e1d4ded3621..0c124cdf279 100644 --- a/src/tests/test_rng_kat.cpp +++ b/src/tests/test_rng_kat.cpp @@ -31,12 +31,12 @@ class HMAC_DRBG_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { - const std::vector seed_input = get_req_bin(vars, "EntropyInput"); - const std::vector reseed_input = get_req_bin(vars, "EntropyInputReseed"); - const std::vector expected = get_req_bin(vars, "Out"); + const std::vector seed_input = vars.get_req_bin("EntropyInput"); + const std::vector reseed_input = vars.get_req_bin("EntropyInputReseed"); + const std::vector expected = vars.get_req_bin("Out"); - const std::vector ad1 = get_opt_bin(vars, "AdditionalInput1"); - const std::vector ad2 = get_opt_bin(vars, "AdditionalInput2"); + const std::vector ad1 = vars.get_opt_bin("AdditionalInput1"); + const std::vector ad2 = vars.get_opt_bin("AdditionalInput2"); Test::Result result("HMAC_DRBG(" + algo + ")"); @@ -81,12 +81,12 @@ class ChaCha_RNG_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string&, const VarMap& vars) override { - const std::vector seed_input = get_req_bin(vars, "EntropyInput"); - const std::vector reseed_input = get_req_bin(vars, "EntropyInputReseed"); - const std::vector expected = get_req_bin(vars, "Out"); + const std::vector seed_input = vars.get_req_bin("EntropyInput"); + const std::vector reseed_input = vars.get_req_bin("EntropyInputReseed"); + const std::vector expected = vars.get_req_bin("Out"); - const std::vector ad1 = get_opt_bin(vars, "AdditionalInput1"); - const std::vector ad2 = get_opt_bin(vars, "AdditionalInput2"); + const std::vector ad1 = vars.get_opt_bin("AdditionalInput1"); + const std::vector ad2 = vars.get_opt_bin("AdditionalInput2"); Test::Result result("ChaCha_RNG"); diff --git a/src/tests/test_rsa.cpp b/src/tests/test_rsa.cpp index 88c086812d3..8d5d34893ee 100644 --- a/src/tests/test_rsa.cpp +++ b/src/tests/test_rsa.cpp @@ -30,9 +30,9 @@ class RSA_ES_KAT_Tests final : public PK_Encryption_Decryption_Test std::unique_ptr 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"); + const BigInt p = vars.get_req_bn("P"); + const BigInt q = vars.get_req_bn("Q"); + const BigInt e = vars.get_req_bn("E"); std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); return key; @@ -54,9 +54,9 @@ class RSA_Decryption_KAT_Tests final : public PK_Decryption_Test std::unique_ptr 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"); + const BigInt p = vars.get_req_bn("P"); + const BigInt q = vars.get_req_bn("Q"); + const BigInt e = vars.get_req_bn("E"); std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); return key; @@ -74,9 +74,9 @@ class RSA_KEM_Tests final : public PK_KEM_Test std::unique_ptr 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"); + const BigInt p = vars.get_req_bn("P"); + const BigInt q = vars.get_req_bn("Q"); + const BigInt e = vars.get_req_bn("E"); std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); return key; @@ -101,9 +101,9 @@ class RSA_Signature_KAT_Tests final : public PK_Signature_Generation_Test std::unique_ptr 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"); + const BigInt p = vars.get_req_bn("P"); + const BigInt q = vars.get_req_bn("Q"); + const BigInt e = vars.get_req_bn("E"); std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); return key; @@ -120,10 +120,10 @@ class RSA_PSS_KAT_Tests final : public PK_Signature_Generation_Test "P,Q,E,Hash,Nonce,Msg,Signature", "") {} - std::string default_padding(const VarMap& var) const override + std::string default_padding(const VarMap& vars) const override { - const std::string hash_name = get_req_str(var, "Hash"); - const size_t salt_size = get_req_bin(var, "Nonce").size(); + const std::string hash_name = vars.get_req_str("Hash"); + const size_t salt_size = vars.get_req_bin("Nonce").size(); return "PSSR(" + hash_name + ",MGF1," + std::to_string(salt_size) + ")"; } @@ -134,9 +134,9 @@ class RSA_PSS_KAT_Tests final : public PK_Signature_Generation_Test std::unique_ptr 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"); + const BigInt p = vars.get_req_bn("P"); + const BigInt q = vars.get_req_bn("Q"); + const BigInt e = vars.get_req_bn("E"); std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); return key; @@ -153,10 +153,10 @@ class RSA_PSS_Raw_KAT_Tests final : public PK_Signature_Generation_Test "P,Q,E,Hash,Nonce,Msg,Signature", "") {} - std::string default_padding(const VarMap& var) const override + std::string default_padding(const VarMap& vars) const override { - const std::string hash_name = get_req_str(var, "Hash"); - const size_t salt_size = get_req_bin(var, "Nonce").size(); + const std::string hash_name = vars.get_req_str("Hash"); + const size_t salt_size = vars.get_req_bin("Nonce").size(); return "PSSR_Raw(" + hash_name + ",MGF1," + std::to_string(salt_size) + ")"; } @@ -167,9 +167,9 @@ class RSA_PSS_Raw_KAT_Tests final : public PK_Signature_Generation_Test std::unique_ptr 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"); + const BigInt p = vars.get_req_bn("P"); + const BigInt q = vars.get_req_bn("Q"); + const BigInt e = vars.get_req_bn("E"); std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); return key; @@ -192,8 +192,8 @@ class RSA_Signature_Verify_Tests final : public PK_Signature_Verification_Test std::unique_ptr load_public_key(const VarMap& vars) override { - const BigInt n = get_req_bn(vars, "N"); - const BigInt e = get_req_bn(vars, "E"); + const BigInt n = vars.get_req_bn("N"); + const BigInt e = vars.get_req_bn("E"); std::unique_ptr key(new Botan::RSA_PublicKey(n, e)); return key; @@ -216,8 +216,8 @@ class RSA_Signature_Verify_Invalid_Tests final : public PK_Signature_NonVerifica std::unique_ptr load_public_key(const VarMap& vars) override { - const BigInt n = get_req_bn(vars, "N"); - const BigInt e = get_req_bn(vars, "E"); + const BigInt n = vars.get_req_bn("N"); + const BigInt e = vars.get_req_bn("E"); std::unique_ptr key(new Botan::RSA_PublicKey(n, e)); return key; } diff --git a/src/tests/test_siv.cpp b/src/tests/test_siv.cpp index 99fb35f9b69..d7380a9ba0a 100644 --- a/src/tests/test_siv.cpp +++ b/src/tests/test_siv.cpp @@ -25,12 +25,12 @@ class SIV_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { - const std::vector key = get_req_bin(vars, "Key"); - const std::vector nonce = get_opt_bin(vars, "Nonce"); - const std::vector input = get_req_bin(vars, "In"); - const std::vector expected = get_req_bin(vars, "Out"); + const std::vector key = vars.get_req_bin("Key"); + const std::vector nonce = vars.get_opt_bin("Nonce"); + const std::vector input = vars.get_req_bin("In"); + const std::vector expected = vars.get_req_bin("Out"); const std::vector ad_list = - Botan::split_on(get_req_str(vars, "ADs"), ','); + Botan::split_on(vars.get_req_str("ADs"), ','); Test::Result result(algo + "/SIV"); diff --git a/src/tests/test_sm2.cpp b/src/tests/test_sm2.cpp index c4ddf6ddf16..3a231871541 100644 --- a/src/tests/test_sm2.cpp +++ b/src/tests/test_sm2.cpp @@ -31,7 +31,7 @@ class SM2_Signature_KAT_Tests final : public PK_Signature_Generation_Test std::string default_padding(const VarMap& vars) const override { - return get_req_str(vars, "Ident") + "," + get_opt_str(vars, "Hash", "SM3"); + return vars.get_req_str("Ident") + "," + vars.get_opt_str("Hash", "SM3"); } Botan::RandomNumberGenerator* test_rng(const std::vector& nonce) const override @@ -42,14 +42,14 @@ class SM2_Signature_KAT_Tests final : public PK_Signature_Generation_Test std::unique_ptr load_private_key(const VarMap& vars) override { // group params - const BigInt p = get_req_bn(vars, "P"); - const BigInt a = get_req_bn(vars, "A"); - const BigInt b = get_req_bn(vars, "B"); - const BigInt xG = get_req_bn(vars, "xG"); - const BigInt yG = get_req_bn(vars, "yG"); - const BigInt order = get_req_bn(vars, "Order"); - const BigInt cofactor = get_req_bn(vars, "Cofactor"); - const BigInt x = get_req_bn(vars, "x"); + const BigInt p = vars.get_req_bn("P"); + const BigInt a = vars.get_req_bn("A"); + const BigInt b = vars.get_req_bn("B"); + const BigInt xG = vars.get_req_bn("xG"); + const BigInt yG = vars.get_req_bn("yG"); + const BigInt order = vars.get_req_bn("Order"); + const BigInt cofactor = vars.get_req_bn("Cofactor"); + const BigInt x = vars.get_req_bn("x"); Botan::EC_Group domain(p, a, b, xG, yG, order, cofactor); @@ -73,7 +73,7 @@ class SM2_Encryption_KAT_Tests final : public PK_Encryption_Decryption_Test std::string default_padding(const VarMap& vars) const override { - return get_opt_str(vars, "Hash", "SM3"); + return vars.get_opt_str("Hash", "SM3"); } bool clear_between_callbacks() const override { return false; } @@ -86,14 +86,14 @@ class SM2_Encryption_KAT_Tests final : public PK_Encryption_Decryption_Test std::unique_ptr load_private_key(const VarMap& vars) override { // group params - const BigInt p = get_req_bn(vars, "P"); - const BigInt a = get_req_bn(vars, "A"); - const BigInt b = get_req_bn(vars, "B"); - const BigInt xG = get_req_bn(vars, "xG"); - const BigInt yG = get_req_bn(vars, "yG"); - const BigInt order = get_req_bn(vars, "Order"); - const BigInt cofactor = get_req_bn(vars, "Cofactor"); - const BigInt x = get_req_bn(vars, "x"); + const BigInt p = vars.get_req_bn("P"); + const BigInt a = vars.get_req_bn("A"); + const BigInt b = vars.get_req_bn("B"); + const BigInt xG = vars.get_req_bn("xG"); + const BigInt yG = vars.get_req_bn("yG"); + const BigInt order = vars.get_req_bn("Order"); + const BigInt cofactor = vars.get_req_bn("Cofactor"); + const BigInt x = vars.get_req_bn("x"); Botan::EC_Group domain(p, a, b, xG, yG, order, cofactor); diff --git a/src/tests/test_stream.cpp b/src/tests/test_stream.cpp index 219d58e4b99..1f26a5cfdc7 100644 --- a/src/tests/test_stream.cpp +++ b/src/tests/test_stream.cpp @@ -21,11 +21,11 @@ class Stream_Cipher_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { - const std::vector key = get_req_bin(vars, "Key"); - const std::vector expected = get_req_bin(vars, "Out"); - const std::vector nonce = get_opt_bin(vars, "Nonce"); - const size_t seek = get_opt_sz(vars, "Seek", 0); - std::vector input = get_opt_bin(vars, "In"); + const std::vector key = vars.get_req_bin("Key"); + const std::vector expected = vars.get_req_bin("Out"); + const std::vector nonce = vars.get_opt_bin("Nonce"); + const size_t seek = vars.get_opt_sz("Seek", 0); + std::vector input = vars.get_opt_bin("In"); if(input.empty()) { diff --git a/src/tests/test_tls.cpp b/src/tests/test_tls.cpp index 70291929051..a64a3fa48ac 100644 --- a/src/tests/test_tls.cpp +++ b/src/tests/test_tls.cpp @@ -79,8 +79,8 @@ class TLS_CBC_Padding_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string&, const VarMap& vars) override { - const std::vector record = get_req_bin(vars, "Record"); - const size_t output = get_req_sz(vars, "Output"); + const std::vector record = vars.get_req_bin("Record"); + const size_t output = vars.get_req_sz("Output"); uint16_t res = Botan::TLS::check_tls_cbc_padding(record.data(), record.size()); @@ -163,10 +163,10 @@ class TLS_CBC_Tests final : public Text_Based_Test { Test::Result result("TLS CBC"); - const size_t block_size = get_req_sz(vars, "Blocksize"); - const size_t mac_len = get_req_sz(vars, "MACsize"); - const std::vector record = get_req_bin(vars, "Record"); - const bool is_valid = get_req_sz(vars, "Valid") == 1; + const size_t block_size = vars.get_req_sz("Blocksize"); + const size_t mac_len = vars.get_req_sz("MACsize"); + const std::vector record = vars.get_req_bin("Record"); + const bool is_valid = vars.get_req_sz("Valid") == 1; // todo test permutations bool explicit_iv = true; diff --git a/src/tests/test_tls_messages.cpp b/src/tests/test_tls_messages.cpp index 68318eb8de5..038b790852e 100644 --- a/src/tests/test_tls_messages.cpp +++ b/src/tests/test_tls_messages.cpp @@ -51,11 +51,11 @@ class TLS_Message_Parsing_Test final : public Text_Based_Test Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { - const std::vector buffer = get_req_bin(vars, "Buffer"); - const std::vector protocol = get_opt_bin(vars, "Protocol"); - const std::vector ciphersuite = get_opt_bin(vars, "Ciphersuite"); - const std::string exception = get_req_str(vars, "Exception"); - const std::string expected_name = get_opt_str(vars, "Name", ""); + const std::vector buffer = vars.get_req_bin("Buffer"); + const std::vector protocol = vars.get_opt_bin("Protocol"); + const std::vector ciphersuite = vars.get_opt_bin("Ciphersuite"); + const std::string exception = vars.get_req_str("Exception"); + const std::string expected_name = vars.get_opt_str("Name", ""); const bool is_positive_test = exception.empty(); Test::Result result(algo + " parsing"); @@ -71,7 +71,7 @@ class TLS_Message_Parsing_Test final : public Text_Based_Test } else if(algo == "client_hello") { - const std::string extensions = get_req_str(vars, "AdditionalData"); + const std::string extensions = vars.get_req_str("AdditionalData"); Botan::TLS::Protocol_Version pv(protocol[0], protocol[1]); Botan::TLS::Client_Hello message(buffer); result.test_eq("Protocol version", message.version().to_string(), pv.to_string()); @@ -98,7 +98,7 @@ class TLS_Message_Parsing_Test final : public Text_Based_Test } else if(algo == "server_hello") { - const std::string extensions = get_req_str(vars, "AdditionalData"); + const std::string extensions = vars.get_req_str("AdditionalData"); Botan::TLS::Protocol_Version pv(protocol[0], protocol[1]); Botan::TLS::Ciphersuite cs = Botan::TLS::Ciphersuite::by_id(Botan::make_uint16(ciphersuite[0], ciphersuite[1])); Botan::TLS::Server_Hello message(buffer); diff --git a/src/tests/test_utils.cpp b/src/tests/test_utils.cpp index ee5f06187d2..d3b00e8977e 100644 --- a/src/tests/test_utils.cpp +++ b/src/tests/test_utils.cpp @@ -41,10 +41,10 @@ class Utility_Function_Tests final : public Text_Based_Test if(algo == "round_up") { - const size_t x = get_req_sz(vars, "In1"); - const size_t to = get_req_sz(vars, "In2"); + const size_t x = vars.get_req_sz("In1"); + const size_t to = vars.get_req_sz("In2"); - result.test_eq(algo, Botan::round_up(x, to), get_req_sz(vars, "Out")); + result.test_eq(algo, Botan::round_up(x, to), vars.get_req_sz("Out")); try { @@ -55,10 +55,10 @@ class Utility_Function_Tests final : public Text_Based_Test } else if(algo == "round_down") { - const size_t x = get_req_sz(vars, "In1"); - const size_t to = get_req_sz(vars, "In2"); + const size_t x = vars.get_req_sz("In1"); + const size_t to = vars.get_req_sz("In2"); - result.test_eq(algo, Botan::round_down(x, to), get_req_sz(vars, "Out")); + result.test_eq(algo, Botan::round_down(x, to), vars.get_req_sz("Out")); result.test_eq(algo, Botan::round_down(x, 0), x); } @@ -228,8 +228,8 @@ class Poly_Double_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("Polynomial doubling"); - const std::vector in = get_req_bin(vars, "In"); - const std::vector out = get_req_bin(vars, "Out"); + const std::vector in = vars.get_req_bin("In"); + const std::vector out = vars.get_req_bin("Out"); std::vector b = in; Botan::poly_double_n(b.data(), b.size()); @@ -266,7 +266,7 @@ class Date_Format_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& type, const VarMap& vars) override { - const std::string date_str = get_req_str(vars, "Date"); + const std::string date_str = vars.get_req_str("Date"); Test::Result result("Date parsing"); const std::vector d = parse_date(date_str); @@ -332,13 +332,13 @@ class Base64_Tests final : public Text_Based_Test Test::Result result("Base64"); const bool is_valid = (type == "valid"); - const std::string base64 = get_req_str(vars, "Base64"); + const std::string base64 = vars.get_req_str("Base64"); try { if(is_valid) { - const std::vector binary = get_req_bin(vars, "Binary"); + const std::vector binary = vars.get_req_bin("Binary"); result.test_eq("base64 decoding", Botan::base64_decode(base64), binary); result.test_eq("base64 encoding", Botan::base64_encode(binary), base64); } @@ -409,8 +409,8 @@ class Charset_Tests final : public Text_Based_Test { Test::Result result("Charset"); - const std::vector in = get_req_bin(vars, "In"); - const std::vector expected = get_req_bin(vars, "Out"); + const std::vector in = vars.get_req_bin("In"); + const std::vector expected = vars.get_req_bin("Out"); const std::string in_str(in.begin(), in.end()); @@ -533,8 +533,8 @@ class Hostname_Tests final : public Text_Based_Test { Test::Result result("Hostname Matching"); - const std::string issued = get_req_str(vars, "Issued"); - const std::string hostname = get_req_str(vars, "Hostname"); + const std::string issued = vars.get_req_str("Issued"); + const std::string hostname = vars.get_req_str("Hostname"); const bool expected = (type == "Invalid") ? false : true; const std::string what = hostname + ((expected == true) ? diff --git a/src/tests/test_workfactor.cpp b/src/tests/test_workfactor.cpp index c16041cf0ea..8e6c80f7c7c 100644 --- a/src/tests/test_workfactor.cpp +++ b/src/tests/test_workfactor.cpp @@ -21,8 +21,8 @@ class PK_Workfactor_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& type, const VarMap& vars) override { - const size_t param_size = get_req_sz(vars, "ParamSize"); - const size_t exp_output = get_req_sz(vars, "Workfactor"); + const size_t param_size = vars.get_req_sz("ParamSize"); + const size_t exp_output = vars.get_req_sz("Workfactor"); size_t output = 0; diff --git a/src/tests/test_x509_dn.cpp b/src/tests/test_x509_dn.cpp index 378e7b1095c..662c11e7472 100644 --- a/src/tests/test_x509_dn.cpp +++ b/src/tests/test_x509_dn.cpp @@ -21,8 +21,8 @@ class X509_DN_Comparisons_Tests final : public Text_Based_Test Test::Result run_one_test(const std::string& type, const VarMap& vars) override { - const std::vector dn_bits1 = get_req_bin(vars, "DN1"); - const std::vector dn_bits2 = get_req_bin(vars, "DN2"); + const std::vector dn_bits1 = vars.get_req_bin("DN1"); + const std::vector dn_bits2 = vars.get_req_bin("DN2"); const bool dn_same = (type == "Equal"); Test::Result result("X509_DN comparisons"); diff --git a/src/tests/test_xmss.cpp b/src/tests/test_xmss.cpp index f8610e1e11a..1c0b713f656 100644 --- a/src/tests/test_xmss.cpp +++ b/src/tests/test_xmss.cpp @@ -32,7 +32,7 @@ class XMSS_Signature_Tests final : public PK_Signature_Generation_Test { if(Test::run_long_tests() == false) { - const std::string params = get_req_str(vars, "Params"); + const std::string params = vars.get_req_str("Params"); if(params == "SHAKE128_W16_H10") { @@ -47,12 +47,12 @@ class XMSS_Signature_Tests final : public PK_Signature_Generation_Test std::string default_padding(const VarMap& vars) const override { - return get_req_str(vars, "Params"); + return vars.get_req_str("Params"); } std::unique_ptr load_private_key(const VarMap& vars) override { - const std::vector raw_key = get_req_bin(vars, "PrivateKey"); + const std::vector raw_key = vars.get_req_bin("PrivateKey"); const Botan::secure_vector sec_key(raw_key.begin(), raw_key.end()); std::unique_ptr key(new Botan::XMSS_PrivateKey(sec_key)); @@ -71,12 +71,12 @@ class XMSS_Signature_Verify_Tests final : public PK_Signature_Verification_Test std::string default_padding(const VarMap& vars) const override { - return get_req_str(vars, "Params"); + return vars.get_req_str("Params"); } std::unique_ptr load_public_key(const VarMap& vars) override { - const std::vector raw_key = get_req_bin(vars, "PublicKey"); + const std::vector raw_key = vars.get_req_bin("PublicKey"); std::unique_ptr key(new Botan::XMSS_PublicKey(raw_key)); return key; } @@ -93,12 +93,12 @@ class XMSS_Signature_Verify_Invalid_Tests final : public PK_Signature_NonVerific std::string default_padding(const VarMap& vars) const override { - return get_req_str(vars, "Params"); + return vars.get_req_str("Params"); } std::unique_ptr load_public_key(const VarMap& vars) override { - const std::vector raw_key = get_req_bin(vars, "PublicKey"); + const std::vector raw_key = vars.get_req_bin("PublicKey"); std::unique_ptr key(new Botan::XMSS_PublicKey(raw_key)); return key; } diff --git a/src/tests/tests.cpp b/src/tests/tests.cpp index beb7e770d3a..076f85f0d5f 100644 --- a/src/tests/tests.cpp +++ b/src/tests/tests.cpp @@ -626,29 +626,11 @@ std::string Test::random_password() return Botan::hex_encode(Test::rng().random_vec(len)); } -Text_Based_Test::Text_Based_Test(const std::string& data_src, - const std::string& required_keys_str, - const std::string& optional_keys_str) : - m_data_src(data_src) - { - if(required_keys_str.empty()) - { - throw Test_Error("Invalid test spec"); - } - - std::vector required_keys = Botan::split_on(required_keys_str, ','); - std::vector optional_keys = Botan::split_on(optional_keys_str, ','); - - m_required_keys.insert(required_keys.begin(), required_keys.end()); - m_optional_keys.insert(optional_keys.begin(), optional_keys.end()); - m_output_key = required_keys.at(required_keys.size() - 1); - } - -std::vector Text_Based_Test::get_req_bin(const VarMap& vars, +std::vector VarMap::get_req_bin( const std::string& key) const { - auto i = vars.find(key); - if(i == vars.end()) + auto i = m_vars.find(key); + if(i == m_vars.end()) { throw Test_Error("Test missing variable " + key); } @@ -664,22 +646,20 @@ std::vector Text_Based_Test::get_req_bin(const VarMap& vars, } } -std::string Text_Based_Test::get_opt_str(const VarMap& vars, - const std::string& key, const std::string& def_value) const - +std::string VarMap::get_opt_str(const std::string& key, const std::string& def_value) const { - auto i = vars.find(key); - if(i == vars.end()) + auto i = m_vars.find(key); + if(i == m_vars.end()) { return def_value; } return i->second; } -bool Text_Based_Test::get_req_bool(const VarMap& vars, const std::string& key) const +bool VarMap::get_req_bool( const std::string& key) const { - auto i = vars.find(key); - if(i == vars.end()) + auto i = m_vars.find(key); + if(i == m_vars.end()) { throw Test_Error("Test missing variable " + key); } @@ -698,31 +678,31 @@ bool Text_Based_Test::get_req_bool(const VarMap& vars, const std::string& key) c } } -size_t Text_Based_Test::get_req_sz(const VarMap& vars, const std::string& key) const +size_t VarMap::get_req_sz( const std::string& key) const { - auto i = vars.find(key); - if(i == vars.end()) + auto i = m_vars.find(key); + if(i == m_vars.end()) { throw Test_Error("Test missing variable " + key); } return Botan::to_u32bit(i->second); } -size_t Text_Based_Test::get_opt_sz(const VarMap& vars, const std::string& key, const size_t def_value) const +size_t VarMap::get_opt_sz( const std::string& key, const size_t def_value) const { - auto i = vars.find(key); - if(i == vars.end()) + auto i = m_vars.find(key); + if(i == m_vars.end()) { return def_value; } return Botan::to_u32bit(i->second); } -std::vector Text_Based_Test::get_opt_bin(const VarMap& vars, +std::vector VarMap::get_opt_bin( const std::string& key) const { - auto i = vars.find(key); - if(i == vars.end()) + auto i = m_vars.find(key); + if(i == m_vars.end()) { return std::vector(); } @@ -738,10 +718,10 @@ std::vector Text_Based_Test::get_opt_bin(const VarMap& vars, } } -std::string Text_Based_Test::get_req_str(const VarMap& vars, const std::string& key) const +std::string VarMap::get_req_str( const std::string& key) const { - auto i = vars.find(key); - if(i == vars.end()) + auto i = m_vars.find(key); + if(i == m_vars.end()) { throw Test_Error("Test missing variable " + key); } @@ -749,11 +729,11 @@ std::string Text_Based_Test::get_req_str(const VarMap& vars, const std::string& } #if defined(BOTAN_HAS_BIGINT) -Botan::BigInt Text_Based_Test::get_req_bn(const VarMap& vars, +Botan::BigInt VarMap::get_req_bn( const std::string& key) const { - auto i = vars.find(key); - if(i == vars.end()) + auto i = m_vars.find(key); + if(i == m_vars.end()) { throw Test_Error("Test missing variable " + key); } @@ -768,13 +748,12 @@ Botan::BigInt Text_Based_Test::get_req_bn(const VarMap& vars, } } -Botan::BigInt Text_Based_Test::get_opt_bn(const VarMap& vars, - const std::string& key, - const Botan::BigInt& def_value) const +Botan::BigInt VarMap::get_opt_bn(const std::string& key, + const Botan::BigInt& def_value) const { - auto i = vars.find(key); - if(i == vars.end()) + auto i = m_vars.find(key); + if(i == m_vars.end()) { return def_value; } @@ -790,6 +769,24 @@ Botan::BigInt Text_Based_Test::get_opt_bn(const VarMap& vars, } #endif +Text_Based_Test::Text_Based_Test(const std::string& data_src, + const std::string& required_keys_str, + const std::string& optional_keys_str) : + m_data_src(data_src) + { + if(required_keys_str.empty()) + { + throw Test_Error("Invalid test spec"); + } + + std::vector required_keys = Botan::split_on(required_keys_str, ','); + std::vector optional_keys = Botan::split_on(optional_keys_str, ','); + + m_required_keys.insert(required_keys.begin(), required_keys.end()); + m_optional_keys.insert(optional_keys.begin(), optional_keys.end()); + m_output_key = required_keys.at(required_keys.size() - 1); + } + std::string Text_Based_Test::get_next_line() { while(true) @@ -973,7 +970,7 @@ std::vector Text_Based_Test::run() results.push_back(Test::Result::Failure(header_or_name, test_id + " failed unknown key " + key)); - vars[key] = val; + vars.add(key, val); if(key == m_output_key) { diff --git a/src/tests/tests.h b/src/tests/tests.h index 87ea16379b8..8b9bc7d0a15 100644 --- a/src/tests/tests.h +++ b/src/tests/tests.h @@ -508,6 +508,42 @@ class Test #define BOTAN_REGISTER_TEST(type, Test_Class) \ Test::Registration reg_ ## Test_Class ## _tests(type, new Test_Class) +class VarMap + { + public: + void clear() { m_vars.clear(); } + + void add(const std::string& key, const std::string& value) + { + m_vars[key] = value; + } + + bool has_key(const std::string& key) const + { + return m_vars.count(key) == 1; + } + + bool get_req_bool(const std::string& key) const; + + std::vector get_req_bin(const std::string& key) const; + std::vector get_opt_bin(const std::string& key) const; + +#if defined(BOTAN_HAS_BIGINT) + Botan::BigInt get_req_bn(const std::string& key) const; + Botan::BigInt get_opt_bn(const std::string& key, const Botan::BigInt& def_value) const; +#endif + + std::string get_req_str(const std::string& key) const; + std::string get_opt_str(const std::string& key, + const std::string& def_value) const; + + size_t get_req_sz(const std::string& key) const; + size_t get_opt_sz(const std::string& key, const size_t def_value) const; + + private: + std::unordered_map m_vars; + }; + /* * A test based on reading an input file which contains key/value pairs * Special note: the last value in required_key (there must be at least @@ -516,8 +552,8 @@ class Test * Calls run_one_test with the variables set. If an ini-style [header] * is used in the file, then header will be set to that value. This allows * splitting up tests between [valid] and [invalid] tests, or different -* related algorithms tested in the same file. Use the protected get_XXX -* functions to retrieve formatted values from the VarMap +* related algorithms tested in the same file. Use the get_XXX functions +* on VarMap to retrieve formatted values. * * If most of your tests are text-based but you find yourself with a few * odds-and-ends tests that you want to do, override run_final_tests which @@ -537,7 +573,6 @@ class Text_Based_Test : public Test std::vector run() override; protected: - typedef std::unordered_map VarMap; std::string get_next_line(); virtual Test::Result run_one_test(const std::string& header, @@ -551,23 +586,6 @@ class Text_Based_Test : public Test return std::vector(); } - bool get_req_bool(const VarMap& vars, const std::string& key) const; - - std::vector get_req_bin(const VarMap& vars, const std::string& key) const; - std::vector get_opt_bin(const VarMap& vars, const std::string& key) const; - -#if defined(BOTAN_HAS_BIGINT) - Botan::BigInt get_req_bn(const VarMap& vars, const std::string& key) const; - Botan::BigInt get_opt_bn(const VarMap& vars, const std::string& key, const Botan::BigInt& def_value) const; -#endif - - std::string get_req_str(const VarMap& vars, const std::string& key) const; - std::string get_opt_str(const VarMap& vars, - const std::string& key, - const std::string& def_value) const; - - size_t get_req_sz(const VarMap& vars, const std::string& key) const; - size_t get_opt_sz(const VarMap& vars, const std::string& key, const size_t def_value) const; private: std::string m_data_src; std::set m_required_keys; diff --git a/src/tests/unit_ecc.cpp b/src/tests/unit_ecc.cpp index c980d4a2490..c79307c1063 100644 --- a/src/tests/unit_ecc.cpp +++ b/src/tests/unit_ecc.cpp @@ -708,7 +708,7 @@ class ECC_Invalid_Key_Tests final : public Text_Based_Test { Test::Result result("ECC invalid keys"); - const std::string encoded = get_req_str(vars, "SubjectPublicKey"); + const std::string encoded = vars.get_req_str("SubjectPublicKey"); Botan::DataSource_Memory key_data(Botan::hex_decode(encoded)); try From 5f26125dc579d0ee5297a0233305496365c69e63 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 29 May 2018 14:53:26 -0400 Subject: [PATCH 141/174] Dedup some test code Possible now that VarMap doesn't require access to protected functions of Text_Based_Test --- src/tests/test_rsa.cpp | 70 +++++++++++++++--------------------------- src/tests/test_sm2.cpp | 50 ++++++++++++------------------ 2 files changed, 45 insertions(+), 75 deletions(-) diff --git a/src/tests/test_rsa.cpp b/src/tests/test_rsa.cpp index 8d5d34893ee..32e4ab9e6b1 100644 --- a/src/tests/test_rsa.cpp +++ b/src/tests/test_rsa.cpp @@ -18,6 +18,23 @@ namespace { #if defined(BOTAN_HAS_RSA) +std::unique_ptr load_rsa_private_key(const VarMap& vars) + { + const BigInt p = vars.get_req_bn("P"); + const BigInt q = vars.get_req_bn("Q"); + const BigInt e = vars.get_req_bn("E"); + + return std::unique_ptr(new Botan::RSA_PrivateKey(p, q, e)); + } + +std::unique_ptr load_rsa_public_key(const VarMap& vars) + { + const BigInt n = vars.get_req_bn("N"); + const BigInt e = vars.get_req_bn("E"); + + return std::unique_ptr(new Botan::RSA_PublicKey(n, e)); + } + class RSA_ES_KAT_Tests final : public PK_Encryption_Decryption_Test { public: @@ -30,12 +47,7 @@ class RSA_ES_KAT_Tests final : public PK_Encryption_Decryption_Test std::unique_ptr load_private_key(const VarMap& vars) override { - const BigInt p = vars.get_req_bn("P"); - const BigInt q = vars.get_req_bn("Q"); - const BigInt e = vars.get_req_bn("E"); - - std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); - return key; + return load_rsa_private_key(vars); } }; @@ -54,12 +66,7 @@ class RSA_Decryption_KAT_Tests final : public PK_Decryption_Test std::unique_ptr load_private_key(const VarMap& vars) override { - const BigInt p = vars.get_req_bn("P"); - const BigInt q = vars.get_req_bn("Q"); - const BigInt e = vars.get_req_bn("E"); - - std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); - return key; + return load_rsa_private_key(vars); } }; @@ -74,12 +81,7 @@ class RSA_KEM_Tests final : public PK_KEM_Test std::unique_ptr load_private_key(const VarMap& vars) override { - const BigInt p = vars.get_req_bn("P"); - const BigInt q = vars.get_req_bn("Q"); - const BigInt e = vars.get_req_bn("E"); - - std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); - return key; + return load_rsa_private_key(vars); } }; @@ -101,12 +103,7 @@ class RSA_Signature_KAT_Tests final : public PK_Signature_Generation_Test std::unique_ptr load_private_key(const VarMap& vars) override { - const BigInt p = vars.get_req_bn("P"); - const BigInt q = vars.get_req_bn("Q"); - const BigInt e = vars.get_req_bn("E"); - - std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); - return key; + return load_rsa_private_key(vars); } }; @@ -134,12 +131,7 @@ class RSA_PSS_KAT_Tests final : public PK_Signature_Generation_Test std::unique_ptr load_private_key(const VarMap& vars) override { - const BigInt p = vars.get_req_bn("P"); - const BigInt q = vars.get_req_bn("Q"); - const BigInt e = vars.get_req_bn("E"); - - std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); - return key; + return load_rsa_private_key(vars); } }; @@ -167,12 +159,7 @@ class RSA_PSS_Raw_KAT_Tests final : public PK_Signature_Generation_Test std::unique_ptr load_private_key(const VarMap& vars) override { - const BigInt p = vars.get_req_bn("P"); - const BigInt q = vars.get_req_bn("Q"); - const BigInt e = vars.get_req_bn("E"); - - std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); - return key; + return load_rsa_private_key(vars); } }; @@ -192,11 +179,7 @@ class RSA_Signature_Verify_Tests final : public PK_Signature_Verification_Test std::unique_ptr load_public_key(const VarMap& vars) override { - const BigInt n = vars.get_req_bn("N"); - const BigInt e = vars.get_req_bn("E"); - - std::unique_ptr key(new Botan::RSA_PublicKey(n, e)); - return key; + return load_rsa_public_key(vars); } }; @@ -216,10 +199,7 @@ class RSA_Signature_Verify_Invalid_Tests final : public PK_Signature_NonVerifica std::unique_ptr load_public_key(const VarMap& vars) override { - const BigInt n = vars.get_req_bn("N"); - const BigInt e = vars.get_req_bn("E"); - std::unique_ptr key(new Botan::RSA_PublicKey(n, e)); - return key; + return load_rsa_public_key(vars); } }; diff --git a/src/tests/test_sm2.cpp b/src/tests/test_sm2.cpp index 3a231871541..333e198b796 100644 --- a/src/tests/test_sm2.cpp +++ b/src/tests/test_sm2.cpp @@ -19,6 +19,24 @@ namespace Botan_Tests { namespace { +std::unique_ptr load_sm2_private_key(const VarMap& vars) + { + // group params + const BigInt p = vars.get_req_bn("P"); + const BigInt a = vars.get_req_bn("A"); + const BigInt b = vars.get_req_bn("B"); + const BigInt xG = vars.get_req_bn("xG"); + const BigInt yG = vars.get_req_bn("yG"); + const BigInt order = vars.get_req_bn("Order"); + const BigInt cofactor = vars.get_req_bn("Cofactor"); + const BigInt x = vars.get_req_bn("x"); + + Botan::EC_Group domain(p, a, b, xG, yG, order, cofactor); + + Botan::Null_RNG null_rng; + return std::unique_ptr(new Botan::SM2_Signature_PrivateKey(null_rng, domain, x)); + } + class SM2_Signature_KAT_Tests final : public PK_Signature_Generation_Test { public: @@ -41,21 +59,7 @@ class SM2_Signature_KAT_Tests final : public PK_Signature_Generation_Test std::unique_ptr load_private_key(const VarMap& vars) override { - // group params - const BigInt p = vars.get_req_bn("P"); - const BigInt a = vars.get_req_bn("A"); - const BigInt b = vars.get_req_bn("B"); - const BigInt xG = vars.get_req_bn("xG"); - const BigInt yG = vars.get_req_bn("yG"); - const BigInt order = vars.get_req_bn("Order"); - const BigInt cofactor = vars.get_req_bn("Cofactor"); - const BigInt x = vars.get_req_bn("x"); - - Botan::EC_Group domain(p, a, b, xG, yG, order, cofactor); - - Botan::Null_RNG null_rng; - std::unique_ptr key(new Botan::SM2_Signature_PrivateKey(null_rng, domain, x)); - return key; + return load_sm2_private_key(vars); } }; @@ -85,21 +89,7 @@ class SM2_Encryption_KAT_Tests final : public PK_Encryption_Decryption_Test std::unique_ptr load_private_key(const VarMap& vars) override { - // group params - const BigInt p = vars.get_req_bn("P"); - const BigInt a = vars.get_req_bn("A"); - const BigInt b = vars.get_req_bn("B"); - const BigInt xG = vars.get_req_bn("xG"); - const BigInt yG = vars.get_req_bn("yG"); - const BigInt order = vars.get_req_bn("Order"); - const BigInt cofactor = vars.get_req_bn("Cofactor"); - const BigInt x = vars.get_req_bn("x"); - - Botan::EC_Group domain(p, a, b, xG, yG, order, cofactor); - - Botan::Null_RNG null_rng; - std::unique_ptr key(new Botan::SM2_Encryption_PrivateKey(null_rng, domain, x)); - return key; + return load_sm2_private_key(vars); } }; From 4ba8c8db638b9f95b6c688d695ce8ca40f3218c7 Mon Sep 17 00:00:00 2001 From: Wambou Date: Tue, 24 Apr 2018 16:17:02 +0200 Subject: [PATCH 142/174] Create unit tests for Base32 encoding --- src/tests/data/base32.vec | 79 ++++++++++++++++++++++++++++++++++ src/tests/test_utils.cpp | 89 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 src/tests/data/base32.vec diff --git a/src/tests/data/base32.vec b/src/tests/data/base32.vec new file mode 100644 index 00000000000..c681d85d1ab --- /dev/null +++ b/src/tests/data/base32.vec @@ -0,0 +1,79 @@ + +[valid] +# empty string +Binary = +Base32 = + +Binary = 66 +Base32 = MY====== + +Binary = 666F +Base32 = MZXQ==== + +Binary = 666F6F +Base32 = MZXW6=== + +Binary = 666F6F66 +Base32 = MZXW6ZQ= + +Binary = 666F6F666F +Base32 = MZXW6ZTP + +Binary = 68656C6C6F20776F726C64 +Base32 = NBSWY3DPEB3W64TMMQ====== + +Binary = 68656C6C6F20776F726C6421 +Base32 = NBSWY3DPEB3W64TMMQQQ==== + +Binary = 48656C6C6F2C20776F726C642E +Base32 = JBSWY3DPFQQHO33SNRSC4=== + +Binary = 546865203132206368617273 +Base32 = KRUGKIBRGIQGG2DBOJZQ==== + +Binary = 5468652031332063686172732E +Base32 = KRUGKIBRGMQGG2DBOJZS4=== + +Binary = 5468652031342063686172732E2E +Base32 = KRUGKIBRGQQGG2DBOJZS4LQ= + +Binary = 5468652031352063686172732E2E2E +Base32 = KRUGKIBRGUQGG2DBOJZS4LRO + +Binary = 416E205554462D382075756D6C3A20C3BC +Base32 = IFXCAVKUIYWTQIDVOVWWYORAYO6A==== + +Binary = 5765697264204765726D616E20322062797465207468696E673A20C39F2E +Base32 = K5SWS4TEEBDWK4TNMFXCAMRAMJ4XIZJAORUGS3THHIQMHHZO + +Binary = 9B +Base32 = TM====== + +Binary = 1C60 +Base32 = DRQA==== + +Binary = 8134BD +Base32 = QE2L2=== + +Binary = 5E6CFFDE +Base32 = LZWP7XQ= + +Binary = b2cdf0dc7f +Base32 = WLG7BXD7 + +Binary = fc562ddad40e +Base32 = 7RLC3WWUBY====== + +Binary = 29b2322e8841e8 +Base32 = FGZDELUIIHUA==== + +Binary = 0f0fced9497aaf92 +Base32 = B4H45WKJPKXZE=== + +Binary = 270fb18982800da640 +Base32 = E4H3DCMCQAG2MQA= + +[invalid] +Base32 = ZOOL!isnotvalidbase32 + +Base32 = Neitheris:this? diff --git a/src/tests/test_utils.cpp b/src/tests/test_utils.cpp index d3b00e8977e..6b082a47478 100644 --- a/src/tests/test_utils.cpp +++ b/src/tests/test_utils.cpp @@ -22,6 +22,10 @@ #include #endif +#if defined(BOTAN_HAS_BASE32_CODEC) + #include +#endif + #if defined(BOTAN_HAS_POLY_DBL) #include #endif @@ -320,6 +324,86 @@ class Date_Format_Tests final : public Text_Based_Test BOTAN_REGISTER_TEST("util_dates", Date_Format_Tests); +#if defined(BOTAN_HAS_BASE32_CODEC) + +class Base32_Tests final : public Text_Based_Test + { + public: + Base32_Tests() : Text_Based_Test("base32.vec", "Base32", "Binary") {} + + Test::Result run_one_test(const std::string& type, const VarMap& vars) override + { + Test::Result result("Base32"); + + const bool is_valid = (type == "valid"); + const std::string base32 = vars.get_req_str("Base32"); + + try + { + if(is_valid) + { + const std::vector binary = vars.get_req_bin("Binary"); + result.test_eq("base32 decoding", Botan::base32_decode(base32), binary); + result.test_eq("base32 encoding", Botan::base32_encode(binary), base32); + } + else + { + auto res = Botan::base32_decode(base32); + result.test_failure("decoded invalid base32 to " + Botan::hex_encode(res)); + } + } + catch(std::exception& e) + { + if(is_valid) + { + result.test_failure("rejected valid base32", e.what()); + } + else + { + result.test_note("rejected invalid base32"); + } + } + + return result; + } + + std::vector run_final_tests() override + { + Test::Result result("Base32"); + const std::string valid_b32 = "MY======"; + + for(char ws_char : { ' ', '\t', '\r', '\n' }) + { + for(size_t i = 0; i <= valid_b32.size(); ++i) + { + std::string b32_ws = valid_b32; + b32_ws.insert(i, 1, ws_char); + + try + { + result.test_failure("decoded whitespace base32", Botan::base32_decode(b32_ws, false)); + } + catch(std::exception&) {} + + try + { + result.test_eq("base32 decoding with whitespace", Botan::base32_decode(b32_ws, true), "66"); + } + catch(std::exception& e) + { + result.test_failure(b32_ws, e.what()); + } + } + } + + return {result}; + } + }; + +BOTAN_REGISTER_TEST("base32", Base32_Tests); + +#endif + #if defined(BOTAN_HAS_BASE64_CODEC) class Base64_Tests final : public Text_Based_Test @@ -485,10 +569,11 @@ class Charset_Tests final : public Text_Based_Test result.test_throws("conversion fails for non-Latin1 characters", []() { // "abcdefŸabcdef" - const std::vector input = { + const std::vector input = + { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0xC5, 0xB8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 - }; + }; Botan::utf8_to_latin1(std::string(input.begin(), input.end())); }); From 36d0da039b3ffd9aaf77ab96ee45b40f55b9bbe3 Mon Sep 17 00:00:00 2001 From: Wambou Date: Tue, 24 Apr 2018 16:17:06 +0200 Subject: [PATCH 143/174] Implement Base32 --- src/lib/codec/base32/base32.cpp | 273 ++++++++++++++++++++++++++++++++ src/lib/codec/base32/base32.h | 141 +++++++++++++++++ src/lib/codec/base32/info.txt | 3 + 3 files changed, 417 insertions(+) create mode 100644 src/lib/codec/base32/base32.cpp create mode 100644 src/lib/codec/base32/base32.h create mode 100644 src/lib/codec/base32/info.txt diff --git a/src/lib/codec/base32/base32.cpp b/src/lib/codec/base32/base32.cpp new file mode 100644 index 00000000000..71c0e1e3d31 --- /dev/null +++ b/src/lib/codec/base32/base32.cpp @@ -0,0 +1,273 @@ +/* +* Base32 Encoding and Decoding +* (C) 2018 Erwan Chaussy +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include +#include +#include +#include + +namespace Botan { + +namespace { + +static const uint8_t BIN_TO_BASE32[32] = + { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + '2', '3', '4', '5', '6', '7' + }; + +void do_base32_encode(char out[8], const uint8_t in[5]) + { + out[0] = BIN_TO_BASE32[(in[0] & 0xF8) >> 3]; + out[1] = BIN_TO_BASE32[((in[0] & 0x07) << 2) | (in[1] >> 6)]; + out[2] = BIN_TO_BASE32[((in[1] & 0x3E) >> 1)]; + out[3] = BIN_TO_BASE32[((in[1] & 0x01) << 4) | (in[2] >> 4)]; + out[4] = BIN_TO_BASE32[((in[2] & 0x0F) << 1) | (in[3] >> 7)]; + out[5] = BIN_TO_BASE32[((in[3] & 0x7C) >> 2)]; + out[6] = BIN_TO_BASE32[((in[3] & 0x03) << 3) | (in[4] >> 5)]; + out[7] = BIN_TO_BASE32[in[4] & 0x1F]; + } + +} + +size_t base32_encode(char out[], + const uint8_t in[], + size_t input_length, + size_t& input_consumed, + bool final_inputs) + { + input_consumed = 0; + + size_t input_remaining = input_length; + size_t output_produced = 0; + + while(input_remaining >= 5) + { + do_base32_encode(out + output_produced, in + input_consumed); + + input_consumed += 5; + output_produced += 8; + input_remaining -= 5; + } + + if(final_inputs && input_remaining) + { + uint8_t remainder[5] = {0}; + for(size_t i = 0; i != input_remaining; ++i) + { remainder[i] = in[input_consumed + i]; } + + do_base32_encode(out + output_produced, remainder); + + size_t empty_bits = 8 * (5 - input_remaining); + size_t index = output_produced + 8 - 1; + while(empty_bits >= 6) + { + out[index--] = '='; + empty_bits -= 5; + } + + input_consumed += input_remaining; + output_produced += 8; + } + + return output_produced; + } + +std::string base32_encode(const uint8_t input[], + size_t input_length) + { + const size_t output_length = base32_encode_max_output(input_length); + std::string output(output_length, 0); + + size_t consumed = 0; + size_t produced = 0; + + if(output_length > 0) + { + produced = base32_encode(&output.front(), + input, input_length, + consumed, true); + } + + BOTAN_ASSERT_EQUAL(consumed, input_length, "Consumed the entire input"); + BOTAN_ASSERT_EQUAL(produced, output.size(), "Produced expected size"); + + return output; + } + +size_t base32_decode(uint8_t output[], + const char input[], + size_t input_length, + size_t& input_consumed, + bool final_inputs, + bool ignore_ws) + { + /* + * base32 Decoder Lookup Table + * Warning: assumes ASCII encodings + */ + static const uint8_t BASE32_TO_BIN[256] = + { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, + 0x80, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, + 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, + 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + }; + + uint8_t* out_ptr = output; + uint8_t decode_buf[8]; + size_t decode_buf_pos = 0; + size_t final_truncate = 0; + + clear_mem(output, input_length * 5 / 8); + + for(size_t i = 0; i != input_length; ++i) + { + const uint8_t bin = BASE32_TO_BIN[static_cast(input[i])]; + + if(bin <= 0x1F) + { + decode_buf[decode_buf_pos] = bin; + decode_buf_pos += 1; + } + else if(!(bin == 0x81 || (bin == 0x80 && ignore_ws))) + { + std::string bad_char(1, input[i]); + if(bad_char == "\t") + { bad_char = "\\t"; } + else if(bad_char == "\n") + { bad_char = "\\n"; } + else if(bad_char == "\r") + { bad_char = "\\r"; } + + throw Invalid_Argument( + std::string("base32_decode: invalid base32 character '") + + bad_char + "'"); + } + + /* + * If we're at the end of the input, pad with 0s and truncate + */ + if(final_inputs && (i == input_length - 1)) + { + if(decode_buf_pos) + { + for(size_t j = decode_buf_pos; j != 8; ++j) + { decode_buf[j] = 0; } + final_truncate = 8 - decode_buf_pos; + decode_buf_pos = 8; + } + } + + if(decode_buf_pos == 8) + { + out_ptr[0] = (decode_buf[0] << 3) | (decode_buf[1] >> 2); + out_ptr[1] = (decode_buf[1] << 6) | (decode_buf[2] << 1) | (decode_buf[3] >> 4); + out_ptr[2] = (decode_buf[3] << 4) | (decode_buf[4] >> 1); + out_ptr[3] = (decode_buf[4] << 7) | (decode_buf[5] << 2) | (decode_buf[6] >> 3); + out_ptr[4] = (decode_buf[6] << 5) | decode_buf[7]; + + out_ptr += 5; + decode_buf_pos = 0; + input_consumed = i + 1; + } + } + + while(input_consumed < input_length && + BASE32_TO_BIN[static_cast(input[input_consumed])] == 0x80) + { + ++input_consumed; + } + + size_t written = (out_ptr - output); + + if(final_truncate) + { + written -= (final_truncate / 2) + 1; + } + + return written; + } + +size_t base32_decode(uint8_t output[], + const char input[], + size_t input_length, + bool ignore_ws) + { + size_t consumed = 0; + size_t written = base32_decode(output, input, input_length, + consumed, true, ignore_ws); + + if(consumed != input_length) + { throw Invalid_Argument("base32_decode: input did not have full bytes"); } + + return written; + } + +size_t base32_decode(uint8_t output[], + const std::string& input, + bool ignore_ws) + { + return base32_decode(output, input.data(), input.length(), ignore_ws); + } + +secure_vector base32_decode(const char input[], + size_t input_length, + bool ignore_ws) + { + const size_t output_length = base32_decode_max_output(input_length); + secure_vector bin(output_length); + + size_t written = base32_decode(bin.data(), + input, + input_length, + ignore_ws); + + bin.resize(written); + return bin; + } + +secure_vector base32_decode(const std::string& input, + bool ignore_ws) + { + return base32_decode(input.data(), input.size(), ignore_ws); + } + +size_t base32_encode_max_output(size_t input_length) + { + return (round_up(input_length, 5) / 5) * 8; + } + +size_t base32_decode_max_output(size_t input_length) + { + return (round_up(input_length, 8) * 5) / 8; + } + +} diff --git a/src/lib/codec/base32/base32.h b/src/lib/codec/base32/base32.h new file mode 100644 index 00000000000..b3f138b00a0 --- /dev/null +++ b/src/lib/codec/base32/base32.h @@ -0,0 +1,141 @@ +/* +* Base32 Encoding and Decoding +* (C) 2018 Erwan Chaussy +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#ifndef BOTAN_BASE32_CODEC_H_ +#define BOTAN_BASE32_CODEC_H_ + +#include +#include + +namespace Botan { + +/** +* Perform base32 encoding +* @param output an array of at least base32_encode_max_output bytes +* @param input is some binary data +* @param input_length length of input in bytes +* @param input_consumed is an output parameter which says how many +* bytes of input were actually consumed. If less than +* input_length, then the range input[consumed:length] +* should be passed in later along with more input. +* @param final_inputs true iff this is the last input, in which case + padding chars will be applied if needed +* @return number of bytes written to output +*/ +size_t BOTAN_PUBLIC_API(2, 7) base32_encode(char output[], + const uint8_t input[], + size_t input_length, + size_t& input_consumed, + bool final_inputs); + +/** +* Perform base32 encoding +* @param input some input +* @param input_length length of input in bytes +* @return base32adecimal representation of input +*/ +std::string BOTAN_PUBLIC_API(2, 7) base32_encode(const uint8_t input[], + size_t input_length); + +/** +* Perform base32 encoding +* @param input some input +* @return base32adecimal representation of input +*/ +template +std::string base32_encode(const std::vector& input) + { + return base32_encode(input.data(), input.size()); + } + +/** +* Perform base32 decoding +* @param output an array of at least base32_decode_max_output bytes +* @param input some base32 input +* @param input_length length of input in bytes +* @param input_consumed is an output parameter which says how many +* bytes of input were actually consumed. If less than +* input_length, then the range input[consumed:length] +* should be passed in later along with more input. +* @param final_inputs true iff this is the last input, in which case + padding is allowed +* @param ignore_ws ignore whitespace on input; if false, throw an + exception if whitespace is encountered +* @return number of bytes written to output +*/ +size_t BOTAN_PUBLIC_API(2, 7) base32_decode(uint8_t output[], + const char input[], + size_t input_length, + size_t& input_consumed, + bool final_inputs, + bool ignore_ws = true); + +/** +* Perform base32 decoding +* @param output an array of at least base32_decode_max_output bytes +* @param input some base32 input +* @param input_length length of input in bytes +* @param ignore_ws ignore whitespace on input; if false, throw an + exception if whitespace is encountered +* @return number of bytes written to output +*/ +size_t BOTAN_PUBLIC_API(2, 7) base32_decode(uint8_t output[], + const char input[], + size_t input_length, + bool ignore_ws = true); + +/** +* Perform base32 decoding +* @param output an array of at least base32_decode_max_output bytes +* @param input some base32 input +* @param ignore_ws ignore whitespace on input; if false, throw an + exception if whitespace is encountered +* @return number of bytes written to output +*/ +size_t BOTAN_PUBLIC_API(2, 7) base32_decode(uint8_t output[], + const std::string& input, + bool ignore_ws = true); + +/** +* Perform base32 decoding +* @param input some base32 input +* @param input_length the length of input in bytes +* @param ignore_ws ignore whitespace on input; if false, throw an + exception if whitespace is encountered +* @return decoded base32 output +*/ +secure_vector BOTAN_PUBLIC_API(2, 7) base32_decode(const char input[], + size_t input_length, + bool ignore_ws = true); + +/** +* Perform base32 decoding +* @param input some base32 input +* @param ignore_ws ignore whitespace on input; if false, throw an + exception if whitespace is encountered +* @return decoded base32 output +*/ +secure_vector BOTAN_PUBLIC_API(2, 7) base32_decode(const std::string& input, + bool ignore_ws = true); + +/** +* Calculate the size of output buffer for base32_encode +* @param input_length the length of input in bytes +* @return the size of output buffer in bytes +*/ +size_t BOTAN_PUBLIC_API(2, 7) base32_encode_max_output(size_t input_length); + +/** +* Calculate the size of output buffer for base32_decode +* @param input_length the length of input in bytes +* @return the size of output buffer in bytes +*/ +size_t BOTAN_PUBLIC_API(2, 7) base32_decode_max_output(size_t input_length); + +} // namespace Botan + +#endif diff --git a/src/lib/codec/base32/info.txt b/src/lib/codec/base32/info.txt new file mode 100644 index 00000000000..8e414c5a338 --- /dev/null +++ b/src/lib/codec/base32/info.txt @@ -0,0 +1,3 @@ + +BASE32_CODEC -> 20180418 + From 4ca5e490311774f8a91a992e3fefbe018348e68a Mon Sep 17 00:00:00 2001 From: Wambou Date: Tue, 24 Apr 2018 16:17:25 +0200 Subject: [PATCH 144/174] Define templated base encoding/decoding --- src/lib/codec/codec_base/codec_base.h | 165 ++++++++++++++++++++++++++ src/lib/codec/codec_base/info.txt | 2 + 2 files changed, 167 insertions(+) create mode 100644 src/lib/codec/codec_base/codec_base.h create mode 100644 src/lib/codec/codec_base/info.txt diff --git a/src/lib/codec/codec_base/codec_base.h b/src/lib/codec/codec_base/codec_base.h new file mode 100644 index 00000000000..7b5a5f18c3c --- /dev/null +++ b/src/lib/codec/codec_base/codec_base.h @@ -0,0 +1,165 @@ +/* +* Base Encoding and Decoding +* (C) 2018 Erwan Chaussy +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#ifndef BOTAN_BASE_CODEC_H_ +#define BOTAN_BASE_CODEC_H_ + +#include +#include +#include + +namespace Botan { + +/** +* Perform encoding using the base provided +* @param encoding object giving access to the encodings specifications +* @param output an array of at least base.encode_max_output bytes +* @param input is some binary data +* @param input_length length of input in bytes +* @param input_consumed is an output parameter which says how many +* bytes of input were actually consumed. If less than +* input_length, then the range input[consumed:length] +* should be passed in later along with more input. +* @param final_inputs true iff this is the last input, in which case + padding chars will be applied if needed +* @return number of bytes written to output +*/ +template +size_t base_encode(Base&& base, + char output[], + const uint8_t input[], + size_t input_length, + size_t& input_consumed, + bool final_inputs) + { + input_consumed = 0; + + const size_t encoding_bytes_in = base.encoding_bytes_in(); + const size_t encoding_bytes_out = base.encoding_bytes_out(); + + size_t input_remaining = input_length; + size_t output_produced = 0; + + while(input_remaining >= encoding_bytes_in) + { + base.encode(output + output_produced, input + input_consumed); + + input_consumed += encoding_bytes_in; + output_produced += encoding_bytes_out; + input_remaining -= encoding_bytes_in; + } + + if(final_inputs && input_remaining) + { + std::vector remainder(encoding_bytes_in, 0); + for(size_t i = 0; i != input_remaining; ++i) + { remainder[i] = input[input_consumed + i]; } + + base.encode(output + output_produced, remainder.data()); + + const size_t bits_consumed = base.bits_consumed(); + const size_t remaining_bits_before_padding = base.remaining_bits_before_padding(); + + size_t empty_bits = 8 * (encoding_bytes_in - input_remaining); + size_t index = output_produced + encoding_bytes_out - 1; + while(empty_bits >= remaining_bits_before_padding) + { + output[index--] = '='; + empty_bits -= bits_consumed; + } + + input_consumed += input_remaining; + output_produced += encoding_bytes_out; + } + + return output_produced; + } + +/** +* Perform decoding using the base provided +* @param base object giving access to the encodings specifications +* @param output an array of at least base.decode_max_output bytes +* @param input some base input +* @param input_length length of input in bytes +* @param input_consumed is an output parameter which says how many +* bytes of input were actually consumed. If less than +* input_length, then the range input[consumed:length] +* should be passed in later along with more input. +* @param final_inputs true iff this is the last input, in which case + padding is allowed +* @param ignore_ws ignore whitespace on input; if false, throw an + exception if whitespace is encountered +* @return number of bytes written to output +*/ +template +size_t base_decode(Base&& base, + uint8_t output[], + const char input[], + size_t input_length, + size_t& input_consumed, + bool final_inputs, + bool ignore_ws = true) + { + const size_t decoding_bytes_in = base.decoding_bytes_in(); + const size_t decoding_bytes_out = base.decoding_bytes_out(); + + uint8_t* out_ptr = output; + std::vector decode_buf(decoding_bytes_in, 0); + size_t decode_buf_pos = 0; + size_t final_truncate = 0; + + clear_mem(output, base.decode_max_output(input_length)); + + for(size_t i = 0; i != input_length; ++i) + { + const uint8_t bin = base.lookup_binary_value(input[i]); + + if(base.check_bad_char(bin, input[i], ignore_ws)) // May throw Invalid_Argument + { + decode_buf[decode_buf_pos] = bin; + ++decode_buf_pos; + } + + /* + * If we're at the end of the input, pad with 0s and truncate + */ + if(final_inputs && (i == input_length - 1)) + { + if(decode_buf_pos) + { + for(size_t j = decode_buf_pos; j < decoding_bytes_in; ++j) + { decode_buf[j] = 0; } + + final_truncate = decoding_bytes_in - decode_buf_pos; + decode_buf_pos = decoding_bytes_in; + } + } + + if(decode_buf_pos == decoding_bytes_in) + { + base.decode(out_ptr, decode_buf.data()); + + out_ptr += decoding_bytes_out; + decode_buf_pos = 0; + input_consumed = i+1; + } + } + + while(input_consumed < input_length && + base.lookup_binary_value(input[input_consumed]) == 0x80) + { + ++input_consumed; + } + + size_t written = (out_ptr - output) - base.bytes_to_remove(final_truncate); + + return written; + } + +} + +#endif diff --git a/src/lib/codec/codec_base/info.txt b/src/lib/codec/codec_base/info.txt new file mode 100644 index 00000000000..0771e5801c4 --- /dev/null +++ b/src/lib/codec/codec_base/info.txt @@ -0,0 +1,2 @@ + + From 4fc63c5d240f1df55da3b835675584cb28b8a468 Mon Sep 17 00:00:00 2001 From: Wambou Date: Wed, 25 Apr 2018 10:27:14 +0200 Subject: [PATCH 145/174] Refactoring Base32 to use the templated algorithm --- src/lib/codec/base32/base32.cpp | 314 +++++++++++++++----------------- src/lib/codec/base32/base32.h | 14 -- 2 files changed, 146 insertions(+), 182 deletions(-) diff --git a/src/lib/codec/base32/base32.cpp b/src/lib/codec/base32/base32.cpp index 71c0e1e3d31..392c063ba6c 100644 --- a/src/lib/codec/base32/base32.cpp +++ b/src/lib/codec/base32/base32.cpp @@ -6,32 +6,160 @@ */ #include +#include #include -#include #include namespace Botan { namespace { -static const uint8_t BIN_TO_BASE32[32] = +class Base32 + { + public: + static inline size_t encoding_bytes_in() BOTAN_NOEXCEPT + { + return m_encoding_bytes_in; + } + static inline size_t encoding_bytes_out() BOTAN_NOEXCEPT + { + return m_encoding_bytes_out; + } + + static inline size_t decoding_bytes_in() BOTAN_NOEXCEPT + { + return m_encoding_bytes_out; + } + static inline size_t decoding_bytes_out() BOTAN_NOEXCEPT + { + return m_encoding_bytes_in; + } + + static inline size_t bits_consumed() BOTAN_NOEXCEPT + { + return m_encoding_bits; + } + static inline size_t remaining_bits_before_padding() BOTAN_NOEXCEPT + { + return m_remaining_bits_before_padding; + } + + static inline size_t encode_max_output(size_t input_length) + { + return (round_up(input_length, m_encoding_bytes_in) / m_encoding_bytes_in) * m_encoding_bytes_out; + } + static inline size_t decode_max_output(size_t input_length) + { + return (round_up(input_length, m_encoding_bytes_out) * m_encoding_bytes_in) / m_encoding_bytes_out; + } + + static void encode(char out[8], const uint8_t in[5]) BOTAN_NOEXCEPT + { + out[0] = Base32::m_bin_to_base32[(in[0] & 0xF8) >> 3]; + out[1] = Base32::m_bin_to_base32[((in[0] & 0x07) << 2) | (in[1] >> 6)]; + out[2] = Base32::m_bin_to_base32[((in[1] & 0x3E) >> 1)]; + out[3] = Base32::m_bin_to_base32[((in[1] & 0x01) << 4) | (in[2] >> 4)]; + out[4] = Base32::m_bin_to_base32[((in[2] & 0x0F) << 1) | (in[3] >> 7)]; + out[5] = Base32::m_bin_to_base32[((in[3] & 0x7C) >> 2)]; + out[6] = Base32::m_bin_to_base32[((in[3] & 0x03) << 3) | (in[4] >> 5)]; + out[7] = Base32::m_bin_to_base32[in[4] & 0x1F]; + } + + static inline uint8_t lookup_binary_value(char input) BOTAN_NOEXCEPT + { + return Base32::m_base32_to_bin[static_cast(input)]; + } + + static inline bool check_bad_char(uint8_t bin, char input, bool ignore_ws) + { + if(bin <= 0x1F) + { + return true; + } + else if(!(bin == 0x81 || (bin == 0x80 && ignore_ws))) + { + std::string bad_char(1, input); + if(bad_char == "\t") + { bad_char = "\\t"; } + else if(bad_char == "\n") + { bad_char = "\\n"; } + else if(bad_char == "\r") + { bad_char = "\\r"; } + + throw Invalid_Argument( + std::string("base32_decode: invalid base32 character '") + + bad_char + "'"); + } + return false; + } + + static void decode(uint8_t* out_ptr, const uint8_t decode_buf[8]) + { + out_ptr[0] = (decode_buf[0] << 3) | (decode_buf[1] >> 2); + out_ptr[1] = (decode_buf[1] << 6) | (decode_buf[2] << 1) | (decode_buf[3] >> 4); + out_ptr[2] = (decode_buf[3] << 4) | (decode_buf[4] >> 1); + out_ptr[3] = (decode_buf[4] << 7) | (decode_buf[5] << 2) | (decode_buf[6] >> 3); + out_ptr[4] = (decode_buf[6] << 5) | decode_buf[7]; + } + + static inline size_t bytes_to_remove(size_t final_truncate) + { + return final_truncate ? (final_truncate / 2) + 1 : 0; + } + + private: + static const size_t m_encoding_bits = 5; + static const size_t m_remaining_bits_before_padding = 6; + + + static const size_t m_encoding_bytes_in = 5; + static const size_t m_encoding_bytes_out = 8; + + + static const uint8_t m_bin_to_base32[32]; + static const uint8_t m_base32_to_bin[256]; + }; + +const uint8_t Base32::m_bin_to_base32[32] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7' }; -void do_base32_encode(char out[8], const uint8_t in[5]) +/* +* base32 Decoder Lookup Table +* Warning: assumes ASCII encodings +*/ +const uint8_t Base32::m_base32_to_bin[256] = { - out[0] = BIN_TO_BASE32[(in[0] & 0xF8) >> 3]; - out[1] = BIN_TO_BASE32[((in[0] & 0x07) << 2) | (in[1] >> 6)]; - out[2] = BIN_TO_BASE32[((in[1] & 0x3E) >> 1)]; - out[3] = BIN_TO_BASE32[((in[1] & 0x01) << 4) | (in[2] >> 4)]; - out[4] = BIN_TO_BASE32[((in[2] & 0x0F) << 1) | (in[3] >> 7)]; - out[5] = BIN_TO_BASE32[((in[3] & 0x7C) >> 2)]; - out[6] = BIN_TO_BASE32[((in[3] & 0x03) << 3) | (in[4] >> 5)]; - out[7] = BIN_TO_BASE32[in[4] & 0x1F]; - } + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, + 0x80, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, + 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, + 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + }; } @@ -41,47 +169,13 @@ size_t base32_encode(char out[], size_t& input_consumed, bool final_inputs) { - input_consumed = 0; - - size_t input_remaining = input_length; - size_t output_produced = 0; - - while(input_remaining >= 5) - { - do_base32_encode(out + output_produced, in + input_consumed); - - input_consumed += 5; - output_produced += 8; - input_remaining -= 5; - } - - if(final_inputs && input_remaining) - { - uint8_t remainder[5] = {0}; - for(size_t i = 0; i != input_remaining; ++i) - { remainder[i] = in[input_consumed + i]; } - - do_base32_encode(out + output_produced, remainder); - - size_t empty_bits = 8 * (5 - input_remaining); - size_t index = output_produced + 8 - 1; - while(empty_bits >= 6) - { - out[index--] = '='; - empty_bits -= 5; - } - - input_consumed += input_remaining; - output_produced += 8; - } - - return output_produced; + return base_encode(Base32(), out, in, input_length, input_consumed, final_inputs); } std::string base32_encode(const uint8_t input[], size_t input_length) { - const size_t output_length = base32_encode_max_output(input_length); + const size_t output_length = Base32::encode_max_output(input_length); std::string output(output_length, 0); size_t consumed = 0; @@ -100,120 +194,14 @@ std::string base32_encode(const uint8_t input[], return output; } -size_t base32_decode(uint8_t output[], - const char input[], +size_t base32_decode(uint8_t out[], + const char in[], size_t input_length, size_t& input_consumed, bool final_inputs, bool ignore_ws) { - /* - * base32 Decoder Lookup Table - * Warning: assumes ASCII encodings - */ - static const uint8_t BASE32_TO_BIN[256] = - { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, - 0x80, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, - 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, - 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, - 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF - }; - - uint8_t* out_ptr = output; - uint8_t decode_buf[8]; - size_t decode_buf_pos = 0; - size_t final_truncate = 0; - - clear_mem(output, input_length * 5 / 8); - - for(size_t i = 0; i != input_length; ++i) - { - const uint8_t bin = BASE32_TO_BIN[static_cast(input[i])]; - - if(bin <= 0x1F) - { - decode_buf[decode_buf_pos] = bin; - decode_buf_pos += 1; - } - else if(!(bin == 0x81 || (bin == 0x80 && ignore_ws))) - { - std::string bad_char(1, input[i]); - if(bad_char == "\t") - { bad_char = "\\t"; } - else if(bad_char == "\n") - { bad_char = "\\n"; } - else if(bad_char == "\r") - { bad_char = "\\r"; } - - throw Invalid_Argument( - std::string("base32_decode: invalid base32 character '") + - bad_char + "'"); - } - - /* - * If we're at the end of the input, pad with 0s and truncate - */ - if(final_inputs && (i == input_length - 1)) - { - if(decode_buf_pos) - { - for(size_t j = decode_buf_pos; j != 8; ++j) - { decode_buf[j] = 0; } - final_truncate = 8 - decode_buf_pos; - decode_buf_pos = 8; - } - } - - if(decode_buf_pos == 8) - { - out_ptr[0] = (decode_buf[0] << 3) | (decode_buf[1] >> 2); - out_ptr[1] = (decode_buf[1] << 6) | (decode_buf[2] << 1) | (decode_buf[3] >> 4); - out_ptr[2] = (decode_buf[3] << 4) | (decode_buf[4] >> 1); - out_ptr[3] = (decode_buf[4] << 7) | (decode_buf[5] << 2) | (decode_buf[6] >> 3); - out_ptr[4] = (decode_buf[6] << 5) | decode_buf[7]; - - out_ptr += 5; - decode_buf_pos = 0; - input_consumed = i + 1; - } - } - - while(input_consumed < input_length && - BASE32_TO_BIN[static_cast(input[input_consumed])] == 0x80) - { - ++input_consumed; - } - - size_t written = (out_ptr - output); - - if(final_truncate) - { - written -= (final_truncate / 2) + 1; - } - - return written; + return base_decode(Base32(), out, in, input_length, input_consumed, final_inputs, ignore_ws); } size_t base32_decode(uint8_t output[], @@ -242,7 +230,7 @@ secure_vector base32_decode(const char input[], size_t input_length, bool ignore_ws) { - const size_t output_length = base32_decode_max_output(input_length); + const size_t output_length = Base32::decode_max_output(input_length); secure_vector bin(output_length); size_t written = base32_decode(bin.data(), @@ -260,14 +248,4 @@ secure_vector base32_decode(const std::string& input, return base32_decode(input.data(), input.size(), ignore_ws); } -size_t base32_encode_max_output(size_t input_length) - { - return (round_up(input_length, 5) / 5) * 8; - } - -size_t base32_decode_max_output(size_t input_length) - { - return (round_up(input_length, 8) * 5) / 8; - } - } diff --git a/src/lib/codec/base32/base32.h b/src/lib/codec/base32/base32.h index b3f138b00a0..15b894c2947 100644 --- a/src/lib/codec/base32/base32.h +++ b/src/lib/codec/base32/base32.h @@ -122,20 +122,6 @@ secure_vector BOTAN_PUBLIC_API(2, 7) base32_decode(const char input[], secure_vector BOTAN_PUBLIC_API(2, 7) base32_decode(const std::string& input, bool ignore_ws = true); -/** -* Calculate the size of output buffer for base32_encode -* @param input_length the length of input in bytes -* @return the size of output buffer in bytes -*/ -size_t BOTAN_PUBLIC_API(2, 7) base32_encode_max_output(size_t input_length); - -/** -* Calculate the size of output buffer for base32_decode -* @param input_length the length of input in bytes -* @return the size of output buffer in bytes -*/ -size_t BOTAN_PUBLIC_API(2, 7) base32_decode_max_output(size_t input_length); - } // namespace Botan #endif From bbc621dac505dc7a02aa6d2443b1760a17484992 Mon Sep 17 00:00:00 2001 From: Wambou Date: Wed, 25 Apr 2018 11:49:24 +0200 Subject: [PATCH 146/174] Update documentation --- doc/credits.rst | 4 ++++ doc/todo.rst | 2 +- news.rst | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/credits.rst b/doc/credits.rst index 014a486fb7f..7721f4cf726 100644 --- a/doc/credits.rst +++ b/doc/credits.rst @@ -143,3 +143,7 @@ snail-mail address (S), and Bitcoin address (B). W: https://sirrix.com/ D: CI, PKCS#11, RdSeed, BSI module policy S: Bochum, Germany + + N: Erwan Chaussy + D: Base32 + S: France diff --git a/doc/todo.rst b/doc/todo.rst index fb5a7391687..5cd02a86a7e 100644 --- a/doc/todo.rst +++ b/doc/todo.rst @@ -49,7 +49,7 @@ Public Key Crypto, Math Utility Functions ------------------ -* base58 and base32 encoding +* base58 encoding Multiparty Protocols ---------------------- diff --git a/news.rst b/news.rst index 5cdc6c68f9a..10b282778f7 100644 --- a/news.rst +++ b/news.rst @@ -52,6 +52,9 @@ Version 2.7.0, Not Yet Released * Support for Visual C++ 2013 is deprecated, and will be removed in Jan 2019. +* Implement Base32 encoding with template function to prepare + refactoring of Base64. (GH #1541) + Version 2.6.0, 2018-04-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From ec6afeece0894aee67b4ff1b7ac88403d15219bf Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 31 May 2018 17:18:20 -0400 Subject: [PATCH 147/174] Correct error in P-224 computation If x was very small to start with x.size() might be under the limb count which would cause the final addition to throw because the destination array was smaller than the P-224 p being added. Caught by Wycheproof ECDSA tests --- src/lib/math/numbertheory/nistp_redc.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib/math/numbertheory/nistp_redc.cpp b/src/lib/math/numbertheory/nistp_redc.cpp index 33e77562e77..b74a2f9c6b9 100644 --- a/src/lib/math/numbertheory/nistp_redc.cpp +++ b/src/lib/math/numbertheory/nistp_redc.cpp @@ -221,6 +221,8 @@ const BigInt& prime_p224() void redc_p224(BigInt& x, secure_vector& ws) { + static const size_t p224_limbs = (BOTAN_MP_WORD_BITS == 32) ? 7 : 4; + BOTAN_UNUSED(ws); const int64_t X00 = get_uint32_t(x, 0); @@ -249,6 +251,7 @@ void redc_p224(BigInt& x, secure_vector& ws) const int64_t S6 = 0xFFFFFFFF + X06 + X10 - X13; x.mask_bits(224); + x.shrink_to_fit(p224_limbs + 1); int64_t S = 0; uint32_t R0 = 0, R1 = 0; @@ -291,8 +294,6 @@ void redc_p224(BigInt& x, secure_vector& ws) BOTAN_ASSERT(S >= 0 && S <= 2, "Expected overflow in P-224 reduce"); - static const size_t p224_limbs = (BOTAN_MP_WORD_BITS == 32) ? 7 : 4; - static const word p224_mults[3][p224_limbs] = { #if (BOTAN_MP_WORD_BITS == 64) {0x0000000000000001, 0xFFFFFFFF00000000, 0xFFFFFFFFFFFFFFFF, 0x00000000FFFFFFFF}, From 58ce0b4be4f359416e078382ddd863b14b26f254 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 31 May 2018 17:19:28 -0400 Subject: [PATCH 148/174] Prevent signature malleability in DER/BER encoded sigs --- src/lib/pubkey/pubkey.cpp | 49 ++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/src/lib/pubkey/pubkey.cpp b/src/lib/pubkey/pubkey.cpp index bc476b30de6..632514020cb 100644 --- a/src/lib/pubkey/pubkey.cpp +++ b/src/lib/pubkey/pubkey.cpp @@ -1,5 +1,5 @@ /* -* (C) 1999-2010,2015 Jack Lloyd +* (C) 1999-2010,2015,2018 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -229,6 +229,29 @@ void PK_Signer::update(const uint8_t in[], size_t length) m_op->update(in, length); } +namespace { + +std::vector der_encode_signature(const std::vector& sig, + size_t parts, + size_t part_size) + { + if(sig.size() % parts != 0 || sig.size() != parts * part_size) + throw Encoding_Error("Unexpected size for DER signature"); + + std::vector sig_parts(parts); + for(size_t i = 0; i != sig_parts.size(); ++i) + sig_parts[i].binary_decode(&sig[part_size*i], part_size); + + std::vector output; + DER_Encoder(output) + .start_cons(SEQUENCE) + .encode_list(sig_parts) + .end_cons(); + return output; + } + +} + std::vector PK_Signer::signature(RandomNumberGenerator& rng) { const std::vector sig = unlock(m_op->sign(rng)); @@ -239,19 +262,7 @@ std::vector PK_Signer::signature(RandomNumberGenerator& rng) } else if(m_sig_format == DER_SEQUENCE) { - if(sig.size() % m_parts != 0 || sig.size() != m_parts * m_part_size) - throw Internal_Error("PK_Signer: DER signature sizes unexpected, cannot encode"); - - std::vector sig_parts(m_parts); - for(size_t i = 0; i != sig_parts.size(); ++i) - sig_parts[i].binary_decode(&sig[m_part_size*i], m_part_size); - - std::vector output; - DER_Encoder(output) - .start_cons(SEQUENCE) - .encode_list(sig_parts) - .end_cons(); - return output; + return der_encode_signature(sig, m_parts, m_part_size); } else throw Internal_Error("PK_Signer: Invalid signature format enum"); @@ -305,6 +316,7 @@ bool PK_Verifier::check_signature(const uint8_t sig[], size_t length) BER_Decoder ber_sig = decoder.start_cons(SEQUENCE); size_t count = 0; + while(ber_sig.more_items()) { BigInt sig_part; @@ -316,6 +328,15 @@ bool PK_Verifier::check_signature(const uint8_t sig[], size_t length) if(count != m_parts) throw Decoding_Error("PK_Verifier: signature size invalid"); + const std::vector reencoded = + der_encode_signature(real_sig, m_parts, m_part_size); + + if(reencoded.size() != length || + same_mem(reencoded.data(), sig, reencoded.size()) == false) + { + throw Decoding_Error("PK_Verifier: signature is not valid BER"); + } + return m_op->is_valid_signature(real_sig.data(), real_sig.size()); } else From c82667e15d2ac1be856bbdfd74002f2f52e5c277 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 31 May 2018 17:20:53 -0400 Subject: [PATCH 149/174] Add ECDSA tests from Wycheproof --- news.rst | 6 + src/tests/data/pubkey/ecdsa_wycheproof.vec | 13649 +++++++++++++++++++ src/tests/test_ecdsa.cpp | 41 + src/tests/test_pubkey.cpp | 33 +- src/tests/test_pubkey.h | 4 + 5 files changed, 13725 insertions(+), 8 deletions(-) create mode 100644 src/tests/data/pubkey/ecdsa_wycheproof.vec diff --git a/news.rst b/news.rst index 5cdc6c68f9a..1f9dd9c621f 100644 --- a/news.rst +++ b/news.rst @@ -35,6 +35,12 @@ Version 2.7.0, Not Yet Released * XMSS signature verification did not check that the signature was of the expected length which could lead to a crash. (GH #1537) +* Previously for ASN.1 encoded signatures (eg ECDSA) Botan would accept any + valid BER encoding. Now only the single valid DER encoding is accepted. + +* Correct an error that could in rare cases cause an internal error exception + when doing computations with the P-224 curve. + * Botan generates X.509 subject key IDs by hashing the public key with whatever hash function is being used to sign the certificate. However especially for SHA-512 this caused SKIDs that were far longer than diff --git a/src/tests/data/pubkey/ecdsa_wycheproof.vec b/src/tests/data/pubkey/ecdsa_wycheproof.vec new file mode 100644 index 00000000000..6f07e1c578e --- /dev/null +++ b/src/tests/data/pubkey/ecdsa_wycheproof.vec @@ -0,0 +1,13649 @@ +Group = brainpool224r1 +Hash = SHA-224 + +Px = 0x572eab7376d052dfc40923db25342ea9cbfce4b8581e104a4c8f37c9 +Py = 0x4a700ec5dc05a481b2b695320c6f1ad2dd8628633cdb75a91245c265 +# Test 1 (signature malleability) +Msg = 313233343030 +Valid = 1 +Signature = 303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021c139c78243a6e36e124d5f5e14b4cb8754abdf20ff1a501d5666a428f + +# Test 2 (random signature) +Signature = 303d021d00d4ee58357e6fc6288bbeda0858f6ee1d0ce1590e263f0e419c46208b021c30cb8303ba3bb01cf07f5bd3fd9bebc9edbf06606b7a715790cea0f8 + +# Test 3 (random signature) +Signature = 303c021c60ac28620ff7aebeafdecad41bf33f30dbb1cd75090b7899ec72dafa021c7e7aa45fdd0b023a3760046ca34f0e602b0f025e0bab6d1a6a474b4f + +# Test 4 (random signature) +Signature = 303d021c3882068e4c2a00a0d5e6ecc2d5c8361f967eb941b620ecf41150ce7a021d00b57dd94442067388935684cf9ee7825ed505b767708bb36ef0fdf0c0 + +# Test 5 (random signature) +Signature = 303c021c6ef36b8ef54e0153365902acdeaf4af78f2525743d8d941b700ac5de021c7127f4d83f4be641c7e929641a1c5e1bc79cde1ab857e91b2120e6cc + +# Test 6 (random signature) +Signature = 303d021d00be025ae1a255b8febaa0e45da32e2589d6e390c31c192443d0ad0f04021c47701271f1d8f3338ef40f565d6f44c4100a02061f1b2574b9fed264 + +# Test 7 (Legacy:ASN encoding of r misses leading 0) +Valid = 0 +Signature = 303d021ccb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 8 (Legacy:ASN encoding of s misses leading 0) +Signature = 303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021cc424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 9 (valid) +Valid = 1 +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 10 (long form encoding of length) +Valid = 0 +Signature = 30813e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 11 (long form encoding of length) +Signature = 303f02811d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 12 (long form encoding of length) +Signature = 303f021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d302811d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 13 (length contains leading 0) +Signature = 3082003e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 14 (length contains leading 0) +Signature = 30400282001d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 15 (length contains leading 0) +Signature = 3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30282001d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 16 (wrong length) +Signature = 303f021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 17 (wrong length) +Signature = 303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 18 (wrong length) +Signature = 303e021e00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 19 (wrong length) +Signature = 303e021c00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 20 (wrong length) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021e00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 21 (wrong length) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021c00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 22 (uint32 overflow in length) +Signature = 3085010000003e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 23 (uint32 overflow in length) +Signature = 30430285010000001d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 24 (uint32 overflow in length) +Signature = 3043021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30285010000001d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 25 (uint64 overflow in length) +Signature = 308901000000000000003e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 26 (uint64 overflow in length) +Signature = 3047028901000000000000001d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 27 (uint64 overflow in length) +Signature = 3047021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3028901000000000000001d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 28 (length = 2**31 - 1) +Signature = 30847fffffff021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 29 (length = 2**31 - 1) +Signature = 304202847fffffff00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 30 (length = 2**31 - 1) +Signature = 3042021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d302847fffffff00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 31 (length = 2**32 - 1) +Signature = 3084ffffffff021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 32 (length = 2**32 - 1) +Signature = 30420284ffffffff00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 33 (length = 2**32 - 1) +Signature = 3042021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30284ffffffff00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 34 (length = 2**40 - 1) +Signature = 3085ffffffffff021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 35 (length = 2**40 - 1) +Signature = 30430285ffffffffff00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 36 (length = 2**40 - 1) +Signature = 3043021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30285ffffffffff00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 37 (length = 2**64 - 1) +Signature = 3088ffffffffffffffff021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 38 (length = 2**64 - 1) +Signature = 30460288ffffffffffffffff00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 39 (length = 2**64 - 1) +Signature = 3046021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30288ffffffffffffffff00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 40 (incorrect length) +Signature = 30ff021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 41 (incorrect length) +Signature = 303e02ff00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 42 (incorrect length) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d302ff00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 43 (indefinite length without termination) +Signature = 3080021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 44 (indefinite length without termination) +Signature = 303e028000cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 45 (indefinite length without termination) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3028000c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 46 (removing sequence) +Signature = + +# Test 47 (appending 0's to sequence) +Signature = 3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000 + +# Test 48 (prepending 0's to sequence) +Signature = 30400000021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 49 (appending unused 0's) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000 + +# Test 50 (appending unused 0's) +Signature = 3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30000021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 51 (appending null value) +Signature = 3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100500 + +# Test 52 (appending null value) +Signature = 3040021f00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30500021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 53 (appending null value) +Signature = 3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021f00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100500 + +# Test 54 (including garbage) +Signature = 3043498177303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 55 (including garbage) +Signature = 30422500303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 56 (including garbage) +Signature = 3040303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100004deadbeef + +# Test 57 (including garbage) +Signature = 30432222498177021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 58 (including garbage) +Signature = 304222212500021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 59 (including garbage) +Signature = 3046221f021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30004deadbeef021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 60 (including garbage) +Signature = 3043021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d32222498177021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 61 (including garbage) +Signature = 3042021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d322212500021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 62 (including garbage) +Signature = 3046021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3221f021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100004deadbeef + +# Test 63 (including undefined tags) +Signature = 3046aa00bb00cd00303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 64 (including undefined tags) +Signature = 3044aa02aabb303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 65 (including undefined tags) +Signature = 30462225aa00bb00cd00021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 66 (including undefined tags) +Signature = 30442223aa02aabb021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 67 (including undefined tags) +Signature = 3046021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d32225aa00bb00cd00021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 68 (including undefined tags) +Signature = 3044021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d32223aa02aabb021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 69 (using composition with indefinite length) +Signature = 3080303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000 + +# Test 70 (using composition with indefinite length) +Signature = 30422280021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30000021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 71 (using composition with indefinite length) +Signature = 3042021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d32280021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000 + +# Test 72 (using composition with wrong tag) +Signature = 3080313e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000 + +# Test 73 (using composition with wrong tag) +Signature = 30422280031d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30000021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 74 (using composition with wrong tag) +Signature = 3042021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d32280031d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000 + +# Test 75 (Replacing sequence with NULL) +Signature = 0500 + +# Test 76 (changing tag value) +Signature = 2e3e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 77 (changing tag value) +Signature = 2f3e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 78 (changing tag value) +Signature = 313e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 79 (changing tag value) +Signature = 323e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 80 (changing tag value) +Signature = ff3e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 81 (changing tag value) +Signature = 303e001d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 82 (changing tag value) +Signature = 303e011d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 83 (changing tag value) +Signature = 303e031d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 84 (changing tag value) +Signature = 303e041d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 85 (changing tag value) +Signature = 303eff1d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 86 (changing tag value) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3001d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 87 (changing tag value) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3011d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 88 (changing tag value) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3031d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 89 (changing tag value) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3041d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 90 (changing tag value) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3ff1d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 91 (dropping value of sequence) +Signature = 3000 + +# Test 92 (using composition) +Signature = 3042300102303d1d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 93 (using composition) +Signature = 30422221020100021ccb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 94 (using composition) +Signature = 3042021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d32221020100021cc424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 95 (truncate sequence) +Signature = 303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51 + +# Test 96 (truncate sequence) +Signature = 303d1d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 97 (indefinite length) +Signature = 3080021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000 + +# Test 98 (indefinite length with truncated delimiter) +Signature = 3080021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d511000 + +# Test 99 (indefinite length with additional element) +Signature = 3080021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d511005000000 + +# Test 100 (indefinite length with truncated element) +Signature = 3080021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110060811220000 + +# Test 101 (indefinite length with garbage) +Signature = 3080021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000fe02beef + +# Test 102 (indefinite length with nonempty EOC) +Signature = 3080021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100002beef + +# Test 103 (prepend empty sequence) +Signature = 30403000021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 104 (append empty sequence) +Signature = 3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51103000 + +# Test 105 (sequence of sequence) +Signature = 3040303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 106 (truncated sequence) +Signature = 301f021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3 + +# Test 107 (repeat element in sequence) +Signature = 305d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 108 (removing integer) +Signature = 301f021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 109 (appending 0's to integer) +Signature = 3040021f00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30000021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 110 (appending 0's to integer) +Signature = 3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021f00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000 + +# Test 111 (prepending 0's to integer) +Signature = 3040021f000000cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 112 (prepending 0's to integer) +Signature = 3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021f000000c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 113 (Replacing integer with NULL) +Signature = 30210500021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 114 (Replacing integer with NULL) +Signature = 3021021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30500 + +# Test 115 (dropping value of integer) +Signature = 30210200021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 116 (dropping value of integer) +Signature = 3021021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30200 + +# Test 117 (modify first byte of integer) +Signature = 303e021d02cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 118 (modify first byte of integer) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d02c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 119 (modify last byte of integer) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af263146004896153021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 120 (modify last byte of integer) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5190 + +# Test 121 (truncate integer) +Signature = 303d021c00cb68ac9765c7641785df237e9951e1429581879af2631460048961021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 122 (truncate integer) +Signature = 303d021ccb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 123 (truncate integer) +Signature = 303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021c00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51 + +# Test 124 (truncate integer) +Signature = 303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021cc424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 125 (leading ff in integer) +Signature = 303f021eff00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 126 (leading ff in integer) +Signature = 303f021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021eff00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 127 (infinity) +Signature = 3022090180021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 128 (infinity) +Signature = 3022021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3090180 + +# Test 129 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303e021d01a329e1418c0aca9daff753a40f22dcdb669843e66041d103aa30f572021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 130 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021cf3a777ed3f83fd915bc6f3592380e5a9c46acb4f848457bc5ee1ce34021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 131 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303e021dff349753689a389be87a20dc8166ae1ebd6a7e78650d9ceb9ffb769e2d021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 132 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021c0c588812c07c026ea4390ca6dc7f1a563b9534b07b7ba843a11e31cc021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 133 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303e021dfe5cd61ebe73f535625008ac5bf0dd23249967bc199fbe2efc55cf0a8e021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 134 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303e021d01cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 135 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021c349753689a389be87a20dc8166ae1ebd6a7e78650d9ceb9ffb769e2d021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 136 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d019be5f1301218962b2f5a6a69a0553ebc576f8686ea187771e4e4e4af + +# Test 137 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021cec6387dbc591c91edb2a0a1eb4b3478ab5420df00e5afe2a9995bd71 + +# Test 138 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021dff3bdb437a142ad05afabdc5bbd57bbcdc79a735c483c64531c0c2aef0 + +# Test 139 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021dfe641a0ecfede769d4d0a595965faac143a890797915e7888e1b1b1b51 + +# Test 140 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d01c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110 + +# Test 141 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021c3bdb437a142ad05afabdc5bbd57bbcdc79a735c483c64531c0c2aef0 + +# Test 142 (Signature with special case values for r and s) +Signature = 3006020100020100 + +# Test 143 (Signature with special case values for r and s) +Signature = 3006020100020101 + +# Test 144 (Signature with special case values for r and s) +Signature = 30060201000201ff + +# Test 145 (Signature with special case values for r and s) +Signature = 3022020100021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f + +# Test 146 (Signature with special case values for r and s) +Signature = 3022020100021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e + +# Test 147 (Signature with special case values for r and s) +Signature = 3022020100021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0 + +# Test 148 (Signature with special case values for r and s) +Signature = 3022020100021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff + +# Test 149 (Signature with special case values for r and s) +Signature = 3022020100021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100 + +# Test 150 (Signature with special case values for r and s) +Signature = 3008020100090380fe01 + +# Test 151 (Signature with special case values for r and s) +Signature = 3006020101020100 + +# Test 152 (Signature with special case values for r and s) +Signature = 3006020101020101 + +# Test 153 (Signature with special case values for r and s) +Signature = 30060201010201ff + +# Test 154 (Signature with special case values for r and s) +Signature = 3022020101021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f + +# Test 155 (Signature with special case values for r and s) +Signature = 3022020101021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e + +# Test 156 (Signature with special case values for r and s) +Signature = 3022020101021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0 + +# Test 157 (Signature with special case values for r and s) +Signature = 3022020101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff + +# Test 158 (Signature with special case values for r and s) +Signature = 3022020101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100 + +# Test 159 (Signature with special case values for r and s) +Signature = 3008020101090380fe01 + +# Test 160 (Signature with special case values for r and s) +Signature = 30060201ff020100 + +# Test 161 (Signature with special case values for r and s) +Signature = 30060201ff020101 + +# Test 162 (Signature with special case values for r and s) +Signature = 30060201ff0201ff + +# Test 163 (Signature with special case values for r and s) +Signature = 30220201ff021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f + +# Test 164 (Signature with special case values for r and s) +Signature = 30220201ff021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e + +# Test 165 (Signature with special case values for r and s) +Signature = 30220201ff021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0 + +# Test 166 (Signature with special case values for r and s) +Signature = 30220201ff021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff + +# Test 167 (Signature with special case values for r and s) +Signature = 30220201ff021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100 + +# Test 168 (Signature with special case values for r and s) +Signature = 30080201ff090380fe01 + +# Test 169 (Signature with special case values for r and s) +Signature = 3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020100 + +# Test 170 (Signature with special case values for r and s) +Signature = 3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101 + +# Test 171 (Signature with special case values for r and s) +Signature = 3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f0201ff + +# Test 172 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f + +# Test 173 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e + +# Test 174 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0 + +# Test 175 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff + +# Test 176 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100 + +# Test 177 (Signature with special case values for r and s) +Signature = 3024021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f090380fe01 + +# Test 178 (Signature with special case values for r and s) +Signature = 3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e020100 + +# Test 179 (Signature with special case values for r and s) +Signature = 3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e020101 + +# Test 180 (Signature with special case values for r and s) +Signature = 3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e0201ff + +# Test 181 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f + +# Test 182 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e + +# Test 183 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0 + +# Test 184 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff + +# Test 185 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100 + +# Test 186 (Signature with special case values for r and s) +Signature = 3024021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e090380fe01 + +# Test 187 (Signature with special case values for r and s) +Signature = 3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0020100 + +# Test 188 (Signature with special case values for r and s) +Signature = 3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0020101 + +# Test 189 (Signature with special case values for r and s) +Signature = 3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a00201ff + +# Test 190 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f + +# Test 191 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e + +# Test 192 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0 + +# Test 193 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff + +# Test 194 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100 + +# Test 195 (Signature with special case values for r and s) +Signature = 3024021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0090380fe01 + +# Test 196 (Signature with special case values for r and s) +Signature = 3022021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff020100 + +# Test 197 (Signature with special case values for r and s) +Signature = 3022021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff020101 + +# Test 198 (Signature with special case values for r and s) +Signature = 3022021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff0201ff + +# Test 199 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f + +# Test 200 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e + +# Test 201 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0 + +# Test 202 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff + +# Test 203 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100 + +# Test 204 (Signature with special case values for r and s) +Signature = 3024021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff090380fe01 + +# Test 205 (Signature with special case values for r and s) +Signature = 3022021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100020100 + +# Test 206 (Signature with special case values for r and s) +Signature = 3022021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100020101 + +# Test 207 (Signature with special case values for r and s) +Signature = 3022021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c1000201ff + +# Test 208 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f + +# Test 209 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e + +# Test 210 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0 + +# Test 211 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff + +# Test 212 (Signature with special case values for r and s) +Signature = 303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100 + +# Test 213 (Signature with special case values for r and s) +Signature = 3024021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100090380fe01 + +# Test 214 (Edge case for Shamir multiplication) +Msg = 3935333838 +Valid = 1 +Signature = 303d021c0e7ecab2276f035c0dc70520ebd5ae3cb7b7a8f21fa5687eee92c462021d0085a85332f8c899b53d43091b02e6956b391817e175a8b1f40dca7e00 + +Px = 0xa0ef7db1bee0aedb5a5634f4f3b1b88d97d2a07f806a718efe19014d +Py = 0xaee1043f9e929c32d74ab0e4eeba2623f17ba281b6be87745b59f60e +# Test 215 (k*G has a large x-coordinate) +Msg = 313233343030 +Signature = 3030020f00dbeedf884b0c29fbcd51d9212d5f021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939c + +# Test 216 (r too large) +Valid = 0 +Signature = 303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939c + +Px = 0x3adda407bad7f593e83d7d484fd14c23dda17f8d460c222aa7257577 +Py = 0xcd62443b2b770291f65904dacf75ff975f1a667187e0e4f50c14889c +# Test 217 (r,s are large) +Valid = 1 +Signature = 303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939d + +Px = 0x24587ce1dbff281dcab1794519806281ad4e0997492510677fb65106 +Py = 0x9296996e83b808676cbf6f28c92b84303314b63a0308134f222d0ec2 +# Test 218 (r and s^-1 have a large Hamming weight) +Signature = 303c021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021c63f0e34258bb9061547906d0c3827c504422c139e6d6e1078b37aa44 + +Px = 0xc45c51d5a9b213e41ca6f15cb8aa1bc0b8b73d3a8a23a14f5a3da4df +Py = 0xbc78cc6176d3b831e68800671768043c11bf63a695918df6ec87378a +# Test 219 (r and s^-1 have a large Hamming weight) +Signature = 303c021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021c6eb1fbfa8df87d4fa10c833f7dd1bbe7ef0144ff71537975378f91ec + +Px = 0x36a5344da08a421edc6c3beb7de97a7559fc101c1489ff2b5036d8f6 +Py = 0x207bf4666e4df606bd0d9823a52b58ddfdfc1da70513c5f9990f8085 +# Test 220 (small r and s) +Signature = 3006020101020101 + +Px = 0x4095c095a9648951da352b837f368e0be67d79fd57eadfffeddfb455 +Py = 0xccdcfabea19e96d4d20e42b8ae23c2519426018e25a64dea85d8a68b +# Test 221 (small r and s) +Signature = 3006020101020102 + +Px = 0xcc352ac48aacb6495ec3831b21ccd4d3197136292bf6f20f22802566 +Py = 0x64321991e67f7dbc22602ecbdb3122edce5ff85d923143cecc0d4f6d +# Test 222 (small r and s) +Signature = 3006020101020103 + +# Test 223 (r is larger than n) +Valid = 0 +Signature = 3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0020103 + +Px = 0x9148f29c67f83c705eefb59c92954775f90c15e225da2e996abcdd1d +Py = 0xc9db1aa1e15277c4555d24118239e53fd2f0b5e7ea807eb3de1ee350 +# Test 224 (s is larger than n) +Signature = 3022020101021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5ba6a26 + +Px = 0x9bf045a43a5f14d5e412ee181f111d6e53961120531f3c50ca701e78 +Py = 0xbe9eb95146f4f2be96949976a7aa49d31593a7da2edd907652398c3a +# Test 225 (small r and s^-1) +Valid = 1 +Signature = 302302020102021d009dfe5cfd9b02fe7a6f747bf31dd581d0a93cfecc66a1173d611dfd3c + +Px = 0x87739e2821ed9567e88702fa8c6d083c97c1f3f1eb32d13f751fb073 +Py = 0x6d02eba05e8cb94672d09ebc11051d52ec7bd4dc7767301b67034212 +# Test 226 (smallish r and s^-1) +Signature = 302702072d9b4d347952cc021c43e235748bd3b1bfa14c92234a90261acc3e9086810801a36746bcee + +Px = 0x1a515cbe957bfc070e4c4a75d6fd5e7c15b1e255eb42fead06c9d263 +Py = 0x6252cc0d234318394df7db65b0a52e06953ca6c21ec95774d39efdc9 +# Test 227 (100-bit r and small s^-1) +Signature = 302e020d1033e67e37b32b445580bf4efb021d00a8bdf46532d8136beb21dbf178090c7e7dad2caa8eb52cef8d830fd8 + +Px = 0xd6a16e194e12b96db8e1bb0250d950f7b3129b14bba0efb157c4423e +Py = 0x625a0c8c20838bd97fbc89f1670028754a09ad28f62de5eea6e07bc1 +# Test 228 (small r and 100 bit s^-1) +Signature = 302202020102021c73168a8994e5f71793081cb7afbe3c0af4bf7aa336cf9de31ef85314 + +Px = 0xc012950d074bb01b0a1988a5b59b959104275baf757e53029b046a15 +Py = 0x42f50fe27f3ebac9036558ef30ebcb812027bf0ef46cda51969541bb +# Test 229 (100-bit r and s^-1) +Signature = 302d020d062522bbd3ecbe7c39e93e7c24021c73168a8994e5f71793081cb7afbe3c0af4bf7aa336cf9de31ef85314 + +Px = 0xd15c13a1be99d9eb77d688104a18e24242d205a4026f4a65629e59ee +Py = 0x7e3ddf9abbb7d532b6e81a6e11f30d5b55feb8ee707c4fedf99c0607 +# Test 230 (r and s^-1 are close to n) +Signature = 303d021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7931f021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a + +Px = 0x3fe01972c0622ea812d30652c9fe2febee708123b1626d744f87db0d +Py = 0xa572c7e1e3a48195e6221d983f782fdc9e7c55bd5fdf7b679b0f8756 +# Test 231 (s == 1) +Signature = 3021021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a020101 + +# Test 232 (s == 0) +Valid = 0 +Signature = 3021021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a020100 + +Px = 0xd4b6e5112406fb743b6bb55f49ea2030d904420831ebddacd67bba89 +Py = 0x652265384b75d850e7c27f4e33ed6c576df0ff969470a9ef25ffafcd +# Test 233 (point at infinity during verify) +Signature = 303c021c6be09a551321b343150c1812bae87dcc688b5e25b6ef5e51d2d3c9cf021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a + +Px = 0x55a7b0100613fabd957b42600835c6d42e01e04252593bdde3b17278 +Py = 0x87708a05aba2f93f1a1e1ecb703ec9a8ee6d6013a101d397012a8cce +# Test 234 (u1 == 1) +Valid = 1 +Signature = 303c021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c + +Px = 0x1ada54dc015861680d8bb2d311b90e82db75aa9e8217b92611fa03cb +Py = 0x84c611551197298b3274875cb94686e758f0a1a9675c0bc157451a76 +# Test 235 (u1 == n - 1) +Signature = 303c021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a021c628580a9adb02604525b1ee6b135e1a9c745021824582c52385a8173 + +Px = 0xc67b6429785334a608dde949a8abe641dbd3601ebce1e675fe71a8e5 +Py = 0x27d2e8727dc4f618493550bb940151bca6826f714c5b31854038f44d +# Test 236 (u2 == 1) +Signature = 303c021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a + +Px = 0x1dcc7a5ad111a33627f92dd875ba4a06f6a7c2befdd1050488d057a7 +Py = 0x341cae0be72a99776db5bd79b463e2d3882764af9c0245d084a3342d +# Test 237 (u2 == n - 1) +Signature = 303d021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a021d008fd6231c198244597165756e4e8b5265e0b9d2dcf3e9d317c3c50d15 + +Px = 0xbdf708a01c6a814728d394b7f29bf6579734862d8af8e6ff786fbe49 +Py = 0x901cd462946e5e36cc97c9896df2e18177456d282a7a26a38084c086 +# Test 238 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d00b6ea09c6ec5e0484b94f25d890145b0ae3ffbb98b716addd92debdce + +Px = 0xc531fb3d996faa22407df1305ff6ae0bfe94e1c2022f4730d0f8a4a +Py = 0xbd8073950459562e539ac0895433757e25209b12534ff30fe3d37c71 +# Test 239 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c2f62a9cf48e3ca602eef4e33afa43f2dceb922a40a67de79f7b1ae38 + +Px = 0x6782954082418e0002a0812672ac2123b6334b341340555096bcf6c6 +Py = 0x1f6fa1a8fea617d9dda14461d63aa448f205a39b25501a6b1d42ee5f +# Test 240 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c618dfc54408bec1cb37c7ee52b60adbc8d3a6c26457c39d013e88e81 + +Px = 0x5b5e6eaba7597ae641420ace6af2575839f161b27b91b270f18bf7d0 +Py = 0x496ab3c3072fa6ee5578fc814f74d148ecbc2a98cfdc5d40ec7e6980 +# Test 241 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c010de57124c0930ef800e764b5585927977e2ad2d8b82e7cb648af52 + +Px = 0x8e661a06ad55b5227801ea4309a72b9cd94973bc873c0405e1247d1e +Py = 0x64898b822c363cac8821302de38a914268aaa67db2561878f0f90a02 +# Test 242 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c033ef5010beced04c4928868513ed1878ce677a6ed810e9b99dd9794 + +Px = 0xb3d2b93f1488657262140f96c108aa0485939bd99440240a7a7d54e3 +Py = 0x88968174b061853739f8b0471c76126539dc57cc6d7c1f539f686674 +# Test 243 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c067dea0217d9da09892510d0a27da30f19ccef4ddb021d3733bb2f28 + +Px = 0xba830dbf83075cd182bc9322c1f6299a4ce3cf4ddde0e6fcee50f0d6 +Py = 0x2b153f6f377a88809c9dd50d8d61eb6794514448165786a7c6558dcc +# Test 244 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c45847e02fd01a3cc9e063f961fb920ab3271ec09996f75bca7fe6d3f + +Px = 0x77f40222e4a79a0fa7e510887e69eba31f6dd7067121dafe739bbe13 +Py = 0xd0ffab7222cf6d827c51eb53abac506bc0a5d7c1a5a7e1683d49e43e +# Test 245 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c0b4cbe866d1920634138c8798fcc41479447e5ae760794e1e5797928 + +Px = 0x597b5a3c106b8c4e9a7e7a517cd740e77667c8a2d06c510e5e3b728d +Py = 0x9cc249e827f5fff902122eb26badc4a7da6555b489ba98982d388125 +# Test 246 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c20d72ae339e5620170c90a4ce5bca08ded1700b2b6c80ec612c8d5d1 + +Px = 0xf2453e7585cb1392ff4fa11869f8c10b2f9cf4f2a18b866e8f37c2b +Py = 0xd1566ef04928797579d40f3310ebaf477a4e78a235861928328634df +# Test 247 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d009d235aa9e9f9c6453e39a78613836ea14c2ddf31c91b747aef010a89 + +Px = 0x10cb3dbce4da518e04eb125cf3b44bef0451bad3e7cbbad5328b85bb +Py = 0x358651b478bcf200684fd310e6d14acd23dc2a760475df0f5b8a758c +# Test 248 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d009ca7987f3367a9516eca57855098d4aaaf289438d9ad7b39dcc81110 + +Px = 0x2c27732aaaa3f8b16664a48a1dd06fc0fe40f65742751e5c04b7eff5 +Py = 0x7804b2dbee79ffe56dc4f4a6062ced6f375b80b5ad2cf3a2921b395 +# Test 249 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c7295bc38b76bccd7635d6561d1f053dd9b079419249f94368c8d3133 + +Px = 0x8ced556877ee15af314aed5dfc43a00fbb7626fbdc7b81ff7dbea2f8 +Py = 0x98f5e26f7fc3276da2a8e869b0afbc41ef3b40326080aa85ce62c2ab +# Test 250 (edge case for u2) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d00938f2db2b72061abd7eb6e5c8fe685391e966ec0c769d0c538e0678a + +Px = 0x42b19b22506c4fd89fa28c5909d97f8ffebdc82804dcc7bf6a570ae2 +Py = 0x1a974ee08b484fa05e1fbb89c48c50754ba1e40a658a5ced409c6361 +# Test 251 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c7f907c8e32e60e2ba4033ee7d65f3fe8fd23719c7a9c6f5e52f18c47 + +Px = 0x2095e12116cebdd4e8bc1cc184b538b1515f789e3be4b03a4183fae5 +Py = 0xd0926e446875abdcd12c8239e607961cadd00a2e899d821db11d5679 +# Test 252 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c34c3978c3a1dac921f6235c82a02edb9342285469426bb10f82897c4 + +Px = 0x58f82eb2ca6e3474a90e29ac56dcb63d88e669e0a40204e6202af7c5 +Py = 0xa0e85e4039f343255b4fe4bdc1191a7845bdd7eb908ecd8779a27963 +# Test 253 (edge case for u2) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d009701d6523d3d3f5b8ac8402680b3cab8966e2651cfc1739fcd3c0749 + +Px = 0x71f2c4a7c3f71311a793458ff12262a863518fb30dbb7a80701030b8 +Py = 0xb6b08428fabdb69c8a8e9e327daed0795fb84e0d8817086022d3b23b +# Test 254 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c564277fa54371830eb7850278b9699d85bc5905831a42a9bf4d07af3 + +Px = 0x3cfcf64eece994c35c56e915e4ed1883ba6ec34fe396c11acd8f47d2 +Py = 0x63cdfbaa34401100b5b10af771bb46c0d53446f7aa847956c9363494 +# Test 255 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c7794fbdee638f657ac1e4c65284c144b3efa7bf4109e6cca605c4f4c + +Px = 0x4c404decbc0697b207fa08982ef0fedb001eeb43f37404dab97a9a77 +Py = 0x47191bc240dfd440274e06955611f9923fad6949b2cc157a185c8229 +# Test 256 (edge case for u2) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d00b5200da7a45837f5b71c47e1b94c7862a1e4becba30a908ada219487 + +Px = 0x7be4b0ea0b15b96f91312c15c81629e40c4418f70b86c5bcdc258fd9 +Py = 0x79cbef8ea2a77ca092db0eb954a9e33e82b9c5f110c8c990b9235a57 +# Test 257 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c652b78716ed799aec6bacac3a3e0a7bb360f2832493f286d191a626c + +Px = 0x64a64cffa54066499264991e47a0f14bca6319a1c27e1508e2016b56 +Py = 0xbda7c17a04d9cb88eadb7296cf87dfbfadfe65056837a797d66997dd +# Test 258 (edge case for u2) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d0097c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a2 + +Px = 0x3d4c4e3c5ba7a533c8a3386d6ff77a81351346e1894b2560b406a63e +Py = 0xa349775946799eeb274926b4d957328f6c7d50f6760291acdaeb114f +# Test 259 (edge case for u2) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d00aba8d89c2c94ba58e70db786a6181dc0e71d16f3f43d9600fc4c8ff3 + +Px = 0x4db8e8ac43f22df75c9c09fe193b9cd83d5c9b73f37d1494761724b0 +Py = 0xa76082c35da862a1e2e8626ffa94ed18fcb1d897ec7ab52c322553ff +# Test 260 (point duplication during verification) +Signature = 303d021c7af295e6e4787252f34c527af562ca27214a66f6d6db4fd2c112b564021d00b1d010f74062eeaac0cecb2c3c2c4d288a576bf6f0a00347c6a5b562 + +Px = 0x4db8e8ac43f22df75c9c09fe193b9cd83d5c9b73f37d1494761724b0 +Py = 0x3060b1e6c89b03e4472fcdb57b3cea6eb3ed2ebfab5fd4c94ca36d00 +# Test 261 (duplication bug) +Valid = 0 +Signature = 303d021c7af295e6e4787252f34c527af562ca27214a66f6d6db4fd2c112b564021d00b1d010f74062eeaac0cecb2c3c2c4d288a576bf6f0a00347c6a5b562 + +Px = 0x2b92268208d522450c42f3fcbda409c3ace2a5f857ea10612c6093f8 +Py = 0x315eb2d448134e716b032078b68301622e3c2186ab583d976e769feb +# Test 262 (comparison with point at infinity ) +Signature = 303c021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a021c2b26a42207a714813b9e70077df698b829d158dbe2c625ba5454b71f + +Px = 0x4d4bd5693d86dd9a6016ba806d8031f94dc8e2d33c6f5871a00b6473 +Py = 0x2a4662f29524ece754828b9d829c0a0724d9bd9d288d21f87e3fb1fa +# Test 263 (extreme value for k) +Valid = 1 +Signature = 303c021c33b7e498bcda1a33e61a67af56a36d12df7032255ddf5e1ec65a5669021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a + +Px = 0x606ce6f8c77ac17d5b7515d5851eed155ea120cd07ca4277b35b8d36 +Py = 0x5f716b62aee9a81a011bd1d2bceaf37d5f3a61e5f7307e0bb9c892c8 +# Test 264 (extreme value for k) +Signature = 303c021c0d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a + +Px = 0xd9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d +Py = 0x58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd +# Test 265 (testing point duplication) +Valid = 0 +Signature = 303c021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c021c1ed2753ce0e50ea573ba500559f948838b95889d0fb21af2ce85a75f + +# Test 266 (testing point duplication) +Signature = 303c021c628580a9adb02604525b1ee6b135e1a9c745021824582c52385a8173021c1ed2753ce0e50ea573ba500559f948838b95889d0fb21af2ce85a75f + +Px = 0xd9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d +Py = 0x7f16ddb2b382f4170551778727042b637b5368bdcd36932208b4be32 +# Test 267 (testing point duplication) +Signature = 303c021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c021c1ed2753ce0e50ea573ba500559f948838b95889d0fb21af2ce85a75f + +# Test 268 (testing point duplication) +Signature = 303c021c628580a9adb02604525b1ee6b135e1a9c745021824582c52385a8173021c1ed2753ce0e50ea573ba500559f948838b95889d0fb21af2ce85a75f + +Px = 0xb554fc25e9f098eaf1466c35328c97305d0d4aa0e4462e8baf7a8e7e +Py = 0xd08fc40eb01dc855577baea9e3070770616f57b17ea9854cad93881a +# Test 269 (pseudorandom signature) +Msg = +Valid = 1 +Signature = 303e021d00b982bea80d10816bb450a3faaaed4ed54fb197b3bff95af25d7d3786021d009e6ea2e58713f1304d29debf8559a74a89e018bae28b05556e5482a1 + +# Test 270 (pseudorandom signature) +Signature = 303d021d00ba756b27dd4f6c795578207f7422ad8e1ce9b2269c1cdd78f399f5e5021c349524440fc7eaf8553471eb36806d6f57ac2cc622b96acb6cb6fa4b + +# Test 271 (pseudorandom signature) +Signature = 303c021c20c0d4cd5c5919bb5fd7597fb16b8b688a0920a09fc8f905c61d5837021c10265abb068dc3652696dc9cfd6bde3faf0d255113d2c67541919bb3 + +# Test 272 (pseudorandom signature) +Signature = 303d021d00cb3fd8aa5afa71fef0def1e8bfb6f9d3294852ff7796e4ed1969d69b021c2ba29a89dbab65c1f4f6493699a49f6525c53e7079e3e8b04aa27cef + +# Test 273 (pseudorandom signature) +Signature = 303c021c434e3dd89c62d184ebbff3381998d65e262587551e2d5cd7c363c348021c04cd5dcbdf55da37ddb017b43c598011de9ef44ccd3f7beb58b0b865 + +# Test 274 (pseudorandom signature) +Signature = 303c021c32e4338400d6da3000a387cabd9c591bb6655b30778e88c936e6568c021c1c221fc827fe59b7031d55feb72e115b4b5ccd66b25b0ecc36000046 + +# Test 275 (pseudorandom signature) +Signature = 303c021c710c37bdd281f6b555b19191f276124495e6f3107dadeac88093607f021c30708492dc458cb80df1bd89bcba5f8396008878bfa171f45659527a + +# Test 276 (pseudorandom signature) +Signature = 303e021d009e0697c0da456a2307ec34976b81824da7ab53dc4aef71f18f88239f021d00b832d148bb79764875b34173a3a571b12f3bc272fb959a2520ca4495 + +# Test 277 (pseudorandom signature) +Signature = 303c021c785207e4354e55e458ac8e2c097b5627f63c19d8ae04e9f7042c18b7021c2abae674a4d5f4894bed0eac8a25d0bb025beb7c0a234ad16c4ccf99 + +# Test 278 (pseudorandom signature) +Signature = 303c021c129dce4db87a34c9c6a3bd0ffb9e08457827447c87ee0591f3476656021c79306c25b6922814f44dfa7cf3f1dec3341b9f4c3b9ad7633f10ccaa + +# Test 279 (pseudorandom signature) +Msg = 4d7367 +Signature = 303c021c4dabc5fe962b5f8a6681e94a2165d9b6be1940f20e27ceb73fc4ea7d021c746e9bba7efb90fcecc263c229a16d809d3547c28a26cd71a52abdc5 + +# Test 280 (pseudorandom signature) +Signature = 303d021d00babe417d8a35754274546468ad80844ebe757569f032d8dce504f5b5021c7770f402ed46775e945cccf1d63c1c789a182c74c86f9de42987624f + +# Test 281 (pseudorandom signature) +Signature = 303d021c3d060bfd635fd6e77fddc1364cab4fb1d1e947c3d18f7ffb6931c540021d00bf2b652d489cd938939fbb606b827d4ba2797ea179601da68e6b7a94 + +# Test 282 (pseudorandom signature) +Signature = 303e021d00926000093199a8ffea2b30807353c589bfa67c1cab70416235e2a4f5021d00d600ab30ab70afcadfd7905df9abc7079ffe44b1b834822dc21a7442 + +# Test 283 (pseudorandom signature) +Signature = 303c021c4e48f99f529802582c5dee87a916d8e1906e0495a9c1bfb88adbf15e021c57d614ab7e5ab325dbf617ae8368e41d6800ea75e72ed3f96e3fb13f + +# Test 284 (pseudorandom signature) +Signature = 303e021d00b26058ec42348b7fd8760589b381971d656fee1ccaf90258fdebda12021d00bda18580af3355a4dab38b5d1ae24273cd3b562ceb7ba41c1f80a105 + +# Test 285 (pseudorandom signature) +Signature = 303e021d00aa05f1c9c2891640907eca5b95de643896818e2805b8f616d463ab8e021d00873230841c15abd2064936d1e7e40ae092b0a773d92b83e20dd3a01f + +# Test 286 (pseudorandom signature) +Signature = 303c021c430c2580dfe044ccdd85b4ff20a5cfe3a04e645f20e2c6cedb180940021c3669a152244b98e5b9a1dcf2744574efc6905e7047caf04303e88c62 + +# Test 287 (pseudorandom signature) +Signature = 303d021d00d07c02eff9cbbfc044bb1b01a46873fe2d9dc8979a9540e4dbd07d68021c539547a6035138f187e61d9db461fd294e958bc9137b41ee13ba79dc + +# Test 288 (pseudorandom signature) +Signature = 303c021c5cf7da29833d9d79ce765b41445cfeb87097e9b09af84c60a95d1204021c1908014a0e861d27b5dbe4785e2f340aa6618084a0dd180dd81af796 + +# Test 289 (pseudorandom signature) +Msg = 313233343030 +Signature = 303d021d0095b11e320007a2e0f8ce00f9058ca9b919e8d6aad544a8f9808b44a1021c15a962019c85a5b1fa7474162d03cd0e528e8b93bcc84920af579f61 + +# Test 290 (pseudorandom signature) +Signature = 303c021c35c61adeca7686039807e7c7cfa52b9820d02c3e42330127e0dbed89021c0b9561879279d6cf7f3d31bb44ec2e01cbee2fe67349a5e6e9703cff + +# Test 291 (pseudorandom signature) +Signature = 303c021c26654e4fddebbc950fc1e4a2f38d2d0ec7f99d87efb408dea83b89f4021c3e0a8eff55b91708625add7b1cb06090a0ca9090ca32e823b37d867b + +# Test 292 (pseudorandom signature) +Signature = 303c021c7c6741f30ef739b439840a08a3ee1f642eb60ecfc5c285cfd645f36b021c5492572d19f0721f3c586d1948bba2ee218301a0c2d24d0ceb37cc5c + +# Test 293 (pseudorandom signature) +Signature = 303d021c74c449469f41e7c0bf63a70c37c4e1144b4398665b0f7d7880069364021d00baf380e709c209b16071b36a6898a55b4844b6a49d9c8dbb9c658724 + +# Test 294 (pseudorandom signature) +Signature = 303c021c2fb12ab3ddb4a17ae88b082ce89a0c7b8dc0beed0ebcd3884b4b9a78021c3e526f6bd6e114bec8cd0ed2f7f755dcab5facdcbf8ec9f9a0f3fd10 + +# Test 295 (pseudorandom signature) +Signature = 303d021d00c9aa0a2bd104d97f05f4da5e7330c242da7935d43e5834228b0ab14b021c3d1cc35a16fa1f006e9037d630fc43345892902f51e633fb172569ba + +# Test 296 (pseudorandom signature) +Signature = 303d021d00b4d81368ef579cc9029ed8c8211e9270cf79cce2431006a583f5a304021c385cac816b704e26b80b701c4e80b5303702d58aa0715f608a5391d9 + +# Test 297 (pseudorandom signature) +Signature = 303e021d008056544bd4d2d5b01087d3b0751b0a341d0b350f6780e5caae67b11f021d00b98eb47d89aadbfdf6c4279d8829753b440e735cb38b1dbb428d7a0f + +# Test 298 (pseudorandom signature) +Signature = 303c021c25145fc2a37861e8289ee269e8fee366730843f32017a9b6b83a7fe8021c7eeb69a821418a70a8a9eee2c59607036796918839f67a588f155b0c + +# Test 299 (pseudorandom signature) +Msg = 0000000000000000000000000000000000000000 +Signature = 303e021d009e4dab9e0b0097e365783fc05f010c160d361df7925b0ddbdfece88b021d008406a365f078f031e6fad6511d69f8a65483c19a5a800c39490f7510 + +# Test 300 (pseudorandom signature) +Signature = 303d021c10ea9ef0f6b0762ebed9ec2ec0e8fde0b254c87beff6a975710d4ee9021d00d29cbcb4b2c0b475bdebdd6c7a2043bccb1ceda19a84cd6234f68b2c + +# Test 301 (pseudorandom signature) +Signature = 303d021c7e362ec35e0c072e374cf04fb6eff855fcd8e10288113225976e033c021d009e1182ce4e7595357fa495615ceb02df59c416868cb28a58474e030f + +# Test 302 (pseudorandom signature) +Signature = 303d021c104d42246af6d22318e688dafbb0703146817ee657d1b12499423460021d00a75680daa57dcce75f3cff4cf3b02909805943c3f5310b1f013b6d24 + +# Test 303 (pseudorandom signature) +Signature = 303d021d00a23101edfa421660e5bd64ec13bc5260c10b2bb61e6887d09b64c649021c5610c1da8da1e3af8da09e11ef0bf307b073e8665cac9bbbaac83c59 + +# Test 304 (pseudorandom signature) +Signature = 303d021c44eb3256b59074a5405ba06f4c99d3fc19fa6ed1ff933f075d3d6e66021d00821fa7514a75cf244e4c2071541c4477dfc40bfeafd179127a5fa68f + +# Test 305 (pseudorandom signature) +Signature = 303d021d00c3a73348f5d2d0b6a2fff18c1b54462139f40f5b332717cd30072013021c2c7b47057955964960eb90f2d7b81bb21dc8bc4525f2e5a14e02a981 + +# Test 306 (pseudorandom signature) +Signature = 303d021c4b03770b93c962d4acc12fe635a755524fcb773faa783679cfa8c882021d00d1e3320eafe1a8f81016391687fdb7f0aa35922c36b9537655217f64 + +# Test 307 (pseudorandom signature) +Signature = 303c021c35acb58706f19cf74b862c34671de7a67f50f86ae298e6ddc9333626021c29c56614e6e2ba3231c998898c9265c6ec6fbca521d01ddc4368e0f5 + +# Test 308 (pseudorandom signature) +Signature = 303e021d00c61fbbf5c63cb8e3426c95c327e329edbda7b6ffe75312df8bae43ed021d00a07284d3b51cc9d42aefb07c21b9304b7f3087610a82ba421c6eab92 + +Px = 0x802a0f51204ef6a829211bc0740887461ee4aba736e9caee00000000 +Py = 0x7fb931e06300451362d444106eeb5dabddca650fec4be55fc545f7c8 +# Test 309 (x-coordinate of the public key has many trailing 0's) +Msg = 4d657373616765 +Signature = 303c021c0c93fd7f6dd0b697d5c287ee61aee4dcbedcc20885c1e6215b8b3608021c3bc7a1beccf1a8e83af2f5162fc539a1d062bd639a2fbec512907a27 + +# Test 310 (x-coordinate of the public key has many trailing 0's) +Signature = 303e021d009e0b620a2f313ada756463a22988afb6571b3b030a4285b185e1cc80021d00c3eba04c42e64d4028acabcdcb7b2eed1b3cfb560b8d7d14fb26aca3 + +# Test 311 (x-coordinate of the public key has many trailing 0's) +Signature = 303d021d00a306f500da4f0a30946479936aaf9c637676b0f02d20ae0d981c25eb021c015647f2500bcbe3204bdb804972b841890b4e53196cd8b188993151 + +Px = 0xcb320c84f26c00a1b4ad7146914cae126529165de7363d8aef9abd05 +Py = 0xa397d46b87283176b7f69da1f94615ca4431fc47b2a0e60c00000000 +# Test 312 (y-coordinate of the public key has many trailing 0's) +Signature = 303c021c04f00dd44fdd8ae6b08b86ccbdd7d615aa9e498a89b35094c8a9a6fe021c49617a1617c56ce90d41c53eef4e628f24c047a06e02c1f92123441f + +# Test 313 (y-coordinate of the public key has many trailing 0's) +Signature = 303c021c1286f6a7375bf68051e31b2e32b5f6c0988c9189799256e7ce64e291021c52d3c1f9e777f23c17cbc832d0e5a84bb68b13debf393878d1a06498 + +# Test 314 (y-coordinate of the public key has many trailing 0's) +Signature = 303c021c582825df2368dcb92fbba3fa6454d149d3b860e3ff326afe36215813021c49334fc6a70418dbc454da6a997bc8376270c3a38863adb2aa70bb0f + +Px = 0x81df971744a25ac99472c3ff5a8fc49b86fc9fb570448ff9 +Py = 0x77f2d07c1c9296b2f77478d13d5ab1c63993962f2dd08ee7c313dece +# Test 315 (x-coordinate of the public key is small) +Signature = 303d021c5a11718c90a02459800f109e4e840cc261d782d64e1c8a4712dd9081021d00d283b1c1e110a4620a696fdf74a9c7792352139d54cced8c973d9e7e + +# Test 316 (x-coordinate of the public key is small) +Signature = 303d021d00d577f23e592414e351b3928a593c5d2f89f0c72df513bfbc6535babb021c1bb09dd235124a14e0246946f280450f15576912aeb735b73ce828bc + +# Test 317 (x-coordinate of the public key is small) +Signature = 303e021d00af8f836e63995dc715a4d3c6842c4e6c6cf4586df76e4659d809eec9021d0085befd0b1bb8ae182c05d071dad180224d22533dce737d4dda74d5d1 + +Px = 0xd28b4f7fe1f6c6fa6a77d11e43bd3e9271758df34c65fa577a6dd3b +Py = 0x2801d48382861684b8d2cbd7e5989a0d7c15a7e819b573aa +# Test 318 (y-coordinate of the public key is small) +Signature = 303d021c156aa78692c78e9769aba728c9eea78835b55000901ba50794a33efc021d00b9785df40a2213377481311b1a81d310e76341927b8fba0d6e3ec7ad + +# Test 319 (y-coordinate of the public key is small) +Signature = 303d021d009274d46a7ffa1299a372e821bd89728de83ef87c46af67043a634b02021c19e4bbec8b03fa772a3622bf4893e581efadf9d20bd60806d82676b6 + +# Test 320 (y-coordinate of the public key is small) +Signature = 303d021d00cf6a9cba285e56493cbb462b7b16128a0cf1c7058447945daef34149021c29a687839e8ee03c5372a113733c081f413d1f9405ddfe47e18fcc54 + +Px = 0xd28b4f7fe1f6c6fa6a77d11e43bd3e9271758df34c65fa577a6dd3b +Py = 0xd7c134a9fe419202a79219a0bcff0bafcb066d4a1bc4e20d65134d55 +# Test 321 (y-coordinate of the public key is large) +Signature = 303c021c592e54a0ea950ac7cd830f56c7954a769f81aa55e8e101bee19b3b27021c48375fdd4d9014c9b60b63c70bfe98c844be668f2d3a2e259262b945 + +# Test 322 (y-coordinate of the public key is large) +Signature = 303c021c1ec0ef4d5bedafe5081f7adae32db4d0aa946f130acedabae26d90dc021c627e81d7eb358f59e8a8630527d4e8946d1cad2196761836d97d953c + +# Test 323 (y-coordinate of the public key is large) +Signature = 303d021c5faf035ed5774eeb0adc187ff485a846aa2abcf1e7f859b1b910f25c021d008bf12a1c00b18f66c228352de49cc4fb827a09fc86f722ce561ba5fa + +Px = 0x512e581731c9c460bb705b60da976ccb1b0ef421785106ba2ccdd238 +Py = 0xf21d5bacdf81c0cb78fa151237db3130ad4def373f3e523398c2cf7 +# Test 324 (y-coordinate of the public key has many trailing 1's on brainpoolP224t1) +Signature = 303d021c52b2d369f18df56372afe7feb38413f232b4fb9ca16c6f6fedc64189021d00c1b19f137773ef3201cd341c381e4f9449cc0e6c688a351d7a6070b2 + +# Test 325 (y-coordinate of the public key has many trailing 1's on brainpoolP224t1) +Signature = 303c021c5b889d288aaa81674d32006e81279c57ed56a035c878d3e2b687bec3021c0da621d5fa9813263c7f58f8e0155d6f0c330a56c594defc2ebdf0a0 + +# Test 326 (y-coordinate of the public key has many trailing 1's on brainpoolP224t1) +Signature = 303e021d00b6f8a80187180aad8a5c896be214314601a1585f2ccb28bc7e8e8f01021d00a90c68c14a67f5d59cec70dc0f473b5c14013b056d12cbc0f7153b1d + +Group = brainpool256r1 +Hash = SHA-256 + +Px = 0x19a2d9637743a63ddaefdbca0ee229a163b809b9b145e5313bbeb8defeab9d6 +Py = 0x548caf89bf5ba49499404145651234336401b9b2843a579ed152e090f11b9e59 +# Test 1 (signature malleability) +Msg = 313233343030 +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220426e857aad3ff7aa96e4d200c03b45f1846a36d089ee3917768ca1a0d6d4da6e + +# Test 2 (random signature) +Signature = 304402202440b00de8c6c2caff40d4a92e21cb5e40b53cd66296534082dfe6b9840613300220352db8c44dd8bba94d5c43fba80cba0481a63e60016b1703b9cc0bcba9701887 + +# Test 3 (random signature) +Signature = 304402206ac21e51a7de98bac9052dcaa98daebf98161f2c28a45f099b5306ecda66bdb402200bd37d7e15a660ace09d0000e047b84c27f7812404fca7e57040a32ca32fc1ff + +# Test 4 (random signature) +Signature = 304502204b69a0f8c8d8ca25839cc4de98ff7e6a383f680383aacc8a5d88945e499740f10221009dcc1528103e2e924f1bfce57351c4ebe00a1ab5c0eab3d4cb12f0821526ce77 + +# Test 5 (random signature) +Signature = 30450220257bed3322bfa437df5825989783142fd43e2a80d52f021bb9330ebf8b29656002210098c443f939ca786726eb0149c12cbaabd0bc984ee4a347731d1565967345256e + +# Test 6 (random signature) +Signature = 304502210093e58a5b712d6508b13fe34a1c39d0dfd77fed09b2c8593316902792c4e0aaca022054e1fa0c3d1def63f9cc5881c8e31fbc561f04c367c7cfbb3e92250a04e88544 + +# Test 7 (valid) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 8 (long form encoding of length) +Valid = 0 +Signature = 30814402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 9 (long form encoding of length) +Signature = 30450281200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 10 (long form encoding of length) +Signature = 304502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f028120678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 11 (length contains leading 0) +Signature = 3082004402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 12 (length contains leading 0) +Signature = 3046028200200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 13 (length contains leading 0) +Signature = 304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f02820020678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 14 (wrong length) +Signature = 304502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 15 (wrong length) +Signature = 304302200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 16 (wrong length) +Signature = 304402210a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 17 (wrong length) +Signature = 3044021f0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 18 (wrong length) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0221678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 19 (wrong length) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f021f678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 20 (uint32 overflow in length) +Signature = 3085010000004402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 21 (uint32 overflow in length) +Signature = 3049028501000000200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 22 (uint32 overflow in length) +Signature = 304902200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f02850100000020678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 23 (uint64 overflow in length) +Signature = 308901000000000000004402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 24 (uint64 overflow in length) +Signature = 304d02890100000000000000200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 25 (uint64 overflow in length) +Signature = 304d02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0289010000000000000020678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 26 (length = 2**31 - 1) +Signature = 30847fffffff02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 27 (length = 2**31 - 1) +Signature = 304802847fffffff0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 28 (length = 2**31 - 1) +Signature = 304802200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f02847fffffff678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 29 (length = 2**32 - 1) +Signature = 3084ffffffff02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 30 (length = 2**32 - 1) +Signature = 30480284ffffffff0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 31 (length = 2**32 - 1) +Signature = 304802200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0284ffffffff678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 32 (length = 2**40 - 1) +Signature = 3085ffffffffff02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 33 (length = 2**40 - 1) +Signature = 30490285ffffffffff0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 34 (length = 2**40 - 1) +Signature = 304902200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0285ffffffffff678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 35 (length = 2**64 - 1) +Signature = 3088ffffffffffffffff02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 36 (length = 2**64 - 1) +Signature = 304c0288ffffffffffffffff0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 37 (length = 2**64 - 1) +Signature = 304c02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0288ffffffffffffffff678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 38 (incorrect length) +Signature = 30ff02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 39 (incorrect length) +Signature = 304402ff0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 40 (incorrect length) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f02ff678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 41 (indefinite length without termination) +Signature = 308002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 42 (indefinite length without termination) +Signature = 304402800a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 43 (indefinite length without termination) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0280678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 44 (removing sequence) +Signature = + +# Test 45 (appending 0's to sequence) +Signature = 304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000 + +# Test 46 (prepending 0's to sequence) +Signature = 3046000002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 47 (appending unused 0's) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000 + +# Test 48 (appending unused 0's) +Signature = 304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f00000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 49 (appending null value) +Signature = 304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390500 + +# Test 50 (appending null value) +Signature = 304602220a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f05000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 51 (appending null value) +Signature = 304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0222678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390500 + +# Test 52 (including garbage) +Signature = 3049498177304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 53 (including garbage) +Signature = 30482500304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 54 (including garbage) +Signature = 3046304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390004deadbeef + +# Test 55 (including garbage) +Signature = 3049222549817702200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 56 (including garbage) +Signature = 30482224250002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 57 (including garbage) +Signature = 304c222202200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0004deadbeef0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 58 (including garbage) +Signature = 304902200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f22254981770220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 59 (including garbage) +Signature = 304802200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f222425000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 60 (including garbage) +Signature = 304c02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f22220220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390004deadbeef + +# Test 61 (including undefined tags) +Signature = 304caa00bb00cd00304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 62 (including undefined tags) +Signature = 304aaa02aabb304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 63 (including undefined tags) +Signature = 304c2228aa00bb00cd0002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 64 (including undefined tags) +Signature = 304a2226aa02aabb02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 65 (including undefined tags) +Signature = 304c02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f2228aa00bb00cd000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 66 (including undefined tags) +Signature = 304a02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f2226aa02aabb0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 67 (using composition with indefinite length) +Signature = 3080304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000 + +# Test 68 (using composition with indefinite length) +Signature = 3048228002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f00000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 69 (using composition with indefinite length) +Signature = 304802200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f22800220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000 + +# Test 70 (using composition with wrong tag) +Signature = 3080314402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000 + +# Test 71 (using composition with wrong tag) +Signature = 3048228003200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f00000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 72 (using composition with wrong tag) +Signature = 304802200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f22800320678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000 + +# Test 73 (Replacing sequence with NULL) +Signature = 0500 + +# Test 74 (changing tag value) +Signature = 2e4402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 75 (changing tag value) +Signature = 2f4402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 76 (changing tag value) +Signature = 314402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 77 (changing tag value) +Signature = 324402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 78 (changing tag value) +Signature = ff4402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 79 (changing tag value) +Signature = 304400200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 80 (changing tag value) +Signature = 304401200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 81 (changing tag value) +Signature = 304403200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 82 (changing tag value) +Signature = 304404200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 83 (changing tag value) +Signature = 3044ff200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 84 (changing tag value) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0020678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 85 (changing tag value) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0120678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 86 (changing tag value) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0320678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 87 (changing tag value) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0420678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 88 (changing tag value) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111fff20678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 89 (dropping value of sequence) +Signature = 3000 + +# Test 90 (using composition) +Signature = 30483001023043200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 91 (using composition) +Signature = 3048222402010a021f5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 92 (using composition) +Signature = 304802200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f2224020167021f8cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 93 (truncate sequence) +Signature = 304302200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c + +# Test 94 (truncate sequence) +Signature = 3043200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 95 (indefinite length) +Signature = 308002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000 + +# Test 96 (indefinite length with truncated delimiter) +Signature = 308002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c3900 + +# Test 97 (indefinite length with additional element) +Signature = 308002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c3905000000 + +# Test 98 (indefinite length with truncated element) +Signature = 308002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39060811220000 + +# Test 99 (indefinite length with garbage) +Signature = 308002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000fe02beef + +# Test 100 (indefinite length with nonempty EOC) +Signature = 308002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390002beef + +# Test 101 (prepend empty sequence) +Signature = 3046300002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 102 (append empty sequence) +Signature = 304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c393000 + +# Test 103 (sequence of sequence) +Signature = 3046304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 104 (truncated sequence) +Signature = 302202200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f + +# Test 105 (repeat element in sequence) +Signature = 306602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 106 (removing integer) +Signature = 30220220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 107 (appending 0's to integer) +Signature = 304602220a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f00000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 108 (appending 0's to integer) +Signature = 304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0222678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000 + +# Test 109 (prepending 0's to integer) +Signature = 3046022200000a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 110 (prepending 0's to integer) +Signature = 304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f02220000678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 111 (Replacing integer with NULL) +Signature = 302405000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 112 (Replacing integer with NULL) +Signature = 302402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0500 + +# Test 113 (dropping value of integer) +Signature = 302402000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 114 (dropping value of integer) +Signature = 302402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0200 + +# Test 115 (modify first byte of integer) +Signature = 30440220085f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 116 (modify first byte of integer) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220658cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 117 (modify last byte of integer) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d119f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 118 (modify last byte of integer) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737cb9 + +# Test 119 (truncate integer) +Signature = 3043021f0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d110220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 120 (truncate integer) +Signature = 3043021f5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 121 (truncate integer) +Signature = 304302200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f021f678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c + +# Test 122 (truncate integer) +Signature = 304302200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f021f8cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 123 (leading ff in integer) +Signature = 30450221ff0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 124 (leading ff in integer) +Signature = 304502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0221ff678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 125 (infinity) +Signature = 30250901800220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 126 (infinity) +Signature = 302502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f090180 + +# Test 127 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3045022100b45ae44c5c1bb1ff143702d28ee43a86a590e44bcafda560b652e5bfdde567c60220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 128 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30450221ff60643495183e5e86976aedb153dd1fa38d1def04603a57719616c8baaf54ba780220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 129 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30440220f5a0738f45d2f7bd2a2f07be0e9f52eae6a89657ea640196d9cb28c2b962eee10220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 130 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30450221009f9bcb6ae7c1a1796895124eac22e05c72e210fb9fc5a88e69e9374550ab45880220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 131 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30450221ff4ba51bb3a3e44e00ebc8fd2d711bc5795a6f1bb435025a9f49ad1a40221a983a0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 132 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30450221010a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 133 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3045022100f5a0738f45d2f7bd2a2f07be0e9f52eae6a89657ea640196d9cb28c2b962eee10220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 134 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 304502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f02210111882a3c969d5bcde5e743207acbd4f19408be76e0d514d7a9af7b6457bbd2e0 + +# Test 135 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220bd917a8552c00855691b2dff3fc4ba0e7b95c92f7611c6e889735e5f292b2592 + +# Test 136 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f022098732d9f0b514dee587ec77022b7b87ff830bc2cd48c921fe66e931e3f8c83c7 + +# Test 137 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 304502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0221feee77d5c36962a4321a18bcdf85342b0e6bf741891f2aeb285650849ba8442d20 + +# Test 138 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 304502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f022101678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39 + +# Test 139 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 304502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f02210098732d9f0b514dee587ec77022b7b87ff830bc2cd48c921fe66e931e3f8c83c7 + +# Test 140 (Signature with special case values for r and s) +Signature = 3006020100020100 + +# Test 141 (Signature with special case values for r and s) +Signature = 3006020100020101 + +# Test 142 (Signature with special case values for r and s) +Signature = 30060201000201ff + +# Test 143 (Signature with special case values for r and s) +Signature = 3026020100022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7 + +# Test 144 (Signature with special case values for r and s) +Signature = 3026020100022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6 + +# Test 145 (Signature with special case values for r and s) +Signature = 3026020100022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8 + +# Test 146 (Signature with special case values for r and s) +Signature = 3026020100022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377 + +# Test 147 (Signature with special case values for r and s) +Signature = 3026020100022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378 + +# Test 148 (Signature with special case values for r and s) +Signature = 3008020100090380fe01 + +# Test 149 (Signature with special case values for r and s) +Signature = 3006020101020100 + +# Test 150 (Signature with special case values for r and s) +Signature = 3006020101020101 + +# Test 151 (Signature with special case values for r and s) +Signature = 30060201010201ff + +# Test 152 (Signature with special case values for r and s) +Signature = 3026020101022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7 + +# Test 153 (Signature with special case values for r and s) +Signature = 3026020101022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6 + +# Test 154 (Signature with special case values for r and s) +Signature = 3026020101022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8 + +# Test 155 (Signature with special case values for r and s) +Signature = 3026020101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377 + +# Test 156 (Signature with special case values for r and s) +Signature = 3026020101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378 + +# Test 157 (Signature with special case values for r and s) +Signature = 3008020101090380fe01 + +# Test 158 (Signature with special case values for r and s) +Signature = 30060201ff020100 + +# Test 159 (Signature with special case values for r and s) +Signature = 30060201ff020101 + +# Test 160 (Signature with special case values for r and s) +Signature = 30060201ff0201ff + +# Test 161 (Signature with special case values for r and s) +Signature = 30260201ff022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7 + +# Test 162 (Signature with special case values for r and s) +Signature = 30260201ff022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6 + +# Test 163 (Signature with special case values for r and s) +Signature = 30260201ff022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8 + +# Test 164 (Signature with special case values for r and s) +Signature = 30260201ff022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377 + +# Test 165 (Signature with special case values for r and s) +Signature = 30260201ff022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378 + +# Test 166 (Signature with special case values for r and s) +Signature = 30080201ff090380fe01 + +# Test 167 (Signature with special case values for r and s) +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020100 + +# Test 168 (Signature with special case values for r and s) +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020101 + +# Test 169 (Signature with special case values for r and s) +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a70201ff + +# Test 170 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7 + +# Test 171 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6 + +# Test 172 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8 + +# Test 173 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377 + +# Test 174 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378 + +# Test 175 (Signature with special case values for r and s) +Signature = 3028022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7090380fe01 + +# Test 176 (Signature with special case values for r and s) +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6020100 + +# Test 177 (Signature with special case values for r and s) +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6020101 + +# Test 178 (Signature with special case values for r and s) +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a60201ff + +# Test 179 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7 + +# Test 180 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6 + +# Test 181 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8 + +# Test 182 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377 + +# Test 183 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378 + +# Test 184 (Signature with special case values for r and s) +Signature = 3028022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6090380fe01 + +# Test 185 (Signature with special case values for r and s) +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8020100 + +# Test 186 (Signature with special case values for r and s) +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8020101 + +# Test 187 (Signature with special case values for r and s) +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a80201ff + +# Test 188 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7 + +# Test 189 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6 + +# Test 190 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8 + +# Test 191 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377 + +# Test 192 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378 + +# Test 193 (Signature with special case values for r and s) +Signature = 3028022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8090380fe01 + +# Test 194 (Signature with special case values for r and s) +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377020100 + +# Test 195 (Signature with special case values for r and s) +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377020101 + +# Test 196 (Signature with special case values for r and s) +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53770201ff + +# Test 197 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7 + +# Test 198 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6 + +# Test 199 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8 + +# Test 200 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377 + +# Test 201 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378 + +# Test 202 (Signature with special case values for r and s) +Signature = 3028022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377090380fe01 + +# Test 203 (Signature with special case values for r and s) +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378020100 + +# Test 204 (Signature with special case values for r and s) +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378020101 + +# Test 205 (Signature with special case values for r and s) +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53780201ff + +# Test 206 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7 + +# Test 207 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6 + +# Test 208 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8 + +# Test 209 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377 + +# Test 210 (Signature with special case values for r and s) +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378 + +# Test 211 (Signature with special case values for r and s) +Signature = 3028022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378090380fe01 + +# Test 212 (Edge case for Shamir multiplication) +Msg = 3638393434 +Valid = 1 +Signature = 304402200c939a92486c6d0d619510b4a94162b9221be2eb15faf878bff75e6cdf4e370702203977619b43e6b4ea1870d861206483b306560e3c4a3ef82b11a802ff8892dc1d + +Px = 0x4b402a9ae18fc1a87cda337483900499fe729e471607671651a263fbf0d93f78 +Py = 0x1ef9b0f98fb73bcb605a7823a427ea5f0d98788c7dae42a04536202022c021cd +# Test 213 (k*G has a large x-coordinate) +Msg = 313233343030 +Signature = 3036021100e2027b801fc479308ff5399a8825fccf022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4 + +# Test 214 (r too large) +Valid = 0 +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4 + +Px = 0x40a2df0f17c7873459d5e9ac11fff84deb5f40ff9a52df8745bb4770f6dbf581 +Py = 0x99c2bf4920e9c8f758c2de69e42c1cb77c58425a9dafa41d7b0873efa894cedc +# Test 215 (r,s are large) +Valid = 1 +Signature = 3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a3022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a2 + +Px = 0x9de669f9444da82e429f842f31c64418d4d7b05e93f41daddd09fc181ac227c6 +Py = 0x1c86210e8291fc5ae30c72e2013ec22bb97d88bf376d4a85dd1bb71b22526d1f +# Test 216 (r and s^-1 have a large Hamming weight) +Signature = 304402207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02204ab8de0a51481bc45794b924518f2dd6ac5cce31f3228d624c5a896f79a2d6a2 + +Px = 0x30345b6451377b78a54ac6e110f50c7de71c2c760278373607722c53f5867907 +Py = 0x59acc40014c93d4ad44778bc1a44ebaebe1a97c88ad11c1025057b6bc4377f2d +# Test 217 (r and s^-1 have a large Hamming weight) +Signature = 304502207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0221008b1b5f89f5bb74caa42d36e601a9f3c20b4e6c91ceb98a52fbfa9f81781b8a17 + +Px = 0x149d893f1306fb253bbf3a8691aba8a50002b0a27693aa97435a7b5cb33a55ee +Py = 0x24b075fcdbc1a739f2f492dbe4799474ee3ad3804447e7d584e3430ce15a968a +# Test 218 (small r and s) +Signature = 3006020101020101 + +Px = 0x156e626649ce8236982201a24935fb3d36b0d73041b6fdca97990a8d152efb8b +Py = 0x326f4b20a0cc4623b02a6bb17114901a01de0df1716d669d253de440cc8f9cdd +# Test 219 (small r and s) +Signature = 3006020101020102 + +Px = 0x10cc7992ede28c7b4dda5c35cbd71174918e83adab0342cc3d556a413b4ce93b +Py = 0x3f9c3b38aef0a0e687d7ee6afde70d47d6900ff0ce62156e8645b8103fc66cad +# Test 220 (small r and s) +Signature = 3006020101020103 + +# Test 221 (r is larger than n) +Valid = 0 +Signature = 3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8020103 + +Px = 0x2ba28f6236c5a774cd104b036d2e016711cb4a83fa078b5150f69e5098de7b4c +Py = 0xa7c13ef8c57fcbe684ceff312ef53af1b14397d4154ba6106a3383aaed16ecb1 +# Test 222 (s is larger than n) +Signature = 3026020101022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82975b2d2e + +Px = 0x113489555bdc112352b08b7ffebcf05090f94da62367646b2e03a3478863914b +Py = 0x4b4a0a435462a122f6d9ac801319bbc6d2c59228861a3414b500e5cf5943c964 +# Test 223 (small r and s^-1) +Valid = 1 +Signature = 30260202010102202827370584fdeb9f5d5a9fb9579a09390efb6f9d99b64fc188d8bce05c2d4eed + +Px = 0x34224746efa8c5d4f4c6b82de4d76d3e7150c1b69e23339f098ff769bcac94bf +Py = 0x94618e3624a57d48d19e72867dbc191a0fd05cf6f4b5ec497b797626a57baa22 +# Test 224 (smallish r and s^-1) +Signature = 302b02072d9b4d347952ce02204937a087731df4febc2c3a81ddfbab5dc3af950817f41b590d156ed409ad2869 + +Px = 0x6fb0cdf3b08dc5d8b7e5259c7d1bbd31a2235345b7b445631e894b567d23c079 +Py = 0x53243207df5c446011c1cfedde6e5351958affa8f274fe5af435759de87db343 +# Test 225 (100-bit r and small s^-1) +Signature = 3032020d1033e67e37b32b445580bf4efb02210091827d03bb6dac31940ba56ed88489048ff173f0bf20cab20dcc086fca37f285 + +Px = 0xb8d3bef12ebab43f2f6f6618f0843d5f45d97874f26f9a36b788cb7a69ecf5f +Py = 0x855588c99b3839ca9361ddc77645f7592ad371438ee3e186c74081c481dd5295 +# Test 226 (small r and 100 bit s^-1) +Signature = 30260202010102203eb35fe7e8331f71e4c63b45f349a99d47a5e781798e579f2386195d3827bb15 + +Px = 0x6d24985342a45a55fd99e47521fe3e991b8a1d376fa73899d3bacc067c12ee0d +Py = 0x6542f148599fccb99b1ba28d3805814292a99bffe371df277b09e8ada1253dcd +# Test 227 (100-bit r and s^-1) +Signature = 3031020d062522bbd3ecbe7c39e93e7c2502203eb35fe7e8331f71e4c63b45f349a99d47a5e781798e579f2386195d3827bb15 + +Px = 0x4125e46820f41206b670882a9d8d51b6bac39091150c9cb33b6d009e0cff5223 +Py = 0x65749240622b40d70a63407952c1b8761c9f8e85aba6f03bbc7219e24e6fb276 +# Test 228 (r and s^-1 are close to n) +Signature = 3045022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e8297485628022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2 + +Px = 0x91ba1706a19ce58faca26366dced293399450efa488f2c4baa95693b974d075d +Py = 0x5e8401565a37b05b9351e408af542bf0f7957e5eed182afeabeafa2bf7bbbb47 +# Test 229 (s == 1) +Signature = 3025022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2020101 + +# Test 230 (s == 0) +Valid = 0 +Signature = 3025022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2020100 + +Px = 0x25d17570e4bae1e468e6dd0975b382368061e0c704241c1d18fd5baa8ca8dc13 +Py = 0x5acadcd13992f6665b469c9f9ab7797e3c4b881c6d7f4d2601c96a1536f76d05 +# Test 231 (point at infinity during verify) +Signature = 3044022054fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b53022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2 + +Px = 0x8afd47eb0667860bec98d5dcd2f60da9eac1ae99620569892f14e094d635872a +Py = 0x5e8f0bc67b98a233ade715c04d9daab11a27517a92cf2651c9e5f2fde4e2db98 +# Test 232 (u1 == 1) +Signature = 3045022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023 + +Px = 0x876616636a8dbc82160ac01af2941353ba0eea4a3b8fe31696b47317d4972c9 +Py = 0x23180073061d27984ecf491f394004c3a4846d773f58dc2ab5e43dcbf968d027 +# Test 233 (u1 == n - 1) +Valid = 1 +Signature = 3045022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2022100989c5cc31440c1168f88b32ba6e47900183c0d843f9c41671898030664305d2b + +Px = 0xfabb052217eae8e63fea4eea09953d51862427f341307d819ff6e933bf72ba9 +Py = 0x4b897f2c4a4cf57054c363c720da3d242471cc8e493becb0de022251d2ee4c8c +# Test 234 (u2 == 1) +Signature = 3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2 + +Px = 0x72ebad749b504c874d21bc5e4bba545dd42eb5fbf78af42043f5cef10aeb3ad7 +Py = 0x45227464e1e9cef662f43fc80d4ce7eb7eb615a23699d48e89b278abd46ccc46 +# Test 235 (u2 == n - 1) +Signature = 3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2022071523a926bf4712829995c6069025e4bb2d0fc6d23966f4fb5695f01ba3039c5 + +Px = 0x744e218a04b31471b05e679c9481446bcd72a4d0fca7a7af1a1fe2f574d9362f +Py = 0x60c0c52843d8d72cd636153f0f510a09089fc4478372dfc50e5b91d5301ba75e +# Test 236 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022005ca53b2d9e4a2e1e4f47276fcdfb17b26a9cf0a7c9721dad28203d41107fdd4 + +Px = 0x7ea53d3c4635a4d5b60d79aac79d974c759263363472146a4605280d935ffc75 +Py = 0x59790403c96459b20477eaa437b3c7decd5e690faa940c0891de0cd07d41813c +# Test 237 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205448aa82fc57740b2e1ebdf989baa145b018b423b3761feb055959eb6a01f1a1 + +Px = 0x750462a163655746af66ba3eb48009a490d970799280586cfe59316365dc4ef0 +Py = 0xa2f1567257bd9aa1dcca3cd276ffaeb1dd85cea28d888a98642bf09a98f69f11 +# Test 238 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022065bfcce69b89eff545fb0a67d2581a5f253484ef538b9b55fa862dfd2d488d52 + +Px = 0x323ae5754b417552cf968f5f3eea7187f7b1726e8c2e510f98d26430ac5849bc +Py = 0x327101d82adf87c932e8eaa6a57e1d11bd65dc8f404c113f65abaa6eeaf5c7c4 +# Test 239 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207a459e047395d81d3b00f4b8d5ad34442b35dec5e6c1b45a0678e65a1fe9e9e6 + +Px = 0x37a105e3ce3fb636733032d1ca56b4c659b451f64f4ba7378b087987e7a544d2 +Py = 0x782bad9b1654f2770d7a3ee35b672a366f685bc7191889ff2fa5c6b94ebe7ab8 +# Test 240 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02203b7739bbe1048b69fd05f9262f628e03b0770e7ecd82337f1482a72db0293232 + +Px = 0x13dd59454f6af3e9db115b7ec8c3a1c8d308fdcb4963c3b8ea1264e4afda652c +Py = 0x5d260b7fc9bfd200896d229f3c8daab9df2f55aa9ad95d4ea76aed8d74c5494d +# Test 241 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022076ee7377c20916d3fa0bf24c5ec51c0760ee1cfd9b0466fe29054e5b60526464 + +Px = 0x2c1dc56459bf09df50fb2d962f5989f3643021c5c360363e10e695a70b5942e8 +Py = 0x6216d3ca0cca31dbd92a4d28bf951437f6f45db41e8e41fdf72414a293f53087 +# Test 242 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02204a992824c737b00f02d23d2f2e3decf090b28ffa0e90e6d1e5dd157070719f65 + +Px = 0x137d6fdf836b1824378c08b35fa7ebe4e807d8a20105ce9cb3cd281f0a47c9c3 +Py = 0x7d6475d4958c16d950f0439d3dbf86c2d7e2b12e8b137efc62dd1c723b83a62 +# Test 243 (edge case for u1) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221009c092d165ef1b11a82b59c73aab3496631e3032038feda236db7b0f5a8e0cabb + +Px = 0x640213be1698b166f0c54e588e1b57a64826bf848adabfef60681d77747d2ca8 +Py = 0x646e45d961419d4ad1338c361228e1c6b6615398582c0e3e97f7ebc85a504423 +# Test 244 (edge case for u1) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100a90449e87d9de3ebed92a227735e45325b1d2d774b4876a86d0863349471ac59 + +Px = 0x269154ca58317552c655d2a9b3804dd94c2711145b9cd93c360f2dfe34cc1971 +Py = 0x98046cc90cc6a8ac48ef7bacc5cb7e57334fa91facbadb48952c9fee543d1bb5 +# Test 245 (edge case for u1) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100a4310428c80a06da59719819a0a3dbf6658fab9938ca851cbd9c0aae864058d3 + +Px = 0x240e0b64cee2e0b8890c2fa82de5848a5642ef0f7b2414f88f585281df7a1ff5 +Py = 0x3a5990f860da3053f821bea914059ced85c9c2390b0d860532dbccca7ff66692 +# Test 246 (edge case for u1) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100a14bda4f5b17b56966f75ede22340338d23ac413fa7ef42f545b08c47dbc59e9 + +Px = 0x96f3cb5eb0c33be205ec058a22093d739fe80a7ecc874399c14f7f6c38cfcc51 +Py = 0x47b3eccaecc9add2b1dffc988f13dcab15b7e910d0250e70a1d79b3b931c32ed +# Test 247 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022032dfe6734dc4f7faa2fd8533e92c0d2f929a4277a9c5cdaafd4316fe96a446a9 + +Px = 0x103b1bf6343d57260f652d272aaeff6cfa439f1583335eba66fa72d00eff7f85 +Py = 0x20f2bb035bd056c67ca22ca952abb5e1bcb68d67ca81790d24097f13d45209a1 +# Test 248 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02206353c7f3e0a4e33ebf7758dadf2bd9d0841328e13c75e252855f5a2b87c2c78c + +Px = 0x959b3bf372301993b37e20b4344f13c06d5c1c53c7737f166efb94832c3b9bbb +Py = 0x40d35ef46e4cfad475ddd1a1d9609feca7069712d30bdf4638d4c88bc9a12100 +# Test 249 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022014899bc6ff5e72338f3c9847fa6531c4337fde3fcf1c8c32f768fba3a402a964 + +Px = 0x6e69b17d83894e2e71ffce351b53459c0bb29bec379ff435f23c01a9b37df49e +Py = 0x3ba1053ad84236d82cf7c762362b37b24e3b0ee1f8ea6c543a2591dcb6681a8f +# Test 250 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022072655c5e4f1cefca22f413a612e5bfdd7ba9ae71053f68b0c74d9a73590013c3 + +Px = 0x336fc28e1f250485276747dfc34859b4741667b3ac46a0f6384decc1ac790304 +Py = 0x401206b5508aa06601a2246e7381dfecca6adb2b197ae14549a24c355cd53be1 +# Test 251 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100a2030dbf01d8c9de2900dc3845fda4e4c6bc049c4cd5717a9c629b9ed29d1859 + +Px = 0x913d9ce35b9c73203578e255d4dd35ff20212d357227d26b8a959180665b542b +Py = 0xa503d922d3fd65a07eca18c0a4e2d3f2cf7c05928b406458cb286e11dc62dcb6 +# Test 252 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100a1db7293b6f01594b808718e61a4d642dff4fee2fb471167ef7ab42959a473e7 + +Px = 0x6b76915cc1c854744a78dac9baecd59845b90ad9cd308f5a887dccc909dacd4a +Py = 0x7260456f8f8d31760d81bf85348d9f50c99d9918b480b1ec25f4e2e34de03769 +# Test 253 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02210099bb8d4bcbf1816d31aad88c25c61f1433b08322412c7bd84ed759d01c009127 + +Px = 0x647b37b731d3ead759762751995483469031084cd709887c9b6bafba462cbf84 +Py = 0x888c5b171f2b2fb7bb2b9d88200d79ac94d7d4025f79348e2283511c047891bf +# Test 254 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022041cee82a6957ef02ab3aa07a3315accc0d0d66c2081d530246d6e681873c90d1 + +Px = 0x1f761a1ae1e82e4af277b399da0a523e85644ce971c7b90236d03115aed9855b +Py = 0x55cdb3e104361fd2e0979863f29a3b0bf5542c5105c91dfc7c94643b78a2b7f2 +# Test 255 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220746d61572ecae774691e7809121986d9b93279b00934ff1def1f4798da89ad4c + +Px = 0x63d303162574962899fd9a323c5fe24a09188fa20d47a8d92ba502d4f886f5b3 +Py = 0x72cd0d82b3fd4f54fedc5d8618b142f63553e438cc1269719dee3abd3316fa21 +# Test 256 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220281b26a0908968099f8e1f610f4f358318baa21107b791ef6f24cb244677a64b + +Px = 0x3e1d966e05f04c44e162133d97730f6408a88ad990a2c6efb7e3e73a886f7ed4 +Py = 0xa40e3b3fd8b005fc417437f21011d9fbe38b329a2e7959ed9b040c8e1eb677fd +# Test 257 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022046a78fe7c149c67d7eeeb1b5be57b3a1082651c278ebc4a50abeb4570f858f1b + +Px = 0x56ac8e49b319d5d041ae3d3f91de229c0a820d7ffd97ea06196eee7507363f42 +Py = 0x787fc05eba606f77b984e57cabf911209700b5d39147a14c5d1a95f56cd5feb4 +# Test 258 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022014fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b55 + +Px = 0x5e2f228631ee7f00ceaf936278f2e2681b429fcfb8cb2c019b31f188839884f5 +Py = 0x30e1079a6b889393cc83fabbd524f21bb486c65b83ab0afafb17265d971bae91 +# Test 259 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008e305a1cf885ccc330ad0f1b5834a6a783f1948a5d5087d42bb5d47af8243535 + +Px = 0x6dbc5605b4e113932fede7b4743f4dfc62fdecae16735b51653d79ee008f2fc5 +Py = 0x1288fb2ca09ee336ef316b73919a7f3b329fca2f5c365cc427425fecf64f7bf3 +# Test 260 (point duplication during verification) +Signature = 30440220074c035603e1eb49ab5382819bf82af82929b500c6e78841c1b2c3ff54a615dd02202035ac9ea7119e30e54f369cd22aa27af38b566ae6093f1df35b612de6f07598 + +Px = 0x6dbc5605b4e113932fede7b4743f4dfc62fdecae16735b51653d79ee008f2fc5 +Py = 0x97725caf014fc6854f349f1d0be90e373b9c2bf478efc363f8d0e830291ed784 +# Test 261 (duplication bug) +Valid = 0 +Signature = 30440220074c035603e1eb49ab5382819bf82af82929b500c6e78841c1b2c3ff54a615dd02202035ac9ea7119e30e54f369cd22aa27af38b566ae6093f1df35b612de6f07598 + +Px = 0x8c5635eeaf7e994ff163ebdc9aacfdad1d50f9929a8035c36cf1c1e16d5b28f1 +Py = 0x3de48431f3eb823a384c940b2b0a01512da98b8f72bd9545d179d6f1cd5a2a63 +# Test 262 (comparison with point at infinity ) +Signature = 3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2022021ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4487 + +Px = 0x2b9999cf86f15a7471ff8d212ca3f9a99225851b6d9608034ce0af55fd539b5a +Py = 0x25d1d06449a6a9f4db833ab69d1170b4f0f07d2e5f74a9b56212563a0356e0b6 +# Test 263 (extreme value for k) +Valid = 1 +Signature = 30440220743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2 + +Px = 0x33d4259f3ac0ce8a534e7655f2068f80f401c742ec04084784d269c49ef0701f +Py = 0x3e1dd6fc7c206d4d759c80e3612da4d0fcd4200afe7a68300e9c13f4ef23f880 +# Test 264 (extreme value for k) +Signature = 30450221008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2 + +Px = 0x8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262 +Py = 0x547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997 +# Test 265 (testing point duplication) +Valid = 0 +Signature = 3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c + +# Test 266 (testing point duplication) +Signature = 3045022100989c5cc31440c1168f88b32ba6e47900183c0d843f9c41671898030664305d2b022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c + +Px = 0x8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262 +Py = 0x557c5fa5de13e4bea66dc47689226fa8abc4b110a73891d3c3f5f355f069e9e0 +# Test 267 (testing point duplication) +Signature = 3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c + +# Test 268 (testing point duplication) +Signature = 3045022100989c5cc31440c1168f88b32ba6e47900183c0d843f9c41671898030664305d2b022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c + +Px = 0x2676bd1e3fd83f3328d1af941442c036760f09587729419053083eb61d1ed22c +Py = 0x2cf769688a5ffd67da1899d243e66bcabe21f9e78335263bf5308b8e41a71b39 +# Test 269 (pseudorandom signature) +Msg = +Valid = 1 +Signature = 30440220745be1da902d19c76c8f57d4a1f3362b4b20ed7c8de8fc0463d566795f979cea02205916c317a1e325b53735216a0fa37737f08b32245c88084817b468a41f5afee9 + +# Test 270 (pseudorandom signature) +Signature = 304402203b86fbb66618f04881862be0a78bb6dddcdf5004f86ed27267487e6950687da402202159bc314a90fc148cbf01deea077feaf50dc12399148832c327d8b569e525d1 + +# Test 271 (pseudorandom signature) +Signature = 304402205943bcb4bbe2cc93bdd62a43d5b350a34c435cc576ed8fefda6242c0db814dcf02202b3295d375c7e3aff3f5d3e23de8b361280f423be43e802662543a8048fd663c + +# Test 272 (pseudorandom signature) +Signature = 304402207111061f15ec3c9bd4e18a9fd4c9e4933a981e7ee8c90402097126e15c8495ac02205f7a114828cff4b6bcd32ad56e43117d945e7625816cd14e79eed328b603b789 + +# Test 273 (pseudorandom signature) +Signature = 304402205b9418292ee08c1569b3e27f7f64fd2493d394c9fed0daba29e2eeea84249051022018b950f288afa7db8afa014cc71e8ebfdb70ecd1bed35d12c55f10d0f1259f75 + +# Test 274 (pseudorandom signature) +Signature = 30460221008ceac89d24eb388f65fcac415beccbd0051949f733aeed75d99532ed4925f2b3022100a5069db340a166c04a71488bd9e6f0b83328bf12ed6255e554a153a9165b7dab + +# Test 275 (pseudorandom signature) +Signature = 304402202d361f4b4f56208a041af7b430412a1cb7ef5ab4f09598a198be98f5ca9a5d8b02202744ab423f3b18b9c6ef52511f01d515fe646fea7b9003197d2b38d6ef6651b7 + +# Test 276 (pseudorandom signature) +Signature = 304502203d012b0ca94a4a144482d513046340176b6e436b428f7f2c6d4ba79ee03f992a02210080953aca24ed94ee9f2d6502bf0ff23131aab6c4cf61eaeece42fbbccada3fe7 + +# Test 277 (pseudorandom signature) +Signature = 3044022075913672600127d2a46106dbe0630184f8f7417e15bcbe9bd0328518317407e20220521467cbb076a8db9ed9207a36a16161bf2d5a149a895e8b289b42ece12072b6 + +# Test 278 (pseudorandom signature) +Signature = 304402200cf794354ddc11ef82ceb48e47f365d9bfc149021a3770ef27162c5d85176618022042d84231b1953e5d0d4e12d10adc566abf025ddfe38ad7ec9024ffac6298ba37 + +# Test 279 (pseudorandom signature) +Msg = 4d7367 +Signature = 304502200ff9279a0775740b7db8bec07f9a0401b7903886cb198c1b18c46de0673b31c30221008b3c8686bd1a1508b5b785e762fece8c6cf19b6156983e5c36b2bbe724d6c23e + +# Test 280 (pseudorandom signature) +Signature = 3045022067451d25f4c95a4e3881c8173b34205c674369190a93671735dcdfb4353960e50221008e680d7c8916a67bee8d8f965169c5c1071b5c4aa2d14969244b8086d01ce6ed + +# Test 281 (pseudorandom signature) +Signature = 304502204a2e2de82c67580ad56bb8e810358ef19039de8b6c842758132064757aa5b44602210084404f11d66a59dcdc33040cd60d3ddd6957a8d91eb6209fa869103371e1dc8f + +# Test 282 (pseudorandom signature) +Signature = 30440220342f962ecf6348c830285ad5b891fe0fc966375a35c25908c79f1068a9c747e902200c9b1e639c004d94ac4d73bcfd0d3ad22ac0967e83e3975217eba878475cc657 + +# Test 283 (pseudorandom signature) +Signature = 30440220269b3c6e2aa9a0797d40e50d266ebb93e0d7eb7e313099f8d839238c4f8e88a30220770c06506d15f7b092a51aa52de5c82fb772f70f8e73e0b838346a16d9ee709d + +# Test 284 (pseudorandom signature) +Signature = 3044022036970df9bff7bd44996d3eeb24be3655eed090ae27c1b5b3e91e949c3a4a39ce02202816549ade27c73656778a22992c59965bed7d337a45196f67be37b21526eff0 + +# Test 285 (pseudorandom signature) +Signature = 304402207cebbf8ecb14adf986aaec8610d4c8803235a8f757c644deba3cc2da5a7d8e8a02205b832def9fcb6a76972b116ac2f9588c710d6cc44f14d83b2f881f675ab02446 + +# Test 286 (pseudorandom signature) +Signature = 3044022037771acdc3beea26157b807de7f7377ef472706e8f6910603448ad9e0a2fcf23022012bd254ca9a5587767532b5321161c3b2fafb64d7538266a4a589fd3b7e23374 + +# Test 287 (pseudorandom signature) +Signature = 304402200585f0921ded2869725c791d5d1d083327515228e750183e485952a9fe26f40b02207b1c188a8b9b1c588bef2fdb28c6ae1365e3ab70b666c90c700594200e3c7623 + +# Test 288 (pseudorandom signature) +Signature = 304402206e7afb8147b78750a0ddffe29ed8d8e6f781bd002c794e019bab8af4d8525dc8022042dabd193d99e9ba22f74e357972147db0fa15bc0f146c733110678538274306 + +# Test 289 (pseudorandom signature) +Msg = 313233343030 +Signature = 30450220351e727003896ec02949a3cf752223bcc6c2b611b30391edd60dc0c83dc9c98f022100924ad9dc00364d4aa2091416d173862f9b02965ff176e880ea62a673e16db98e + +# Test 290 (pseudorandom signature) +Signature = 3046022100a0ac4453893d671ebca111713ca23c3beed7b63317119858e1b8516fd1ca62dc022100a046ee1d900f36b3856aaab16523eb3f62427d305c12b9da9e5e00ebdbce0ae0 + +# Test 291 (pseudorandom signature) +Signature = 304402205e1b940c559d2dff9418fcad50c27ad4de122d1bed47d2657ef1f756be97ce7e0220340855b0b0b045192aaeae2e96e276c9a78e1b2043c176d89cbc4951eeed8d50 + +# Test 292 (pseudorandom signature) +Signature = 30440220460cb9d841a5ce5fe708d0c9d8d77d8adcd5b08aaa7adc675c477e84d6cc40540220499b0f4a64b5ea01557ad969039b72ba72c621d824a0c17dcce767cfc53666fb + +# Test 293 (pseudorandom signature) +Signature = 30450221008e315c67e69ef2818e117cd7739289078f567c92bdf18c755e1cba6c89698a6702207ed4fd2e4ba8df9826f304c155721058ea82020ec101995a591b66d4a675375d + +# Test 294 (pseudorandom signature) +Signature = 3045022100a1a934052cc69410bbda9df9e13ff7bef149c2bb09befa457aafe9231b8912c202204e695cdf4911861398ccc4a3d23cce3ab7d9953ef0bf928295b2855ccde42cea + +# Test 295 (pseudorandom signature) +Signature = 304402201525e7ef4775b0d8e27c71602f991632b95c5ca043acd0913fcca0946528e4020220682ad0d69435231909d1bcf573043784f70ba22122228bc2d59b7e34f95dc8c7 + +# Test 296 (pseudorandom signature) +Signature = 3044022032513d8d29d99319c1ca5e12ab6537b633d469ffa00050e3fb51444d77660fd502201845b55e92574c3a9e4389c2b8b3772ef3827d884795014eb381a7cd60be4461 + +# Test 297 (pseudorandom signature) +Signature = 3045022100948e9b863fecbc1c511dbce5721ca165e6e36279dcaea12553ef8e9d485d527d02203625cc1211056e4a2cba6509581ac3bb1be1ad1ca0ce43d386375580b2f28bbf + +# Test 298 (pseudorandom signature) +Signature = 30440220363f3d944a0471539520e9b8c422057a2d862611e108fd86e30a759b67fc3dfb02203407c6008ccdcb0e61cb0269eaaf69f045c29cd88839831fd83ed45cb39e3a15 + +# Test 299 (pseudorandom signature) +Msg = 0000000000000000000000000000000000000000 +Signature = 3044022044a811b2321acbc65cacf80d2dbe848946f1dac528f3e1ae38b0e54d083c258f022055d7edfaecdda3bbc062d5074e3c3719d32761159d027ca27c1725ddbd62f688 + +# Test 300 (pseudorandom signature) +Signature = 3044022047c4620f4aecda3118fe23af68cc6febe53fb6df9cf093d9bb5ffe8db3290852022031bb8313a3447f67069e399841bb7042507127906855993efd9a67f4e14a4643 + +# Test 301 (pseudorandom signature) +Signature = 30440220236d1aa36625fa6d49f4d7a57f2f089ec1d79b489a6f3cff559f7b0c1eb9048802204288ef7f06455ed1ac553cb0965695f6d6a70dadcd1780f85b306dfdf4433f92 + +# Test 302 (pseudorandom signature) +Signature = 304402204e3bc670164d82d8c81bdc4ee970d0d7a6c34105fa369b6134d65d3a4865b6fb02202e3f9cb3324ce4cbe7335335854bb647434cfe61b727d81982cf8fb3f0f9c47e + +# Test 303 (pseudorandom signature) +Signature = 304402206d70455d3f68f67755897ea13caa991beb18175299848ab800c6858f9bd87834022031ceae09c90fd7fd7132f9b926a3a1ee3d4a6c6149202d7e1925ae3690f4698b + +# Test 304 (pseudorandom signature) +Signature = 30450221009148f1eed1365c32721ac231347d931452373dd53f0eafb83f5f133c7093759f02203b0bb1c44293cb4f3e78f5d7ed729887295af363b7febc6fa9a150a7ef1f0550 + +# Test 305 (pseudorandom signature) +Signature = 3044022026c0c3646be1c3a39c4704710404a606011e52d1aa947b8b582cc1e03c8efdac02201319ddda2b84e7a5ec71497d1f0ed9f8f476bd7188e9e203ca0a42239e2ba0a4 + +# Test 306 (pseudorandom signature) +Signature = 304402201bd87e7c7ceac9969f5f0e2a1723c23cef5fa03158edbf0a2b01132ec6276c6d02204ee9c0f386c94f93fbbdd811f9cfc8a5237480ecec98f47e57db150646f8b69c + +# Test 307 (pseudorandom signature) +Signature = 30450220543d97f75c457549e1d51469ed3eacf5316d421cca7b3560e95dd523a031997c02210095a280c377727015399662fb1f8a9a142183194527ce29036cc989b770b34e52 + +# Test 308 (pseudorandom signature) +Signature = 3044022064318a7a59386bda3d30b30539e618b2ddc95b9e7523fcc19fb7dd23d0cf385f02207cc4302ef92a350344df7ff1d754e86dc70a76cf2cd608f5f7e36895e6c1b50f + +Px = 0xa9fb57db62501389594f0ee9fc1652fa83377fa302e19cef64252fc0b147f774 +Py = 0x9507acf5b04339ed102b9ca60db98c165b94ebe855d2202e46dce15ba1e028be +# Test 309 (x-coordinate of the public key is large) +Msg = 4d657373616765 +Signature = 3045022062aab40a36d6a0d25644719ce31dc629ec684f6f0da32f9dd034ccc421dbd0ed022100a1fa6b0dfd9558da29374fb77505ee8ab3572161711f821d11807c7fff910c1c + +# Test 310 (x-coordinate of the public key is large) +Signature = 30450220740cd3d3a9cd9dbe05ead4e39e54db27c0f1579da68e3aa5c9245b047aebc3b80221008ae78c12233d378fe2ce3c0fb2b769f8463830a71a5e5187c11b20fdd7e50445 + +# Test 311 (x-coordinate of the public key is large) +Signature = 3045022100a28f30245c5fb0c225fdec23924dc2cd4c2da888d1ee1bc5445858c646015ca802200ee364c1491c4551ef3509be8f88db0e04d0afb36528aeda1301b14948cc9cd6 + +Px = 0x351a45fb920f2c9f1b178438fa3bf272ff9328b881c477a1f56a8c0e88465276 +Py = 0x1270f806fe40ad97ebf76c6825384b780ae6afccc792b05f2fb3eb7b7fffffff +# Test 312 (y-coordinate of the public key has many trailing 1's) +Signature = 304402207f202f54f591b51105b227ee6d6da3adddfc4b5e819efc04befcdcbf7484f78302204360ea04503955fc3f025928b2dce50ff2d58b9060b34bbedfc3c219b3b4355b + +# Test 313 (y-coordinate of the public key has many trailing 1's) +Signature = 3044022062e218dca32e4ef35692e9315e1e036bef1766073b846e38de20d2d29349f9fe0220519d4d4c6158d95474d793a0ee9c260a0c5469c5aab79510971b41fb4fae4baf + +# Test 314 (y-coordinate of the public key has many trailing 1's) +Signature = 3045022100a3902295f6f743ac754db7b3fcd823be917b1191a5705728f5682492784da7f1022043def636660eff72e6435edb850c9126c7067938668f249998a0e4006b8ee7db + +Px = 0x129b2146e36fc055545bf8f2cc70f8e73e8b25e539365ad7577cc3535 +Py = 0x4a2b8c0319bc4ccd3e60da119477c23faf8fc2dcefc42d3af75827aeb42f6f0f +# Test 315 (x-coordinate of the public key is small) +Signature = 304502210086d05b26a9ca7e10ae0681bb4c35a06d7a4e918f8625e3dfa7ac2d5aeda91c05022008c5f475a95888769da4a0e1b635c2292f654f934a5c5010fe0c729f3d11e1b1 + +# Test 316 (x-coordinate of the public key is small) +Signature = 3045022043c4474710d25094a2e21a9cc08585c26015f9f94012b100e72c0763aa9e0cff0221008345c46fd5592cefbd5ebb258965c05d964e6e6a278198ddc1e388cf1e75867c + +# Test 317 (x-coordinate of the public key is small) +Signature = 304402206d2724167e816528491cce574f0526209de52cd0f2af0085284fd050163d37c5022076dd1dd50ff9b553b0e142b7e6c6be8edf3708dd292f03f3e9bf157d21daa9eb + +Px = 0x680becabe7d7df4fadfe5ae01fba5ea51b76759606a2e30612e667419b885d05 +Py = 0x8541dcb0723785c3c766581a7514a1ff42e4437d63f878271cb860f00000000 +# Test 318 (y-coordinate of the public key has many trailing 0's) +Signature = 30440220321009a06c759c54cd66baafa0cbfd07eedb19f12a1ed654dd52b56f9c4fac7c02201956310a7e4757ec83ddb92d2763607354678149f1ad92387928cf887b4bed0f + +# Test 319 (y-coordinate of the public key has many trailing 0's) +Signature = 30450221009bdd359881c239e2415ca2af3d18463bb24be53f6f636cbd20360b6b333bc34502200ff03bc36cc1975bdc8680c44fbf2aefddf67c118c304b8b3d360eb10203c3a4 + +# Test 320 (y-coordinate of the public key has many trailing 0's) +Signature = 3044022048565eb7e7820d40754b5f264a4ceafa62bf75084241514b491995e7971e699502203da6df3d354f48daef6d078cf1124295fc8c3211f2757967c781dc2e9c62ed1a + +Px = 0x7d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee9061 +Py = 0x1469fb456ca6a1720ca8db25d567e121cf921ce13e34000f8c12f5272 +# Test 321 (y-coordinate of the public key is small) +Signature = 30450220518e885def022eb5020fc90f4024d87122dc0f3ed7f869ed7720ff74a009fb7b0221008a3e26a8cd426d21eba5cd7a5614f3644395cfcecb24fe760a68a7a9e8f09c02 + +# Test 322 (y-coordinate of the public key is small) +Signature = 3044022004b01e5cc3ce9bf10844bc1cb21deeff6ebc9e2a7010cfbb3af0811354599c8102202e65fb8db62f255910ea4d5235bb21aa67aa59ffd519911ecd9893000ab67bb4 + +# Test 323 (y-coordinate of the public key is small) +Signature = 304502210094bb0601198c4ce266b0932426ffd00132d7d4e2de65ef47f56360825f26243802202734327d1989c9580f5458f04aac6fd5752a1ee5e236e9ed1a7c0b2d9b36db10 + +Px = 0x7d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee9061 +Py = 0xa9fb57da5b4ef56573fbf36fd2f5db1517bde406dc0452143cd347245e3f0105 +# Test 324 (y-coordinate of the public key is large) +Signature = 304402204dde197f962c63a7799c862e897b3bb1e7a7ddfb9ab77c2a17a54151ce604ad60220017e7aef86e533086425a2c4b32082f118913ef3667c8437672e0bbc7c2b8d7e + +# Test 325 (y-coordinate of the public key is large) +Signature = 304402207c53ed1d504ad4ba53d39792012a34d007250a2b8d1ca189c0d9f75ccc9a9957022009b97dcc5c67487114231d601374a8364cafa39581291762202b9215d51135fd + +# Test 326 (y-coordinate of the public key is large) +Signature = 30450220513245ab2b6a4206bb0f6970c8ad040a94725ddc9a08db0fd9def93866ffbba1022100a53a7ab37decedae18dd5b5c48eb642b7a9c927e6bcf6bdac3a757e6d2c169c5 + +Px = 0x81528b7adbbebf1b6b3c7fa1d61284b07759b9a98d31a5702707b018fdecff11 +Py = 0x75bbfccb545381bf8601031731841829401b08dcdc68cc34e06a64e412038512 +# Test 327 (x-coordinate of the public key has many trailing 1's on brainpoolP256t1) +Signature = 3045022100a50318c3066a4966ad18ae8f85253fbb5835a34b2f9187daac71ee28d3d5d0eb02200890ef0fc93df222d11197cb221483ce897b0cf1acf4a909c306c5a485776abc + +# Test 328 (x-coordinate of the public key has many trailing 1's on brainpoolP256t1) +Signature = 30440220041e0389dda2cf2ae3a9562a0fb5d41c1f7533e6cc84a896e99af781e21097700220366b5d88c36f1227df522fdab65e12347d68eb64f2de82c648115fd565bd37b7 + +# Test 329 (x-coordinate of the public key has many trailing 1's on brainpoolP256t1) +Signature = 304502202a76394a04ae19b25c54291e28bcd42a7edeb20981b8a3b838f9dd0e29b574c10221009ce89980ae432c4fa6a68025da554bf900cc2eb0c66906420d322c14b453049c + +Px = 0xa3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e +Py = 0x16ea8e03c20977f20aed58106b6d9d1085b4475f75b5469c5f426cb27ec6d872 +# Test 330 (y-coordinate of the public key is small on brainpoolP256t1) +Signature = 3045022066958be3379405826a00daf5495b1657698126a5ff449f9649af26ca96df96670221009b4100816e2741f86c5c0b0dcf82e579f4281d2b8e70c234808d84c1a495079f + +# Test 331 (y-coordinate of the public key is small on brainpoolP256t1) +Signature = 3044022053ed0f4b8fb33ef277cdd1060435ed3dec518a225659f71f67f9a1f07f85c1ca0220124d5f94ddf12bb4cbe3c5cea6d2686d4480dabb8ffbb05e5238c877fe20383e + +# Test 332 (y-coordinate of the public key is small on brainpoolP256t1) +Signature = 3044022046643c7fe0f308b8af4ce2978d797e8c46a7e1f8bfee0b5cdbaecde1f59be41d02201bd11a814d1fbd9ae97a49df99beca7fec2512563c0031c5aad5b9fc2fb0a507 + +Px = 0xa3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e +Py = 0x9310c9d7dfe531ca3378b2803215f061e887aec45f70d98bc0d0db6aa0a77b05 +# Test 333 (y-coordinate of the public key is large on brainpoolP256t1) +Signature = 304402204f833bec9c80185beacbb73b5f984e2c03d922359be7468ce37584f53d1aea4a02206636744ab7fecaa53541bcf5f37c6cbe828a8efbc4d00f6469ba390a86708a26 + +# Test 334 (y-coordinate of the public key is large on brainpoolP256t1) +Signature = 3045022100a2869da416523aad2b8fa8aad5c3b31c5a535fdd413b71af4dffb90c6f96a669022029ff3e8d499cabc3cc4cccd0fa811cc3b04770aa71f0d052185210b14d31993d + +# Test 335 (y-coordinate of the public key is large on brainpoolP256t1) +Signature = 3044022063dbfe29249a506b89fbd2cb1fafc254a9582dfc4b08d143b6d25bf2ab49d55e022044cad80c00460905e103f26da84cefd71af4bc7a71962a3bce321bc3b5842736 + +Px = 0x6d499b077ab6d77b244320a2cacab91a764595dd67a7a8dfcf84da7d38b2d8f4 +Py = 0x5994c07b833ff4909c1a92cc9f24dea88be8603b407b00d228faf2158db2354f +# Test 336 (y-coordinate of the public key has many trailing 1's on brainpoolP256t1) +Signature = 30450221009d907cf88e10d60c3f23892498fe43ddb02f824fb18e6be313e02d94f2c8e09002200c16b9e0db4dc8606c023b001f69b3c886080794fc9d7fe31b00c1cf0935e421 + +# Test 337 (y-coordinate of the public key has many trailing 1's on brainpoolP256t1) +Signature = 304402207395ce0ef652848a86b61097cc9543998d39dae88a1fc9e4dfdd69642949548902207de29e256e8202382f91c116a667a8b946f210447a57369ba61ae4fae73dd136 + +# Test 338 (y-coordinate of the public key has many trailing 1's on brainpoolP256t1) +Signature = 304402207baf1fde87ccb1bea0f893b3bfb2549c04bca18835d8eb5a31b8d20506ff88c30220289ebe829fefb9ad009d7cdd622874aef5fa088f0508a4b43d5895d61645cecf + +Px = 0x8c2f95ffedde1d55e3f2c9dcf5884347f6904c6492273ad760eb7b9b35f036b +Py = 0x2bcf7a048caa2c726ae8808dc95312eb2350275a8f4fbeea7c0f32f3839c7b93 +# Test 339 (x-coordinate of the public key is large on brainpoolP256t1) +Signature = 3044022033e37c3b66acabee3d68cbbb9c55cd52b586de51647723fa84e532a3ec5953ef02203b8a9ee707d1bc5f83e17ea072adc2ecda92e637d7c06060f1af79b929a850b3 + +# Test 340 (x-coordinate of the public key is large on brainpoolP256t1) +Signature = 304402201f8ebdc94ecddd84f90960cc55d0ca02e33d70535fc1c7322b3c2783b9dc92380220205aa8626c3a5da214e5485b11154a378d70b0d3323ab868528ae8048d17b696 + +# Test 341 (x-coordinate of the public key is large on brainpoolP256t1) +Signature = 304402206b0d70e09ba1642adac06dff9b52e22a3e4aab4180e372665691412241e743a002204d7d30ff8a210de69e3e6d1ecf7175f89f481a4d9ed06beaf7148da47f4af9e9 + +Group = brainpool320r1 +Hash = SHA-384 + +Px = 0xfcc8860cb26e262ca8b4ecb9c52f78d82a10a1d30dd0c8ecd7584ce80dbb75c488a062b64375500 +Py = 0x1f27e676c26cd3488c1ef4ec3edd88cf8af78daf9036724b57e66da02cf7c676a53664becdfedc3b +# Test 1 (signature malleability) +Msg = 313233343030 +Signature = 305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e022900833d6661b0576d61a80ffe4d3271c43b2a56c14b3bd90305923ccdcf7b3d988c07ebb1c4cc67381c + +# Test 2 (random signature) +Signature = 30540228258ef9338000816fa220de07c2ac41717204f98e462d02d1e4b38a6f15961d7c9feac1c5623dacb60228068f9f4ee3d5b3982540e793d0b407532aa65c917e77060e86b600f608a6a4be760087a9315fcd4b + +# Test 3 (random signature) +Signature = 30560229009be0959323d68b9951cf535956063bc38176f1bcfb56bc67588b1ceced1cc18294614794cd35e6df022900a9d0e99674a7ab035d5bb6f0bff9dcb20bc51fbca0b36d6bcec8306e2d60bdff82c739c34c1156f9 + +# Test 4 (random signature) +Signature = 305402284b68be3db05def94ad56d7b8ca8c9d83f4bae618ada254a477d2379e1e2d2f0ac212f8f561df19e1022879610328a4e938f6d09b609cd0ba3e1b47edca93e2703b8f441858e35e8d8cc869f62ece4e63b48b + +# Test 5 (random signature) +Signature = 3056022900a9794992bf2c4ccab2c486ef750d56004dcd63511efbebe554fe0ab10554e7df83f594cd9131b9d8022900954d5e1090493967ad99d100660bba887215293bd390165eb1086796f108faff75f70462fbcb02c0 + +# Test 6 (random signature) +Signature = 30550228026118188c8adac5773a41f8fe087b4530f0dbd643d6ec3d5f3995c4cef0cb91f14d1c5822623e86022900afc187f425f6c6c547ac12d3a79a19f02016c251ceeb06ce250b2e5c78519773c0a206db8d58cee9 + +# Test 7 (Legacy:ASN encoding of r misses leading 0) +Valid = 0 +Signature = 3054022885b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 8 (valid) +Valid = 1 +Signature = 305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 9 (long form encoding of length) +Valid = 0 +Signature = 30815502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 10 (long form encoding of length) +Signature = 30560281290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 11 (long form encoding of length) +Signature = 305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0281285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 12 (length contains leading 0) +Signature = 3082005502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 13 (length contains leading 0) +Signature = 3057028200290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 14 (length contains leading 0) +Signature = 305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e028200285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 15 (wrong length) +Signature = 305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 16 (wrong length) +Signature = 305402290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 17 (wrong length) +Signature = 3055022a0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 18 (wrong length) +Signature = 305502280085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 19 (wrong length) +Signature = 305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02295020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 20 (wrong length) +Signature = 305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02275020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 21 (uint32 overflow in length) +Signature = 3085010000005502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 22 (uint32 overflow in length) +Signature = 305a028501000000290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 23 (uint32 overflow in length) +Signature = 305a02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e028501000000285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 24 (uint64 overflow in length) +Signature = 308901000000000000005502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 25 (uint64 overflow in length) +Signature = 305e02890100000000000000290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 26 (uint64 overflow in length) +Signature = 305e02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02890100000000000000285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 27 (length = 2**31 - 1) +Signature = 30847fffffff02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 28 (length = 2**31 - 1) +Signature = 305902847fffffff0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 29 (length = 2**31 - 1) +Signature = 305902290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02847fffffff5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 30 (length = 2**32 - 1) +Signature = 3084ffffffff02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 31 (length = 2**32 - 1) +Signature = 30590284ffffffff0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 32 (length = 2**32 - 1) +Signature = 305902290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0284ffffffff5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 33 (length = 2**40 - 1) +Signature = 3085ffffffffff02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 34 (length = 2**40 - 1) +Signature = 305a0285ffffffffff0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 35 (length = 2**40 - 1) +Signature = 305a02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0285ffffffffff5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 36 (length = 2**64 - 1) +Signature = 3088ffffffffffffffff02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 37 (length = 2**64 - 1) +Signature = 305d0288ffffffffffffffff0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 38 (length = 2**64 - 1) +Signature = 305d02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0288ffffffffffffffff5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 39 (incorrect length) +Signature = 30ff02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 40 (incorrect length) +Signature = 305502ff0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 41 (incorrect length) +Signature = 305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02ff5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 42 (indefinite length without termination) +Signature = 308002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 43 (indefinite length without termination) +Signature = 305502800085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 44 (indefinite length without termination) +Signature = 305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02805020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 45 (removing sequence) +Signature = + +# Test 46 (appending 0's to sequence) +Signature = 305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000 + +# Test 47 (prepending 0's to sequence) +Signature = 3057000002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 48 (appending unused 0's) +Signature = 305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000 + +# Test 49 (appending unused 0's) +Signature = 305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e000002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 50 (appending null value) +Signature = 305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50500 + +# Test 51 (appending null value) +Signature = 3057022b0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e050002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 52 (appending null value) +Signature = 305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e022a5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50500 + +# Test 53 (including garbage) +Signature = 305a498177305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 54 (including garbage) +Signature = 30592500305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 55 (including garbage) +Signature = 3057305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50004deadbeef + +# Test 56 (including garbage) +Signature = 305a222e49817702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 57 (including garbage) +Signature = 3059222d250002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 58 (including garbage) +Signature = 305d222b02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0004deadbeef02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 59 (including garbage) +Signature = 305a02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e222d49817702285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 60 (including garbage) +Signature = 305902290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e222c250002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 61 (including garbage) +Signature = 305d02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e222a02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50004deadbeef + +# Test 62 (including undefined tags) +Signature = 305daa00bb00cd00305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 63 (including undefined tags) +Signature = 305baa02aabb305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 64 (including undefined tags) +Signature = 305d2231aa00bb00cd0002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 65 (including undefined tags) +Signature = 305b222faa02aabb02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 66 (including undefined tags) +Signature = 305d02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e2230aa00bb00cd0002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 67 (including undefined tags) +Signature = 305b02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e222eaa02aabb02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 68 (using composition with indefinite length) +Signature = 3080305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000 + +# Test 69 (using composition with indefinite length) +Signature = 3059228002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e000002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 70 (using composition with indefinite length) +Signature = 305902290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e228002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000 + +# Test 71 (using composition with wrong tag) +Signature = 3080315502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000 + +# Test 72 (using composition with wrong tag) +Signature = 3059228003290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e000002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 73 (using composition with wrong tag) +Signature = 305902290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e228003285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000 + +# Test 74 (Replacing sequence with NULL) +Signature = 0500 + +# Test 75 (changing tag value) +Signature = 2e5502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 76 (changing tag value) +Signature = 2f5502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 77 (changing tag value) +Signature = 315502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 78 (changing tag value) +Signature = 325502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 79 (changing tag value) +Signature = ff5502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 80 (changing tag value) +Signature = 305500290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 81 (changing tag value) +Signature = 305501290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 82 (changing tag value) +Signature = 305503290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 83 (changing tag value) +Signature = 305504290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 84 (changing tag value) +Signature = 3055ff290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 85 (changing tag value) +Signature = 305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e00285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 86 (changing tag value) +Signature = 305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e01285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 87 (changing tag value) +Signature = 305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e03285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 88 (changing tag value) +Signature = 305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e04285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 89 (changing tag value) +Signature = 305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6eff285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 90 (dropping value of sequence) +Signature = 3000 + +# Test 91 (using composition) +Signature = 30593001023054290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 92 (using composition) +Signature = 3059222d020100022885b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 93 (using composition) +Signature = 305902290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e222c020150022720e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 94 (truncate sequence) +Signature = 305402290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5a + +# Test 95 (truncate sequence) +Signature = 3054290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 96 (indefinite length) +Signature = 308002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000 + +# Test 97 (indefinite length with truncated delimiter) +Signature = 308002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af500 + +# Test 98 (indefinite length with additional element) +Signature = 308002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af505000000 + +# Test 99 (indefinite length with truncated element) +Signature = 308002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5060811220000 + +# Test 100 (indefinite length with garbage) +Signature = 308002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000fe02beef + +# Test 101 (indefinite length with nonempty EOC) +Signature = 308002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50002beef + +# Test 102 (prepend empty sequence) +Signature = 3057300002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 103 (append empty sequence) +Signature = 305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af53000 + +# Test 104 (sequence of sequence) +Signature = 3057305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 105 (truncated sequence) +Signature = 302b02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e + +# Test 106 (repeat element in sequence) +Signature = 307f02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af502285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 107 (removing integer) +Signature = 302a02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 108 (appending 0's to integer) +Signature = 3057022b0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e000002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 109 (appending 0's to integer) +Signature = 305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e022a5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000 + +# Test 110 (prepending 0's to integer) +Signature = 3057022b00000085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 111 (prepending 0's to integer) +Signature = 305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e022a00005020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 112 (Replacing integer with NULL) +Signature = 302c050002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 113 (Replacing integer with NULL) +Signature = 302d02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0500 + +# Test 114 (dropping value of integer) +Signature = 302c020002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 115 (dropping value of integer) +Signature = 302d02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0200 + +# Test 116 (modify first byte of integer) +Signature = 305502290285b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 117 (modify first byte of integer) +Signature = 305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285220e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 118 (modify last byte of integer) +Signature = 305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34aee02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 119 (modify last byte of integer) +Signature = 305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5a75 + +# Test 120 (truncate integer) +Signature = 305402280085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 121 (truncate integer) +Signature = 3054022885b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 122 (truncate integer) +Signature = 305402290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02275020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5a + +# Test 123 (truncate integer) +Signature = 305402290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e022720e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 124 (leading ff in integer) +Signature = 3056022aff0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 125 (leading ff in integer) +Signature = 305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0229ff5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 126 (infinity) +Signature = 302d09018002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 127 (infinity) +Signature = 302e02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e090180 + +# Test 128 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 305502290159100378a2b190377dcb3bd531e20c378d106931fc183f707dc9d08576f8fb566185594220b8dd7f02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 129 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30540228b25375383538f0c7bb524b178dde4b6b99f0c9e68efa1a2a233972f599ec49835462ae8b972db75d02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 130 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30550229ff7a4e43a7940abf8063713c89a01fd42e6c7f6673ba76d332af7e5e42778d5d93250bfc19240cb59202285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 131 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 305402284dac8ac7cac70f3844adb4e87221b494660f36197105e5d5dcc68d0a6613b67cab9d517468d248a302285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 132 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30550229fea6effc875d4e6fc88234c42ace1df3c872ef96ce03e7c08f82362f7a890704a99e7aa6bddf47228102285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 133 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 305502290185b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 134 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 305402287a4e43a7940abf8063713c89a01fd42e6c7f6673ba76d332af7e5e42778d5d93250bfc19240cb59202285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 135 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e022901237f27debd21320e1a68f2707191fc90c8c8de0031452240c8538fc061cf19470536f8f1bd23ee06 + +# Test 136 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0229ff7cc2999e4fa8929e57f001b2cd8e3bc4d5a93eb4c426fcfa6dc3323084c26773f8144e3b3398c7e4 + +# Test 137 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0228afdf1f41799b1da9c6d385ee606fe3d530c6f1a58549f06264f49f078cb73fa2815a5c6987a1a50b + +# Test 138 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0229fedc80d82142decdf1e5970d8f8e6e036f373721ffcebaddbf37ac703f9e30e6b8fac9070e42dc11fa + +# Test 139 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0229015020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5 + +# Test 140 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e022900afdf1f41799b1da9c6d385ee606fe3d530c6f1a58549f06264f49f078cb73fa2815a5c6987a1a50b + +# Test 141 (Signature with special case values for r and s) +Signature = 3006020100020100 + +# Test 142 (Signature with special case values for r and s) +Signature = 3006020100020101 + +# Test 143 (Signature with special case values for r and s) +Signature = 30060201000201ff + +# Test 144 (Signature with special case values for r and s) +Signature = 302e020100022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311 + +# Test 145 (Signature with special case values for r and s) +Signature = 302e020100022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310 + +# Test 146 (Signature with special case values for r and s) +Signature = 302e020100022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312 + +# Test 147 (Signature with special case values for r and s) +Signature = 302e020100022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27 + +# Test 148 (Signature with special case values for r and s) +Signature = 302e020100022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28 + +# Test 149 (Signature with special case values for r and s) +Signature = 3008020100090380fe01 + +# Test 150 (Signature with special case values for r and s) +Signature = 3006020101020100 + +# Test 151 (Signature with special case values for r and s) +Signature = 3006020101020101 + +# Test 152 (Signature with special case values for r and s) +Signature = 30060201010201ff + +# Test 153 (Signature with special case values for r and s) +Signature = 302e020101022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311 + +# Test 154 (Signature with special case values for r and s) +Signature = 302e020101022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310 + +# Test 155 (Signature with special case values for r and s) +Signature = 302e020101022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312 + +# Test 156 (Signature with special case values for r and s) +Signature = 302e020101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27 + +# Test 157 (Signature with special case values for r and s) +Signature = 302e020101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28 + +# Test 158 (Signature with special case values for r and s) +Signature = 3008020101090380fe01 + +# Test 159 (Signature with special case values for r and s) +Signature = 30060201ff020100 + +# Test 160 (Signature with special case values for r and s) +Signature = 30060201ff020101 + +# Test 161 (Signature with special case values for r and s) +Signature = 30060201ff0201ff + +# Test 162 (Signature with special case values for r and s) +Signature = 302e0201ff022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311 + +# Test 163 (Signature with special case values for r and s) +Signature = 302e0201ff022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310 + +# Test 164 (Signature with special case values for r and s) +Signature = 302e0201ff022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312 + +# Test 165 (Signature with special case values for r and s) +Signature = 302e0201ff022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27 + +# Test 166 (Signature with special case values for r and s) +Signature = 302e0201ff022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28 + +# Test 167 (Signature with special case values for r and s) +Signature = 30080201ff090380fe01 + +# Test 168 (Signature with special case values for r and s) +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311020100 + +# Test 169 (Signature with special case values for r and s) +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311020101 + +# Test 170 (Signature with special case values for r and s) +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110201ff + +# Test 171 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311 + +# Test 172 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310 + +# Test 173 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312 + +# Test 174 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27 + +# Test 175 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28 + +# Test 176 (Signature with special case values for r and s) +Signature = 3030022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311090380fe01 + +# Test 177 (Signature with special case values for r and s) +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310020100 + +# Test 178 (Signature with special case values for r and s) +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310020101 + +# Test 179 (Signature with special case values for r and s) +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593100201ff + +# Test 180 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311 + +# Test 181 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310 + +# Test 182 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312 + +# Test 183 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27 + +# Test 184 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28 + +# Test 185 (Signature with special case values for r and s) +Signature = 3030022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310090380fe01 + +# Test 186 (Signature with special case values for r and s) +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312020100 + +# Test 187 (Signature with special case values for r and s) +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312020101 + +# Test 188 (Signature with special case values for r and s) +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593120201ff + +# Test 189 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311 + +# Test 190 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310 + +# Test 191 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312 + +# Test 192 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27 + +# Test 193 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28 + +# Test 194 (Signature with special case values for r and s) +Signature = 3030022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312090380fe01 + +# Test 195 (Signature with special case values for r and s) +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27020100 + +# Test 196 (Signature with special case values for r and s) +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27020101 + +# Test 197 (Signature with special case values for r and s) +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e270201ff + +# Test 198 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311 + +# Test 199 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310 + +# Test 200 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312 + +# Test 201 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27 + +# Test 202 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28 + +# Test 203 (Signature with special case values for r and s) +Signature = 3030022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27090380fe01 + +# Test 204 (Signature with special case values for r and s) +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28020100 + +# Test 205 (Signature with special case values for r and s) +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28020101 + +# Test 206 (Signature with special case values for r and s) +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e280201ff + +# Test 207 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311 + +# Test 208 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310 + +# Test 209 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312 + +# Test 210 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27 + +# Test 211 (Signature with special case values for r and s) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28 + +# Test 212 (Signature with special case values for r and s) +Signature = 3030022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28090380fe01 + +# Test 213 (Edge case for Shamir multiplication) +Msg = 3730373135 +Valid = 1 +Signature = 3054022825166f47ac99c6bec3b038849ab4ead3b251f18afb0da1da5caa604a92a909c8561817684abffb9202283107ffd1aadce5b58a2a1b9517ccedda090433ac6344b027f36fc6b358ef4a8e436df3fd05521668 + +Px = 0xb21ecd48cc46fb306ed54e88adb615208457bd257e7e9d81db5bd1f56100a7aebb1386465507bbf3 +Py = 0x86224cb383815e1babe561dcb6f49af0073e1bfda366066ef62440fc81dec7eca021cb0c05091dfb +# Test 214 (k*G has a large x-coordinate) +Msg = 313233343030 +Signature = 30420215014064fb4c224a8b248a0d933f7642bd56aced9b12022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e + +# Test 215 (r too large) +Valid = 0 +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e23022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e + +Px = 0x9c9701de2ffdb296e6d56a5f3c189ecbb0e4448e38ed65da46eeaa51a7b34e650a91da95faf17900 +Py = 0x1e0a98a598523a34c4918d4180f87d641e4626ce11fa3a244abfb2450736693d38652309240ebda9 +# Test 216 (r,s are large) +Valid = 1 +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930f022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e + +Px = 0xb6f0ddc834ef8a67903681ea02b788fcff82d12307c8c3f4a44b30d7c5f614dafcc9a839991f8ee4 +Py = 0x27538e30ae5102b2043957dd6124fba3a1b601c04bddaf6c929ffdf2f7796fd7098c387dbc0b26fb +# Test 217 (r and s^-1 have a large Hamming weight) +Signature = 305502287fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0229008c0736554dbc446063e8e15f297fd4b66fa8879945bbb5c22714a9645f4fa4ef9d710eafa6b226d8 + +Px = 0x6df44321d4a5f6af63e01b79bb608ea04ac6f35f795044a04ff400f547fd34d9b78c12c45978f96f +Py = 0xb52901cece48aab432c3dbdcbc0e270b2cc9b9915cc1ffb69a365d84c39186c48177387aa9ee0a48 +# Test 218 (r and s^-1 have a large Hamming weight) +Signature = 305402287fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02285407cdd593acb501fc2848351f9d2e6b5457d3de43c3130e3b74e6a9242b3cce1c24f094f118bcd6 + +Px = 0x4e496f056ab5d07f96562c683643440e31fea26d35e6c5b69eefaa4107d345c807bf279f2ea26b60 +Py = 0x288539766fc726cb9e841db5dcfbbb792cade3c1ef64b69dcbda7f5e497b455a911ce2f0ebcacaad +# Test 219 (small r and s) +Signature = 3006020101020101 + +Px = 0x11e094f470948e4eaa6aa13fab4e063386e91a638fa226d988d0693dea719ca95f61e493e9835af4 +Py = 0x3f533e89aa2085a9f8121086a2597f1060f73c8d75d66940e50eead73dfd03c476ea1947cdd4dd3f +# Test 220 (small r and s) +Signature = 3006020101020102 + +Px = 0x16517a7d7beab6472ea8f6bc20412a3cd96d242c246ce9f983b2ef08b284cfad1ac28563b56edafb +Py = 0x9f56fe2df78c239aa16c3c318bc9191a16ec407a700354173f8b862d9a0aa10d67397f26e7c9c0be +# Test 221 (small r and s) +Signature = 3006020101020103 + +# Test 222 (r is larger than n) +Valid = 0 +Signature = 302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312020103 + +Px = 0x3a2668bc09614d2638ed58f1c421bb61f2d499a86fe7d573bd1392acef9e296b1ef2b10d7f4ec524 +Py = 0xd1b78eb2716ce668054d29677c6f4d3235f27d3a9295ecef9ddfd2f658ba002052d0e1e671721e2e +# Test 223 (s is larger than n) +Signature = 302e020101022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44d86998 + +Px = 0xcd1697c6e107f3d90b8df462eb368b75eba585635950177e0a64b1ad4be527c90957fbdf203d67c8 +Py = 0x4b003f20e81659099b7e466618f2610c6f1df315b2011db07b90f3662b51561fffdf3ebb5d443440 +# Test 224 (small r and s^-1) +Valid = 1 +Signature = 302e02020100022821494db879806d4f59e53d4963977a03f6ec51140c9f9a1dba8857ff3bbc76d2214947e60edc982b + +Px = 0xb1e3619d9e35873e959bb7de7740e927e3cb7fcf4413bfdbbed72ecc9a86a50d7029cae08ec285ab +Py = 0x486b5d2f7c9b9314420bc864cfe29b4064bf7b922bbb5bbcd16f3a81ea7d0a61b0a09a62959b7690 +# Test 225 (smallish r and s^-1) +Signature = 303302072d9b4d347952cc022843becc876a63564b458280199e382cbad8ef68d406665bbf307ffea45845a9ac69345a84a5a72b87 + +Px = 0x97cfebab588a54242a4d962ef803376c3f43079aa50a8871d6e776f7a0b33aea46ab9a2da63a33d8 +Py = 0xc81af34af2e9a0c571effb501c4a27fd2aedc13623447af2bc8b6d5e7208c23e87e2d797cc3cf57e +# Test 226 (100-bit r and small s^-1) +Signature = 3039020d1033e67e37b32b445580bf4efc02283992353d916617b49303856488e39fbc26173b8bc426f8207de3d8f1b97f3d12c803b99d57768fa7 + +Px = 0x296e0067947efc07a06ae218fb00164d1ebebcd3787f793481407e2796248e8b65eac57db0c14606 +Py = 0x729e8094b9a54eeac23d98d51d662eff2df33a8693008fd02a0429ef6851ecbdcd93aac67c2fbdb6 +# Test 227 (small r and 100 bit s^-1) +Signature = 302f0202010002290084380881b243236967227191398a3a4909000425576c79465bdaaa0a03267b9e48f68fa0a68b29e3 + +Px = 0xa3783b01455d92080f520d171f92abeaf48c7238e168b2931f2b322f9c0faa69a24097836cb0a685 +Py = 0x1cbf1a22bac2437551244605682dabcdd4cf39ff9d08443921c99448cbcea5deb85ad952dbb2b967 +# Test 228 (100-bit r and s^-1) +Signature = 303a020d062522bbd3ecbe7c39e93e7c2402290084380881b243236967227191398a3a4909000425576c79465bdaaa0a03267b9e48f68fa0a68b29e3 + +Px = 0x70d5fd41c416d5b7cdbcb944205bd69ff00ed6354aa502757e089cb19af6f777beb0f6921c0fafac +Py = 0x22ae7cc65e0e7b617423750b8493a58512e379c00de626c17f7c82bfc907f26610a3f1e4d132c575 +# Test 229 (r and s^-1 are close to n) +Signature = 3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c592940229008ce984c0247d8a7a9628503f36abeaeea65fdfc3cf0a0c6cc8dac9da9f043b4659b638e7832e620b + +Px = 0x6828ce63f3b0d694ce2999d06947fa9e2d1c18ab8032652fa7a98c678cf6bb2c52e7369085e4ef7 +Py = 0xc56df69128962fbefc2aef1b3f6c467b72fc305acf51b339643ca2ed6bde56317c4cf59895923ded +# Test 230 (s == 1) +Signature = 302d02284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105020101 + +# Test 231 (s == 0) +Valid = 0 +Signature = 302d02284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105020100 + +Px = 0x202516ad663775f12155521079037f3fca50c64faa4afd886add4daab927f3f62aa2dae684a635d6 +Py = 0x632aedd530e61dab35916962ee8f23ed688198afd5ad6b0705e2ef9d0ba3c5333b15bdab432ee342 +# Test 232 (point at infinity during verify) +Signature = 3054022869af23901b5e27dbf09e3c2f6900f032fcc7e7d2db47895196a41763f7432c74c348aaada262c98802284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105 + +Px = 0x6b4327117e9c04d7a58259c5207a36e8d278e873b92b5b3a70a3c4742cc583b41408aaab23a12a9c +Py = 0x9b0b26160c548abacd7f0e37276f917c09721b3844d0b26e9ed5c76c99787992259bf0f7b02445d3 +# Test 233 (u1 == 1) +Signature = 305502284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105022900f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb700 + +Px = 0x277f487faf77a65dbb791536e863b8c70f904fcdcaf52740d4bd5c469731e58ea6bd53e8d7720228 +Py = 0x2d346f2b4ca7bacb882fef749c2713f1a75f00827e8b9b9f744a0e1e34bcf80799a120950de95d99 +# Test 234 (u1 == n - 1) +Valid = 1 +Signature = 305502284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105022900ad0b664f9559e29e46fd4fd390e75abebf14997d17a1a3304c80e451fc8f79bb7cff168e17de6f22 + +Px = 0x73bd62f3bb329d65092b5d13c5746d462401d2600994d8fe2ec5ef5b9f3399084b1ddc64cb334bae +Py = 0xc1d1ac4f9a0c2a79ef7ccc4ae9165ddfa76138235718cf24032c33f9db4a26b2b03692a56f5202eb +# Test 235 (u2 == 1) +Signature = 305402284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c197310502284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105 + +Px = 0x20a75551035db95d7a1a673d464d276da0861008e4644c582bc10a1beeaeb070823fd064a2625ebb +Py = 0x5d47f0c77fc57e3bb0e153bbc7e9bbde8db98b0c46c58154af5b9786b10ba12ab3ba8533a3992883 +# Test 236 (u2 == n - 1) +Signature = 305502284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c19731050229008ce984c0247d8a7a9628503f36abeaeea65fdfc3cf0a0c6cc8dac9da9f043b4659b638e7832e620c + +Px = 0x3f436d07cb0264b13f92fd696334a4e51b7d6619e2d043b2d0d278963f2516200ef905ebf6716663 +Py = 0x40e642b6c966072b79278003651128879f19dee01273b66bead8045194277c9284093348d90569b1 +# Test 237 (edge case for u1) +Signature = 305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02280cc64af035cb79b3336a62d915b381e268d3bcb834f9cfd0f597c37ca5fcf50f588614ef0ef7b6a5 + +Px = 0xc16fbe6d0d77327cf9a65f987c2fe7ee1807851c0e1c8bc4f0622807dcd4a88b3b912eb0475471e5 +Py = 0x75421c40540050507a163f23cc7cb90acc52822d01d245ab70dcaac06e2ea644327a85f595d026ef +# Test 238 (edge case for u1) +Signature = 305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0229008e765d0d1cf9539f682a4155b6d60eb6aa6862b2af9e9d3f94c9ad46d332f0e029775522815c0e5a + +Px = 0xbe924007d6e22b944ac76da7fc2660d1aefab69471bd835bd78edd2c10621e76f718bfd0a5e2307e +Py = 0xc62583d5ba5cc1c547630476b399866e7ed953b538f76c86afe9cfd0854b57e33691c77e444ccab8 +# Test 239 (edge case for u1) +Signature = 305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02287225a960d967cfe52ac126a50fd79fa85a586397c0b298c8adfaf138317b0f794b24f53bd920c1cf + +Px = 0xacf240130d47d4a57d606595f989129fea7e9744b1e53f5ce679c244c85af35c618607e2ecce1a43 +Py = 0x1b696a7959fe30d049100dd54258181b08a2fe442e41ff29523c11a3e01028eb64b321c2b702579c +# Test 240 (edge case for u1) +Signature = 305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900874f311b6b9ac74fc34c60c0941873651b3c0ec1d097a7861e0c7fbec3226f23a5e2c929d856ecb3 + +Px = 0x46243b39e77639ac19e9be53669317d9598e03ec30a0cf6930f800009833826a59ade5321933ff2f +Py = 0x69d770b978ccc36c90b748e5010636e7004ddc19885da7bb90dbfad479fc52dce4b9281405f1c6bd +# Test 241 (edge case for u1) +Signature = 305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022813753ac90fbc7edfdcb32e1697fdfd41b1fb59c5ad177e96feacc87522ef928de80a60bb0f32e7e2 + +Px = 0xb4b9b6ba3c0e7509c275894e84e818d71de14577bdb4bf0b8e5e1332d1087f3c333b73e8ab75f2c9 +Py = 0x4f33d0e2ab342d2e1968ce3e1c47be87e39ee88273ae4cf777869d3a1703b63a983d2d43c59303e5 +# Test 242 (edge case for u1) +Signature = 305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022826ea75921f78fdbfb9665c2d2ffbfa8363f6b38b5a2efd2dfd5990ea45df251bd014c1761e65cfc4 + +Px = 0x3015b3ca67683467c79446d4b93d10978330856eee40d6d58683ac73500ae315c5b582351c4226b +Py = 0x18d89561d3ffa0f9311aa616547f7eb1d36e73a6cc4bd230df34a1f319be66bcb2fb0e1f68cc192e +# Test 243 (edge case for u1) +Signature = 305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0229009fee192930d30502c05e56adf086ecd13a92cd43ce0c72ea65ead43667890ae19be835333c32c5f0 + +Px = 0x187d93f84a0e6043f097d0a87f8dca07739cf44548a7d3403e039e49c4c51285482975af54ec056c +Py = 0x623c57538fefb7231d619bbefd4cab373a54b361354e586b1d9981a8835e9c6beab082cb93e13b6 +# Test 244 (edge case for u1) +Signature = 305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900963f97cb35a321df62fc219eb2f3703949c483165d06db13c403080a86c1e5d9b43d2e8dd9643cde + +Px = 0x855cc20351126b38f934fbb56c302f62a360e62493c2d529fb87caea0d71bfdaf5fcc3368d495fd +Py = 0x1ce7578610cbec465398b2c1238b3e23b9e29b476196106430d76316aaf29937ace658b69c8bfb99 +# Test 245 (edge case for u1) +Signature = 305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022813dbff9e667e7bcd44950226f93b09738e793517c02886ae9f2b3dededa756c9049ab9a46bc7c93e + +Px = 0x94c54919004079be0db4c92dc1fc947d79eb0f8e869d94813886ada4254f1dadb4d87a6112a58336 +Py = 0x86d8b5beac00fafd647ef8b631e899a6a8b72a511d4f50ce156648ad9cb708fb2fb2c638fdb9f332 +# Test 246 (edge case for u1) +Signature = 305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900852466cef316992b3ca25cc54b7f4fda2e8a819e7c4b040543e94f9caca02937681c2019bb49ee43 + +Px = 0x2bca76043728b5eeefde89d25acdf2e0b160c5ae0ccdab6bd3baa479f17753c3c000ccf8ba8623de +Py = 0x92f0c2d68a1bd405e449823fe63b21402aef3e9a017dcbc30af18bcc79a85264834398c72fa2bb16 +# Test 247 (edge case for u1) +Signature = 305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0228634bfe1800786b0256e90ac2de272f41c85e0976c0caa1691bd835a5a444b1ed1705a0361ae6ee36 + +Px = 0x1c013b3a3260ccfb53e3f6ce93e6984865dc8e1293e92301f4cb3a554bd5da8a53ee101b3e1a3009 +Py = 0x97d2901e26729303e1cb93a8b72dc2afc90ff5b44fd5b6624455487974ed71c7833eff03cc128d0c +# Test 248 (edge case for u1) +Signature = 305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900c697fc3000f0d604add21585bc4e5e8390bc12ed819542d237b06b4b488963da2e0b406c35cddc6c + +Px = 0x624bec4520e6044abed1eee4964668775181464c5d6bf5a8b539f1156f3248c02271bf9425b966b5 +Py = 0x47f406bcc143226d814cdb988d76412ad186bdeeb869ad78a32fe87c76f2545447ddf8fbd0430811 +# Test 249 (edge case for u1) +Signature = 305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02285685b327caacf14f237ea7e9c873ad5f5f8a4cbe8bd0d19826407228fe47bcddbe7f8b470bef3791 + +Px = 0x1b2b2738e3055d1596f64176cf0ac381b3a8178a2f021403350218fa18f9f860c1bba39fc524bc82 +Py = 0x9fbafca1afc5af7598b878d69cb875be0d39f41ff01b09388693eb310adc9d4836e226c23677e51 +# Test 250 (edge case for u1) +Signature = 305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900a2c1f84088120fce85fecf81f0ecc00729f4199ebba0d5b5eda190001000b43168db254b8ef32a70 + +Px = 0x40902bf6b239d2f3588260e9d7f512253fa44f308a0ab81dff05b8fa2e25814d65c2018d49390aae +Py = 0x16f8ae5691938402adc0ffa29bb87ef0af0ecf3cd446d97c3e8d12b3b09eb78909c1b91b1b8785f +# Test 251 (edge case for u2) +Signature = 305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0228711f6d0abce96fe7f5bed2ca4600a021fdda9a8c922fb0e10f180f97fa2cc84dd785c71e6c41dbaf + +Px = 0x726533e26773ac720a115b02de89ac15966677e239b7c577a1c15b81027b1feb73e673601e211aa9 +Py = 0x2accb585bc06cc274b61c9e614746edd248d1cccf8d8b1ab4bc15cc58cdf116065ce9767f2a3223d +# Test 252 (edge case for u2) +Signature = 305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022802a6eb408443d24e96be4ca0278442a8a426087f9beb03ffe5526162bf1dc30434cf7ea79574b19b + +Px = 0x53c3da4de14f7d35775f9beca6d53ee78dac73cd3f18c6fbf709b4ffa7dd3e70b436409b9b285d1c +Py = 0x2a5b60e457e58422c959142b5ecff236dfd76c99c3018cea904058099a13647db08898cfd0509e84 +# Test 253 (edge case for u2) +Signature = 305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900b6ba1aecd240debe77213a4228b125603671c9d5147b6c0b36dd23e42b7cb5078a1b8fdf1b98b93a + +Px = 0xcd24ae7f7523adf859db92e51d48746b8b2f868620898a9c42f8bae8173e3646f586fd818712430e +Py = 0x55b12d59f7344168f796fe59c026eaaa139745a8ace97df1d5c6bcc21f0cfa6860f9c8c75f391629 +# Test 254 (edge case for u2) +Signature = 305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900957b383ba1cebf5ca579ef6ed10027988f8424f42ffbea2e51b3340df9f8c3c60b558d6dc2df10f3 + +Px = 0x4db460209972c8e9c365119546ac457add157f0c4d2b3cd65c635dcaeca617029cabf75c06101bb6 +Py = 0x9ef8b7626e6b2f9845b0086d2a964018b9b25eb8db426bc90694cc614b7602b1fd6087a9a71cbf1f +# Test 255 (edge case for u2) +Signature = 305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02290098ff1db1b9affa33a2e53c684d3f07611772405e8c200f2af2afa9e53c6e8ef30cc143b3f5ff7fb0 + +Px = 0x3e7ab850840d75987d33837ead46499ce433f3fce67383b2e325dd2fc7e0f500769cbb67b4550a28 +Py = 0xc30314487a87094750334499dbfbeb2d5cb976ee2d47997321597a41124a038fe867be0ef668c4ce +# Test 256 (edge case for u2) +Signature = 305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02285e9ff4433ca3a4af648e0071c87c2e5c3554b11761b10bb2b81725028a56c4fc92f1320ca7396c4f + +Px = 0x7acc919934b0fd90011cd96f59ddba52e12094dac18a2cadcb03a0f31ac72d3fd5984a11e9220f8c +Py = 0x629bc5f3f0dabbd3fdd30f47a0a5bea3052892f8e50a4033be4795b32c6671d141b473080e57911 +# Test 257 (edge case for u2) +Signature = 305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900c76ce53560163f157b11e4d05c61540a5df6b8241cbd3ba7d911a7541eec55e986ebf811ae50a8b9 + +Px = 0x12c163fe25cb79ad59c76b5280dc6706a42c58596230bf7ba7206e6ce2b467e1b7a7063e59b0bed6 +Py = 0xccbeaf22accb1ac41ed43ac775b97aea3a688e2f096c3a5e59f868bc919da5ce252cf5d712e7de40 +# Test 258 (edge case for u2) +Signature = 305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02284218a45116ea65b283cc7d90a510f077b1b09eddbcfca3e7d2896b869dd3ba556c4f10590b0e08cf + +Px = 0x6960bfcddd0021fcb8a3d7aa85f96cf360a7113e3824508525021f83e3085989c35e0c5772650330 +Py = 0x5c1275b9d8b5199d461fcb9d34f8857b65a140462fd5cdc7a33e5cf7f4e2d08a5a34d9ae00b2939a +# Test 259 (edge case for u2) +Signature = 305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02285e5f32423bad3644be718d8195341362c9cba52b330f913b1521af6e5e3eb2069421b05dcac299f7 + +Px = 0x66ad2c26012388c8b9046a466b87bd71b64ab81b54cffc5a611f4b7581ad8365edd08e6afd4a52f6 +Py = 0x1a3066c0b3b703ddce746239a4d3dbf1938945f15ea9497bbfc45b389e130350b9945922b87ce374 +# Test 260 (edge case for u2) +Signature = 305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900ac07aaade5c5fb2fe5a18bbefd262e0e439fd68e0a317db06ff4ba623a2a03114ec5b6e084171058 + +Px = 0xcfa6e3838d8113a24d87db97417d68f00c426e9b8550d8a951fed531572e7cca66ffe0ae176ff0e +Py = 0x312fa02e5cc77c21f4a6630e25bcb987dc1eef14aec80c15b9b292e3acfb30bc2c0438f0a9831c07 +# Test 261 (edge case for u2) +Signature = 305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0228311f6d0abce96fe7f5bed2ca4600a021fdda9a8c922fb0e10f180f97fa2cc84dd785c71e6c41dbb1 + +Px = 0x3dabbc36a455ba07432da1aa7239aefdefb72ac09313c3a7f3439850f602543eb4affc5d8225b5ee +Py = 0xce48e2f67e82d448b3d8b9b0fc200832a3d1ac88058872762fcbf027e9f5705d8f5812e507dae125 +# Test 262 (edge case for u2) +Signature = 305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0228623eda1579d2dfcfeb7da5948c014043fbb53519245f61c21e301f2ff459909baf0b8e3cd883b762 + +Px = 0x8a9658dc5f91aa577706f1d91d2252cb0d09f2053e561129105c7f37ddb2f972b3224f12cf9e43fe +Py = 0x8782ec6105f4c06587eb1ececb2f4f4a04e236304dc75eb2efff0be66b977fa804af73bfcbac78e +# Test 263 (edge case for u2) +Signature = 305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900935e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59313 + +Px = 0x6b43bb9587ee158ad5752d1ad11f6f0f5e316ad21937cdd9253f3844857f0a25e7b677bbf999444 +Py = 0x9705362334bdceb68ae6a584640c95cb10789b19953f5e119973eed735177aabfcb263fc8ef5ef97 +# Test 264 (edge case for u2) +Signature = 305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02285b5d0d7669206f5f3b909d21145892b01b38e4ea8a3db6059b6e91f215be5a83c50dc7ef8dcc5c9d + +Px = 0x568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f423999 +Py = 0xc08367945495d933f206927a2b7f5b74b22f973a898355aa2f7e295e06ef3a4f561546db97f79afa +# Test 265 (point duplication during verification) +Signature = 30560229009563bd68545ccd185ae724d8efcd4cc23234934eef10f280792b2f930c97a6c1e00829a8b975b9ee022900c5e79c49abb135129f0636e18e2e73bced30855deeba1477d9521b33a32865155177d946e1babcb4 + +Px = 0x568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f423999 +Py = 0x12dadf8be2267683ef35e5e4a68284f14760386c6d70b8452014908e71a4b1d9a6becbd659bb932d +# Test 266 (duplication bug) +Valid = 0 +Signature = 30560229009563bd68545ccd185ae724d8efcd4cc23234934eef10f280792b2f930c97a6c1e00829a8b975b9ee022900c5e79c49abb135129f0636e18e2e73bced30855deeba1477d9521b33a32865155177d946e1babcb4 + +Px = 0x5d1a100118bd3610f10e13b5adcc7a90a37f4f988cfa4e22cca77e88444b00216dcfe5f68418d342 +Py = 0x5d5b88c9b8c92b3dec7f7bcc688a6d18e6cdeb9176150d4b1062a832c8a3bc377f8d7e98b1db0b9d +# Test 267 (comparison with point at infinity ) +Signature = 305402284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c197310502282a460e39a48c0ff193727e795d339347984ff65457b636ed6f74d627fc8144fb81504445742783d0 + +Px = 0xcca9ac38de5b36cf79d8e415cb729e685e0bbdafe161c5e7ecfa4177e826e815d66526aa5daf3227 +Py = 0x9b7799bcefc6b5d8d09ff1a0739fd423188126f80af703314da0d26ba6714aa197a6582c36b0f05d +# Test 268 (extreme value for k) +Valid = 1 +Signature = 305402282fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de802284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105 + +Px = 0x90537a6827a25060273d44d4846aea596682df0a59d0ffe79be2a1ebe918703cabfac64da5e59100 +Py = 0x3309180d9da5e78237b95403c52f3ceee503067b672715e97d8b6369342684a72f467698741b1a1f +# Test 269 (extreme value for k) +Signature = 3054022843bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061102284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105 + +Px = 0x43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611 +Py = 0x14fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1 +# Test 270 (testing point duplication) +Valid = 0 +Signature = 3055022900f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb70002281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070 + +# Test 271 (testing point duplication) +Signature = 3055022900ad0b664f9559e29e46fd4fd390e75abebf14997d17a1a3304c80e451fc8f79bb7cff168e17de6f2202281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070 + +Px = 0x43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611 +Py = 0xbe6076caf0d032ef35fbe53a528ab907f24bcfb9e5828b04a5cb4174cde781612981cce088849f46 +# Test 272 (testing point duplication) +Signature = 3055022900f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb70002281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070 + +# Test 273 (testing point duplication) +Signature = 3055022900ad0b664f9559e29e46fd4fd390e75abebf14997d17a1a3304c80e451fc8f79bb7cff168e17de6f2202281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070 + +Px = 0x44ab2320c2297b66114428df33fe641956f82033893398af3b49b0023179201c27d26dd65121c06e +Py = 0xc59524c938f19daffc2a9a4679dba7cf1991ced4700592bb75e98cf77dbf6c584c2f72735152921 +# Test 274 (pseudorandom signature) +Msg = +Valid = 1 +Signature = 30540229009cf7f0d60cc1fb2d4b3e78d5f83b374e17a4aebccc6e723f1ad35babb2acfb2b75530389189395f802271110c5b8b8e5fa8dc7952a7bf6200bddae6c1d66639a07a4b6046e00bfa7a2bd9d5777b80c3a92 + +# Test 275 (pseudorandom signature) +Signature = 30540228240a2a7ee9ebb2c753b774cc7f296a905edca6f8715769b8ba21284448aa87a0b30cf0d62aa8db11022817194483a413fb2a5be8d418171097d6a72b6ceb9a3cd4f4c956a681aa95a9e964d829ef2ed6b7aa + +# Test 276 (pseudorandom signature) +Signature = 3055022808c0d832a0b8fd22eb7a10afe148bd7c61132d1b3e625091dbe05e26bca2a9283c1408b6bf6ebac70229008c004e7c796b7a78757d4e1bfc449ba1b79a2a77502548653d5743d587be04f726fa505e0b80a72a + +# Test 277 (pseudorandom signature) +Signature = 3055022900c0e2e65bdeeadd24b785a61959121d16f33ea059235f89dffff94af4d0f7f6f3e3c2fc7626886288022805c332000296f866455795c95e40de8cba4c230525dc1700e73ebf2715466513460d11a9c5cefab0 + +# Test 278 (pseudorandom signature) +Signature = 30560229008f1ec392960476b53f375ce2e9218aa171aa162ae1751779e93ebd412c2fef6c9e802dbaf0c966950229008db0adffad09b55541879e95475421ac9236c4b8bf1d0ebf7be9df28340c9a394f854b2ad1a983cb + +# Test 279 (pseudorandom signature) +Signature = 305402280b5ef7a2d5f1d17555050804e80c1d999638475868406303e59d5a19fe784c1b5e6ef6a1db39844902284ce0e07ae7b2a068d4fb767e6ea624da4e5414b384ced412e042b66ff9342d5292d6eb3f74c804f8 + +# Test 280 (pseudorandom signature) +Signature = 305402286daf315f518206aa0916515db129e55af448f3feef9dd44ba1eee341e1abe026b979b33ff2f935b40228048ac193784a78be0fb5cec317c9c93a57334e44d44b93ee53fc685c3bdf0318077eb3b61a70951e + +# Test 281 (pseudorandom signature) +Signature = 3055022900a6477be7ac1e7251c05bc3a33ef582bb2ff2e15a3ddedd36551423a5d47eb169952ae5472757118e022825f89d31586afd4e99f35a72064d928a729fa63223ec6969ff6ae21ebd608902400f0c1e7e5db842 + +# Test 282 (pseudorandom signature) +Signature = 3055022900af6bc6a7d631ca4d8bd0d902e07ebb65eee711af1376c303f3a4e92e3648f4fbc2f90934251a7aa102287ddc09201e20fa923cf5294b6c031a24f29cafe74934eab71e99a052ca32d565f736a8031fdf4028 + +# Test 283 (pseudorandom signature) +Signature = 3054022847cb9c51231958b093753977d0e9168baf7df30a12e5f51d590d287ffc3dff663bb5ac2e3640611102282dabeff55edfa2cd41d4cd5b178886ba7971e74c4736d02a94a4cce5abaf42d2f833926b02d6566a + +# Test 284 (pseudorandom signature) +Msg = 4d7367 +Signature = 3055022826fd695ee1cc50c2661c2434f8699577af181304bceb7690c538b03463df24334395e791f6750ff6022900b322618cd50c6a7cffcb419ec05b67ec6a117088c78d57cecdd224902d391892ca03e4bc1bd0467b + +# Test 285 (pseudorandom signature) +Signature = 305302273c2e58b8b769bb5f2358384cfb5cd18d9b42bb4d8f7038c2c360fa4a07d7fdb6baf8712b6a313002282fe414ed89b168ed2c54483645871e5a0528ab9897137301387ca210212f10dd6772c4ad3a1db626 + +# Test 286 (pseudorandom signature) +Signature = 305402280a171f07e45b5d547b34aa757a388adeb2ebca9e5981ae001bea48b9245c39b1c39900f251279535022818fc5fe8610366920851fdb374dd6fcdc5ff611685aec3db5b60f990b3e802bab7d12703fb6b7e2d + +# Test 287 (pseudorandom signature) +Signature = 305502280a1eba2117080d5f3ad3713018d67692f81cea10457f77f1ad8600f597d6d8e1508e7f58bcdc7ca9022900b58a604a5bb03b70152e18a4ae1a67e5487057a49de3cec409327346b3a87e0f1ecb1c4379e3c014 + +# Test 288 (pseudorandom signature) +Signature = 30540228152cf11f7eadb7ee1c2d08c5e4dbd13c6cde7af370a7f0e6bc8e97448d095e9397f510d8671a894602281a01143c041ea5df4bd5e1807ee1caaff55dc65c0cead9b3afd0fa321c7d6b7031a4a6416e454794 + +# Test 289 (pseudorandom signature) +Signature = 3056022900b66f0ee0d538030dec76463bd218dfea9fa099172e6aebc29bf3249e2f6a43d87b65ddbf53842619022900999435b30552063f7fde62b2dd9197b8fb6b9a2fd9fad91c2202ed5ed1115f2941baef7812def2aa + +# Test 290 (pseudorandom signature) +Signature = 3055022900b644526f1d152487148bd27e8fa696df19d96b85958d7a1562f2f6cdf9bad0627ab8f3cfa4514714022858eac270103dd30257622c433093820fcbfc178fde0937777673992c02850e1388269f5a9d8af10e + +# Test 291 (pseudorandom signature) +Signature = 3055022900a2c7a235c29fe8edf861daf4eb7189e6764173f4725d65a9d722eacfe284c9c1b08530645b1e0450022833cd2fe300da21b57b615ef666884a3996824daceb753c63ac0632bbbd2c5c47fd54560df467b136 + +# Test 292 (pseudorandom signature) +Signature = 305502285022199709ae123895506096ab337a7fed439b60fd86ae05603b1c90066083dd64814377d33c5a3c022900c51b0facb631cb8bf1af92c468e85cf7efbc470ac306ae1025aa9eb8f8b6a50cb153cd5ca1d18de5 + +# Test 293 (pseudorandom signature) +Signature = 3054022866a09e5f56726092c2bddd00f1b5b932dcf92189628035ac6fcca7606e2d66be6c7a63130232680a0228620c73ae81c037c1465a9eeb02f01ead57d54abc8deb76412d05720c530140c60700c937577638c7 + +# Test 294 (pseudorandom signature) +Msg = 313233343030 +Signature = 305402287a31b7375f924369ec12bc33b834726c95444a4c263557344afa732cf48a155e71a6ee7de42e91ce022824d3d72861f4d2b551c10f0294d16a3bf1d4ee3e484439b804d097dea2d7cace76ade14af1663322 + +# Test 295 (pseudorandom signature) +Signature = 305402286787b980a66749ed0b63b8e1857d2d8bafe7344ca7a0d1c2c2ad23bc9d3916714bb1683ca3e19ef002286e0352e95bcd79de5cd1aac11f5ed3c42b4aa3b2bde667e939cc8aab2da60f7e27ed01375d77efd9 + +# Test 296 (pseudorandom signature) +Signature = 30550228033e4bdb806f5bf3dca2f3f839bdd9213c4904a00a2fb6ebe3ff9b4a00430a5e5547a1115676edf4022900976c3695960f25151df781955444e4581332f299d812e259c8efe857c8af8cb53144863178610db7 + +# Test 297 (pseudorandom signature) +Signature = 305402283f3f2b52fcdd46d19d225656cdffec5d46d30bcefb095224f8a96a420c74e1a1e7f1699ad820102b022847af2647d0f48fd0af14f0e1973c02b91d313c2407ba01d320870a4e1598ea3f5193ba2adf245c51 + +# Test 298 (pseudorandom signature) +Signature = 30540228529d6d1bb1bb51388ebf41737ada083b0740f9a37a878e0f34b237b01cb108c025898ffebbd43463022824ec25045f4652b0363513686a4142588e11733bba31322f495f828d91d3e805497bc1f47604b647 + +# Test 299 (pseudorandom signature) +Signature = 305402284c3d1f1f5f13355289951ceb44ec3d7ed23c70b6db934c6e3c225a6e0c0d7efaeea110cd9fe75294022868ba90fd8c55cfd53d2d6d50e152f957208aabc917947ae25ddd258ec2f82be82a9a2c3cbe1fd206 + +# Test 300 (pseudorandom signature) +Signature = 3056022900a72f9b8bf22b28b3a2cc9b5da808c174d848e62a31011a7b130ed54dbfe89530aa9ac9a1ceaaa368022900a913454b3c76bb36229a0545ac414905dd26bf4d4c67f4f9c7a2c81d5445be0d9b1465afdb4feacf + +# Test 301 (pseudorandom signature) +Signature = 305502283d8ffb5908d20eeda0abbcea3280772669aa3420e211681fd4c31cfb1f82b8a0d9231ed7e35886530229008ef01622f63761ebd7ed383083e1f00984603de71e4b6429f9b1dad5352c870fd64effead5305b13 + +# Test 302 (pseudorandom signature) +Signature = 30560229008a2cbfb0e9120614ba14d7a93049a227bc8ecb7c0ac5ae0bc72e8f45fd45646e56edc0c28734e594022900b976a913c060867c57678422badf0b403d4395a80909e4dcc8cdf8c6f68312c51a1311dfcf2aca15 + +# Test 303 (pseudorandom signature) +Signature = 305402281af8b8d325032fec4e10c0471a5d02526ead95e2a5ce85dc0d5e38959dadde4f59efa76eaadf13de022812f4ca711553c38ab64f2e74ad52729cfaea773d6abeb13b9ae417f84079a88e9bfcceaf21049d0e + +# Test 304 (pseudorandom signature) +Msg = 0000000000000000000000000000000000000000 +Signature = 305502282417eb10a538921621066608243fd6574de84ef1281520f01ebe0444b46a607ab9eda8f3721779a60229008f1e2ea294028baeb738181e128c86ad55cb1945436cf69e090c2f6159f6f22011d731733b4433ba + +# Test 305 (pseudorandom signature) +Signature = 305502287d91e0d4c8b14ccd4be282229108d8cf9b22d458164e3ee36d3c77ca9d434824c3de90dc356786cc022900b4733939814bec07ee9e045604d56afca213f032d7fd7efbc5202062bf8b098b4dcb4f530366711b + +# Test 306 (pseudorandom signature) +Signature = 3055022900bed4f95bb94ec98e730f43335b5dc35f6ef4b0f4afbce8990903d51561e8912c4e07d9671841074c02282cfbd417500a63ba179601501289bcc87b1184e522398c66c75d283850470badbd7b28d71933ff99 + +# Test 307 (pseudorandom signature) +Signature = 3054022876afc2b14e76af9129dcf1d6b605d1dd56017fc53b3bb0aed1c901d24c6266586dbb4460d9cc7f0c02287e9996a2fb52b1e2a7ad6489022e1bc0fbf9523a1fd526a05d6aec1fe78b709f7af17bff48028382 + +# Test 308 (pseudorandom signature) +Signature = 305502284a8768f0698a76b77bbb91ae698cadfddcdf1f93364f7cc9b695e3a4a14bdb2067302b0cab6308cb022900ba010fa0428d57e28e2231a7bb1a4ee6c28964c07e5d82557945137a22a55df99685f1c43571a927 + +# Test 309 (pseudorandom signature) +Signature = 305502285fe898f704932d2976593d260519cc3fc5bbb39988ebdb8f6c8686aa83c5d628efdee22907ed6c8d0229008277d8de421da5bc7286116290b3266a8e006a3fbd48fd3dc70c6736af3a53ccb6184a3ab5042dd1 + +# Test 310 (pseudorandom signature) +Signature = 305402285cce2d6cfdb4f10f809a8b63640b90e8fccc21381b7c870e3704de3c8bd8230e1a627197b6a1111a022820cb6e42e5e651b3cecb7bd3bcc6fcc249f6eaf512e3152f97ddd7820e746c5a8739fda710f4c013 + +# Test 311 (pseudorandom signature) +Signature = 30560229008c94a6a25b5db8ec209175fedaf15c7ffcb189fcbb2cd6c18ba96b5596c5f892e6bbbec8c7a43ac402290087ad68b96ae24f33296ca49ca675d04c4f25b61c8e5ca9ca66b9eddf072451aca87fc7994b848d18 + +# Test 312 (pseudorandom signature) +Signature = 305402282490665d073b6045dfc09c743768b61aa290cdc3bc9f49a89c5ee8acb96c9322ff98a09472e4583202282b86566dc5d0c48e6cf8dcf4de977908f34b94e846a479eeb4c9ae1e6dfe97783761970364ea917f + +# Test 313 (pseudorandom signature) +Signature = 3055022900b9c8bb17bca2ba8275aeb772834c8a6365ad5148e68e955612c9ffdf1834062c416586b3c24e0fb0022863511f500b31214488e0a36c1ebb80b1c377539be3bbe09d14321b632c79225d6693fde61def6a94 + +Group = brainpool384r1 +Px = 0x192ed5ce547d2336911d3f6cecba227f08df077f6242a9147a914e854e6e32d325fd23ccc42921dc4a7e4c2eb71defd3 +Py = 0x631e69079ba982e7a1cad0a39eff47fc6d6e3a280d081286b624886ba1f3069671ec1a29986d84fb79736d2799e6fc21 +# Test 1 (signature malleability) +Msg = 313233343030 +Signature = 306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102310083aa7ba485dc060df9922f9ccc5da29adb75d44671d18bad0636d2e09c5e2f95e892a79b9fd3b37e1f798b157b567a24 + +# Test 2 (random signature) +Signature = 3064023029e021a3835ca84c4e72cac034682dd3bc9617cf42fdbda6824e62863e2dbb7da930d196f1192e8d5da062ec463ae2290230052816be3803e32167fd7cbd19edf56ea771290c06b6bd4c705cf7d591eae46c8f28569306e8b74157a7dd2688d7ecab + +# Test 3 (random signature) +Signature = 3064023057def8ee9ea3e7aeeedea8f09cfd3efd0a72797a1dcfdb9466d354d93b44f045147db6d3f359d5b4b84d3fa968d9166c02301773822fbc56b9aa5bd8eebc747dc8970c0ecf808bb4c75fa2b766477c1d8dbccffef02f1a1c2741ed61509d7cfb414c + +# Test 4 (random signature) +Signature = 3064023045fd5ec8d9db3b6f027d113bb7aa8691693122e12e42bfec8312286683f6eb45441d9ffdff7eb3d82eb86092008753090230224b46fc0b2294afd7a43f35dc3c827ca03e18aaecb1dbc28be59f01656bb9a20f3ada1fea07e2c1b6a3b3dae494a4e7 + +# Test 5 (random signature) +Signature = 306402303b47364cb8fd761691f52ec6cf7d2dcaee39385ec1f41a268586d70a8cc112ea604286d0306dc9019c1120db24d9d48b02301394e9419b1baeb3cec3cb9d0b4cbc4ae13b8cdbff00d7a8bde31bec28a8142b05942403f03cb9f1c6fcf77640756dac + +# Test 6 (random signature) +Signature = 3064023068d213b292ca177acde005fdd64ef61b988835c9923e36fd00122d2330f2f56a9a8ca60792b85c243a43b03ad7df02bb02301248798ddcdd63d76d108fee4678fb9197d66da8fb3538e2f7c38433306ef7a1396f46f00d590e2b235d5a319d941bee + +# Test 7 (valid) +Signature = 306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 8 (long form encoding of length) +Valid = 0 +Signature = 30816402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 9 (long form encoding of length) +Signature = 30650281300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 10 (long form encoding of length) +Signature = 306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91028130090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 11 (length contains leading 0) +Signature = 3082006402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 12 (length contains leading 0) +Signature = 3066028200300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 13 (length contains leading 0) +Signature = 306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102820030090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 14 (wrong length) +Signature = 306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 15 (wrong length) +Signature = 306302300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 16 (wrong length) +Signature = 306402310e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 17 (wrong length) +Signature = 3064022f0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 18 (wrong length) +Signature = 306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910231090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 19 (wrong length) +Signature = 306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91022f090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 20 (uint32 overflow in length) +Signature = 3085010000006402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 21 (uint32 overflow in length) +Signature = 3069028501000000300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 22 (uint32 overflow in length) +Signature = 306902300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102850100000030090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 23 (uint64 overflow in length) +Signature = 308901000000000000006402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 24 (uint64 overflow in length) +Signature = 306d02890100000000000000300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 25 (uint64 overflow in length) +Signature = 306d02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910289010000000000000030090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 26 (length = 2**31 - 1) +Signature = 30847fffffff02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 27 (length = 2**31 - 1) +Signature = 306802847fffffff0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 28 (length = 2**31 - 1) +Signature = 306802300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102847fffffff090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 29 (length = 2**32 - 1) +Signature = 3084ffffffff02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 30 (length = 2**32 - 1) +Signature = 30680284ffffffff0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 31 (length = 2**32 - 1) +Signature = 306802300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910284ffffffff090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 32 (length = 2**40 - 1) +Signature = 3085ffffffffff02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 33 (length = 2**40 - 1) +Signature = 30690285ffffffffff0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 34 (length = 2**40 - 1) +Signature = 306902300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910285ffffffffff090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 35 (length = 2**64 - 1) +Signature = 3088ffffffffffffffff02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 36 (length = 2**64 - 1) +Signature = 306c0288ffffffffffffffff0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 37 (length = 2**64 - 1) +Signature = 306c02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910288ffffffffffffffff090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 38 (incorrect length) +Signature = 30ff02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 39 (incorrect length) +Signature = 306402ff0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 40 (incorrect length) +Signature = 306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102ff090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 41 (indefinite length without termination) +Signature = 308002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 42 (indefinite length without termination) +Signature = 306402800e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 43 (indefinite length without termination) +Signature = 306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910280090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 44 (removing sequence) +Signature = + +# Test 45 (appending 0's to sequence) +Signature = 306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000 + +# Test 46 (prepending 0's to sequence) +Signature = 3066000002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 47 (appending unused 0's) +Signature = 306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000 + +# Test 48 (appending unused 0's) +Signature = 306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9100000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 49 (appending null value) +Signature = 306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410500 + +# Test 50 (appending null value) +Signature = 306602320e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9105000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 51 (appending null value) +Signature = 306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910232090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410500 + +# Test 52 (including garbage) +Signature = 3069498177306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 53 (including garbage) +Signature = 30682500306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 54 (including garbage) +Signature = 3066306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410004deadbeef + +# Test 55 (including garbage) +Signature = 3069223549817702300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 56 (including garbage) +Signature = 30682234250002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 57 (including garbage) +Signature = 306c223202300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910004deadbeef0230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 58 (including garbage) +Signature = 306902300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9122354981770230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 59 (including garbage) +Signature = 306802300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91223425000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 60 (including garbage) +Signature = 306c02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9122320230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410004deadbeef + +# Test 61 (including undefined tags) +Signature = 306caa00bb00cd00306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 62 (including undefined tags) +Signature = 306aaa02aabb306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 63 (including undefined tags) +Signature = 306c2238aa00bb00cd0002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 64 (including undefined tags) +Signature = 306a2236aa02aabb02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 65 (including undefined tags) +Signature = 306c02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b912238aa00bb00cd000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 66 (including undefined tags) +Signature = 306a02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b912236aa02aabb0230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 67 (using composition with indefinite length) +Signature = 3080306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000 + +# Test 68 (using composition with indefinite length) +Signature = 3068228002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9100000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 69 (using composition with indefinite length) +Signature = 306802300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9122800230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000 + +# Test 70 (using composition with wrong tag) +Signature = 3080316402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000 + +# Test 71 (using composition with wrong tag) +Signature = 3068228003300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9100000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 72 (using composition with wrong tag) +Signature = 306802300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9122800330090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000 + +# Test 73 (Replacing sequence with NULL) +Signature = 0500 + +# Test 74 (changing tag value) +Signature = 2e6402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 75 (changing tag value) +Signature = 2f6402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 76 (changing tag value) +Signature = 316402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 77 (changing tag value) +Signature = 326402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 78 (changing tag value) +Signature = ff6402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 79 (changing tag value) +Signature = 306400300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 80 (changing tag value) +Signature = 306401300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 81 (changing tag value) +Signature = 306403300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 82 (changing tag value) +Signature = 306404300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 83 (changing tag value) +Signature = 3064ff300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 84 (changing tag value) +Signature = 306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910030090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 85 (changing tag value) +Signature = 306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910130090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 86 (changing tag value) +Signature = 306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910330090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 87 (changing tag value) +Signature = 306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910430090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 88 (changing tag value) +Signature = 306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91ff30090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 89 (dropping value of sequence) +Signature = 3000 + +# Test 90 (using composition) +Signature = 30683001023063300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 91 (using composition) +Signature = 3068223402010e022f8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 92 (using composition) +Signature = 306802300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b912234020109022f0ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 93 (truncate sequence) +Signature = 306302300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb + +# Test 94 (truncate sequence) +Signature = 3063300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 95 (indefinite length) +Signature = 308002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000 + +# Test 96 (indefinite length with truncated delimiter) +Signature = 308002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb4100 + +# Test 97 (indefinite length with additional element) +Signature = 308002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb4105000000 + +# Test 98 (indefinite length with truncated element) +Signature = 308002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41060811220000 + +# Test 99 (indefinite length with garbage) +Signature = 308002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000fe02beef + +# Test 100 (indefinite length with nonempty EOC) +Signature = 308002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410002beef + +# Test 101 (prepend empty sequence) +Signature = 3066300002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 102 (append empty sequence) +Signature = 306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb413000 + +# Test 103 (sequence of sequence) +Signature = 3066306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 104 (truncated sequence) +Signature = 303202300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91 + +# Test 105 (repeat element in sequence) +Signature = 30819602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 106 (removing integer) +Signature = 30320230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 107 (appending 0's to integer) +Signature = 306602320e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9100000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 108 (appending 0's to integer) +Signature = 306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910232090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000 + +# Test 109 (prepending 0's to integer) +Signature = 3066023200000e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 110 (prepending 0's to integer) +Signature = 306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102320000090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 111 (Replacing integer with NULL) +Signature = 303405000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 112 (Replacing integer with NULL) +Signature = 303402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910500 + +# Test 113 (dropping value of integer) +Signature = 303402000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 114 (dropping value of integer) +Signature = 303402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910200 + +# Test 115 (modify first byte of integer) +Signature = 306402300c8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 116 (modify first byte of integer) +Signature = 306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102300b0ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 117 (modify last byte of integer) +Signature = 306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b110230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 118 (modify last byte of integer) +Signature = 306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadebc1 + +# Test 119 (truncate integer) +Signature = 3063022f0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b0230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 120 (truncate integer) +Signature = 3063022f8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 121 (truncate integer) +Signature = 306302300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91022f090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb + +# Test 122 (truncate integer) +Signature = 306302300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91022f0ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 123 (leading ff in integer) +Signature = 30650231ff0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 124 (leading ff in integer) +Signature = 306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910231ff090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 125 (infinity) +Signature = 30350901800230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 126 (infinity) +Signature = 303502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91090180 + +# Test 127 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30650231009b472fccbf6d812d65696852cbfcadddaa9ff8b1ed8f8be752cc82bc2aebfc9f6bc887fe5da9bd8a6aafb4c21c74f0f60230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 128 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3064023081d4f2c778fca6dd46ae89562a302a1f8041169e12e6de81149fa5e2d2e3b14fcd531a9f86aa3769f39f50bc4a6c262c0230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 129 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30640230f171eeb5e3caebfaa9f4072b84e994016a8f7857ffc4cacbcc49ebb08118290863722eb10dd60585d0d87d40cc8f746f0230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 130 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 306402307e2b0d3887035922b95176a9d5cfd5e07fbee961ed19217eeb605a1d2d1c4eb032ace5607955c8960c60af43b593d9d40230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 131 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30650231ff64b8d03340927ed29a9697ad340352225560074e12707418ad337d43d514036094377801a256427595504b3de38b0f0a0230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 132 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30650231010e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 133 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3065023100f171eeb5e3caebfaa9f4072b84e994016a8f7857ffc4cacbcc49ebb08118290863722eb10dd60585d0d87d40cc8f746f0230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 134 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102310095c7c160c094d4422528af5fd56ee1234ee90dcd68d721b937f609f8bbaa1bb9b5e2c5c3372bd2a25796d8f056b250a6 + +# Test 135 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910231ff7c55845b7a23f9f2066dd06333a25d65248a2bb98e2e7452f9c92d1f63a1d06a176d5864602c4c81e08674ea84a985dc + +# Test 136 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230f6f15d21e2a398e5ea34c01e7b7760bbc646633c847d34f9e7206473f05a09ee1957f0ec3453f06de3f15912925214bf + +# Test 137 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910231ff6a383e9f3f6b2bbddad750a02a911edcb116f2329728de46c809f6074455e4464a1d3a3cc8d42d5da869270fa94daf5a + +# Test 138 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91023101090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41 + +# Test 139 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91023100f6f15d21e2a398e5ea34c01e7b7760bbc646633c847d34f9e7206473f05a09ee1957f0ec3453f06de3f15912925214bf + +# Test 140 (Signature with special case values for r and s) +Signature = 3006020100020100 + +# Test 141 (Signature with special case values for r and s) +Signature = 3006020100020101 + +# Test 142 (Signature with special case values for r and s) +Signature = 30060201000201ff + +# Test 143 (Signature with special case values for r and s) +Signature = 30360201000231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565 + +# Test 144 (Signature with special case values for r and s) +Signature = 30360201000231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564 + +# Test 145 (Signature with special case values for r and s) +Signature = 30360201000231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566 + +# Test 146 (Signature with special case values for r and s) +Signature = 30360201000231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53 + +# Test 147 (Signature with special case values for r and s) +Signature = 30360201000231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54 + +# Test 148 (Signature with special case values for r and s) +Signature = 3008020100090380fe01 + +# Test 149 (Signature with special case values for r and s) +Signature = 3006020101020100 + +# Test 150 (Signature with special case values for r and s) +Signature = 3006020101020101 + +# Test 151 (Signature with special case values for r and s) +Signature = 30060201010201ff + +# Test 152 (Signature with special case values for r and s) +Signature = 30360201010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565 + +# Test 153 (Signature with special case values for r and s) +Signature = 30360201010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564 + +# Test 154 (Signature with special case values for r and s) +Signature = 30360201010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566 + +# Test 155 (Signature with special case values for r and s) +Signature = 30360201010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53 + +# Test 156 (Signature with special case values for r and s) +Signature = 30360201010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54 + +# Test 157 (Signature with special case values for r and s) +Signature = 3008020101090380fe01 + +# Test 158 (Signature with special case values for r and s) +Signature = 30060201ff020100 + +# Test 159 (Signature with special case values for r and s) +Signature = 30060201ff020101 + +# Test 160 (Signature with special case values for r and s) +Signature = 30060201ff0201ff + +# Test 161 (Signature with special case values for r and s) +Signature = 30360201ff0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565 + +# Test 162 (Signature with special case values for r and s) +Signature = 30360201ff0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564 + +# Test 163 (Signature with special case values for r and s) +Signature = 30360201ff0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566 + +# Test 164 (Signature with special case values for r and s) +Signature = 30360201ff0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53 + +# Test 165 (Signature with special case values for r and s) +Signature = 30360201ff0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54 + +# Test 166 (Signature with special case values for r and s) +Signature = 30080201ff090380fe01 + +# Test 167 (Signature with special case values for r and s) +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020100 + +# Test 168 (Signature with special case values for r and s) +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020101 + +# Test 169 (Signature with special case values for r and s) +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650201ff + +# Test 170 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565 + +# Test 171 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564 + +# Test 172 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566 + +# Test 173 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53 + +# Test 174 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54 + +# Test 175 (Signature with special case values for r and s) +Signature = 30380231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565090380fe01 + +# Test 176 (Signature with special case values for r and s) +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564020100 + +# Test 177 (Signature with special case values for r and s) +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564020101 + +# Test 178 (Signature with special case values for r and s) +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465640201ff + +# Test 179 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465640231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565 + +# Test 180 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465640231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564 + +# Test 181 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465640231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566 + +# Test 182 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465640231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53 + +# Test 183 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465640231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54 + +# Test 184 (Signature with special case values for r and s) +Signature = 30380231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564090380fe01 + +# Test 185 (Signature with special case values for r and s) +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566020100 + +# Test 186 (Signature with special case values for r and s) +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566020101 + +# Test 187 (Signature with special case values for r and s) +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465660201ff + +# Test 188 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565 + +# Test 189 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564 + +# Test 190 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566 + +# Test 191 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53 + +# Test 192 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54 + +# Test 193 (Signature with special case values for r and s) +Signature = 30380231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566090380fe01 + +# Test 194 (Signature with special case values for r and s) +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53020100 + +# Test 195 (Signature with special case values for r and s) +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53020101 + +# Test 196 (Signature with special case values for r and s) +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec530201ff + +# Test 197 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec530231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565 + +# Test 198 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec530231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564 + +# Test 199 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec530231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566 + +# Test 200 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec530231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53 + +# Test 201 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec530231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54 + +# Test 202 (Signature with special case values for r and s) +Signature = 30380231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53090380fe01 + +# Test 203 (Signature with special case values for r and s) +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54020100 + +# Test 204 (Signature with special case values for r and s) +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54020101 + +# Test 205 (Signature with special case values for r and s) +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec540201ff + +# Test 206 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec540231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565 + +# Test 207 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec540231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564 + +# Test 208 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec540231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566 + +# Test 209 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec540231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53 + +# Test 210 (Signature with special case values for r and s) +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec540231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54 + +# Test 211 (Signature with special case values for r and s) +Signature = 30380231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54090380fe01 + +# Test 212 (Edge case for Shamir multiplication) +Msg = 3335373632 +Valid = 1 +Signature = 30640230705c790f8f50061c508c15fc9aabc1f58193ab15b394ab2195e358cb620a5bf4b65449afb9c417bd1a3105e53a9742ce02306dd7abda4001bc416982ab4326b5d27b1280f02b142f040ce2497f9e153e4e1e3a35c5ffaef72694e677872eb19ddf36 + +Px = 0x8a94164dc7654fda3cd4301d3e972024c2daba71d442128c7f3faecdb9e375a85aa80c4ac28889f258e6cba886d47636 +Py = 0x548b3bf1b675f2318c3d8ab7a1c281a33241c121b3590bfdf703c7cd4bae8f451886d989234c1b8c589614554d429392 +# Test 213 (k*G has a large x-coordinate) +Msg = 313233343030 +Signature = 304e021900f39b6bacd3b2eb7bdd98f07a249d57614bbece10480386e80231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046562 + +# Test 214 (r too large) +Valid = 0 +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec4d0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046562 + +Px = 0x73f84ab63789301e88b4cb82cb935decffb8f42b2c9784c7544615b9076ec7a7ab94702ca7f1d9aacfb90537b5d368dc +Py = 0x502cb7c8c18285994c7b19fa3e2401fdc26de54ffe006bb79bdd7852c666d730bdf76a16c0792a6c6681ed6b647fc81b +# Test 215 (r,s are large) +Valid = 1 +Signature = 30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465640231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046563 + +Px = 0x895e8461eddbe21367a95b25cd85cd31e80ecf1f95539056fb7e10b4aa49900b2194d919b29cd9bf373a1d53ef571174 +Py = 0x767c02e36b935a65e5a9cbb35589a2a018482065c5e33da8ce483dc7f7fe441574f9e7ab0614bdcfc61022c780a30009 +# Test 216 (r and s^-1 have a large Hamming weight) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0230480eca2874aa6ba71e7fb5711339ac0a7bf84065b3c7d59c64a2c6015e6f794e7dfa2b1fec73a72adb32bdb7dd55cd04 + +Px = 0x618ad81912e4c31f23eab2f0c693b3ef8404074ab1dce01dc82a768151c9fa0393b4d6aeaeec6858d3f419957a5b997f +Py = 0x31fa809b1b44677cc5aef1894846142c3e44bba6c471123fa14feb8f3aa9e92f769be549cef9c1d55bc6f1f4f841813d +# Test 217 (r and s^-1 have a large Hamming weight) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe02301629ef2d7182d67b6bd9cf6842251fe09c96bfe022b8ad9a0e546fdc8ecf5dc8636fa13059d7e9d83fde50e0d2b392c8 + +Px = 0x79583b4968b576811b567e1620e00b0aab8aa223c5e655b27b1ebeaf83bcd35f4205a5a0e51a2052fffe9fd23785c98f +Py = 0x77357c8a1008fcb7a3579614c2ff47980fa9e44b6b5ea3f8a33c919dd2aea5dad0ca1a01a9e2106518b1642906e4f275 +# Test 218 (small r and s) +Signature = 3006020101020101 + +Px = 0x89657bac216c3ac4a3a2d5afd342ad24a4eb103d4dbe2e4461e03c7011826513fe82bd06e17e3ae8eb5811da0bec88bb +Py = 0x33ee1eddd5d49dd86e785fbfebb9288661964e6fbe0c07af9a4ba3145fc4be11e5484b650c97096db82ebb0ca2bb84ed +# Test 219 (small r and s) +Signature = 3006020101020102 + +Px = 0x5876f414fa385b403a2d10da5d89b110344ad005bfaf8c759ab1e3561a39ff0db9ff91ec6040316e2fca3654a48c0e89 +Py = 0xdcb77f896ea475cb97672a8400329554c941b61b4a84bde1f8c8fc5250c29161fc3ca50458a41c77a48bb336882f2ea +# Test 220 (small r and s) +Signature = 3006020101020103 + +# Test 221 (r is larger than n) +Valid = 0 +Signature = 30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566020103 + +Px = 0x1bee741fa192a9bd0535d00627737079e98f00076394c978a96a0f9fba64e9e21decff6b4b8fe11f60b18d5d758684de +Py = 0x6d19321eab7e8601f8f4606fe93fd3b2f02986a58ca56413282c66dd36ba6724a3cbceee79948ba2d55c756586b58e2 +# Test 222 (s is larger than n) +Signature = 30360201010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9173bec + +Px = 0x6b25f8c1629f7579e3c7ee4b029cc029b4bdbed88b9b399303e4a14352d1f3f6048ecdd062d37cba7b70bcbd587231e7 +Py = 0x621313f93d310f144bd3322582804639dd2960969a993a9f2a3609f856e1415a0a4dcf58a7864e41e2a8c80dfc158a30 +# Test 223 (small r and s^-1) +Valid = 1 +Signature = 303702020101023100896621d23283b12111048d1c978e2c286d60b6ef7ce37af36cf7aa4de268d626de7ddcb356d167c7483c69455c752c93 + +Px = 0x5d082cde6086f8ea6994f46e9dc06c1c1d2c3a3c2dc5c97bf137653d9b2ed21101bad843d46e4b7925b9af7034c6d021 +Py = 0x12c7f56e65d233104063391fb3828b3990e6893d77746e42305e6a5ba111d976d693f595af858f19fac7234f7484c489 +# Test 224 (smallish r and s^-1) +Signature = 303b02072d9b4d347952cc023038e8dae216c63f06b3edbd0f9ba7a5e4a332ec187251e3d627839d1baac667d7caad2ab0a1ea9fbb12dc5a71e3b49bc9 + +Px = 0x7407ca6c2a183f9ca1376609e9c78a8d080effad15a4f63cbb7a168e3c789b8b59ce4d3122ca08a86907ba487f717fbc +Py = 0x3e2c56a9b3460a5136b213be8d48cb3dc9c7ad945b1dcecbf93fa6cfaaf8dbd70f1040b97ad8e3ac30f2e64fd7cc76d6 +# Test 225 (100-bit r and small s^-1) +Signature = 3041020d1033e67e37b32b445580bf4efc02300d2436a599b396a51c546e05d1c3d25a8f6d05935ae5031dad3cdd7cb36cf6912a433de28f8475d3b1e2e1ce77610879 + +Px = 0x4fc32a5226820ec9c3fff2c74e0b36d7de028e59fc005f3807a3bd59892c9ad20dba7168ef9ed9bf99b25ed01bcfc6ca +Py = 0x6a13da2e852777a6f99d04322a1b9fb4227684bf7c40d4d3ef92798003a3bf2da158d5686457c33d0e24be5c265fc473 +# Test 226 (small r and 100 bit s^-1) +Signature = 30360202010102304a289adad7ceec67ae99ef5da797b6bb17d9c168428ab30ea9a68b89652c4b9e9bae876ab3d7fbdf1eb92ed422bd3b93 + +Px = 0x7350a7d00d7719a318522ef4c5e6be24b3b2cb300c596f79e8dd31a4688fe65a54b2d7497a06821eecbaf31b2fa7cdcb +Py = 0x4bd72fc7f05e32457fda0cc3f321157744f1841c30bd086e6ddd5bf415eb71ecbe36f0f3fd23d3c41487fb283e0e9794 +# Test 227 (100-bit r and s^-1) +Signature = 3041020d062522bbd3ecbe7c39e93e7c2402304a289adad7ceec67ae99ef5da797b6bb17d9c168428ab30ea9a68b89652c4b9e9bae876ab3d7fbdf1eb92ed422bd3b93 + +Px = 0x61498ad31a84eed102ba2712eb8a7bd92320bda4ac6d07b4326a30869d19eb1b96229d21efd711dcf73048bf166800e3 +Py = 0xcfcc13a0914132284dbeab6fcf5d70b34ca86a681157e4874abffaeebb69b8b71f69d332306567823dde5407ce739e8 +# Test 228 (r and s^-1 are close to n) +Signature = 30650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90464e502305dd0bf01c2259e1ab4e8f4fee099813f6374f6069e3839ccbf64499dc802c3c534d1cf1f9cffd76027b021574602ee43 + +Px = 0x50592f34db0263df4c669b8991941be18237a1045bfd165ea4af385376564edf6654a0dff7b5d84474090f265c46b51 +Py = 0x1545918cd8f22260ce21a584edfa0b1644488c997d956529262aef400cc0320ed27ddcec3bde6b9fd79b374af688fa9f +# Test 229 (s == 1) +Signature = 303502302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721020101 + +# Test 230 (s == 0) +Valid = 0 +Signature = 303502302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721020100 + +Px = 0x4df898544c2b10dc3c4d3249fca5130e753d26e08320bd823926acb050d8b6a4feadf29bef07ecdb00e85b341f22069a +Py = 0x3343695d1e0ac0a78b38490d97c1e90e4ff4ca0d2140b9101f1b63f29ca4f2bf9176e1600483916216bd35abce6741 +# Test 231 (point at infinity during verify) +Signature = 30640230465c8f41519c369407aeb7bf287320ef8a97b884f6aa2b598f8b3736560212d3e79d5b57b5bfe1881dc41901748232b202302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721 + +Px = 0x5d77134e890ac72f9c69fcc3f181ae746fefffdafc1dfc791cf33a22fb0f8e586188cf2d5d060ddb04004baf56191c9f +Py = 0xe7401ddcc47a09b5ecf2719cc936010a9371a7f7624e63e7a00550a13d035cf586d3b522c7fd06251adbb0f0aad3dd7 +# Test 232 (u1 == 1) +Signature = 306502302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace + +Px = 0x607cd94c42f5bbfcf857a708ac163f0afc0a65c8d88725f18c4bf7eb7cf5d34aca6008a27b4e5fd9476134ed85fcd32c +Py = 0x89f248290c59b8fb963e90bab9b0b3e313d3b8e0a6c8901455a22b7b74a108152c5b814ba575de8de07cdb8d67ba2b50 +# Test 233 (u1 == n - 1) +Valid = 1 +Signature = 306402302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba301772102301fc115146e521d7ea33f3e128eb01db0f653dc45852c2b50301d639b778b13380e51d9366552cf2049156605d57adffc + +Px = 0x4b4afbd91746b1a4df6d0d717afc7528fa4a9dda9a62afee19a72fc0019aa2ea89a125bea7675506230656caaff52c73 +Py = 0x5f5c3575bf669637efdb672477500f1fe37b45dcf879487ad6ca36c4147329fb741706ce9b928ce47bf6dc0f9e44017f +# Test 234 (u2 == 1) +Signature = 306402302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba301772102302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721 + +Px = 0xd8b246c623188b7455716ac189b9af441676a1c41cd575754bd02ae4d6825304b961ddf0826bb161e3d63e9bc71f1d4 +Py = 0x6edbeddc2d40dafdccac90ae85cd616a0ea1e4a08ae8fc3358ce7d5142eee8f3bebdc14591c4c9b15bff12b8cf08334a +# Test 235 (u2 == n - 1) +Signature = 306402302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba301772102305dd0bf01c2259e1ab4e8f4fee099813f6374f6069e3839ccbf64499dc802c3c534d1cf1f9cffd76027b021574602ee44 + +Px = 0x4d9d4a62d6eb02073e738b1e439cecd5440031911f45190eb6062a33535fc5269bcfc25d4afc1dae0ebad948d7732d8 +Py = 0x29af37e89a3cea7df38b020f624906fca6d944e1486853fe8e5ba9cfba2d74a852ec587d46fe49917c364418ef7eca5 +# Test 236 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230533b0d50480a3ef07e7e8af8b1097759bc03ac9a1c7ed6075a052869f57f12b285613162d08ee7aab9fe54aaa984a39a + +Px = 0x1a4a55c9b0ce43d7ed78a98d9bf6459ccf349466fccc457598fc15a1d6956d8ce8348b2332fffb3d516b078d28d329dd +Py = 0x73f45a4ce1f5dc772f3c3283af6564e6e410f9d5064b6484065966936693f62ac9940eb28914a091d2964cd843b41028 +# Test 237 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023070a8e817f4ea82b831ba5e671830b4312846b23da14ff7d43baf3a7ee7aa061c86422aaf27ffc5c655406868b5bf19bf + +Px = 0x373ac98f088268a86d136de4fa0ce2c41042cd33ed2d07250f53cd4ed43fa1da425da597bd5b413d56cfff954267104f +Py = 0x69e0453bbbd79280316f8c1c161a846af379a941ed286e593e7f289ba4fff42458b273a3ba499574e134e7fb4a7dc19 +# Test 238 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230326c0872a7224e7a104087acf4c4b4e3e5aba4ffe4625fc3955ce9647bf71fb596b83971ad2b52473a2821991c808905 + +Px = 0x7e6ab429b9e33a974f6ab9a49eb152c484575fad5d9bcddcb87edce16e79333a937276f36aec9121de450384cb20bb2e +Py = 0x8595f6c2880d89198e1b625e65056d0a19a58d1d1c551bcc5dd39d281d726dad4108488c8f941ac983169cace3ecc71b +# Test 239 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023065cf0a5bce70af078af6d5a14545ca619e47d6eb0fd0531ecc743a7685530284a83289c2d09e024384ae5e778799e414 + +Px = 0x1fbb37f75195c3f2de3afcc88ad7eb32108144608943face3a890005ff2a3e0b558079c5842620f44adc0c38dd88aac5 +Py = 0x51734f8eb827df929d7317714a29cf8ba432caf689094d00eb9d63cbc908ba76ca5b1f93d229477c960842940f4224d3 +# Test 240 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02302e099adfe4d9120596e8a1520399b0e249555b171e0a71967307548a3c28753fa40bbcb0a8658369dc8ca0caa05fb001 + +Px = 0x7fa30c837c8ad029326a1d448bd27521b5d26aad4d8244b7242493df70172e6dd1daf5c7e07f4fa102f5c415a4ec61f +Py = 0x904527df877527f7d0f5a7f71b6d9c03f2de1df8804868e7337da35c9b1ffc9bf2e279c3af8a0786e6f39832cc6ed1b +# Test 241 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02305c1335bfc9b2240b2dd142a4073361c492aab62e3c14e32ce60ea9147850ea7f4817796150cb06d3b919419540bf6002 + +Px = 0x61397ae7fe8e7e894bfa689e5813514293a0f1b9f1090c0d9696379b61287a752a3f7d1d2480fe4127498d0eeda84c63 +Py = 0xc2fadd37ea36bfe532b5d3a0f101ddd3ac59458399648f3efaf5833dec1c8c8ece05515893553ef4d58120d37ce2ecd +# Test 242 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230259160b321c350f4f2299aa77c72a09248927957b6414308bf8c7fb4f2dbba5ca79198f80a150e1ceb5a9845144eee9b + +Px = 0x7f166efa8d8416d922f57673a2180cfbb49e8d160d60ba5ec90ba547f3eccd22ce6afd99a0fb292cfd16b0692b9cab03 +Py = 0x418579e67c87b359912f6cb4158bdd7ea130b5007726df2fce319915deedc4f7e89ee23f786e25373c9937498bab81b4 +# Test 243 (edge case for u1) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023100881964e1bba9a28c7a1d84379c65bb3da72f3cc879f7f579d2f9b34a574432d6c7d1c229ee227d4ddbdd9f15df9978c0 + +Px = 0x77c9c2e658b004ab6840d7c33a5e7eb5f93ba3a7c5b32f7275fd75b07c1c92f5ae31576b9cbca046337e6d6ea76c145e +Py = 0x67c56010dd9749e2d90b3eb57ef1c4c73741233a32a6a4355b8c4e3a24bcf5986627c7480783161db1d2a5332bd75fef +# Test 244 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02300e3c83bb59abc57220170152251cf010b0081fecca2c957ca7ec1a33dae3ca1d7094b1c0f71b03e008bbe64659119f09 + +Px = 0x64d9a317d5b41af30fdfc7389460f357fa9978304d026b312aa5ca04a19bdc0c56440cfd14a0b060c3b8f4ee8d4a5a37 +Py = 0x77299b2280ab4c857ed2531e8db027f8c7238028bd7f7ba59bc80547d4f10da6f2e613580553406f0427ecbd7b75916e +# Test 245 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230631b97da7f334dafd01e2a01f8618632372d9abcdf14ebaf7213da37b1449c4e8c8a1dfe03384f3ade8907ad94421398 + +Px = 0x264ba447f80d721bf1e79877f27a23ee58565e88c49f6b9cd6448c024b6ff53aebb2b08cec22eb2eb38e30fd54727f01 +Py = 0x801887f9f94dce625ed1d56350a4b252e0dcfc0984928f25ad22a13135baf996bfa82809fbe79c0979670fddc9fba9e6 +# Test 246 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230397e11325b2e2e3790dee4859fdcca85592bc46fd0d580abc5114602b68512f549d9854c9af0db658189dd583f7fc1cb + +Px = 0x4918040a58dc477a7245561273df2d8bd977e5fd39c40d3011536cb2b9cfee82e2ab5f539e5908dcbf3ff24c645db4e +Py = 0x5969a9d8df5cdaafe3490caa4946acf5ebe3e93aab28a8d4a6f61e2c8e5c02dc605c75806dddddebe23915631159c1f7 +# Test 247 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02300fe08a8a37290ebf519f9f0947580ed87b29ee22c29615a8180eb1cdbbc5899c0728ec9b32a96790248ab302eabd6ffe + +Px = 0x22e44ebe0a351e4c91f7bdfc0c0c3c6e1c679da84a32539c2dbb41ea31061b0825e3f34d7b0ad525261eb9e457c40819 +Py = 0x6089e33034731ba8e9f95f5a234bf8d3539c8381f4d95510d5e0f145fd48205e5c60218c3f84b189c8e4fd5608b49778 +# Test 248 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02305f92937aa52d5dd10fcefb95a2d57b617d6d8b04e8db5b3b5a39abe893fda2aeb2f978108c558aabbad829ce02c27735 + +Px = 0x66ed49779ed6a7b10c812bc7ee7b47a5d11c5ea50277273da140bc1b0cf5b8210a6a737f7e9d92eee6d845137e5c44a2 +Py = 0x8accb8f637385cf6519bfae3ed3ae4d0acaa19a260a01bd8cb53ad24dacab1954b20d1472cf3975e87cc733f329ab6bd +# Test 249 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023059930a2b8bbd79b8051f252a1af76b4a5c6525adf9c6c7910a5ccf798eac0c8d4513923a792a965abe82bb564dac21cb + +Px = 0x3024912041bc989a936fb4dcdd178b15e03a0aa94abafb4465b4a89d4416b7a8b029d47c17e69a25962ff3aefe862dcb +Py = 0x249ee9252b5713e747a2da8aac2b961ee2b6aca157a44888748648fbcdc5661cd4a169bb92c9c1ce50a79a63735002a1 +# Test 250 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02301449901ce4b00f0e3a5ff84cff8c134854b808e504d1b8f027ace9591234e3f62ce70c35a8aa8e60cafe1e0df3ed80e7 + +Px = 0x6c9393b00e9a62ce0b83674cdcca59b18d5b34246348e37c1d78898a522d813c49d08efc5f3f7ef33f3dc9dd1bc2e5c2 +Py = 0xb9410ce04a64cd095ae1194bc1f514c7009a4e06871b557154cf492e7c57749487ecfcd04cb31426ab785ffa95e2f +# Test 251 (edge case for u2) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02310089ae6f8e215bcf35c7e2afed1a6b9855171687d9edbea8af5bf8e9ddc667aac4e166f05097385fa9ea3a6245fc07b4ad + +Px = 0x2c58277aaa61c400d7036183af49c99a97fea5a8d5f8608c4c6ac7a282757e4dc4b6f92d82a10272f2a19696a48fa79f +Py = 0x5a8adb770740669d6010e55f6625b141be469fe1779f4adfe64eab2e4a9ac5bf1c25b3de0b74b8f9644fc216010d9659 +# Test 252 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02303fc16256a0914ce2661a54688af4b2546b1b59b043667da6abb5b1a1e0e2e6ab862fe8bb749f7251572bc160567530a7 + +Px = 0x6e5f827e1aa225c4b95db52655f67d654bdc69a4bf8f49c19d1e65dcf12ca511505aa1726ca2f5cdf8ab376f94a0c5bd +Py = 0x5daec6f35f1dfbc68fba024cc8c5f79ce9baa86adfd8d2ba53a798cdcc9025eb9797d3be207bc694abb338e43778ffdd +# Test 253 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023064c1556c5eef311a4f3ba46316adf73732d6ed47b1ba2ecd178ff89bbc5ddd6c6419f62e045ea2d35c33a250dc2fb925 + +Px = 0x7fe852a7612a673df351f05afeafcbb16ce4cadf85681b2b5f46cc31ef33d6b695378e7325e9cb3185d7137b2b170046 +Py = 0x5cbd4c810076d135316887e94b14b4b0108db1c944794c398938d42176c32575b6428b3e37b602211c574acafef0911e +# Test 254 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02303cc98c561aa5f50c8f19d947dc75ac8f507e6985762006e7100982caccb79530f8f935ac9d3d82967cdf129ecf5b0ce5 + +Px = 0xa49dc359ed4fef683e462dfe685442cea77b733fd95633216794d9a61f7e1022d942a36e781a484a2b479a643469af4 +Py = 0x512ebd0966b68bfecf7a47021bcd9e6aa2703dcc556a9a443d16195aa145738fa36a4dff3d09481f4a86550a8d1f3545 +# Test 255 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02303f2095530f36144e009019eee102b2867d83c9eb4f28bcb31b383e00c8c3746b20cc90e8efc813aefb5b6a4965204c53 + +Px = 0x276715087495d52c4160d15446ebb4d758291bf5bc9ca87b56c3f00adc41fa452d66684152d3e19d2fc3ad5d289787ad +Py = 0x367385d3c3f5c3c2c6c3166adcfafc3d204453cab8797d56e955fbf1cf421763a6653e40efd9035df8128135546b6261 +# Test 256 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230704afc6a72080d1728f6cc9fd023e9d2373023377f02599b6ea9fb2923dd7403fe2fd73999f65316b53f910bda4f6f10 + +Px = 0x5943dbd66c79fcb882936eccdd6d860c42e20727a2cdb29165c8426c9d192990b71d9a3c7f240e46acab2741b7ee9c7a +Py = 0x461e5ab1db3eb9b51b3238d3ada33567d251d8fd0fbaf59aa1cfb40fe7b22e0277f166a32edb81ab6a8580f9b1fb3e39 +# Test 257 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023046f09c4741c1afe74e32f6ff14daaf90f4486c33f5d0e978f9af24f5751988e72b374c5faeffdec309330401965f7d20 + +Px = 0x5285d72925c87c75b6ad9955064182bf2debcb25c88d0606f6672863de413e549688a4fcfbe6689bb23dba2b757bcda6 +Py = 0x4ef6b01766c95b66ff10496d5deebac4b4bf8c3bb4232c019f80b69d8ab0214ceaf5813027ecec133a5a5b971948822e +# Test 258 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023019930a2b8bbd79b8051f252a1af76b4a5c6525adf9c6c7910a5ccf798eac0c8d4513923a792a965abe82bb564dac21cd + +Px = 0x786afb03dd791dbfc371ab51ffa288b7cedd90d6a35a3c3a92566f895f38cb18536137e010f1cfba2fbed70568d77b8 +Py = 0x4eec840cca8b6f3f612304b602ffad8dcbae1786b2c2216e9a1e59a6b69628b52a408b6a083d727f3ccd0e706f9aeef8 +# Test 259 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023033261457177af3700a3e4a5435eed694b8ca4b5bf38d8f2214b99ef31d58191a8a272474f2552cb57d0576ac9b58439a + +Px = 0x46690db403904228e4f736b1344791596628e85669d4dd01374b21274280b421e42f5ba3f3f2fadad27d4469be7d9bdb +Py = 0x7e883b43c27217f606e0a5ba6c9df781c145776c0e5a8993f0ed65c6ded65a43bddd0fe7611485e8e8d9e7decdf2d8b5 +# Test 260 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02304cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046567 + +Px = 0x8be6928acad44c9571b5c4015fa3ffae5e639e4130a1a66b473e5dfdfe93b68a8de89583666d4d699e8885469f9b1a4d +Py = 0x83b1d5312310e445ae57c85ab1a3df8dbbb706a598fbc007efb602a14a5952fd7e7df0464d533e062ea211285c2f5c27 +# Test 261 (edge case for u2) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0231008b33c708624a1e2eeba00fb5b5a8ed1a1622fc71ed897fb13d87ac253935e8365850d380015c115d12e14a2472860d09 + +Px = 0x1886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e85 +Py = 0x6a0f0ed8d7f28f916a4e727e55bf0818dcc84ed1132bd7da9f98ff95fb2aec238f4df9185b0982a6682c06c85e6a895e +# Test 262 (point duplication during verification) +Signature = 30650231008729cbb906f69d8d43f94cb8c4b9572c958272f5c6ff759ba9113f340b9f9aa598837aa37a4311717faf4cf66747a5b4023028a9b8c55eb6f5f1cf5c233aff640f48211cd2b9cf0593e8b9ffff67c7e69703f8a6c5382a36769d3cca57711ab63c65 + +Px = 0x1886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e85 +Py = 0x22aa0fa9cb45dd96a50efcfffb2739c638672238da287ed97318da83848c25001d85ae11351397cb1f1af94ad29d62f5 +# Test 263 (duplication bug) +Valid = 0 +Signature = 30650231008729cbb906f69d8d43f94cb8c4b9572c958272f5c6ff759ba9113f340b9f9aa598837aa37a4311717faf4cf66747a5b4023028a9b8c55eb6f5f1cf5c233aff640f48211cd2b9cf0593e8b9ffff67c7e69703f8a6c5382a36769d3cca57711ab63c65 + +Px = 0x89dd738efcb0f79811df6bec873485169450ada18e602721e61768be0d81e5d41381f24668276f32bfe31ff1c16bcb6b +Py = 0x1f7a4d2823bcd73f236d90b6ea61d892026190e14317b5d110526e9e2675f03d5ef3fce87b5827a37e0cf19b4d3988c0 +# Test 264 (comparison with point at infinity ) +Signature = 306402302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba301772102301c25061a20a4e2a19cac497fa9c7a6c6376fe36862aa77bd6c9e1615bc00d454c30bbe23157ff3d00be80a009500e114 + +Px = 0x795592a673e82dff3d77450194e5308d64f45f11f759f34f7c7b5b7cc6ad73f9bff8f6633cc20378cff2e53fb7a53030 +Py = 0x85b5cd4621665aac8435d8ce85b26d444508b77b282e91cd5315c701d2e5b66ba4c00bf7e1eb0859a13cc351d00041a1 +# Test 265 (extreme value for k) +Valid = 1 +Signature = 306402302282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca02302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721 + +Px = 0x2c115772dd298612197a1c59df9c25a86ac16fa4f27adf74bcc673bb4a6a4bb5d0b5b64470d5d26e0300922ab7237324 +Py = 0x42f6ec209e27ce0b127d334745272643d3666bff54927419764de52322ee1696e620d15e0eea62fed0f20efe6c91e1e3 +# Test 266 (extreme value for k) +Signature = 306402301d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e02302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721 + +Px = 0x1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e +Py = 0x8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315 +# Test 267 (testing point duplication) +Valid = 0 +Signature = 3065023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c + +# Test 268 (testing point duplication) +Signature = 306402301fc115146e521d7ea33f3e128eb01db0f653dc45852c2b50301d639b778b13380e51d9366552cf2049156605d57adffc0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c + +Px = 0x1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e +Py = 0x1fb010d823eaa83b2ab83efbb166c8cb27865dfee67fe4f3115d4c98625e7fb9e8d6108188b996044c4fcd20acb993e +# Test 269 (testing point duplication) +Signature = 3065023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c + +# Test 270 (testing point duplication) +Signature = 306402301fc115146e521d7ea33f3e128eb01db0f653dc45852c2b50301d639b778b13380e51d9366552cf2049156605d57adffc0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c + +Px = 0x6c9aaba343cb2faf098319cc4d15ea218786f55c8cf0a8b668091170a6422f6c2498945a8164a4b6f27cdd11e800da50 +Py = 0x1be961b37b09804610ce0df40dd8236c75a12d0c8014b163464a4aeba7cb18d20d3222083ec4a941852f24aa3d5d84e3 +# Test 271 (pseudorandom signature) +Msg = +Valid = 1 +Signature = 3064023065fd456814371d60883ffda5f74f36dc2d45886121770e29ed3163754716d12c1cab03a2cb6a6e3376fc96d8727bd1bf02301aa65e57932d05788413219b7ab23e5337f63fb2dcb0f89b4227d284a3fcbdf3c54c021a6c0ca42445bf802213121654 + +# Test 272 (pseudorandom signature) +Signature = 306402306b10a2ecec944cd8263ea904457db3d2031f8f5cc369c42056d38edea3e673f6ffb2dc80ad9926021aa36b8eccb9b1ef0230361bffe307741afb3c946b37fbfbca5619a65ce55229dea766469f73c33a87d40310e2c1ad7dd0dd86e833c409fd411c + +# Test 273 (pseudorandom signature) +Signature = 306402306677fdfbb7896df62cd1fb7be92c32580cf82d88333500c3fb5fa8279d45a73dcddd9cb019223c18a6851d29a2323c46023075449ffd41b66e4d8d5bf880cf8f5f7618c770f9bdfd7456b16655cdc1a73e029ae49b2083ed0db0eedc3a37e6bf67e2 + +# Test 274 (pseudorandom signature) +Signature = 30640230142f9af23572fcf1df6cdfc27ebe88ba1e5dae3ffe4b7a96cdfd9fde2c34681b5fa7cbc2edfe0fd85237233f16815e4c023027bee9228de0e93c682cf3380ea7524286e2b723aed58f6c1b45d070409fab5e5f0db44b7c703c5c2dd98e9f54c86b80 + +# Test 275 (pseudorandom signature) +Signature = 30640230134d654b9b2ce89745ee6f91f14f384c1b0918cdc31f956896888c0049c0a037ce6843abfe0fa208e9bc85d00ea4977902302803b3db39b01486c3824207455d6c37a9550ff01085e3547f7971f87f20ce0b899e16d819f4659d12c2ad870e0658f0 + +# Test 276 (pseudorandom signature) +Signature = 306402306999f75ce19e7ed2aae51a00995bf0892012121d32768b1e5d64bb95a968352c280323595e45e8e248cd9097be3c763a02305f64ca3810fd8f15e7ceade306e2949020f817565072f63608915c73612a6ea91f31479e480a08dedbcdaa347bb5420c + +# Test 277 (pseudorandom signature) +Signature = 306402303a537419444d9a6fd27de5a6ce218b57c97ea097ec0baae3f69567e52f1c9dd634a67436f9c116a33e2ff2f15d13ed1c0230586942565989959ad9282df028df29c52d4cd74b988af377cc6f3d22145c18f9b23f5384bf46dbf9c3a3d6e7c38927b3 + +# Test 278 (pseudorandom signature) +Signature = 306402306b2f570c916727c7c4a19b9058a6a1417730c9650de44b4941f412735aa480ad124804e7384ac0ddb6d5f24920381c9502305b96b393ed21f734843de2ef00842b16e739346041542b4e1ff83e9d4281c09a309467066ee506825e9510debe935a7d + +# Test 279 (pseudorandom signature) +Signature = 3064023062062dd583a9c26a9ec3fc3eb6c8d1d6d39053ba45c2b51988f41907716f4853925b6d5f2e52704116e27413256063c20230159d46ce8505cc8f950edc20a4e982956f7550afe85874f4a5558b9b5cc55729b438a9722c5e445140069a3e8da2ca2f + +# Test 280 (pseudorandom signature) +Signature = 3064023034f93a9190c052195a2c155b8201dd57c9310c24b36636717a6b208025272d1f2e378d54f48f2251f0adf5eeca2f3260023005be1ffb51284bd25136a810dfecc29bb09ed7a2af1ad55013e801a7cafdbb2736392514a2aecc7101cafe3dd6f26aa8 + +# Test 281 (pseudorandom signature) +Msg = 4d7367 +Signature = 3064023001057e36ad00f79e7c1cfcf4dea301e4e2350644d5eff4d4c7f23cdd2f4f236093ff27e33eb44fd804b2f0daf5c327a402302a9b2b910dd23b994cac12f322828461094c8790481b392569c6674ac2eca74dd74957d94456548546b65bd50558f4a6 + +# Test 282 (pseudorandom signature) +Signature = 3066023100893a4812d5d0935a5719c9d8e58d2f8f6849776f49000dc0f546e77551970e0bd6e0bb24f3e4d4d207eb09ecd9cf24b202310086dbdee702223b288d02234a0508d4e101e2ce63cb22ea02e07e412aadb4a750c5de5c2d714cd9b1a4e382f2f7283114 + +# Test 283 (pseudorandom signature) +Signature = 30640230634216e2b77ec215250d8f2eb7e47fa0b1135b7d220467bbf24d5e255740f96c6d3f922f6e56303470539d4424482b220230768d0c953bdb3d625671c3dac9ffbdbd3e9c904f1739a51b59072d4025090cf0529db0955ab84f7bcc68a425e7bd6c3c + +# Test 284 (pseudorandom signature) +Signature = 30640230356d295e11595c6a0a1eba908604cbd6eb37120cb220ec3ea2ef09ba51fb34b4d066d683f026a8f9d530e93138db17a0023060a7cea9efb0f28bfb4db30e18a2d89bbfbb85951bca9cee686e4343468c9fff1b2ab6967c2ad7cda4e2fae19a221678 + +# Test 285 (pseudorandom signature) +Signature = 306402303c02d52bc40942f2fb54b6c46048ee4dad65a1c0f6deec97274b262e7dd487fc8f5abae51d38331ad2576e8b2c7ce5c6023077042b275ab053f9f10db09093a213ecbc58e8f0ff4468506bcd2ecb440e6d18f4bba77c2ff4d779d0c2336df4f57871 + +# Test 286 (pseudorandom signature) +Signature = 306402304a1b8bf071137f8ea85b9d1b1b0f855ed00b5a36ef7a69584b0b55eb56f87640ac6f2842d42a0fa5097fd8b505ffaabd02307332ff8847516c084a95587a15567ed3dd2a98bf7be6bc58c13883e4be5539370cb39902496203325ec8d3d00891152c + +# Test 287 (pseudorandom signature) +Signature = 3064023034997ec3e14defbb93a1a8a2e1fc3a9aaf7c5f975f995cc412ec45ae0ac34c04ae42701eb6184474a3277b788e4736be023067fb4df932cc6ba99059447e1d9972f099c6419050bffcbf0ff509020a090ac6f1fb6648553e7799a544e26c2c68797c + +# Test 288 (pseudorandom signature) +Signature = 306502310085ef249d1f41b06f57e3d305c47114f05e3903b559dc7830135881813ec7c980deb8ede7cac772b45ae3fc99fcecfc540230326fe752d71f1b402a93ad5e8b778a210f485ca18442ce823458c69ea9f9bdbb5c2cedaced755dd8481028507a188353 + +# Test 289 (pseudorandom signature) +Signature = 30640230392eb29e2a7a5f1c50a72e84251b511ddc85499d6cfe5164ab015d98692f775140b11501799dc9fa5c77bb85eaf952b802304360bf01480dcdb144a4b29a328213dd0d7d153ca4929494d3627772b092b29f6761c085336c1ed765bbd3c88cc8fbf0 + +# Test 290 (pseudorandom signature) +Signature = 30640230224b2c4ba08c96a101acc6cfee93f07ebbb942c0950a6153eec872057d1efc007d8ed3dbe77facf83b25d68be3d755540230514fffb95599fe003dd5fe03efc83f62b64bf51b663733b9c7cea6510bb55d149cf39dfd4fe403514e6150831b382a52 + +# Test 291 (pseudorandom signature) +Msg = 313233343030 +Signature = 306402306dd9d4e98c9c388240e95c49b2100afbe0d722f8a152651c61d7ef9bf46150e3cdf9bf6330e75e4bf2c294cd66e48d0602301282d33b5b79d4eaafa03a77bb8ba2c318291f6ea09d548b7704bb00910856dd360557e609add891c6435d7a80afddfb + +# Test 292 (pseudorandom signature) +Signature = 306402306e888a5eaa24d1a03318d4f6c0686e4dd584f78e7f6c00a52b5ff82e985b3efd641391ac9522685e89f9309ebe06679d023037c47e7fc27a56f86e033e9214691890d0edbf23bc267b2090f21ab6a18ade496dfe207ccd21efbaa797badaada30915 + +# Test 293 (pseudorandom signature) +Signature = 306402304518110ae52f101a2bf80b1969dbf50cc70189790e3805769f58239289cc60051f3337dec7803ec684208d0e56ee4140023019ea6f00caccfba71d9e56dcd47e9db355130722ebf5eeda228a15335192a3bb471f60a88c9bf8a7bfa1025c284fb829 + +# Test 294 (pseudorandom signature) +Signature = 30650231008b10c183171be911454f63cd69b58bf321dd551547366c2d8242c9f32a2f8541ec58c7abeec2c6be23f9d88b65c64fab0230786e14ecf5d0ab4f512ef410f2e37fb851365c3d0ccd4d8801f15c5599a2baef4914005e8d90f51594535bd7e43492a8 + +# Test 295 (pseudorandom signature) +Signature = 306402304b5de69fe9bba28ba3df12c7e51c7566cb920a2ae8b90c16d66249362b40eea5b8b41512a18d389b9fd0f44f7d31c22702302342dc94e814b5309fae83fd80ebdbe5bacadf7a29c454617b077f9231772b55523dc929bf0780d68197676b76ea0f59 + +# Test 296 (pseudorandom signature) +Signature = 306402300edcc4377b3417c37eb632292ac15edd3c59eedede9a3dcf6363f6fda6055911f10ccb1e9763cd5e70dffcd513c0fcf8023057cab352d6f339875908a14d0887d7570338216d27a1865e56a0de299cd4d6d39a521a221256ef707a5c397e6e42a48d + +# Test 297 (pseudorandom signature) +Signature = 30640230119a372655a8279c47953be8f74dd9c5ad89caa504a459fbcef5902b60c10b1aad4b11fa4295b9f21ee83c4eaec2e6e202300ccdb93a4c38a487ae5af34c37486521fe53cc6c7e23ff3483a84d6d114eb0b5c35552d0301e210062b5c393e9850372 + +# Test 298 (pseudorandom signature) +Signature = 306402305f80518f9c01d1efe2bd34cd07ae6f7089de75a9a61c40a434f89388d2c1f0c67801ce79045dce91445ad7956d94e49802301ba6507b33b1eeca4102eaad451bafacb59ef9942417ec9f846e29c2ffe56640093311568a4b41c716225ed6448623a0 + +# Test 299 (pseudorandom signature) +Signature = 306402303725b7cc3ce988a8ea7ca0351847f11f4c2edfd44d89fb98835ad10f17e1acd0ef576eea8fe59f23afa80b1fafd9168502303e5455c5d4e8477b1bfa6b36bd7393710233647eb79bd34fe13bbdb35a5f9dd514d9fe352ccf0c64f0fbb2794222e73d + +# Test 300 (pseudorandom signature) +Signature = 30640230643bab5e2241fd1e4e06de1be76d40b918fec864fe3bc6edb3eecf0bb0bc2f847e6aa4bbf99590dff29d5b6fb13ea238023046e663094086a36c1bed51ffc0f1ca8bfe1258ae769fd04dd286afd3298f60280e597286a6c241a8051420550d4e4f13 + +# Test 301 (pseudorandom signature) +Msg = 0000000000000000000000000000000000000000 +Signature = 3065023046cb43798bc06dbe788a4f4b2b98130e3aae917f1d2a005656bd70a3288caf7c37d1dee0c9108828a69d2a1eeae113c60231008180d0c5ba1bed4f2b0d4d8ed7ea17916b63400397e7b6d70e7312c5ff0f4524a49abf7071c8ba470de64fb668570380 + +# Test 302 (pseudorandom signature) +Signature = 3064023049122026df0ec7eec191f6d930a5fdeb09fbd22ec4e96e1e67a8b5e8a5faa972ef14b08c16743d06ecdedcdea8b46ec2023052616b834784cca56a4fbd59bd6f343275b44222ab503dfee3d1eb39e024d3578a919d28698304ee1868f95f8b7b0c65 + +# Test 303 (pseudorandom signature) +Signature = 30650231008757ac9f296b91bf6930eb4d444914e1a01809a5d38d2af4a2308f962e72da259a674efd5e1a6ec614e9bf030e62565b02307710a488830703e22f0234216fe16fe75337516ea9af73508f0ed5cfd2546873a8498889a13e9cc0fa3dd7dbf6ff2866 + +# Test 304 (pseudorandom signature) +Signature = 306402301fbd8fcb4c2e11311d304c8cf0522ccc86229d7d67936d5993bc6e703fc201d0d1f0ddaa49b7e9e2cdc1f8560ef7abec02301ddc6ec82f2fd78f2997bb3d67ee4a835d1a372baa230b67c82875776037f2fabbd48c2701055b29107e83b86a9a868e + +# Test 305 (pseudorandom signature) +Signature = 306402306dd8d7981aac02fc6aac91d16dec9f407840937c48fb5f24e81f5b5e6016177353368f82f98b5850d71d0878b1168a1e0230495c051860bef7f80bf0b5373da6d5c71d9778707856dc1be4fba925caaae64dae653c8f79357d715878c8d52c7ea04a + +# Test 306 (pseudorandom signature) +Signature = 306402307e9aedf99ce15c53f5564cd06a693e3e1c533252e10e09f3d85aa309ef9282600fcc610b8408386b02c42c124f262c2502301f2e847ec8fecf7ef89ca50dbabc856fccfe9a7daf4a1843b4301af93a5e9f684530ec7f8c5a141675500333e702ba07 + +# Test 307 (pseudorandom signature) +Signature = 3064023044de407a46dc138a82fae4771d981f4695e2fe10c0a75cd1e7b3721aef04de3dd65611a3e463d57cfda2e8f346d86b5702306ef664710e819dc98061320489bbef8c4fb418a580489c96320a3bfa94176f65f5523d3849d665dd308390b74e7639db + +# Test 308 (pseudorandom signature) +Signature = 3064023062a229eec8b4f04cbf19f8448dcc6bd282f0f8bcd6399a40116bbb16907d9f95a8cf8a202a2d1ffaa10f2d44a7bb388d0230552781ff7067c1acc13ce32fbf12b0e6e559a915eaf9bc345bb2208950f66ad83974801d6c378db2f5ecaccdb0231243 + +# Test 309 (pseudorandom signature) +Signature = 30650230150c92f25a556c127ab84faea67af4fed4e941fa6d8fd041786938e494cc07265dc7e3e9a893f2a23aa28783673dfbb70231008a00058a7d653c27fcfa849a3b7c5b61c690686a01eca9d0b96b0abafb4fee25ca9f61f3bd4052ad6159c094120b06df + +# Test 310 (pseudorandom signature) +Signature = 30640230498edee7178373e85abf518916ffce05615d539bfc675e1f015f1e59375e07ada36bbd237b28fa3711e208379edd923202305318b5bad6f1f2188ebfdb68cf467b6873f7ab231b483b6d056e93aa31249baf52e88ec0ca084f7aaaec31f6853bd968 + +Px = 0x462117d2e33a7db1b95c8a6a3c7982f83da96817e749718caee7b6aa9c9da4e8f2ff7951674eed2b569ab846f59002a8 +Py = 0x50e6606a9726a9209c9e945fbf6cbbc9a487c4a4d81c52ac3684c26c3392b9bd24f7184821be06f6448b24a8ffffffff +# Test 311 (y-coordinate of the public key has many trailing 1's) +Msg = 4d657373616765 +Signature = 3064023043a3ac2f3d2b4d3723a97930b023ee73010a7cf8d2a99372f3132bd7d9c83574de3ab86525efc4ee2c59799d5ff7efb4023034f59a3ea9f5267f8458afdaa3873e2336e0ab8a40ca1b797cbd977d192f2024f9eb8d39b37b9a238f208d66bacd27bf + +# Test 312 (y-coordinate of the public key has many trailing 1's) +Signature = 306402303531ada25b8d9af9b87e5224cd6a6d956c17dc323ef8980f497a6e7e44c83d69b74de791d62bceacaff7378863dd725b0230459d15539399409380af99d560c561217daa5c539729453067dd1aa4bd9df2b534920f0d6213261ecea16f0ed68536b1 + +# Test 313 (y-coordinate of the public key has many trailing 1's) +Signature = 30640230438a0cff9fcfcf587f8c40775ad44ea4b0ed69f2d547befe295d1fb9c24ddcb97f228027df552a06bf657b4c2027261502305e157630bb744fc8e7f75901de498e5af0b5511dfeee0c4c1f2e5c4aa0129de57b87a2a13ea59d187d51cbeb6ef22407 + +Px = 0x8cb91e81ee5901b71a59a4f7c8174ae05fe3ba00f699dcbc3c9233265c640587b3c165593c2d76b5ffc4b8dcbcb0e655 +Py = 0x3a0e5d14f2d0e8efe2bd8aa260d8ace06bf964c51bab8207070a2d30410bb6b87aeecb7fff802f2d4ea3caf6e0e7e726 +# Test 314 (x-coordinate of the public key is large) +Signature = 3064023016496c08c3076773fcd841a5e25e1a87108e0ba90f9727f539034bd2cf688e01a955686a15112e0590fc91e3995ff5f8023031b1b7338f74adba33712a83a7c685e7cd5f3be84ef951ecad50facb7c6ec393a3bac52ea7b1212bd92f4f45a9f8514c + +# Test 315 (x-coordinate of the public key is large) +Signature = 306602310087f3090292e79b722cde5aedafa4244f6eb460a280e2e050399b9d802391ad502108704a3c0bb9f9ae571c3f7dec6c0b02310089ae0043de38a585a1632c7211b78303afa3f8936154a6e65a6f729c3b1ec66a1775aa465af8eed6dfeaa5ba98cedb41 + +# Test 316 (x-coordinate of the public key is large) +Signature = 30640230720822abefa91265a7b8d446ec3bc405fd192178aa1b85dd663396a896a32c119e64b1a20843f81edd43c03709b8dbc60230206ae95bb18d2d3844a39340872edba1611e3ea0e84cea7cb6cff282af414d8b5aa0be8aabc1b51b7121d426916b01b5 + +Px = 0x69ebf332e1eb2455324a7572a17977a4e2955108ee8bd81bd6d1f555d608687f5bbb39858ebee304985baa7d09c830bb +Py = 0x672b9c96684dfc007f015e39cdada9fe16db5022bfd173348caafc528684621f97fba24f2c30e3dc728772e800000000 +# Test 317 (y-coordinate of the public key has many trailing 0's) +Signature = 306402301e5027fcc630aa08750a4725919dd9072422a21aca9d3326bec3e6ac040ba9784951b1fda6f588e60dcb550b75793a4e02300df3224641f6804f4d1bf951051e087ce1fa7365c43bd27878626833f09190cc0a7fa29b16bc2ca0d34fd0660d24718f + +# Test 318 (y-coordinate of the public key has many trailing 0's) +Signature = 306402304e61e34740a9f6db0854faf205719a3d98ef644b86241b858fa22959c04395578bef7be35036ae7a9ffeb9a2173311f402301e967c3b6071d37560fd64a4fe0921b1d600f60d883fdec816836176c5e67ad05182aa080c7e2184c0710050d523f0e2 + +# Test 319 (y-coordinate of the public key has many trailing 0's) +Signature = 306402302c3090c581e575da58a8f659f74c5eee566400eb1d91de0a950e787542e6572f73b9f6d4f81f1c8e42f9e460dac3c1dc0230756b1b693e7fe06686708c2a609854accd21e3195d84b72c11c873908d175dfc00c00ebbdf8e2bb6970f2f19785303cc + +Px = 0x4fb5688666673f104287428b5bae6bd82a5c69b523762aa739b24594a9a81297318df613f6b7379af47979ae7fffffff +Py = 0x7e2d325b41fe831a23cb694cb80a30119c196143536ee334416ba437a419054c180a945154596b83d7f7c3a6b6059645 +# Test 320 (x-coordinate of the public key has many trailing 1's) +Signature = 30640230092f0ee1feeb79c054ae36235f8717e9ee72b466b1704d4fa78addfcd13518a64db2b2fdb06439acbc4c045fb2c23c3a02302371ca6d36f4266162ee5c657c71cea35dcec3632c5b220a6f23ace1ba6562a841aeeeefe87a7998adfaf185b8558e4a + +# Test 321 (x-coordinate of the public key has many trailing 1's) +Signature = 306402306c8f4be641afaf5bf91ce08974d284ece6aec74792247229fa86c6597eed3fb507b712bb77af0226e1bbb3bad632b0d80230775954fe8bf936157b7ab7a683f6dc1838a8718200621bc8bf2f32b778f6c8e8c656532b50de39ac22d22b37dccfd1f9 + +# Test 322 (x-coordinate of the public key has many trailing 1's) +Signature = 3064023076e5c07582177400df453114fed746f40704197897b4ca21b72e5b44d4ca40cfcaa55e4446355c91ea9767f38c8172df02300c6dd73eefbb4c06e823224d8efaa3ee934e4a97eed2833513b4d735ed06eb550b2a5fa7f86613d627d9db466afa6646 + +Px = 0x34770c73a7e42ce7a57d1de6e54f35f1752047f6513584c7b14bca17d7abc499f8ab037c70fd2e13a8b97b2ae2636886 +Py = 0x22421615ba363f1ffe9a8f2fe0f6e246fda11462a3ec000c685e09a90dbcdc2af6467f9ee69b5e7bead9b8461f4a4be0 +# Test 323 (x-coordinate of the public key is large on brainpoolP384t1) +Signature = 306402300e44fdc33aed0c320e371e2a78e9f18fde83434e681afb05a5bdb0f43cac70e83ede56bf8c56acf70e054e2ffef549cf02301324b4cfe684d401eac15b0940f5835436d3a1028e27c1966dbf69fefef82748a05b4443c77c870789135755d0d184cf + +# Test 324 (x-coordinate of the public key is large on brainpoolP384t1) +Signature = 306402305966acd8a7714f2015e36fd4fdb3452258ce0aaefb3972091b496bd530bbaf1ec67d7e37e50031b3eea44a8bb8f62c2002302a5f309d2fad55b93a7a3012cbda2845efaa4ea0d187d3824f4a6a9227730d3ab15246d8d0952c7ee8c0b9eb83d1c2a2 + +# Test 325 (x-coordinate of the public key is large on brainpoolP384t1) +Signature = 30640230266eace657e1ec88a2adbb38a5afb4f750274ca614d1fde9ea39dff6f2a2aa69923e9a7489f06bf9d84c518cee57e55b02303d19027684ef221216f63a591d8e793524e4c1234a56ce415bb9ad9e2ebf25ac94a99261b9157d19daa5aa876291f308 + +Px = 0x86f0fc89b7861ec3bd582161aecfc95789ae402459eb7f3015b7dd24e20fc9b005c635fc290a0e2a9ff35863b7b82e3e +Py = 0x1ebba489e923dad88146077914e3ae5c575e1bececec710962a18ffd91005776c4d9e4bd952c793587a70291ce478b4 +# Test 326 (x-coordinate of the public key is small on brainpoolP384t1) +Signature = 3064023013de6eb532321c023092aa78c199f9ee4dce7a18df158c3e799461af9d96c2d38765a78fdb14404d199365de05bd44c502302514a0359bcb66122bf48c186a4bb2edccf305b06414b11f470d2512cadda129366f6072de715bc2babb8a3a5f260d9b + +# Test 327 (x-coordinate of the public key is small on brainpoolP384t1) +Signature = 306402301308d3d9edfe3ad07e215a975b2b067e9f0b803371b3029f4388a3471f4db23f358aea5c03db62d77115c56c4962633b02304b8b1fe44b32cc669114a1ce0ba0555446d0c96a32cb602185e8fba414d3a831cbf5b519b0f90647dc45e30a1f23ef90 + +# Test 328 (x-coordinate of the public key is small on brainpoolP384t1) +Signature = 306402305da3df094155b8f8812d0c6345344e41c3b591b65b95fedbbcbd3c3a3bb1c1dbfc4d4c5b841b8f8874d59b07cf2288fc02304a1e4a8399abbdf246929b2559bb0fa404772755fc74523626aeef432fe4764df1e1f5c9b0f897ed8f1ffd7a88167f0e + +Px = 0x82f7dceb585c5ba4894b0faf6604da888a311ad9f41731a1d3937168a10b0795a1fae496cb9a90739e1c0a6e531e807 +Py = 0x2c3b8568eaa1c6f541a665ce7a66f78ea2d5893103e6028add62356492d8b5ac6ab8901d59621c33416c33981bd594ec +# Test 329 (x-coordinate of the public key has many trailing 0's on brainpoolP384t1) +Signature = 306402300bf6fec0a5be27cddb0e7669ae06d15dfa75837f8ee72b47443ac845ffcd427b0893e10c85c20c7aa576fb70e87761ab02307418b6f374936adca8b07dc51545ee34ed2e9f56f3267033e30ea09a0acd31b6ce83503ee7e098627f8ba8b4c584341e + +# Test 330 (x-coordinate of the public key has many trailing 0's on brainpoolP384t1) +Signature = 3064023003e306a86f6b2cb248fcb68d1d317a6042b7089e96d74c2f5b934e2e122831268a45e2185b7c21270e8b906cd372e6d702304c82ab6de6bc0194ac1a2e3480a0c80466af7d2a329d20b03151d1806a0bc0720f55d3781a7db9febe7d8bbd0a719bfa + +# Test 331 (x-coordinate of the public key has many trailing 0's on brainpoolP384t1) +Signature = 3064023014d1df9b3db55ecc8d1e126625bdf5b6316bba1e7f4ea5ec77418c754a597563dc5dc291b7dd047782d518fe74e0be83023033ef701c440f280edf81a9632dde9dc17de5f438dcc19e9ca5919b4b73e62905e5f7e0bc9db0b14bc53327f79f70c6da + +Px = 0x6afe4ea7705492bda308b789d70da49457dde825d5258960a7a366e4665af9d326392c2672165ea4bbdc33374d88e749 +Py = 0x8475e6937a10a6f6a50f23de9126ba04e5650a1cd06a8066ca423339fc2ce53d91482744a4cdf2f937f76f12aae3f630 +# Test 332 (y-coordinate of the public key has many trailing 1's on brainpoolP384t1) +Signature = 306402306a3a18400686635ae279c385b640d4fa080d9c44a5d421fe4be5a5ec7a8ae31b00bfa406e919e57e39c11360e670d8690230729c0b9ff77f88f810548d6db1835312a448114a3bd93cf59422faa2ea026f5d47627f0c11fb859112246d879c859568 + +# Test 333 (y-coordinate of the public key has many trailing 1's on brainpoolP384t1) +Signature = 306502301ab8d6c31d4577f59ca5714c9eada979fdb9ec0cad32d8cb915dbd70492947187f5a52718e19982f7a2d4cb48b227723023100872e3ce7d1fd5ae180faf1990b11937558aa44ccdab631492b8925be84fbcb452148edad5bbfe48c06b8c9908ca252fd + +# Test 334 (y-coordinate of the public key has many trailing 1's on brainpoolP384t1) +Signature = 3066023100803ffc58f8150a9c4c229a7b522357f49f9a5f48f82d8bb982954395836e09eb5f8cf1f345ce284674bc369d046d5c8a0231008a9feb64c410cf3ae6261ad35f7e3e8da13129daf94944f8e08e9649cd006622c3d5c91ec5b9798a1be3a31533a0a851 + +Px = 0x4bc65262c22d322ea89146ccb5c60c4287b65a35228743a5b9dcd15493bd8642478987c421637dd0715079ec90fb8cd4 +Py = 0x7a45557ef653d0773dbe2630f8e000629ed8293e1aa4a96f3b159a245aa35ad92a1019c7e09a9ab75ba43c0786928237 +# Test 335 (y-coordinate of the public key has many trailing 0's on brainpoolP384t1) +Signature = 306502302ed569f12dbe30a2abf02190bb9e4de7e218e9fd705dc71cbe1480022781b2a2213c3ef2f91052e90840a18f74e375ae0231008872b566f387c2bcb639df9c2d866f7631df290c5f66c264d4949e256383b1b4b2098c120f13449d9d7bff6891919c88 + +# Test 336 (y-coordinate of the public key has many trailing 0's on brainpoolP384t1) +Signature = 306402304b7e5651b035959295092e2efe548da52206c8d0e48ba43e2b8ecd98ece25dc08955b6e7b05e38c4e22829d1658711b5023044a973b75528400cef3f63f55f2154d48bb0b826214200d3f33c7bc31155242d4e24f07ed19606fdb2c8ecaeb6981eb7 + +# Test 337 (y-coordinate of the public key has many trailing 0's on brainpoolP384t1) +Signature = 306402301ecadaceaa479fa4e9aabac4210b1ab77fc1d13a9c4cb022826bb1806575115834a6ecb9dec3e668b8c91d4aca283dc902302de8965a66d56545ad84fdaee16fffa0eb31022186a5b6be2a2475958b9ad72f483ebd4b255748a811806bcd428acfd7 + +Px = 0x2ac393f20c110e3f97065304397eae0e23187b2b6163dc66083e82aff568426843056aff8dc23eebce297f747830e217 +Py = 0x34c935671391c6efa8b46c5c37b3f84a82e429a7580feb9a1383b55c83a9398e8ecc7b15d699e63962329102a1576f2b +# Test 338 (y-coordinate of the public key has many trailing 0's on brainpoolP384t1) +Signature = 3064023037e256872340da9dc884fd00daa14628372b4bedc0a8a09f9d7513521d3b803a78dc0edbab3c7dc2b2014baf7a9d210e02301ba4b4087973070cca9b957650177eeb41c557731596a966b0b7f68717d8e7b554afd07c2937c95403a90c3a05fa964b + +# Test 339 (y-coordinate of the public key has many trailing 0's on brainpoolP384t1) +Signature = 3063022f128c199dc27677f23feae28a9b28813cbc3b02fca493005a67c3126a705c49b982cb5817ee2c81161e80b738bbb512023073cb6d4547771d254be74348955bee979071358aa3afd62a5838179a0965465aec79bd6cbd9b8b2aa2c79bb88ab21592 + +# Test 340 (y-coordinate of the public key has many trailing 0's on brainpoolP384t1) +Signature = 3065023100818b0fd6ca0978a59cad3fa15e84db2896f39b2aa462f0583834fa4444d153fe61e0c93071ba96c5ffa7193f77b806f302301d2d6144172385f857db4b7e7e863962eacacdec034b4b4a9dd1af272604403f39f45a21948b30976e738e9e98fd9cee + +Group = brainpool512r1 +Hash = SHA-512 + +Px = 0x67cea1bedf84cbdcba69a05bb2ce3a2d1c9d911d236c480929a16ad697b45a6ca127079fe8d7868671e28ef33bdf9319e2e51c84b190ac5c91b51baf0a980ba5 +Py = 0xa7e79006194b5378f65cbe625ef2c47c64e56040d873b995b5b1ebaa4a6ce971da164391ff619af3bcfc71c5e1ad27ee0e859c2943e2de8ef7c43d3c976e9b +# Test 1 (signature malleability) +Msg = 313233343030 +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024044b42304e693796618d090dbcb2a2551c3cb78534611e61fd9d1a5c0938b5b8ec6ed53d2d28999eabbd8e7792d167fcf582492403a6a0f7cc94c73a28fb76b71 + +# Test 2 (random signature) +Signature = 30818402404fa015df53797262667c8cf8412ca96335d83c0ac2ea6875c7d10f1274bc2688af5b69b75ebff36b54b5be3ffcc29e0ebcc066cfe4bdb22e067f87736a5ba605024037cdc44d7a08a10a2b7cfbbb31fe65c2423bf73a13c9a3cf894a16976483063f50b2cbd2e405d9eaae76d954027504b0fc11a6acb09bfe79601e8a4c1f63f461 + +# Test 3 (random signature) +Signature = 3081840240328efb44fa5a954d899bc321ebf3626a8d8b662ed32e2d687e88f1da3c068d645a0e6f4bee083a7977b1bb4ed33a95688627ee1377c56ae9a27499ca33174aed02406ec5934c90a1a2c6a96e85e60be71c71ba0da91cc2f35eda5162342be3d4715b216e784932a56286efc29d79c591b4d54a0a6d4c9ddb412bc46860b78ff4f987 + +# Test 4 (random signature) +Signature = 308184024049bb9150fd1baad79f1d4bc2386338603ece56900b50f2cc2885724c33eabe1a1517e963c422c13828d51eb09365cfdf867ddcde7638ca0f06b3ab3900f882c302406675ca81cf5d3e1508df2e7a83c66b3692dcd47e3367ad684e23f7fd672be2f4bcf65cba1ab229202ef1ee83d5742878df164d200a78bb059bb7bd07ec0377cd + +# Test 5 (random signature) +Signature = 30818402407660369c1c87f3137a8fec5adf2afdc1ed4fe9c23e66d848ace51e2d9e5d2c5c57dbc65046624c9fc51fe4e2ecc3daf5f6eeee45b1839cf5b858b7bbe5f3fc64024068c76df31910c3e58a819ca0339880b27fbf8b4dc6cc0140b3d5332a6118c19850fc45b3ab57d72e6c19839f8cc597ef6b831d1b450208a1327e125ecdd18476 + +# Test 6 (random signature) +Signature = 308185024100826ff243ed770688da168ddb8eef36e91ce53dd04c87943d1dc7abb1d56e078ac35f253bfc630aca31e60000daf7b8fbda9cf434d11781449a9436ad82ff379c024031284e23a9646ad261dfaaf7f7814a2bf3e774a1c112095412b79dddbc96fb864c133db61063847e66c4b18e1b74830efc730d8fae1bcf42ed3e6ce512e54897 + +# Test 7 (valid) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 8 (length contains leading 0) +Valid = 0 +Signature = 3082008402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 9 (length contains leading 0) +Signature = 308186028200400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 10 (length contains leading 0) +Signature = 30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70282004066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 11 (wrong length) +Signature = 308502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 12 (wrong length) +Signature = 308302400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 13 (wrong length) +Signature = 30818402410bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 14 (wrong length) +Signature = 308184023f0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 15 (wrong length) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024166297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 16 (wrong length) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7023f66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 17 (uint32 overflow in length) +Signature = 3085010000008402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 18 (uint32 overflow in length) +Signature = 308189028501000000400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 19 (uint32 overflow in length) +Signature = 30818902400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70285010000004066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 20 (uint64 overflow in length) +Signature = 308901000000000000008402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 21 (uint64 overflow in length) +Signature = 30818d02890100000000000000400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 22 (uint64 overflow in length) +Signature = 30818d02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7028901000000000000004066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 23 (length = 2**31 - 1) +Signature = 30847fffffff02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 24 (length = 2**31 - 1) +Signature = 30818802847fffffff0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 25 (length = 2**31 - 1) +Signature = 30818802400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c702847fffffff66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 26 (length = 2**32 - 1) +Signature = 3084ffffffff02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 27 (length = 2**32 - 1) +Signature = 3081880284ffffffff0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 28 (length = 2**32 - 1) +Signature = 30818802400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70284ffffffff66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 29 (length = 2**40 - 1) +Signature = 3085ffffffffff02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 30 (length = 2**40 - 1) +Signature = 3081890285ffffffffff0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 31 (length = 2**40 - 1) +Signature = 30818902400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70285ffffffffff66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 32 (length = 2**64 - 1) +Signature = 3088ffffffffffffffff02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 33 (length = 2**64 - 1) +Signature = 30818c0288ffffffffffffffff0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 34 (length = 2**64 - 1) +Signature = 30818c02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70288ffffffffffffffff66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 35 (incorrect length) +Signature = 30ff02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 36 (incorrect length) +Signature = 30818402ff0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 37 (incorrect length) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c702ff66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 38 (indefinite length without termination) +Signature = 308002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 39 (indefinite length without termination) +Signature = 30818402800bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 40 (indefinite length without termination) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7028066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 41 (removing sequence) +Signature = + +# Test 42 (appending 0's to sequence) +Signature = 30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000 + +# Test 43 (prepending 0's to sequence) +Signature = 308186000002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 44 (appending unused 0's) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000 + +# Test 45 (appending unused 0's) +Signature = 30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70000024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 46 (appending null value) +Signature = 30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80500 + +# Test 47 (appending null value) +Signature = 30818602420bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70500024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 48 (appending null value) +Signature = 30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024266297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80500 + +# Test 49 (including garbage) +Signature = 30818a49817730818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 50 (including garbage) +Signature = 308189250030818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 51 (including garbage) +Signature = 30818730818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80004deadbeef + +# Test 52 (including garbage) +Signature = 308189224549817702400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 53 (including garbage) +Signature = 3081882244250002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 54 (including garbage) +Signature = 30818c224202400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70004deadbeef024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 55 (including garbage) +Signature = 30818902400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c72245498177024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 56 (including garbage) +Signature = 30818802400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c722442500024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 57 (including garbage) +Signature = 30818c02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c72242024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80004deadbeef + +# Test 58 (including undefined tags) +Signature = 30818daa00bb00cd0030818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 59 (including undefined tags) +Signature = 30818baa02aabb30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 60 (including undefined tags) +Signature = 30818c2248aa00bb00cd0002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 61 (including undefined tags) +Signature = 30818a2246aa02aabb02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 62 (including undefined tags) +Signature = 30818c02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c72248aa00bb00cd00024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 63 (including undefined tags) +Signature = 30818a02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c72246aa02aabb024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 64 (using composition with indefinite length) +Signature = 308030818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000 + +# Test 65 (using composition with indefinite length) +Signature = 308188228002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70000024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 66 (using composition with indefinite length) +Signature = 30818802400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c72280024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000 + +# Test 67 (using composition with wrong tag) +Signature = 308031818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000 + +# Test 68 (using composition with wrong tag) +Signature = 308188228003400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70000024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 69 (using composition with wrong tag) +Signature = 30818802400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c72280034066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000 + +# Test 70 (Replacing sequence with NULL) +Signature = 0500 + +# Test 71 (changing tag value) +Signature = 2e818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 72 (changing tag value) +Signature = 2f818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 73 (changing tag value) +Signature = 31818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 74 (changing tag value) +Signature = 32818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 75 (changing tag value) +Signature = ff818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 76 (changing tag value) +Signature = 30818400400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 77 (changing tag value) +Signature = 30818401400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 78 (changing tag value) +Signature = 30818403400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 79 (changing tag value) +Signature = 30818404400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 80 (changing tag value) +Signature = 308184ff400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 81 (changing tag value) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7004066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 82 (changing tag value) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7014066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 83 (changing tag value) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7034066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 84 (changing tag value) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7044066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 85 (changing tag value) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7ff4066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 86 (dropping value of sequence) +Signature = 3000 + +# Test 87 (using composition) +Signature = 308189300102308183400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 88 (using composition) +Signature = 308188224402010b023fd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 89 (using composition) +Signature = 30818802400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c72244020166023f297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 90 (truncate sequence) +Signature = 30818302400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194 + +# Test 91 (truncate sequence) +Signature = 308183400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 92 (indefinite length) +Signature = 308002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000 + +# Test 93 (indefinite length with truncated delimiter) +Signature = 308002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f800 + +# Test 94 (indefinite length with additional element) +Signature = 308002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f805000000 + +# Test 95 (indefinite length with truncated element) +Signature = 308002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8060811220000 + +# Test 96 (indefinite length with garbage) +Signature = 308002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000fe02beef + +# Test 97 (indefinite length with nonempty EOC) +Signature = 308002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80002beef + +# Test 98 (prepend empty sequence) +Signature = 308186300002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 99 (append empty sequence) +Signature = 30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f83000 + +# Test 100 (sequence of sequence) +Signature = 30818730818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 101 (truncated sequence) +Signature = 304202400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7 + +# Test 102 (repeat element in sequence) +Signature = 3081c602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 103 (long form encoding of length) +Signature = 3081850281400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 104 (long form encoding of length) +Signature = 30818502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c702814066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 105 (removing integer) +Signature = 3042024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 106 (appending 0's to integer) +Signature = 30818602420bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70000024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 107 (appending 0's to integer) +Signature = 30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024266297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000 + +# Test 108 (prepending 0's to integer) +Signature = 308186024200000bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 109 (prepending 0's to integer) +Signature = 30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70242000066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 110 (Replacing integer with NULL) +Signature = 30440500024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 111 (Replacing integer with NULL) +Signature = 304402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70500 + +# Test 112 (dropping value of integer) +Signature = 30440200024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 113 (dropping value of integer) +Signature = 304402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70200 + +# Test 114 (modify first byte of integer) +Signature = 308184024009d2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 115 (modify first byte of integer) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024064297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 116 (modify last byte of integer) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f947024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 117 (modify last byte of integer) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf19478 + +# Test 118 (truncate integer) +Signature = 308183023f0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 119 (truncate integer) +Signature = 308183023fd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 120 (truncate integer) +Signature = 30818302400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7023f66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194 + +# Test 121 (truncate integer) +Signature = 30818302400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7023f297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 122 (leading ff in integer) +Signature = 3081850241ff0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 123 (leading ff in integer) +Signature = 30818502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70241ff66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 124 (infinity) +Signature = 3045090180024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 125 (infinity) +Signature = 304502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7090180 + +# Test 126 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 308185024100b6aff6ed23b6308e0ace840e7557d0366549da44c23127fbe2d3f6771c987375223c7ac494ef54fd71ece3546ddbfdc3bdc4bd0a1659446423027f0e01affa30024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 127 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3081850241ff60f4bb7b6be2a7778b24b6b20dc3d826cee8bedd5a9d83de360cbce23c32629477bfc241fb9d08caeee021216e83dd3582611608059d8ea8b7f35208c85df95e024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 128 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3081840240f42da6cbb83393fd3506629fbe722bd165e6b36ef198aa12f38fa653539a94fb3301e17cb7b9d11bcf997dc511d012835fed1676f2049679928517749af90639024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 129 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3081850241009f0b4484941d588874db494df23c27d931174122a5627c21c9f3431dc3cd9d6b88403dbe0462f735111fdede917c22ca7d9ee9f7fa627157480cadf737a206a2024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 130 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3081850241ff49500912dc49cf71f5317bf18aa82fc99ab625bb3dced8041d2c0988e3678c8addc3853b6b10ab028e131cab9224023c423b42f5e9a6bb9bdcfd80f1fe5005d0024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 131 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3081850241010bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 132 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 308185024100f42da6cbb83393fd3506629fbe722bd165e6b36ef198aa12f38fa653539a94fb3301e17cb7b9d11bcf997dc511d012835fed1676f2049679928517749af90639024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 133 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30818502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70241011107186cd1400fb066d93c809c69d2bdd295a3142181bdfdd2f593d44cdab551e38f64afc6c8b247c733dab9d241a0bee33f14c1d651a63ea1c2b962a99a9561 + +# Test 134 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70240bb4bdcfb196c8699e72f6f2434d5daae3c3487acb9ee19e0262e5a3f6c74a4713912ac2d2d76661544271886d2e98030a7db6dbfc595f08336b38c5d7048948f + +# Test 135 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024099d6854c0aa9b4dad8fbaa2d97602949f89aea9f92481411036e08f62358531e71aef79185e073d17a52865fad6a6f883a72bebf320c349f13c4dd1ff30e6b08 + +# Test 136 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30818502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70241feeef8e7932ebff04f9926c37f63962d422d6a5cebde7e42022d0a6c2bb3254aae1c709b5039374db838cc25462dbe5f411cc0eb3e29ae59c15e3d469d56656a9f + +# Test 137 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30818502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c702410166297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8 + +# Test 138 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30818502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c702410099d6854c0aa9b4dad8fbaa2d97602949f89aea9f92481411036e08f62358531e71aef79185e073d17a52865fad6a6f883a72bebf320c349f13c4dd1ff30e6b08 + +# Test 139 (Signature with special case values for r and s) +Signature = 3006020100020100 + +# Test 140 (Signature with special case values for r and s) +Signature = 3006020100020101 + +# Test 141 (Signature with special case values for r and s) +Signature = 30060201000201ff + +# Test 142 (Signature with special case values for r and s) +Signature = 3046020100024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069 + +# Test 143 (Signature with special case values for r and s) +Signature = 3046020100024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068 + +# Test 144 (Signature with special case values for r and s) +Signature = 3046020100024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a + +# Test 145 (Signature with special case values for r and s) +Signature = 3046020100024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3 + +# Test 146 (Signature with special case values for r and s) +Signature = 3046020100024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4 + +# Test 147 (Signature with special case values for r and s) +Signature = 3008020100090380fe01 + +# Test 148 (Signature with special case values for r and s) +Signature = 3006020101020100 + +# Test 149 (Signature with special case values for r and s) +Signature = 3006020101020101 + +# Test 150 (Signature with special case values for r and s) +Signature = 30060201010201ff + +# Test 151 (Signature with special case values for r and s) +Signature = 3046020101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069 + +# Test 152 (Signature with special case values for r and s) +Signature = 3046020101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068 + +# Test 153 (Signature with special case values for r and s) +Signature = 3046020101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a + +# Test 154 (Signature with special case values for r and s) +Signature = 3046020101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3 + +# Test 155 (Signature with special case values for r and s) +Signature = 3046020101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4 + +# Test 156 (Signature with special case values for r and s) +Signature = 3008020101090380fe01 + +# Test 157 (Signature with special case values for r and s) +Signature = 30060201ff020100 + +# Test 158 (Signature with special case values for r and s) +Signature = 30060201ff020101 + +# Test 159 (Signature with special case values for r and s) +Signature = 30060201ff0201ff + +# Test 160 (Signature with special case values for r and s) +Signature = 30460201ff024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069 + +# Test 161 (Signature with special case values for r and s) +Signature = 30460201ff024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068 + +# Test 162 (Signature with special case values for r and s) +Signature = 30460201ff024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a + +# Test 163 (Signature with special case values for r and s) +Signature = 30460201ff024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3 + +# Test 164 (Signature with special case values for r and s) +Signature = 30460201ff024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4 + +# Test 165 (Signature with special case values for r and s) +Signature = 30080201ff090380fe01 + +# Test 166 (Signature with special case values for r and s) +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069020100 + +# Test 167 (Signature with special case values for r and s) +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069020101 + +# Test 168 (Signature with special case values for r and s) +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201ff + +# Test 169 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069 + +# Test 170 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068 + +# Test 171 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a + +# Test 172 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3 + +# Test 173 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4 + +# Test 174 (Signature with special case values for r and s) +Signature = 3048024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069090380fe01 + +# Test 175 (Signature with special case values for r and s) +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068020100 + +# Test 176 (Signature with special case values for r and s) +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068020101 + +# Test 177 (Signature with special case values for r and s) +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900680201ff + +# Test 178 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069 + +# Test 179 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068 + +# Test 180 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a + +# Test 181 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3 + +# Test 182 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4 + +# Test 183 (Signature with special case values for r and s) +Signature = 3048024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068090380fe01 + +# Test 184 (Signature with special case values for r and s) +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a020100 + +# Test 185 (Signature with special case values for r and s) +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a020101 + +# Test 186 (Signature with special case values for r and s) +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a0201ff + +# Test 187 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069 + +# Test 188 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068 + +# Test 189 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a + +# Test 190 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3 + +# Test 191 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4 + +# Test 192 (Signature with special case values for r and s) +Signature = 3048024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a090380fe01 + +# Test 193 (Signature with special case values for r and s) +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3020100 + +# Test 194 (Signature with special case values for r and s) +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3020101 + +# Test 195 (Signature with special case values for r and s) +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f30201ff + +# Test 196 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069 + +# Test 197 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068 + +# Test 198 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a + +# Test 199 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3 + +# Test 200 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4 + +# Test 201 (Signature with special case values for r and s) +Signature = 3048024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3090380fe01 + +# Test 202 (Signature with special case values for r and s) +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4020100 + +# Test 203 (Signature with special case values for r and s) +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4020101 + +# Test 204 (Signature with special case values for r and s) +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f40201ff + +# Test 205 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069 + +# Test 206 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068 + +# Test 207 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a + +# Test 208 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3 + +# Test 209 (Signature with special case values for r and s) +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4 + +# Test 210 (Signature with special case values for r and s) +Signature = 3048024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4090380fe01 + +# Test 211 (Edge case for Shamir multiplication) +Msg = 31313138 +Valid = 1 +Signature = 30818402407da11e5b4bb7932135cd91accef8892c4286654a7be7c9d384b600d97900ee12a23ff1f9ae9a4fe74cca185d0dc9f59dc24be03d0223d8feb55b6dde1777475f02400686bc313aa5c1923ab0543331398190ca5f22a3a97e963a13cedf688da1dfe4a348945497b21c01c8a17c23252b3e8eac1f9a92d6320eaa324b44807c326175 + +Px = 0x6b6763a186aa5159049f2ea5c8a232dcbe6337b0d92e969da52af32524f61da3097fa314ac792234e59867af320478774bd4c785a0330624c0b4babe257f6597 +Py = 0x2e4063e45e13d505e14db6f5fef3538db181cc1a6e0a9381fa3f0321be47f40dc05ab80e9caa3b7559c67535e83d984f3b9557118dde29c5e7a5a4a18d0c9d43 +# Test 212 (k*G has a large x-coordinate) +Msg = 313233343030 +Signature = 3066022101280f3ebf4f1d42296d47401166f7709f0ad02bae2524eba77322c9d3bb914889024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90066 + +# Test 213 (r too large) +Valid = 0 +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90066 + +Px = 0x8f676959bfda02d373977a80528b61d4148f8eabc2027fb5b5db5827677d147a728661fd5c546b6ad5f0a89a347449aa2f32112e3bbda8035089547929b56a55 +Py = 0x78c45ce0a688aea390d4e4db4d48d2cdb21865bc8cefd15f2bbae4270ab765a76f049449f17ce1ac7f513977ce0a5237e5bd63b4af92a6cf4918d91bccd0f279 +# Test 214 (r,s are large) +Valid = 1 +Signature = 308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90065024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90064 + +Px = 0x14f38afbc8d6be59ee7075bdfd2616a44b86535687d05c2347553173cd14df8abd0a4c102c62e8141127dc66d2dcaae38c9324980ede204688bb9f916ba9f1a8 +Py = 0x23f358139316ca27b8874e68b93388f9780d9ba7e23b8421bfad38a19ed161477e0a05380bebd7a1156dc32f69047679fa2b977fadc0c29ebc1ebcea6cc1894c +# Test 215 (r and s^-1 have a large Hamming weight) +Signature = 30818402407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02404338ed95ac0d09c51d7044d59f1bc26f8f3f11fc7bf2f81bdf0b21b5c0b9c89bea3cc6dd8b3692c8310b98117b508d130073e74b02b3ba482fb0a5ef1036a3fd + +Px = 0x3df9e586410ba633b9f165d29b073b67a167297cb4086889e52b925a9cb25acc4c85e5b8112221ba49ecc99a0cb7fb3385352a7140072f79c2f44396ee8b6786 +Py = 0x22c7b6185e4b667a5cc427c99ca53fe54f03dfeeca92ba2c1ae1f2b3feebedeaba62ee3ba065ac5303c2d56969f0b341486f29f3b2a06df32830f25999c42f88 +# Test 216 (r and s^-1 have a large Hamming weight) +Signature = 30818402407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024039c982e2a4f560c509055888f60317e6b5bb61d594d7bd4f5897396bf3e81a09cf703d319f9b4a092d46d5f202ff5ddb776c57e8ede8454def7037b541c97436 + +Px = 0xad66abdba9fbee1fdd1b9e0db9a7460f460de3916efd16d7d9c6cc7a6cc9fa5cc03020d9f8c9094c0cb52fe1babd63c69ab20f04a116ecee3a009d5acb5729d +Py = 0x5b4765858f696b61bf6b3a1812d057bee93b143836a764927971fb746141b5422fc077f73caa000f62ce00103502d1ecb0954f2cad60b224ec6fe1033009d64c +# Test 217 (small r and s) +Signature = 3006020103020101 + +Px = 0x9741c2634e42f1865625a9d97ebc549ac8c67eb6d03cd2a7c5987f0f5164c9be9775e32c5d59d3175de468e243591021ab623f6b09b31a4028639b041684f359 +Py = 0x470ddff173c67c71055f5f715b7b74993800305938bbda89d24b187f4819c30575d5e2275f08cbf3ba86b1a11f12671d2eb009d02516f3d1da0aafcd1d81a0c1 +# Test 218 (small r and s) +Signature = 3006020103020103 + +Px = 0x8b06a77616ea21f14093d3a373a8f57106a71939f25415f6a9aa001640b5ed0adf39fc2f5e58d4233c2eefe4f170499da57e9dceb7f8cd5f38c4181fa7d2f768 +Py = 0x74a91e99eabced1bda358653e09b51eb8b1a9526f5a1b32c7edd3b701f5af4103314971d5c082c5f20053c3b66d39a1cb6c4d310dbe895546892d4296d96eff +# Test 219 (small r and s) +Signature = 3006020103020104 + +# Test 220 (r is larger than n) +Valid = 0 +Signature = 3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006c020104 + +Px = 0x792feceeb3166356d10aeb0940124294341802924c79f2391b77875657c17f55955b28685cc2203f18c22004bab1da516896f01b0529c804245baa3a6930b355 +Py = 0x26deb73e372176cc7358c04247923a791181ce72c183506046e69de4976d4f2637f11e705f1f9a5a0f99eea1841e540c6aa43d4fb20030d70d4a54fb6a6e8559 +# Test 221 (s is larger than n) +Signature = 3046020103024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829cbbd6f0 + +Px = 0x81b42adaac02a5fd87a04a16ddc2333075778f133ea0af66049c72a06721e3924979249e04291e4b99d4ecf448b3fdc5e56ea23381d6d06e23011965d1653816 +Py = 0x244327f9d59ca6787575bb7707ef2672f113ba7a302d69c29fea6ff66f449dcd3b273b3398481776c2f2a685cb6dde31e176be8f2b785fed313be5730c6624ed +# Test 222 (small r and s^-1) +Valid = 1 +Signature = 304602020100024012d5e9125cc71fbeb86c217e09bd92b646c6dd3a1be1d6a6ed4d80267127e4b5b4bc4aac7d5d3aa0033114c85aac2a1bff3def001d248d0a5483dc2ea66f5ac1 + +Px = 0x1a0e00bb4a669f10f594489a42f1babd3a028b5ea75757a986c55f6159469752b88bbe9f52f2422d503a4d9a849c3dad410a6dc4e4e32b95469e09386063401 +Py = 0x574c501128906459a23af93b9830e297f3e73d3173df7807679b713ce6b34f64b1ee7547b927e43105118c496b9a3c1e0264e84b5b0fb459582af98edf0c117f +# Test 223 (smallish r and s^-1) +Signature = 304b02072d9b4d347952cc024076752ce289c38f22de7f75d0fa6da056f473c77194de931d97efd65421ff3ec82c57a6393a42702e14a2d831768865ab933281abf1bcf52a7ef6b73f2373c9ee + +Px = 0xdc4c5639b7690157c210b75e7a006d9cfdf80f9d0b2bbd643036890a8168a88947b197aa9a60047cd8f6e77c0777bb9e09da737dbbe57a977a6ae0707983564 +Py = 0x60b0a49d4f9578273f6e5ab3873194292e893e06c5a39bb1f8a0551f4e01ca460a03a77c35cff8d7d6e0f33b8a88acdc36eae5a83a129bfeecc2a68936883d91 +# Test 224 (100-bit r and small s^-1) +Signature = 3052020d1033e67e37b32b445580bf4efd0241009ce766006a5130005e79caddba04302708487a27823bd1d3d9ca0a801f4fbc0b83126aa1911ad44afd6a770c753d619fef707e7c773f467de5738b35333893cd + +Px = 0x867dfdd726cee931256dd9aae0c1a660a12b1dfd6baf180b35e39c0f93cbf9800c5cf11b29f18678d325121fb286545a512dd8f6c2cb81e598d05fc40cfcf9dc +Py = 0x91d4d2153f667593e25fee42e39dafd1811974943e875dfcc6badc0ea22db4212637be71c6b74375c43cfbf719088691aec70e691e46edfe8ccdb4cefcb1351e +# Test 225 (small r and 100 bit s^-1) +Signature = 3046020201000240029c0de2216bab72af9ec823411e7ee444482bc268ae1ba9064e04019609757d95b2e0c5a3fde377a87fcd38b32f8061bd3dc81cbbdb96ca626e6582ba61dc31 + +Px = 0x34308c7d6eaa1bd7d8edc02fc6277c5271ca847428ff210d6078ec968df4e8730e21bc7715a7ee85a7352802466c0ab23560929bab49296509937fe7cd6edc02 +Py = 0x36491a29b86ea0e6124f4b72101f48230bdc1f5b36d2e6500c3ffd4ba9818b435046335a2da15a89bc51117204d330832abc0f7b09a59d82bbb01d71762d8df5 +# Test 226 (100-bit r and s^-1) +Signature = 3051020d062522bbd3ecbe7c39e93e7c250240029c0de2216bab72af9ec823411e7ee444482bc268ae1ba9064e04019609757d95b2e0c5a3fde377a87fcd38b32f8061bd3dc81cbbdb96ca626e6582ba61dc31 + +Px = 0x78d35a1c8a83997300a02eb477916e7095b001bfc47341528f75c6cebefd2d59c5d5efaeae9c5bd8ad4bdbad76da1cbcd3547a95d392dff53ce85bc4e4b23ff9 +Py = 0x4bb3427e6074138fc0e438320a314e20367137133b4fee63d80ecfb5931666b0873dcd456a36994edfda75b0f3ea81732277e77adc43a481ff0f0ed4d2f37ff0 +# Test 227 (r and s^-1 are close to n) +Signature = 308185024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca8ffe9024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578 + +Px = 0x9019be20f640ecb2b7c3311bcda870954938a780686c063fe0ab26f57ba60511ff3cee3286d8d90487eb8014788a1f134ed59a774fdb8b0d24770bf2301b2d18 +Py = 0x8fe934dc911d15c44e59b9026811e7cd8fdd874410d51a56f5aea137bfc4a8e85b7eba7528949cdabc4d33aef16157d14e3f5f68bde5de1c5196917a56dab29 +# Test 228 (s == 1) +Signature = 3045024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578020101 + +# Test 229 (s == 0) +Valid = 0 +Signature = 3045024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578020100 + +Px = 0x417db8e95f89131457983e75379009905d2d8008b790519d65e650d3b60a32563c18c5afd06ca314bc3a17746087a578ce78cbb60cb599cf0dd9cff22acb84cf +Py = 0xb86f2e57ce298c85bc28f3d0274cf3140ea5fc6015f4b636fb271da09445e15adcb60ae1f6d001ad4e25e6d69767236cc16e725f5d7b2af449939017a8c8c85 +# Test 230 (point at infinity during verify) +Signature = 3081840240556ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548034024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578 + +Px = 0x38597c68eabfbe648bca0b3e8d235f9082cf15d694e14e686b1e0a89b73e3dbc346ebbde38da2c602fe975c21a1fbc8f363b592903d02d4434fae52ee8cc3b3a +Py = 0x572b82084747ea5af0633936b570354365ee2d7fba4c404bd69458eb825007ed89067effec6b2e67c32d197e8c28ecfefa7ee79cea09d7eb248925c543c30ba5 +# Test 231 (u1 == 1) +Valid = 1 +Signature = 308184024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc + +Px = 0x9d60ec91976a8fc7f8422876ccb22870eca8d39b8cdfc30193e3bb22a10e37c537a092dbb0124c8c4b26655ad96127d3140bc1f9556ebabf477fd95951b4b0dd +Py = 0x2bc1fcd7d6840fd83a5e982361c304a34ed10e873aa4637ecac29f555c0526b519c238ce0b002d7e2f98225dec884c95d742e86fa68ce6e81f6542fe81730cfb +# Test 232 (u1 == n - 1) +Signature = 308184024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578024066e59cbcf0f0a0fee7256d52661cf74b816308a77a7c9e8c4130461a4d1205eedfc32b5fba90829c8425409283eab77c74fcf1d45571da5a372a026368794c9d + +Px = 0xa911df350e95c0da4d56c3c44a84aad88ee85e628ccc44c5e131dfad8a3fc69eed9c620ed8c821c84de2c2113c1d6c10aaea5544903b1d59678d39b052e0f1b3 +Py = 0xa2c16d1e74ae6fd993b986234665eda14ff678e58c414ae55de8aa1eda26242d616b267e6fdb7491efb5a3c179b84903127070e5e2597d2f0b2af333b6349857 +# Test 233 (u2 == 1) +Signature = 308184024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578 + +Px = 0x1823db8fd2ba4a34bacc4f64283909f4d01d02b8db66f9cb9bd77806b890ba31a6915b93dcbdd72c83338eb6029f22c31795712b1ac7a1fb81a304e3c58d8d5 +Py = 0x4ec267bad3984a3e2fd87defbe863d73885872488bdda9d6e3da8ecf8eabfd4674d201278ffc63cbc1ffa0f99eb5e85c9b20ae10a226e1e5594ca78fc0d531d8 +# Test 234 (u2 == n - 1) +Signature = 308184024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578024071e913d0929bd85cd53899c977dbfd5a8775b3cd22868c09e4426886f5775af58e2992d6331b6ebb810440bbaa72b584be768d00b03e91e923afb9ac6870aaf1 + +Px = 0x9fa44401db098e9f28579aaf02adff61faf1e6f7039cf1b3134b83dfba962b13a4397dcdd6feef4b64fc32eb3dfba3f596f5f75beabd3dade484089310b65822 +Py = 0x8bb1897c75da51e56db19d8df13623754a0db9d6da5002ffc8a73be21b80eeecca35ec541e81831b3fec4cc3193dc5929f12c4c463a4107911bbb0f15ae390ef +# Test 235 (edge case for u1) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02404f9c8a3c424ba2b2882c200355d25596b1aa063ff9b2573079325128dbc6ae5098e88460f4eb4331ffa2808ad3cf2305eccce70f3e6df3cb114c638b459d9167 + +Px = 0xfe7f7ca44453560e1ba38b34ec8dfbc745edefc58878255452f614fee561a8a620b4d8624e159bd483db08c9a62100fd2ea69ef7381f520abe651b2ea226eea +Py = 0x156e75af465b22d226408314536d4238a739fd2f4003bac552ae34bfa27e9be460fe40a5468cedd3221048cd1b8d796bc27494565f88aaf7fccc4c0fc36b78b1 +# Test 236 (edge case for u1) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02402820c603534f430db8e49727244a316acd6ea30733070dc4fdd24e2211dded80597a9cb6bd866f37b255057ab771925eb439293319a9a2c12dc0b7cb1dbf4fa7 + +Px = 0x99e5c3ad1ef53ad780c3c4d90c27cc1986496a215b25829a88de200a9c2146aec8f182dc6dec6611c7ffda1a55b0ccb2045b1ed5c9231b9eb3cb232417e2fcfa +Py = 0x35e8b3f604f5d793d135ce06e23fc6ac82c0997de9e3f4d2dc3636ba0b521c785776dbc8d48da5d59a86fb3e90fb00bccb017d25100be8e35db1dfb5b44967ef +# Test 237 (edge case for u1) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02406e5d2dd1e3d278ebc6f73409651ebc46b65c6c3efe1165b74b5164356783251e3bb666804faa7bf389b5ff285b66b912c51c478c58cd2dbe5293d95735ab9436 + +Px = 0x423fc7aa8d6d77fae60bebce7757e15689426cbabd2c3fa6ff71da7765ab887a93c93cb8e1008892c0d8f1e03e48555c81dfc433d42f4890b71177b848aab9cc +Py = 0x1ff6abd7c7f953de797480e292b987ddf47570d88dc5e51c7a47c357d71978190931976f55cc84c3a4cd4635ed5ba4920efa8219c7aa1685bf1a9bc7129fa2cb +# Test 238 (edge case for u1) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02402bd0ea22df17e2f0854094002df56a63da80713274b5192327b1d86c256437bd10f7a21e1c7480836dea40f56ee9b5810c68f2a06e728a802d01b5a514db6914 + +Px = 0x415e9d50af5da71189607811680dc16d3da9a0e339a53d166b9b226806a6ffdae01eb40295cf5e00f47ddf0b4afa6729a8f7d18a437d157df4d99c19181ef524 +Py = 0x907efdc15b338664e911b62f9ac015d9e36bb7be0cccdf330517d52970dab18848bce0bfdfc0bd39c675753666036e4c4c5eb0c62321b22bd1cb1fa352670fbc +# Test 239 (edge case for u1) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02403da945bb815ee5303a05dc5eec3285b0a1edf43be7caa19fc8f5ac06122b3451d85b7df2da41f347e2e51458f39d4d16c3cc87aad7b451758d3afd9729659156 + +Px = 0x2c65b61fa1f4d3c86c829d15d4de5b47c5b789f53a4355661f09eef3b97b21a3b93fae0f035bf347a315594785059b37ccf8062a391ace30e69a984d8417ca2c +Py = 0x341a8019653ad617da57c9997c2debfaf340a6780bd8371aee2c668b7dcc70fe06789b8f36f8f13f40822f0401102e03742c8ffaa1dcf0baf981c7ecc1a7e278 +# Test 240 (edge case for u1) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02407b528b7702bdca60740bb8bdd8650b6143dbe877cf95433f91eb580c245668a3b0b6fbe5b483e68fc5ca28b1e73a9a2d87990f55af68a2eb1a75fb2e52cb22ac + +Px = 0x6a8222da632550f85a0d59fa8e8f327e16274b6397d5a42aa1bf6f1a1b5cedd3a1182dd0f22fca690c5ef5a261e6e5d8bae34f2e1ae294b50a287c882574ee7c +Py = 0x82d86218782338757b9bab359e63516ce3dbf5e7fdbd5baa4ae99713fe5dd85bb61ea12a178cfb50a25eef41a085dcd5e5b88f148badf4c8f4031e03d49aec6b +# Test 241 (edge case for u1) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02402d17048ee57e45b66057acfab9c3b2a4939e81b1eb0f8972a8c2b5aa6b04c15584894e168e15dc5cf889fa09f7934d1084def351042c2b97cde3c100b894bad3 + +Px = 0xaa17b5bd2bbfce1ae133e2479fe1f87e64e6165897ee457391bc2daee9fd7686b8d4bec8ecfa8a5693f39b4ef9b4163cdbc5c4546fadba0cfe3e1532ea2aadd4 +Py = 0x73fa93039717f9dfd49a9c2884dc2d1012d71d6054ea0f391685bde5e8c0d5d611b40bd1fbe35dc5bd7e916ddc9a66ba54ae8949776f2f21d4cf54b2f6c757c5 +# Test 242 (edge case for u1) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02402b18986d87bd21cdcbf0f13103794735979354290c43aa8c298dbd473de5a389cb55f00c2184a235f6b7347305926c0e25785eca6d98eb2bd921562164f365f0 + +Px = 0xa72de8d4d2896f9bc6d72a68f8b2588fa2ecb4992e8e3616fd58a1a12f0327db1fc3740ed384022078156fe66712bf092cabbc43659cddc9cf3dbf807bcf3635 +Py = 0x8819319aef0e23b142e75d9c4c139812e55e1c419d96084a68b950356c46eb2357512f208bb1dbe970d1900c8dfda77d2f477760db63d228dbf8b342265bcbde +# Test 243 (edge case for u1) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0240445f8caaf2093f6882bc6c7af537ebacbf8620f0b6ac68a19a5de1935225cc949c24365504222938c56982b824bbee59253f4a866485149ec4c5b5ec9ad74ec3 + +Px = 0x37d8519f0c7492ff443bad34cbd54eee9ba120e41fbb9fd604cdd6d41b762bf2bba392d4f4646978730f6556662b99768dcb2754c180c0fbd8ad707636d8f8b1 +Py = 0x43b17d728ffeac454019530d2bb0f69a58535a2e8e609ff69596d53d11a00e6f650d49d9a5f211204b4e5a421c757f8e1738955df96bad5bfdd71e155a932d1f +# Test 244 (edge case for u1) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02402da089be4ccf10ec5bd463556efbd3388cc343b9dd0bbd6f2e98a5d0ca362d0fde2aebf02bdef173a0f1f04755ee76a098727638e4f7f389521d997bab85b781 + +Px = 0x2afb786d246b43a53df6841d04d4c7705357939697714ed4681dc595188191877a46f3c6bbc63170406e0c6db7dd6789a644738f7d0acb7c9e5959c01e39e975 +Py = 0x20327e6e5c925198b74af0beb51a83ea662efbc3f85bba8924046b97dacb0717d6b7f422d8426625ea7f6b4ce865dfab264ba5247b4dad3e2ca5614bff4c0d5f +# Test 245 (edge case for u1) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02405b41137c999e21d8b7a8c6aaddf7a67119868773ba177ade5d314ba1946c5a1fbc55d7e057bde2e741e3e08eabdced4130e4ec71c9efe712a43b32f7570b6f02 + +Px = 0x1b419aa39d3e3125ae705f77885c3b11387bc422fadbba7eb0a66ac14ae26c0f978333dce64e4fe0d3bdbc6d52adcee3b51493a26d21376bef764e0628dfbb12 +Py = 0x73ee3ef2eae04a27e798323d50e0f4fefbc43fc4613677311da858f83e5d9b3b9e41af6c5582908a3ef2948e4b5dc8c5b8a590b3ceda18e4c4cc05ddc268dcfe +# Test 246 (edge case for u1) +Signature = 30818502407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02410088e19d3ae66d32c5137d2a004cf379a9a649cb2d9723384d8bc9f1725ea2872f9a80c3d0839cd45ae2d5d0d601cb63e1c95762aaaee7da9bf658cc7302912683 + +Px = 0x327a6e5e4ef2bec0631e13354094cca4df5bc4018a0572c00873543d98100ac09d76d27bd6e0bc2dc96bd8cbbe19aec0c141320ffd64aedba5c17a1be4bd2960 +Py = 0x78dccc453c2aa7e92a7734823306c6c1ae3e52131edbfa5fddb719c8d5d00ba3d38baa8fb727bb941e21baff375503c27eed7046fa6d00c70ef136e01d36efd5 +# Test 247 (edge case for u1) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0240372e96e8f1e93c75e37b9a04b28f5e235b2e361f7f08b2dba5a8b21ab3c1928f1ddb334027d53df9c4daff942db35c89628e23c62c6696df2949ecab9ad5ca1b + +Px = 0x9aa189b5b1e5b66641c7ec3fa7d0dbb6a72d874d18c7927cac8470a70969f35705bc73182abc10b5a16955889619bcba6ff310209473c3120e44a2e1bf9fc9c7 +Py = 0x2e5de74749a05227509a2b3d0322a8f9020709cb8e5da67dfee28e96e0ab8a1c3208055d1f08f38fa1cc79c119ff704592a8eef58bf66204b81ad0b0abdd0390 +# Test 248 (edge case for u2) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02402aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9 + +Px = 0x439a859d7aaf99f57205f210c93ab89c317bd2fa215e7903a67976d336d83b1bf9719067077420078f837514d607ae3981185dc7b02627b05ac66e491a2b94c5 +Py = 0x4c3fa47a926dbd6945aca6d404f85f46e070d04e7dabf6fa9cb88c3428dd02fd01a9b190bb61dfb7b2439e42d0b689aef968356b011cf3054ab929c85777e652 +# Test 249 (edge case for u2) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb024048d7851b079f620209e8ba05eb24ee515964d37577c7c3ae309ab2bddd7eee7101899d0c6c780111bede61ed1215ec42399409d605eccc9aac4c9548f87770df + +Px = 0x66fa158c51d3a9421cbb133799ab90a12387ec7875a2b354b8487673495bb1879ef1672f4928a2034095a02c7d083f27e0eac0a40b87d837f52e7648200c5666 +Py = 0x278037cd7e5e8bc6821027b21a2ca7ae9c694ae809966b79d441dcdc9d3b444f8793122f30956ae0a7aadfbe431a342dcd857095bd058a742ba58af18b1a519b +# Test 250 (edge case for u2) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02400e6cf68d5be5138253de290ec41bde7dcf96065c280d0a09d9a4888d5de04dbea75038fc061b653340696c62baaea92d5747e50249034c427f2f813e2b98c24b + +Px = 0x29bdf2feb76740763f5098cfd5efaca5fa2b19654bd4e8d5d75978b90520e7483875bfbe2ac0e57adf90cc140af59821786724e5eab9111445a2de4b3768774c +Py = 0x32ae3979b352dcfb0c72e8f6799ab76415428a9956ca5d2b14d74b9a1be189bcd3032f742ec94744c33a3cdca10dff4d5b07929660d6e78729ada6e5be9ae101 +# Test 251 (edge case for u2) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb024041b2af78294165d86f751cb82a80327a0eb4c0544a06d4a5719aea4a098f115973aff4c1a8cec2dcf0f5f0fa24190b474a25b9ab3baef7770f68ba9c7ef7f7ca + +Px = 0x80af1bb9dfce00963799e01aecbf8bf5a659b6bbfa4689f0674a6115bcdf996d155d9a75c5295141e2cc3e611b32c589e6ae76aef190dc8a363ba9f9c3cc5727 +Py = 0x38cd95bcd34420e63ae435afed09f70e4ebc3501b42f35ebbecd8b0a165c61616090b118ef05a43c31f3b710907c745264b1f537c28596a403c25195e87545e +# Test 252 (edge case for u2) +Signature = 30818502407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0241009c5fc3fbf70f16ccdac92f95974408ffff7e05bd0268cfdf862e9beb174fb48ee1e0e10f942d8fc67ed69f7a94c85f61c84048617e67c1cc6c0260e048641a6a + +Px = 0x6eeb4735286c2c094dda29710a774eccdb6ca5fa8991f9adbc769b448d3899943c860e3fb50cff34825adaee82aab5a533adaf74fbfe7e8b032e2642fa5fc86f +Py = 0x5ef74aa61a26823bc2ed70f08b64a6906db981564d5e0c15a076a582da8fee20b773ef591f9054da34d90a1f1317294610a81d3e0f1adce4f6d2fd6ba4b93501 +# Test 253 (edge case for u2) +Signature = 30818502407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0241008de1ea3f1234690e75bd787cfabe15f833cb7dc65107cdb035f99b0bbe6c60ad6e8365dddbb1f973bc26dddba9e4ae7c72cebd41f471a8bb227d2b3df41f346b + +Px = 0x938841937550134c5a4bade19a5021c73cffc774fdca875413a7d541e65145fb77dad4a7c7eb3a966c184d73cdcf3f1bea984ad25dd4fb7f47239faa5b539f6d +Py = 0x3275cde53c18f3bb537a7f06c7ea1b4f355025919002bae9a3a3c1dcf150c1b53bc8dfe53f60cc785e44051c95b735552ba622897d5bf7556fd7b9e38b6531be +# Test 254 (edge case for u2) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0240326a7e59c4bcf9ba52235a8e06d244557acf66885b64f9238cddb3be327b6205758b60f3203418cbe5b330e28a9d7a360edfb8ddf39d46340d5c2792824b7c6d + +Px = 0x78fbd1e762019602ff7187cf06a886d2ed2cb5d06481b06c3c4be4f7f3746cd0151d57f4d6aebd6048895cabfe9500adf3daec59ffa6ee9621c8b584ed6dad1a +Py = 0x6f3c2070e01421a1ebb969607d44f76778748bcb559a8b5eed83b04760ab53556b0039e8765ab85a92950c10ca6bbdcc9d6e2f03d88b6d7bbdcd53c8b1ff86cc +# Test 255 (edge case for u2) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02403c5d08339f2f6f97a2b86b83296678f7bff61e1b7487cda14f3b12fce6aeafa3f2fb385aea3e82f312a6880efd18a1d77fd7faafaf9d1ecc5ee9c2c0f71d10d9 + +Px = 0x4c9ada2fa2acf8d01fba2b015f7badc322785c85f2199b6c4ac490da8e1ec973387f4abe26d526a056dc7195fb1c9c0ca7612cb65f15f106380d8c5dece529f3 +Py = 0x2172c8b9b3b6fb0bbe9f2273d9a218bd512479dd27605b2a6e8b44f58d176178390c2bdd1ccf60c1e823a23e8b0fce7dab2f197913b1fe30f699e3bf366bf1bf +# Test 256 (edge case for u2) +Signature = 30818502407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0241009584a4bdf0c6c8ca72211f589dcdd7be181accb926f2430dc7135abbfa7887d606030c85c72f5a3c05fcc7e0d1fb33afc0251fd33ea04b3b96470bc26ce612ab + +Px = 0x854cf9601010be20633f5d17214cab687dab3aa54a38a02c55ed003615ec8efada2ac0d62d923d0e1df9aa382d512706cadf5539858a62a5ec62fd8248e63277 +Py = 0x6a783303285206018cbb9fc1e98cdf94ac6f2fecbdc7d8428ff485e59b00b2bfa45a06aaa93e6b51b7ad1b8ac0dbe135455d8d2875231357060990abcde563de +# Test 257 (edge case for u2) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb024040197987189f8cf04a951e01c48fa8ae9042f184848f93b215dc790fe2c42ee2d549d8cb50ff3db74b6ddb376a80b2ce3983946b2ed99819856e75ebf8ff2ae0 + +Px = 0x5e3de509f7585c0f6d05c387a6d07a061c9f98c6adc8b3c36efbdefcbff2e6ad4678960524d116154f5b17332204e3a1867082d2e518504f433e2726ad58e9d7 +Py = 0xa0b32e9d3c523bac3c1ccdd75f82b909a8306c74be899f13228abf87db76b9115c0b293d7d30f3c86230461b28a45a6cc88b8fe079143103c5b01016ba95bcd5 +# Test 258 (edge case for u2) +Signature = 30818502407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0241008032f30e313f19e0952a3c03891f515d2085e309091f27642bb8f21fc5885dc5aa93b196a1fe7b6e96dbb66ed501659c730728d65db330330adcebd7f1fe55c0 + +Px = 0x15d2ffcd4617eb1b400610cba8d738c76c8e15ad72b34e576772ae19cd8345294644d13ac62a293788de2a92dd547c2ac3a98aba72952d3ea2d491d7eea5b9cb +Py = 0xa3ec2c79a2cf7ba0083933b2c534fd4b51587c4ebc3cbaaa28d92b95e3c8e90142effac27bbab215ac0b39d1c5f332feb779351a66c294e4ed62f5cd3229a923 +# Test 259 (edge case for u2) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0240156ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548037 + +Px = 0x974df3e7a61283830e544ba9023479cb8d7559524df76fb38d23c55d29923e72ec5cb48717fab859f2f3111585bbee004595c5fed64411fbbf9f6351bf5f69e8 +Py = 0x4e1fdd691b30b0b4c2590a881ce458053349356da747cd93ba931eee6ae88cae827007105c3b1633a48e1c9db5272ac01145aee6132ba73af83d6e6c4106b290 +# Test 260 (edge case for u2) +Signature = 30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02405ca54a231be76c06c9d987de7bf2ed42cd634a07edeb6e0c580412abe709ab177e474a9ea96245a640f7e6be1d2d5cba3a7cdc41a8b093901a5b8be06420e15a + +Px = 0x2cb7364ccec9148a3242eee17ce01d82a56d037cb01746fdd24b893f35e072827ce463adafca6282d93cf666a740ee88adbef241f17955d2bf5f9f95958a38a6 +Py = 0x96da5643e5fe057f1c3b931e36d33f0e2f5fba680932a35987b79855b6c1f0ead64cbe9c72959ece2184ee65a768410df1dad81c4dba853340a2396abf82e36a +# Test 261 (point duplication during verification) +Signature = 30818402401b8e8440bd94752dc603159728a346872cad48dfff819f181f9d53537a80868bff1280acfd2397a846d3259049352bc11f5fb739410c766d1344cbcbc03bf761024021610740799a83a13b49aa45dd854d85b058bd955a4105d749cba74b8f2a38cf7c33ed56921d029e7493894ad3d8f28f4431dceb89cd56316de93dc09777ca10 + +Px = 0x2cb7364ccec9148a3242eee17ce01d82a56d037cb01746fdd24b893f35e072827ce463adafca6282d93cf666a740ee88adbef241f17955d2bf5f9f95958a38a6 +Py = 0x14034774f5ebbf0c2399538ffcf6bcf99bd0d34baa972eb54eac0474b9711786a700dc642930c9748d48b2c53f3b3fd836a72712dfc84151e80826eb98b76589 +# Test 262 (duplication bug) +Valid = 0 +Signature = 30818402401b8e8440bd94752dc603159728a346872cad48dfff819f181f9d53537a80868bff1280acfd2397a846d3259049352bc11f5fb739410c766d1344cbcbc03bf761024021610740799a83a13b49aa45dd854d85b058bd955a4105d749cba74b8f2a38cf7c33ed56921d029e7493894ad3d8f28f4431dceb89cd56316de93dc09777ca10 + +Px = 0x63d566fa93ee219482ec947e7be4694f9c073b2bb786db849e1f3973c5122394cf68edd9947b58e61fe42c98d3640844ed2775b0c36b5f4c0c9605d028bc0c5 +Py = 0x7521b29889632bb0756fec98e8e956cb7ac515a3fc9082b871861548e9702786f591e9a222391014725167a6c22aaf8c2c4be9425248b4d5f94f31cbd8bd352 +# Test 263 (comparison with point at infinity ) +Signature = 308184024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd6343855780240222c52be9261f41bd990faefa3f53267f5701c5723f52a02f7ad85c216709b49aaa6127375bb6e050d1ae0384cbc03416c56c3e69b45f892bde7eae6ec21cce1 + +Px = 0x13b9a0273b3b283cc8a25aaaf2a8508a745db022e7f4ddc06acdf06eb7770fd95ba68b047b030419aec366bd187eb840a43df7d9439419e2639614d5b4eb22d2 +Py = 0x3ba9a5c0301708dc50ab9e4ad4ed48ad0f701cf387f210e57b6d06fb69cd58dfb0685f89d9ed1a319f00151d9082663046cc27101b692ca22a6b3e083dd0ff7f +# Test 264 (extreme value for k) +Valid = 1 +Signature = 3081850241009f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578 + +Px = 0x83672d9b61f73f1a0b2e066bc3d009749d28d4e584a1afea28dcffd78b6b2d659dbb0c5cf7bed61f3b03c3c129e31d4b49ca8da3813cf25b6f025d84ee82d561 +Py = 0x379be7f5c837fd23e0acd749167549e8703dbad3bc7add9d3a9ff01abd34b55342f532428d95cc1f0c9bae7f458d9411919a2816009658224218851b0f8d5720 +# Test 265 (extreme value for k) +Signature = 30818502410081aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578 + +Px = 0x81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822 +Py = 0x7dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892 +# Test 266 (testing point duplication) +Valid = 0 +Signature = 308184024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc02401868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea + +# Test 267 (testing point duplication) +Signature = 308184024066e59cbcf0f0a0fee7256d52661cf74b816308a77a7c9e8c4130461a4d1205eedfc32b5fba90829c8425409283eab77c74fcf1d45571da5a372a026368794c9d02401868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea + +Px = 0x81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822 +Py = 0x2cff655b8586919e7eea27046451d909d92696b38f2456f43662d76ee813875fca70bcb751671fe4530355525c7c1d3756b7d3ff8492727eafdd42471d624061 +# Test 268 (testing point duplication) +Signature = 308184024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc02401868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea + +# Test 269 (testing point duplication) +Signature = 308184024066e59cbcf0f0a0fee7256d52661cf74b816308a77a7c9e8c4130461a4d1205eedfc32b5fba90829c8425409283eab77c74fcf1d45571da5a372a026368794c9d02401868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea + +Px = 0x1ec7fe2275860c3bc0e4e6e459af7e16985d37adba7351ac357a7c397e07522ea41bcca8e89777fe05b8f0d9dc8c614004fcaf30a97001a5011a159f46fcd544 +Py = 0x3cbc1ddfc7ac89a1a2f8eef77bf9bba8ade73da2100cb6a371546b495fb5ea885eb631645e79591db659c49266d263d5cbd3403081cb407536efe9a5bec69955 +# Test 270 (pseudorandom signature) +Msg = +Valid = 1 +Signature = 30818502410089edf75e6e986305d8181386c16db44ba0d7ff40f4335569754a481f5cd48c6211a63de7bdaa485e9fa79858a4eabf111fed2959f031de2a132ba709412683a902407a8c08564f51534128bb52fe36dffaae89079011256ef8069e64d64c5610d3e611c0ba8b19027388fccc212523b22c44e85a789e16cb1bbd3240c86b43480fde + +# Test 271 (pseudorandom signature) +Signature = 30818502403915e599d984f4d8417fd3a11d01a68c6d90474f2b1551bcc4b4eab9aa8e2d05ef10e0d694d0c13c98bdea76df39895015d92bcc228ff3416c0dfff5394c249d0241008d3e50b32ddb81e8843cff3373d747ba8cc0d090a73282492eb60ee49618534ed05bb73d0dc3a2cea4cbbdc54f3ef915e880926d83405a08b6ccf9848e4d8ab1 + +# Test 272 (pseudorandom signature) +Signature = 3081850240558cd1bbf7853b68d566157772a84967d7a317535009adffc6bc437aed1ec443b82e59c4f7a3ecbdf36e3919b1a14d11cb4420b982df1cedc5c5a48eb5a1342c024100a266df24c6cf32c071e623d81a1991649c2bb3fc06cd91bde4721ce9458513d63511a0dcf522baf6ef4b12126149b66722b30a862be07356e78f9aec34e4c295 + +# Test 273 (pseudorandom signature) +Signature = 3081850241008628504957c1c0295f277969b88f4101795072fe9010bde58de44c4b6a8b19c91eec95d76dd3dbe65c9f95122029a5acdde05d77de5b7dd765a7e756cf21e1840240094c9947a3faf64a7963cfbfdd5a988cec79fe27f1e1b4c5d6c9986da8cd6bfbafffbbafe6ee01a002189607401371765a4a71527b40b2192c09a05273b70a98 + +# Test 274 (pseudorandom signature) +Signature = 308185024039b3a3fd9ca78f258577bf4641d6c02661e9f30eb066b680aa8bbe567ae1d9fa75b5b94211f7f8b842303e97af7e86bea68398d9166159bc6b077a36a6ef235102410094857c4425397ae1a554ef5ddf27195666b65fac8b356a5a19412c2a6134f77703d775095f6af70fa4cd5d63065dfe70c095156c7868bc7f4a4a0aaf70040a1a + +# Test 275 (pseudorandom signature) +Signature = 3081840240187ca74d98179988b356ac360a8575be689c04f70dba3988f293278a1acaac56db4ff13effe990a5df28e1406ef2fa8b3eed62bb1f39d77ee580d21eb44dd3930240249fc547a5e2c2bd1074ef2dfab0c8d48ba1f6fb657e270129682931310a112540a1137683ca65cac718c1be9adfe34d919549ff99d632e69e65530041ca5388 + +# Test 276 (pseudorandom signature) +Signature = 30818402400f09926d3a135f6f51dd7b5db3b5d3e55bfb3c1ba0c30f865faeddba751cc603c9f4af834b874400dba94dbc3c688226a4cb0fc5800f0248e9b159c6e39d849c02404984317b3c9520b139cc4535b8269b6244e9fd6288d1351e8b73d7c9e709bb1932e343f758f6f4fe8db8099161df0fe9a4bbc5e010e6c4c8060ab6a3c6aff889 + +# Test 277 (pseudorandom signature) +Signature = 3081850241008d41d2c4b61d31385e6c4402bf4c86677f1bc8dd01d93ddbb8765e8d5cb447d33756152ceb0a8e0e8aa0e2e6d14da9ea8cede6dce286778f5e5e7bba1509756002406bb0b984933cec50cd3295d0039bcb8ce6a505b43a2be69884b4d064309a892fa617906c2de43fdb8ad3ce5c4bc134203de9e59367ec164bdda484b2734feb5e + +# Test 278 (pseudorandom signature) +Signature = 30818402404f850ac7b43c71ca6ca9ff37ce1e585b4b9e426692eba53716cee6bfaf2e908255be98cc10784f1a6d4e6c4be321597cf4a7746a0cb15b6571cffcfbd428353702407e20583e692ac05f5a1c5098f7f8b173daeee53a724426bde8d3c87dce1f793bccf0b706097ef59329b92e55860c132514ff83e637dbdc5ab39c143d0b3316c5 + +# Test 279 (pseudorandom signature) +Signature = 30818402400c3e41d030a40e8ff8919b07e102aeca730595c882d266dba6a79607e95638d1f8db1ca3f38aed34123d993e524658f83d41a6ab982f730f91c1f3343d958f500240219d8f9e3628ca26f3193318cca8dd671d9adf5422c376def66fd3cb760a24a1c7e7e655af0f28243411fc8b5232576bee9ae47bfda93dec8d3c6feee7512c52 + +# Test 280 (pseudorandom signature) +Msg = 4d7367 +Signature = 3081840240225dc2310177ce6267efde9937eff898fb0bad12b0dbeb4fa9c6be6e20f88563e6d2991d47a648b0ba5a7039842dbf883bbd735df793cce0d136023fbfc9be95024000d59783d8bd050cf728b3506c16ee4a78ac26c12fd33dadb6ee8146372e4fb2a880ef77eb20ac90f3a4275c1718a033a7c0b2df538eb35827330154191153cb + +# Test 281 (pseudorandom signature) +Signature = 3081850241008dee57a9e032e4b3afc9ec58d9a46e9d84d272448d36a07f3b362d821f1cb1082e90f0a0c779225db2287b0292237e2e80ca57ffbe89a87b2d78b5e32d714b6b0240672e2f549117678c4ef0fb106103bc987f839c9bdbef84ee92e9a1f79b3d4270d42b2b982bcedf88df117f62bc4e89c37c7a2aaec8c2391a7089d1721e2a206f + +# Test 282 (pseudorandom signature) +Signature = 308185024100920dd66e2dc70da70034b3b8b1793e6dccefcddd6b89973afc98c9df70e178eeeea5ccc2d5d2e0b068bf775873248e8b06039565d7b0277ca971ff0f8f28fdc7024016a62271848f3df776c53345c7d99abaf34933cbedf5c4f534aa099ac0b76e2a77aa1064395202dcb762b02bcd121af8a6785422e8f8eb585476cb2fcb9786e2 + +# Test 283 (pseudorandom signature) +Signature = 308185024066e5c6498dc07bea9f7437ea760322c4d8a83c3ab415a10e96f726f2c8dfe8e352e7edb38ce0a8f13bb96e233161d6ceb4cbb845a566074e724af0e31ea1721c024100977ac9eb1a33c46c729a601d1b4086b82ed48c2e4c35b9b281470a44fbe16ba403fcda5dcff018a70613fc89f7483ab2531181ce6d76b599845d7d697c48eb69 + +# Test 284 (pseudorandom signature) +Signature = 308184024034430780830864b3a54334e3dd0344412288f3ce5b17277a75f72cbe6d8a38f216c1f4f2f3493f430a8705fe1e9ab3bd4b9ec670d64146bd8c6e25a6d5b36d06024036da09fbc88bd421e0e421aae0df56ed6f4cd21ecd9c2447d50ee6de546e8ade3133d793c898b38ac72d2267ae2b83026441bdc0ec674e5e69c1ee1c7855977d + +# Test 285 (pseudorandom signature) +Signature = 3081850240027fb2089ebf8678a8efbe44e12eb504a18c121068bc45ed4f48f882721dc7b6816f58078cf5482965dee81342594af0412d1c0bb9582c210126f4b17f090d0c0241009bdf94cdd2b3dd22917dbb4afa4638aedfa2eafdd6e11e78ef848471054dd3a01027e434d5164fe6b6cfe820c047a89ae72af8ff8825417473f386cbd8cbe8bd + +# Test 286 (pseudorandom signature) +Signature = 308184024043d872839886c53368c2ce044248255221bc5bcbd4c734efd1bb8c61b3aa06b466e7db5ad93e14906168d4b02d0b37d4e88739b2f54b0860f71c56b75871eb4c02401b46c4011af392543ae3be096adc59b4388d8a51df6771e5e152180fe80c29b03282572c2121cccd0d6c063282e216e0ac477354774ae941575aede4193dd9d3 + +# Test 287 (pseudorandom signature) +Signature = 308185024100a41edc0e4c0fc8083a412cb602a048a0b7bc71cb948fae0f359f5a65181ec7bc3127c2989335bdf9f8c7208060fdf5937794fd7d4763cfac1b7b0bbb8c3df8e20240087749434902774e8eb5c4bf04c451c50273679d548acdf07493d780d0656f6774692fc3ee4ec5d13e01aa0015d6dc9cad1047ef09d1f5aab80d2b6de83710e8 + +# Test 288 (pseudorandom signature) +Signature = 30818602410083aadf57922951fa4eaed0140892c752043a970fee033135c053b009d6f9472d1a26a5f91c053953841093c2a332a5e5e92922a71538f27b22cc6788ba044b280241009e8ab28a76dc0eaabcc43496107264ac42eb79340a7b9ca1aef8d75f2c0226bb5fe7afd4dbe37ebe7c3ba2b135ac2469a6c13bad1780d4f8e40c0e8827b8c1ee + +# Test 289 (pseudorandom signature) +Signature = 3081840240418f88674193a94156fa5d5ac639c2c1271f14ce5394d54c30c0e8085b69b1e4066ec3b6b18d04342859b53bb2487e596722b4e788fc3ede058213ac5db18a9c0240043b63ceabf93e25f946634c09b00c36b7a4e413fad415b5232c69dd04bbe13cad8e7b12eab8e9985899f4d790a20cda9a23a79b04246cc7eb2eeea4093c23ec + +# Test 290 (pseudorandom signature) +Msg = 313233343030 +Signature = 308184024061483c729369413144a6be0dd05c1ac29bc440bbdaf87e572aa987e9ca423639f339bcaaad99cb1fa80b7c35416a1834ec04bcf0fe7812c712eb1f06a16daca3024041bb956c339ebcf5e4e403c7d8928d5eb4fdf7d3f53a2c06d6c9fac347f603ac3209a2af37516f807b50363b5328bc98b94354af7d59966d160f68e80c6b2dc0 + +# Test 291 (pseudorandom signature) +Signature = 308185024100aa0f0c888b164bc5c95dde51b05b96a03194b1eeb51bb203038d874254126e2bd8facd041160d514af353c4c5b6b3879412b7e428ec96199976948a8a72ca499024047aa5389d7f95ba161db52f3a8fbdf25f67423e646d203728f8781b0bd68282a0e3c1360a282d90a2d2de4f70df63c0b1a6376c5b6bec8be918770f162ad63b7 + +# Test 292 (pseudorandom signature) +Signature = 308184024043b42d602b8c9d58c2f3f9c692199918b202c5922c3b6a1719457033b0f291c202f79cdd05dff70f85a8fb3afbc802c51266b4d5a0d75432f624cd84cf92ac5002401fa248a12faaf352d953ba5e456e53ada5776bd96d351d7cd3b6893c25f9b1c75feaf709b297c7ed89d2afe1ee270d56b6d37d700d7f1c99acbd76739d33cf98 + +# Test 293 (pseudorandom signature) +Signature = 308184024024e123514e5a66e6e602c0731b7d523170f0e516094fdc64224851e989959327c26c0508e731c11ee1ec1cabf1724fe5bfe871298465e15b49fafc8179e1789e024070b19db5c097703b4350b3973a1b42e65741f019ac2ab9d6d3bf6db8191920fc4c78007b149b9d1bbcda945608aaaa87df44d6a35fadefe257d6c8ff4bff6368 + +# Test 294 (pseudorandom signature) +Signature = 30818502405af3e9635a468399563d1e9624a5355c37f1c3c8d8a7723eaa83a44012dd30bd3e4f0839100deacd08a8ca7842b267389f97961139de4ca485b8d815721399cc024100a60ee65815a5990942efab34ed7fe9c751ce67f758c1939b09d2673ff2947d467096956b1f4e3851afa051b1e23832d452fdd3edeb4f72c8647596c1374a7ec5 + +# Test 295 (pseudorandom signature) +Signature = 3081860241009655557b1643ef2eb364d3a8159f22e78da5a277c6363c05e190719cb276ba3a9c7654f665997a43024bc8fa5769caf4bdf6e23f3f344df35313a5d18908e69302410091ea8f09db6c672fa8c6c6d3077b93354786430a7bab82e1bc6213b67eba9f52209e84b8e9690f8919413816dc44eac65a721d2236cc7767cfd2b29f3a1f5ee4 + +# Test 296 (pseudorandom signature) +Signature = 308185024073fde788900f7bf9be1057420ddbc6aea955f6aa11a026f416eee30eb48325a3b19a89b752fbc09f91c5a029cf0f00287ef67702d657fa8c8528c27cf82067c1024100a60edba5f6b452b79e1fc6aece05467d68417655270bfe1d05d2b4a76d255006cf8a5f1b680dccdb737ba4af5cd40e394a89f2f4b9e2c1c92fb76116e7932588 + +# Test 297 (pseudorandom signature) +Signature = 308184024007d6bed335740f06f506c3a8e51381dc5cd11e648d787962f88c32ceba1853f9e6eda57cf1d8151f4c40791b3c5bbf263c73557ef72db5fa105b64aadcb9118402405ea1a004276a6a335f0652806d8df1911cc5f086d546a7afa852336a9769ad12c6a394ac2c8aa2398d6c723bbb61c5072b25b3fbe547e6644d2ea66032fd3a88 + +# Test 298 (pseudorandom signature) +Signature = 30818502403ca7cade6c723f12ceeadca56bcff71ea1eb2bd388a27941b728f6752f424a6b3c4c0c7a3dc369753486c74fea234494aa4e3d1df859690901e766ec4cf5b6580241008bb431c4b5e5acdd92140e8a8b3e5cb3de5361979c356b335c41b0577065ff350f15cae3ccfb9c240b8a782fc5e70145fd70ae516e3b70ed912df34fcd5f623d + +# Test 299 (pseudorandom signature) +Signature = 3081850241009401f566e5dfd6806e58de002daf51b29c9f58deb0bb0572a15bb0a01a44dffe80fb45a0b9a061a78bc531b07f2fdbcf94722bff23dd5a1f2a78a0bfd1b5fbdb0240138da4f1356891080bcf600e8713de8dc04a2a4c11cb4c6ce3f08ea884e5c98b44f0a9eaeb2170340151bf4e8322cd6c086848c82c27b55e4fb792bf440ea700 + +# Test 300 (pseudorandom signature) +Msg = 0000000000000000000000000000000000000000 +Signature = 308185024100a620880bb7fab1180e3d8f393e4b3343dd4eb1c374f9d61252f8a201d9096ba836721f8e2d8b56cbf406960aae0e50325adfca6b1b529f06a81260bd8b15ff68024076537febbc0e24ab4992b576abf8bc0201cacf5ccf674ad3c3b1552c98ca64642eff5401afecab167ec0be195fe5ffa178f14567ef171b4827964a559d079b7a + +# Test 301 (pseudorandom signature) +Signature = 308184024002692d43df4ce3724571246a459c46fe3f94373abf7da921e531ad73bebf8c623ed34300741694efb652a21ba4fc3237c7ef0a4b7d9ce2188d885a0302d9102a02400eda15d35f34dbb29c504023851ad03841f578b1f215de05a184493e89f2f802a53ac604b6ef7955863ec610aa786c5236b0981a20721853ee081aa46f99d412 + +# Test 302 (pseudorandom signature) +Signature = 30818502407129e41282482a50417aec000389935adc2eccf65444aac12a30ccb9b06fab0650d347258c8bf1f30b35769946c07bb02de452605e40ee2c2e14fd6b08c476ec024100984ba319c1a3d1467e99a59bce31454367a210d4a261ba7cce92206a7ffeae23770a00d33aa3b61edb88b3790d1a249245ff5c58a5ea83ee28bce7f09648212a + +# Test 303 (pseudorandom signature) +Signature = 308185024100a1246d8296795c48e19211014d88f6795a22863454f6f89ede7a931abab1d8ba003726fd72fca49f5e6d4e178b4e4a83c87265bf48de0684e93f6ef56bf5ca21024058b2dada9935b9dc11a3c8985b0ecc07066fce090cd57d412c25e1431d018e3873dedb3d48b9b2fd0af37608cdfe1e338e19368bd805e1ec38528c04ba1129a9 + +# Test 304 (pseudorandom signature) +Signature = 30818502404134d7c0e61393867b451e4aaba79304b4bc9e7400826cdfa21093e468a6884aea440beb0a0b7e4459c3eb0992683e4e52912ec32083e79a96cd6bfe9605123e0241008533c2c34bf7cd2968f5ccd167a4ea710bfa0a126273b43aaf406ab60063237cd7eb0fbf28f9898c3bf085ded5e2c2c8b216f48a5ba033c029c6b2c969d88051 + +# Test 305 (pseudorandom signature) +Signature = 30818502410087a6311356c309695a74ef2096bf95c2aefb22412bfe2c12ed9d93fb0614fcb176c4db52f17f732528abd0314b1e93fb670ba673925d8f809baa6dca5a7ef37b02403bd5551cfc5ada9b31fcb763900ee21c301abea14851c768ab69b91417527fa96b27f4f35d3a29d99fd860e47d69a1686b8c5b9e3c1fc9a1ad387e950cdc32af + +# Test 306 (pseudorandom signature) +Signature = 30818402405ab0aac4c655b08ac678af4fa151b2a85092a701ca21b44e733391801e499a3743fbfe9b6a38cc51f1bd393c1379db664f59b3c6abaf931402647ddf13bd7bba024032d056f3e09fd4dfe4ee747aabe57a972a2ddcfce29bd2ff6d0c2f1018c85c10a4b5a8dcbb6dbbb8e0e870af0561b98a536f13dabc042ebc49ece5db3809ab37 + +# Test 307 (pseudorandom signature) +Signature = 308184024017dd4280d311e5cf69ce7b4ad7f88d7e1ef3c2ce9128db4cbc68560de309cd2a5ee97cc4e906141de7158f30767ae38b8ddd80c90fbf3bcc2af191ecf24d365902404b517e40d5b145e4f82bc68b6897b8a5b727d29a4b0e97f2202552556cd93bbc92f1e256f8d480b0b7eb72bceb1115e0b6ec45b73ef18999d5b98ee3a345db99 + +# Test 308 (pseudorandom signature) +Signature = 30818502410090d4d5b30c84013ec14011011b244eb5741b3b4512aeeb93e13ba34fc8169b9dc86d47c310cbd575cf2b94a81218717538b902b4603467a654f5f0a35129563702400fa303a2973d7afa13a7f8049504001c3ba7de524d3a7d91c7737880f59ca1611cd945fa50fc78ef7ee9b9606d231aa80b68dd6271b8f57f8f51f10caaa0f233 + +# Test 309 (pseudorandom signature) +Signature = 30818502410087ddfd6155f068b4078b699d1b0eb74cccbb4639ff0c404bd2e4a9be2fcea4fab9f55b41c37be9d5fc3dac0566140564b20f3852b1cd81dca46e9ca6649ae97302405290491b678fe1ea66257a2018b31f31794ce3d2671c5b565097b4a8e1e77e1d4a7013d7f34286d3b9e07a8dad536990245d53bc8d9a216e71b0d57bce64811f + +Group = secp224r1 +Hash = SHA-224 + +Px = 0xeada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7 +Py = 0xeca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5 +# Test 1 (signature malleability) +Msg = 313233343030 +Signature = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021c2840bf24f6f66be287066b7cbf38788e1b7770b18fd1aa6a26d7c6dc + +# Test 2 (random signature) +Signature = 303c021c533d488bd8c4b459bc1bb67c7c96f5fcfc70996660c068d7fca3d605021c31893ff9dd72c79f3a62fdc5d82f7c05b75b8807c3f6830e861697fb + +# Test 3 (random signature) +Signature = 303d021c40d10e9cb11ac916d0c388a6feef764e2c22309f93a9f539c73725a2021d00904be66c40a6d256f3e99555c502b933f8625351e9bf7955fe173e75 + +# Test 4 (random signature) +Signature = 303c021c426f5e9c494c3669a6d0df24f5523d6dcda666a6ab8eb7def60a40bf021c1c342732ba0cc317dd4ffbbd20ce163607f9009a1a67518b0dff0cee + +# Test 5 (random signature) +Signature = 303d021d00abf10842ebbfdcd2c3bf18e1acc17c04bcc488e65542af2de38cb712021c5f37ff71604b38b5d66087a36ffdf371b0d4e2d9d4a22c2e9c80fafc + +# Test 6 (random signature) +Signature = 303d021c7827f94e5abd228d2bf7bd42bb8cbd1a3529ff26b295f4fbfa159b4c021d00b5a984cbd21ed6d230d22e4688745cfe0da94f9c0bccfb249ae6a4ef + +# Test 7 (Legacy:ASN encoding of s misses leading 0) +Valid = 0 +Signature = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021cd7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 8 (valid) +Valid = 1 +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 9 (long form encoding of length) +Valid = 0 +Signature = 30813d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 10 (long form encoding of length) +Signature = 303e02811c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 11 (long form encoding of length) +Signature = 303e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a02811d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 12 (length contains leading 0) +Signature = 3082003d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 13 (length contains leading 0) +Signature = 303f0282001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 14 (length contains leading 0) +Signature = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0282001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 15 (wrong length) +Signature = 303e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 16 (wrong length) +Signature = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 17 (wrong length) +Signature = 303d021d70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 18 (wrong length) +Signature = 303d021b70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 19 (wrong length) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021e00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 20 (wrong length) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021c00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 21 (uint32 overflow in length) +Signature = 3085010000003d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 22 (uint32 overflow in length) +Signature = 30420285010000001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 23 (uint32 overflow in length) +Signature = 3042021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0285010000001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 24 (uint64 overflow in length) +Signature = 308901000000000000003d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 25 (uint64 overflow in length) +Signature = 3046028901000000000000001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 26 (uint64 overflow in length) +Signature = 3046021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a028901000000000000001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 27 (length = 2**31 - 1) +Signature = 30847fffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 28 (length = 2**31 - 1) +Signature = 304102847fffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 29 (length = 2**31 - 1) +Signature = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a02847fffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 30 (length = 2**32 - 1) +Signature = 3084ffffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 31 (length = 2**32 - 1) +Signature = 30410284ffffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 32 (length = 2**32 - 1) +Signature = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0284ffffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 33 (length = 2**40 - 1) +Signature = 3085ffffffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 34 (length = 2**40 - 1) +Signature = 30420285ffffffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 35 (length = 2**40 - 1) +Signature = 3042021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0285ffffffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 36 (length = 2**64 - 1) +Signature = 3088ffffffffffffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 37 (length = 2**64 - 1) +Signature = 30450288ffffffffffffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 38 (length = 2**64 - 1) +Signature = 3045021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0288ffffffffffffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 39 (incorrect length) +Signature = 30ff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 40 (incorrect length) +Signature = 303d02ff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 41 (incorrect length) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a02ff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 42 (indefinite length without termination) +Signature = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 43 (indefinite length without termination) +Signature = 303d028070049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 44 (indefinite length without termination) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a028000d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 45 (removing sequence) +Signature = + +# Test 46 (appending 0's to sequence) +Signature = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000 + +# Test 47 (prepending 0's to sequence) +Signature = 303f0000021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 48 (appending unused 0's) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000 + +# Test 49 (appending unused 0's) +Signature = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 50 (appending null value) +Signature = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610500 + +# Test 51 (appending null value) +Signature = 303f021e70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0500021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 52 (appending null value) +Signature = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021f00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610500 + +# Test 53 (including garbage) +Signature = 3042498177303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 54 (including garbage) +Signature = 30412500303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 55 (including garbage) +Signature = 303f303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610004deadbeef + +# Test 56 (including garbage) +Signature = 30422221498177021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 57 (including garbage) +Signature = 304122202500021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 58 (including garbage) +Signature = 3045221e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0004deadbeef021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 59 (including garbage) +Signature = 3042021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2222498177021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 60 (including garbage) +Signature = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a22212500021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 61 (including garbage) +Signature = 3045021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a221f021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610004deadbeef + +# Test 62 (including undefined tags) +Signature = 3045aa00bb00cd00303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 63 (including undefined tags) +Signature = 3043aa02aabb303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 64 (including undefined tags) +Signature = 30452224aa00bb00cd00021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 65 (including undefined tags) +Signature = 30432222aa02aabb021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 66 (including undefined tags) +Signature = 3045021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2225aa00bb00cd00021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 67 (including undefined tags) +Signature = 3043021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2223aa02aabb021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 68 (using composition with indefinite length) +Signature = 3080303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000 + +# Test 69 (using composition with indefinite length) +Signature = 30412280021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 70 (using composition with indefinite length) +Signature = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2280021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000 + +# Test 71 (using composition with wrong tag) +Signature = 3080313d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000 + +# Test 72 (using composition with wrong tag) +Signature = 30412280031c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 73 (using composition with wrong tag) +Signature = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2280031d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000 + +# Test 74 (Replacing sequence with NULL) +Signature = 0500 + +# Test 75 (changing tag value) +Signature = 2e3d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 76 (changing tag value) +Signature = 2f3d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 77 (changing tag value) +Signature = 313d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 78 (changing tag value) +Signature = 323d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 79 (changing tag value) +Signature = ff3d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 80 (changing tag value) +Signature = 303d001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 81 (changing tag value) +Signature = 303d011c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 82 (changing tag value) +Signature = 303d031c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 83 (changing tag value) +Signature = 303d041c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 84 (changing tag value) +Signature = 303dff1c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 85 (changing tag value) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 86 (changing tag value) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a011d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 87 (changing tag value) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a031d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 88 (changing tag value) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a041d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 89 (changing tag value) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480aff1d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 90 (dropping value of sequence) +Signature = 3000 + +# Test 91 (using composition) +Signature = 3041300102303c1c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 92 (using composition) +Signature = 30412220020170021b049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 93 (using composition) +Signature = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2221020100021cd7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 94 (truncate sequence) +Signature = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463 + +# Test 95 (truncate sequence) +Signature = 303c1c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 96 (indefinite length) +Signature = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000 + +# Test 97 (indefinite length with truncated delimiter) +Signature = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb3584636100 + +# Test 98 (indefinite length with additional element) +Signature = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb3584636105000000 + +# Test 99 (indefinite length with truncated element) +Signature = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361060811220000 + +# Test 100 (indefinite length with garbage) +Signature = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000fe02beef + +# Test 101 (indefinite length with nonempty EOC) +Signature = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610002beef + +# Test 102 (prepend empty sequence) +Signature = 303f3000021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 103 (append empty sequence) +Signature = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463613000 + +# Test 104 (sequence of sequence) +Signature = 303f303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 105 (truncated sequence) +Signature = 301e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a + +# Test 106 (repeat element in sequence) +Signature = 305c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 107 (removing integer) +Signature = 301f021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 108 (appending 0's to integer) +Signature = 303f021e70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 109 (appending 0's to integer) +Signature = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021f00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000 + +# Test 110 (prepending 0's to integer) +Signature = 303f021e000070049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 111 (prepending 0's to integer) +Signature = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021f000000d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 112 (Replacing integer with NULL) +Signature = 30210500021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 113 (Replacing integer with NULL) +Signature = 3020021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0500 + +# Test 114 (dropping value of integer) +Signature = 30210200021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 115 (dropping value of integer) +Signature = 3020021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0200 + +# Test 116 (modify first byte of integer) +Signature = 303d021c72049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 117 (modify first byte of integer) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d02d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 118 (modify last byte of integer) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a488a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 119 (modify last byte of integer) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463e1 + +# Test 120 (truncate integer) +Signature = 303c021b70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a48021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 121 (truncate integer) +Signature = 303c021b049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 122 (truncate integer) +Signature = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021c00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463 + +# Test 123 (truncate integer) +Signature = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021cd7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 124 (leading ff in integer) +Signature = 303e021dff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 125 (leading ff in integer) +Signature = 303e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021eff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 126 (infinity) +Signature = 3022090180021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 127 (infinity) +Signature = 3021021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a090180 + +# Test 128 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303e021d0170049af31f8348673d56cece2b26fc2a84bbe2e2a2e84aeced767247021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 129 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303e021dff70049af31f8348673d56cece2b28cee4c34a02667b2df86234be1dcd021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 130 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021c8ffb650ce07cb798c2a93131d4d81a785bfd0d5b70f4de586ee5b7f6021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 131 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303e021d008ffb650ce07cb798c2a93131d4d7311b3cb5fd9984d2079dcb41e233021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 132 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303e021dfe8ffb650ce07cb798c2a93131d4d903d57b441d1d5d17b51312898db9021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 133 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303e021d0170049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 134 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303e021d008ffb650ce07cb798c2a93131d4d81a785bfd0d5b70f4de586ee5b7f6021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 135 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d01d7bf40db0909941d78f9948340c5b4b7a5fa6fca97e8a82091e08d9e + +# Test 136 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021cd7bf40db0909941d78f9948340c78771e4888f4e702e5595d9283924 + +# Test 137 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021dff2840bf24f6f66be287066b7cbf3961eb3abe80737bf48124ca7b9c9f + +# Test 138 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021dfe2840bf24f6f66be287066b7cbf3a4b485a059035681757df6e1f7262 + +# Test 139 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d01d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361 + +# Test 140 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021c2840bf24f6f66be287066b7cbf3961eb3abe80737bf48124ca7b9c9f + +# Test 141 (Signature with special case values for r and s) +Signature = 3006020100020100 + +# Test 142 (Signature with special case values for r and s) +Signature = 3006020100020101 + +# Test 143 (Signature with special case values for r and s) +Signature = 30060201000201ff + +# Test 144 (Signature with special case values for r and s) +Signature = 3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 145 (Signature with special case values for r and s) +Signature = 3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 146 (Signature with special case values for r and s) +Signature = 3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 147 (Signature with special case values for r and s) +Signature = 3022020100021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 148 (Signature with special case values for r and s) +Signature = 3022020100021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 149 (Signature with special case values for r and s) +Signature = 3008020100090380fe01 + +# Test 150 (Signature with special case values for r and s) +Signature = 3006020101020100 + +# Test 151 (Signature with special case values for r and s) +Signature = 3006020101020101 + +# Test 152 (Signature with special case values for r and s) +Signature = 30060201010201ff + +# Test 153 (Signature with special case values for r and s) +Signature = 3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 154 (Signature with special case values for r and s) +Signature = 3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 155 (Signature with special case values for r and s) +Signature = 3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 156 (Signature with special case values for r and s) +Signature = 3022020101021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 157 (Signature with special case values for r and s) +Signature = 3022020101021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 158 (Signature with special case values for r and s) +Signature = 3008020101090380fe01 + +# Test 159 (Signature with special case values for r and s) +Signature = 30060201ff020100 + +# Test 160 (Signature with special case values for r and s) +Signature = 30060201ff020101 + +# Test 161 (Signature with special case values for r and s) +Signature = 30060201ff0201ff + +# Test 162 (Signature with special case values for r and s) +Signature = 30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 163 (Signature with special case values for r and s) +Signature = 30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 164 (Signature with special case values for r and s) +Signature = 30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 165 (Signature with special case values for r and s) +Signature = 30220201ff021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 166 (Signature with special case values for r and s) +Signature = 30220201ff021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 167 (Signature with special case values for r and s) +Signature = 30080201ff090380fe01 + +# Test 168 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020100 + +# Test 169 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101 + +# Test 170 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d0201ff + +# Test 171 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 172 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 173 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 174 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 175 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 176 (Signature with special case values for r and s) +Signature = 3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d090380fe01 + +# Test 177 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c020100 + +# Test 178 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c020101 + +# Test 179 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c0201ff + +# Test 180 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 181 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 182 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 183 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 184 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 185 (Signature with special case values for r and s) +Signature = 3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c090380fe01 + +# Test 186 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e020100 + +# Test 187 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e020101 + +# Test 188 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e0201ff + +# Test 189 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 190 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 191 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 192 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 193 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 194 (Signature with special case values for r and s) +Signature = 3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e090380fe01 + +# Test 195 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000001020100 + +# Test 196 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000001020101 + +# Test 197 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffffffff0000000000000000000000010201ff + +# Test 198 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 199 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 200 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 201 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 202 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 203 (Signature with special case values for r and s) +Signature = 3024021d00ffffffffffffffffffffffffffffffff000000000000000000000001090380fe01 + +# Test 204 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000002020100 + +# Test 205 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000002020101 + +# Test 206 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffffffff0000000000000000000000020201ff + +# Test 207 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 208 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 209 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 210 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 211 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 212 (Signature with special case values for r and s) +Signature = 3024021d00ffffffffffffffffffffffffffffffff000000000000000000000002090380fe01 + +# Test 213 (Edge case for Shamir multiplication) +Msg = 3137353738 +Valid = 1 +Signature = 303c021c326bc06353f7f9c9f77b8f4b55464e8619944e7879402cca572e041a021c3116e1a38e4ab2008eca032fb2d185e5c21a232eaf4507ae56177fd2 + +Px = 0x8bf7e792f7c86877f1fd0552e42d80653b59e3a29e762a22810daac7 +Py = 0xeec615bbad04b58dc2a7956090b8040bb5055325bba0aa8b3a5caa6f +# Test 214 (k*G has a large x-coordinate) +Msg = 313233343030 +Signature = 3030020f00e95c1f470fc1ec22d6baa3a3d5c1021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a + +# Test 215 (r too large) +Valid = 0 +Signature = 303e021d00fffffffffffffffffffffffffffffffefffffffffffffffffffffffe021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a + +Px = 0x2646ff36d9697aaaed0d641117f94f60e138bab8e9912b558ae0a818 +Py = 0xca48e45a33550c1b5bd20a00e4d9df3033c03222e87bd96a8197f2dd +# Test 216 (r,s are large) +Valid = 1 +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3b + +Px = 0xea3ea2873b6fc099bfd779b0a2c23c2c4354e2fec4536f3b8e420988 +Py = 0xf97e1c7646b4eb3de616752f415ab3a6f696d1d674fb4b6732252382 +# Test 217 (r and s^-1 have a large Hamming weight) +Signature = 303c021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021c3d5052691b8dc89debad360466f2a39e82e8ae2aefb77c3c92ad7cd1 + +Px = 0x92ae54e38b4e9c6ae9943193747c4c8acc6c96f422515288e9698a13 +Py = 0xe8f3a759a1a8273c53f4b4b18bfcf78d9bb988adb3b005002dbe434c +# Test 218 (r and s^-1 have a large Hamming weight) +Signature = 303d021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021d00bf19ab4d3ebf5a1a49d765909308daa88c2b7be3969db552ea30562b + +Px = 0xb157315cc1aaeae64eb5b38452884195fdfe8a15fb5618284f48afe5 +Py = 0xe1fbbaad729477a45f3752b7f72ad2f9cd7dce4158a8e21b8127e8a7 +# Test 219 (small r and s) +Signature = 3006020103020101 + +Px = 0x87d9d964044b5b16801f32de9f3f9066194e8bf80affa3cb0d4ddb1d +Py = 0xb5eb9b6594e6d1bcacd0fd9d67c408f789dfb95feb79a6e2fb9c4cee +# Test 220 (small r and s) +Signature = 3006020103020103 + +Px = 0x461b435af09ede35e74dac21f9af7b1b9998213039f8785d4a4905f5 +Py = 0x18b89bde69de34a482638461d09386e7193ca90ca5b3038e2a3885d1 +# Test 221 (small r and s) +Signature = 3006020103020104 + +# Test 222 (r is larger than n) +Valid = 0 +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a40020104 + +Px = 0x8093af8db04b3dd2e7c3c59bb64a832c2fb8e8e141bae7ba1534950a +Py = 0x10c5e87aecbd1fcdfc36cd18d41b3238b2ac613eb7c9de988d881816 +# Test 223 (s is larger than n) +Signature = 3022020103021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c6f00c4 + +Px = 0xc6d71f4ba0933f1269f7d6df83fd0c9c67254f101dcc126dc15faa3e +Py = 0x3c45dc9fedc71c9f2b0dd1b12b656241f5e335066f3f925bdbcfe98f +# Test 224 (small r and s^-1) +Valid = 1 +Signature = 302302020100021d00c993264c993264c993264c99326411d2e55b3214a8d67528812a55ab + +Px = 0xbeb9d8dcba48146b9032688ecea947a231e7d0e6ce17d76b56ed6348 +Py = 0x35503f3b4af414870ef03383784b1d846b3e07b8e9fc2d6190a3bfda +# Test 225 (smallish r and s^-1) +Signature = 302702072d9b4d347952cc021c3e85d56474b5c55fbe86608442a84b2bf093b7d75f53a47250e1c70c + +Px = 0x1955ba3f90e7a739471a5d182b594c9747eb49d5356203f3bb8b939c +Py = 0x807d88ce3a0885bfa5b5b7f6e9beb18285e7130524b6c1498b3269ee +# Test 226 (100-bit r and small s^-1) +Signature = 302d020d1033e67e37b32b445580bf4efb021c02fd02fd02fd02fd02fd02fd02fd0043a4fd2da317247308c74dc6b8 + +Px = 0x5cb9e5a5071f2b37aa3a5e5f389f54f996b0bc8a132ecb6885318fbf +Py = 0x4ec5f8b93d8bf2a3b64fa7cac316392562c46567963c43a69f7a37fd +# Test 227 (small r and 100 bit s^-1) +Signature = 302302020100021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e + +Px = 0x7b34ef8723a4309c0fa8a7ec3a783477652a82892370f6763314fe7b +Py = 0xdee663853071e35fd3c76f991d7843c5e168ca659b93bd6015518fba +# Test 228 (100-bit r and s^-1) +Signature = 302e020d062522bbd3ecbe7c39e93e7c24021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e + +Px = 0x3f26a9c13979cf5d090ea25dc966398022ceec31504abc4b10f7676 +Py = 0x7d577dcf47e10e384c6b9a229a455a9fd33e54fe7960b8b0160aef16 +# Test 229 (r and s^-1 are close to n) +Signature = 303d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c29bd021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14 + +Px = 0xb671296dd5f690502e4b1500e4acb4c82d3aa8dfbc5868a643f86a3c +Py = 0xa46ba8c3a7b823259522291e2416232276cca8503cc8dbf941f1d93d +# Test 230 (s == 1) +Signature = 3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020101 + +# Test 231 (s == 0) +Valid = 0 +Signature = 3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020100 + +Px = 0x76e34b57a8c61df59cb0b7921cec6e5422344033f7accb7b3179e682 +Py = 0xcefd0a848309d1decf98a3b9e333691b95c17821cb681137630c02e2 +# Test 232 (point at infinity during verify) +Signature = 303c021c7fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e151e021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14 + +Px = 0xb5c09b4851a67371eee7bbf02451e5208c40de61bc1a33df2710b384 +Py = 0xdcce4e5b83c32a800e8de28fa936d582cdcad185e894caac797f1d14 +# Test 233 (u1 == 1) +Valid = 1 +Signature = 303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c + +Px = 0x941e283be31300bfd4f6a12b876fd3267352551cc49e9eef73f76538 +Py = 0xc115e5fe3b92f643c6cef1c58f3f8657574d1f64957d4880995cde83 +# Test 234 (u1 == n - 1) +Signature = 303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d008ac44bff876cbf7e2842eec13b63fcb3d6e7360aca5698f3ef0f1811 + +Px = 0x43c9ccd08a80bca18022722b0bdcd790d82a3ef8b65c3f34204bb472 +Py = 0x9ee1c1f00598130b2313a3e38a3798d03dac665cff20f36ce8a2024a +# Test 235 (u2 == 1) +Signature = 303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14 + +Px = 0xd958e418fad1c5ea5c923e6185e03ed5539d3f5f58dfac8bb9f10459 +Py = 0x6997e408c97be5fdc037a5c004389d4b97eb1f54635e985853c1f082 +# Test 236 (u2 == n - 1) +Signature = 303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d00aaaaaaaaaaaaaaaaaaaaaaaaaaaa0f17407b4ad40d3e1b8392e81c29 + +Px = 0xd629b434c9b5d157bd72e114fd839553f7f0e94600934a0a49e59aa4 +Py = 0x713a13c01775e75e2ebae75d9e29d2506184177b7dd0868693873596 +# Test 237 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d1be91557d866ad5f2945b14ec3317bc43c1338fd06af6496201cce2 + +Px = 0x3d2e9bb9a712bf3ad42ac30659fdbda9be9956537f9f37cd05f0ff37 +Py = 0x7d5982d6d9266d774942c44d9eb3501051d3b9688610131e7856ef36 +# Test 238 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7ac54a381d9bd3f2698359d6f658b5e4167d15a75b576e82d2efbd37 + +Px = 0xa0be2f10144b9b42b016f1bd9fca30e4c24aae4775596c7cdb07ae60 +Py = 0xd60ff3a70f1541631f6087d3f3b3fe376d2305b50b94821106412479 +# Test 239 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c4fbb063e82402e16fe14edda4d7986b0b88344a1f53b0e2684ee7e31 + +Px = 0x4d74397a586c8ac5e326bed03720bde7037e4a07aee7209f70493cab +Py = 0x106778bfd081d17ab6dcb8fd8a454962941c26ecc19cda9fb77719db +# Test 240 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d3be5f50d726f99b8ac44bff876bfe78dd7ae630d227ef0ba87ae39b + +Px = 0x8c2f149b1738243f81a6f12135395a2ba2718863622e66e33efc241f +Py = 0x5638cf6ae9cfb39578cf3a719702052e5e9e940216c5136dcb6ef085 +# Test 241 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00e5f50d726f99b8ac44bff876cbf710e47f9087d1afdfb1dab6d6daf1 + +Px = 0xad5227e48afaa165e7b97ef8210687556e10643fda8a377aaf4f5bf4 +Py = 0x12e86d4ae55f4460aba6a932f307ee78efdc136e9a3df6313100bf4f +# Test 242 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00cbea1ae4df337158897ff0ed97ef0b261e681f654be23a7011518ba5 + +Px = 0x3fb94a3165ecdef43fa27907ed075caf52c25420ac7bc7bb90408992 +Py = 0x23c4d7b4775b591ae223dd4da9ceaabd73b9743ddab8b40576e393f +# Test 243 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d726f99b8ac44bff876cbf7e28422aa07ec3cb1d9472bd704f4029f0 + +Px = 0xe45fcf0a7f4dc2a308dc7868251423fbf71a205a9546850a01a732fc +Py = 0x9a73ca4d41175076f2f362b276ecb0ccdb6e0bb30c4a1b35c2e3ed82 +# Test 244 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d009720b755413cca9506b5d27589e58ac4bed856762ba7ae20ab5b43cc + +Px = 0x3c59e13982fd9c1a45991b1e9d79e939a52a62ca479764f1477e2813 +Py = 0x1b004c9bffd7f00c05e3168c625cc93ab7a0f1ba8d6fa26a4d5162cb +# Test 245 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c2e416eaa8279952a0d6ba4eb13cbfee69cf7bcae437232fbfa5a5d5b + +Px = 0xc6b8ff152d7a1b7a99ce3483bdeaaf5bd2ce64dc6b0f89cf3544b87c +Py = 0x53ab6cf9cb510dc1440ab4e412a167f4c69365fcfc97f31d5ba4581 +# Test 246 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00c56225ffc3b65fbf142177609db189ab5bd013246f19e11ca5b5a127 + +Px = 0x7c0772fb6553c0ec0dd1f73b5db380764d9f2f7afb4eac1e774dacd5 +Py = 0x6e2e5de0db63bf03cf9675eae6d2dfe5424e79ab394951c9b60ad5df +# Test 247 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00a7dd831f4120170b7f0a76ed26bc4ea9cc9e1a70048c1bb5f0a55437 + +Px = 0x4108e0ccd47cba09fb7ed4d9f3455823780965157861c1bf8f93d34b +Py = 0x46d6fdb71e9e89adaae71376b13fd17644b11eed00d498783da0ba1a +# Test 248 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffffb2364ae85014b149b86c741eb8be + +Px = 0x2f2da40a1b72f67ba63613a243119c41c7252839cf106e86b5d8e6e3 +Py = 0x5a1e0e2fc49b4f316f0c0e7236785749eb34ce923c23aef330af8733 +# Test 249 (edge case for u2) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00855f5b2dc8e46ec428a593f73219cf65dae793e8346e30cc3701309c + +Px = 0x7dc09710f4f586af05b08f0c9dcd48b1308733c97767fc286d1c7283 +Py = 0x4353a704c7950b8f4a11394bc8db06adccf19d8ed95c7f214a173137 +# Test 250 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c2db5f61aea817276af2064e104c7a30e32034cb526dd0aacfa56566f + +Px = 0xdbb439e2c3e9d1822b94ccc7d98c9fcb668e65dd6a759ad2dfdcd328 +Py = 0x82663234e6da512d7d7d5fe79156ad0e19ffc62d618e3cf48276106d +# Test 251 (edge case for u2) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0084a6c7513e5f48c07fffffffffff8713f3cba1293e4f3e95597fe6bd + +Px = 0xe012dc20cca5bd2adfaa27f57419596ce09ed0f18a9148e30a0f6ed2 +Py = 0x55beca1b5e3e2485ef9537ae48a67b72dbcf6d7b33372023a5c443e8 +# Test 252 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c6c7513e5f48c07ffffffffffffff9d21fd1b31544cb13ca86a75b25e + +Px = 0xc510ab34abd4855c54d62407abe6ca090c73ba49aca9de9bf117bca2 +Py = 0x42b3b00c272c22681af7c255120fac148ad73c81b47846e4ad2f5627 +# Test 253 (edge case for u2) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d8ea27cbe9180fffffffffffffff3a43fa3662a899627950d4eb64bc + +Px = 0x8a6e167536a47aaa224fec21ce077642efdb97d93ae16b9672279f4 +Py = 0x33fb9f1abb25f2c0c3e6008ac857ede4a89ca8d9d08b8996614969ac +# Test 254 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3e5f48c07fffffffffffffffffffc724968c0ecf9ed783744a7337b3 + +Px = 0x1a83e185fcf30e6c69cf292e497d63cc04e6fd07cb9365a74be3c39c +Py = 0x6b2d56247df49cf94176c4e8efc84ec710cd0d614dd066c16f6ad3e0 +# Test 255 (edge case for u2) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00bfffffffffffffffffffffffffff3d87bb44c833bb384d0f224ccdde + +Px = 0x2d59efd841a44b83fd42e6a2984a53fa93ad242c11678f92202cccfb +Py = 0x95bcaf0b2f6eb0e6d4d83e3260e037d3dc0e48ab6c4141ce6b56cad0 +# Test 256 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffff646c95d0a029629370d8e83d717f + +Px = 0x1161c7add6f67f995b93e19eb18bd5e73fd71d6bb10dceef0b792e9c +Py = 0x8c44cef9826b4ed67508c09d07ec857a0ea49ed1a7f1fa2c74cb838 +# Test 257 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e1520 + +Px = 0x84dc3d2ebfcf3480713baeff30ad0781bc8c4d06ab6ddd4f7f1045af +Py = 0x7570537c5d71a78b1a041aca0fe35f642824abda8c3ff2e9fcf5c8cb +# Test 258 (edge case for u2) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0096dafb0d7540b93b5790327082635cd8895e1e799d5d19f92b594056 + +Px = 0x1767574e645c550ef3d353f76d4428f9616ac288b36378857de33262 +Py = 0x9fe09825a57f3a0ec11189f4560272297ab6d5e095401febb60d0dc9 +# Test 259 (point duplication during verification) +Signature = 303d021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021c1ef359e4bd146f63d8155c5c2523fa3353c9820f84f28150bad3819a + +Px = 0x1767574e645c550ef3d353f76d4428f9616ac288b36378857de33262 +Py = 0x601f67da5a80c5f13eee760ba9fd8dd585492a1f6abfe01449f2f238 +# Test 260 (duplication bug) +Valid = 0 +Signature = 303d021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021c1ef359e4bd146f63d8155c5c2523fa3353c9820f84f28150bad3819a + +Px = 0xe2ef8c8ccb58eba287d9279b349e7652cca3e7cda188a5f179d77142 +Py = 0xf87594f3664c0faf7b59670e353a370d1d68ad89d6a1e246b4d03bee +# Test 261 (comparison with point at infinity ) +Signature = 303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c + +Px = 0xb8bf3ef9646abfffb84220104ec996a92cef33f9328ec4cb1ea69948 +Py = 0x4fea51a0de9e9d801babd42ca0924b36498bc5900fbeb9cbd5ad9c1a +# Test 262 (extreme value for k) +Valid = 1 +Signature = 303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14 + +Px = 0x24819323b7be8ab0910f7f33bd2f7669c44b13f09479965e95287d13 +Py = 0xb0592345beafbfdb8cf3629269bdd817728d5d5cd3c28bc6c6414a70 +# Test 263 (extreme value for k) +Signature = 303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14 + +Px = 0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21 +Py = 0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34 +# Test 264 (testing point duplication) +Valid = 0 +Signature = 303c021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c021c249249249249249249249249249227ce201a6b76951f982e7ae89851 + +# Test 265 (testing point duplication) +Signature = 303d021d008ac44bff876cbf7e2842eec13b63fcb3d6e7360aca5698f3ef0f1811021c249249249249249249249249249227ce201a6b76951f982e7ae89851 + +Px = 0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21 +Py = 0x42c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd +# Test 266 (testing point duplication) +Signature = 303c021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c021c249249249249249249249249249227ce201a6b76951f982e7ae89851 + +# Test 267 (testing point duplication) +Signature = 303d021d008ac44bff876cbf7e2842eec13b63fcb3d6e7360aca5698f3ef0f1811021c249249249249249249249249249227ce201a6b76951f982e7ae89851 + +Px = 0x4c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466 +Py = 0xddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176 +# Test 268 (pseudorandom signature) +Msg = +Valid = 1 +Signature = 303d021c2770403d42b7b45e553308d1f6a480640b61cac0ae36665d6f14d34e021d0085506b0404265ededf9a89fc7c9c7a55c16c5b0d781f774de8f46fa1 + +# Test 269 (pseudorandom signature) +Signature = 303d021d00dd0d56c27a0dc01ce0aad178f274d47bdf9dac8db1df5edbd3234e9f021c393cb201b9f3306ef587c8461e18617f8c0cb96dfad301fca8c852a5 + +# Test 270 (pseudorandom signature) +Signature = 303c021c0441d3ea1ccaf7ee9cba39cc90f117edf9183d34e8ec255bbee3af7b021c72787e0e4c55099d0582680e153ed4907d2a950c9421da4b83036091 + +# Test 271 (pseudorandom signature) +Signature = 303c021c4408ea3b626ab23a391f941f93e1f2998efb4c2dc4ab6ccbf2f79b50021c0fa5ffbafb3943ff0c4e68408247f95343c4832bc01e5cd505685ef3 + +# Test 272 (pseudorandom signature) +Signature = 303d021d009f0659f0009e16c6a98e26f7479b7ed4268f28d9bd8806ca54a5d8e7021c43aa3fd3dfc50844e03f4ce9801d3a1023a8c4d0bd67149f437ae3a2 + +# Test 273 (pseudorandom signature) +Signature = 303d021d00b2f4f3ca7ce467a8928ee15b2672a30aad1d03f5271e9a0e7a52e233021c3e0f281a9d56fdfac280ac1eb799d3874115e773041d1e722fc36b67 + +# Test 274 (pseudorandom signature) +Signature = 303e021d00ed63abaa150741427c9810dbaadec1bf43c0ac36968146300c0b080d021d00febd4a3944f0ea30f0e9bb13d553e839b48ef721e598aa03db7638d5 + +# Test 275 (pseudorandom signature) +Signature = 303d021c340814eb8a132af8e8d6bc0836c0abcd6411e8d8930cf346c41de9ae021d00c8eefdb53796bcb54c59f3193ef858ebc92cebac9f0bb38c08284b4e + +# Test 276 (pseudorandom signature) +Signature = 303d021d00cc75615f5415f8244fd42b518618b9734e3c5b1399507557f7834789021c7b68afe08887d34f1ce19942e4f3c5d99c20d0e15ba13adc287e5554 + +# Test 277 (pseudorandom signature) +Signature = 303d021d00f83bb419a391163c306b3e10c3bb5a029b428d560181c80e279498f3021c317446aa67bac1e52b6069e29e90f6df1737a61229600523e32f4e23 + +# Test 278 (pseudorandom signature) +Msg = 4d7367 +Signature = 303d021d00b68da722bbba7f6a58417bb5d0dd88f40316fc628b0edfcb0f02b062021c5c742e330b6febadf9a12d58ba2a7199629457ef2e9e4cecd2f09f50 + +# Test 279 (pseudorandom signature) +Signature = 303d021c5df6b8389e40473ac6cb14330066887779a6aafbec652c9d3f42f4db021d00ce28e7b8f4a4d5263a10c20d615b3dbaad18b58de36625a485d77adb + +# Test 280 (pseudorandom signature) +Signature = 303d021d00edd07a0529340b7e3ad39a37f7f7043cc560f605f2c14d5b6e7c4f63021c03cd4525a02091490b49645464040fac40d8a70ce49042b21f1a1b8e + +# Test 281 (pseudorandom signature) +Signature = 303d021d00d32e7b5ebef67e442f086595e62d7f282c26b5618e50ae386de8efa9021c554e7c860e0e1db0080cd520c7fe745b72c540074fc610dc0e280520 + +# Test 282 (pseudorandom signature) +Signature = 303d021d00d1edaf4c0174197bf38b78b53c6ed7d8d3f16ab50379bc9c25e40536021c438bc07b8cfc3b8aa319e9d50153ca4bb6702071bbc01b687d48bd99 + +# Test 283 (pseudorandom signature) +Signature = 303e021d008bb29b81e2b348ab4f04156269f21e9ed74eada70e505faf8ee8519a021d008b9a30f30ea26c37bfe4f879939ed442523ff8ce0a3ceda97f3314e2 + +# Test 284 (pseudorandom signature) +Signature = 303d021c627cf63b5c30c55368d377cee6e8da5ccc265952b36eed5f2a7ccc0b021d008f76f6b9cfec6ad1bbb3e0b27ddadc7c3b35b6fd33a8302a75b0ee55 + +# Test 285 (pseudorandom signature) +Signature = 303c021c1d6b1e116413eae3d8975144d14bbab1db23dbc2254417973f8871a4021c7dfea6372066fce663a84ced6385ae63a4c5121d3ba6856208603ddf + +# Test 286 (pseudorandom signature) +Signature = 303d021c1e93ab2e3b2249bcc89c326d709ddaa568320cf8598c3ee0d69aa674021d00ee64abd080c4f31311b5c1ff081f3131a1d76e292f23e1f8602a3dff + +# Test 287 (pseudorandom signature) +Signature = 303c021c76ab1b4c88eb4985ed345b5e3abf06ddc8c3f34c0d0e1b393a76ce85021c523ce0669a34b629b6e13a9f8b0fa6c5a6514e1267077df420ab3b88 + +# Test 288 (pseudorandom signature) +Msg = 313233343030 +Signature = 303c021c01ec1ff15c8a55d697a5424d674753f82f711593828368d2fbb41a17021c20d9089db7baf46b8135e17e01645e732d22d5adb20e3772da740eee + +# Test 289 (pseudorandom signature) +Signature = 303c021c5af925948bda1fe510456cf27ce65b6d3ad17dd6d511600fad58aacf021c2eb0a3cf8b5e0b73239eb053a5a78ab8af78397062d06f8dbda2eb17 + +# Test 290 (pseudorandom signature) +Signature = 303c021c070fa48e5307b660cfa9e66a0ab98959ec3dcc3ac5e1b1dff1064087021c028926a511087943333f6fa336b235792b6f64ee3f5f594a7c3f6d2c + +# Test 291 (pseudorandom signature) +Signature = 303d021d00bcfbb22ed79dd2ee8ae602dde144a63f9fa68f8f9b71b5994ac8f17b021c27c9c1494081d99a2708b02196eb9581b0b4147d00f3ae3089cc6d7a + +# Test 292 (pseudorandom signature) +Signature = 303d021d00a914df6f841ef05491827d92e55148a5c71c687c89dccbfdfd6eddfc021c7316b41eecbff1dd0fafdeb8b717e3f91aceeb2c22cb25023ee2af0b + +# Test 293 (pseudorandom signature) +Signature = 303e021d00a72fc403de3dab1cf179f630940cfd990702969160d7bdf5c47a12a0021d00c2b0a943e45dbd0ffe6a4e31eab8099cd940c02d415041c149f24308 + +# Test 294 (pseudorandom signature) +Signature = 303d021c23ae9b89bbddbc88815c39e6f5969cce536caf36547b19d286fd868d021d00df9f9b611e22facb95e599bbca556f943739d5110678883c27d89c4d + +# Test 295 (pseudorandom signature) +Signature = 303d021c356c7d340cfbd7205d466872524b1585d8659c43532fad657352f420021d00bc54e0b4c6f878e6052058ef4cbadefe3b4299993df773277bc32e5c + +# Test 296 (pseudorandom signature) +Signature = 303d021d0086f4ab774e4e5d8705eaeff1f464da1774c177defcf4799656606b85021c3e03ea07272bad191989244af4230c275657c13258b77f9241caf7e6 + +# Test 297 (pseudorandom signature) +Signature = 303c021c1bde22394310f2f3139a51406c05ef6b553cd72b3520c824eb0ba4e6021c379d85d4a88357b77fc418c1e4a2525e964415605b7a5ca5018c7662 + +# Test 298 (pseudorandom signature) +Msg = 0000000000000000000000000000000000000000 +Signature = 303c021c3e46e9ba4dc089ff30fa8c0209c31b11ff49dbeec090f9f53c000c75021c6f2e3b36369416602bca83206809ed898fcf158a56c25a5474143f68 + +# Test 299 (pseudorandom signature) +Signature = 303d021c6464668eeb6f693262fa4449dfffa86d346a2d11521d196214158666021d009ba2b14539efc3c884515e5bcf794c27a00ccbff01297a45dc444693 + +# Test 300 (pseudorandom signature) +Signature = 303c021c50b504b81612583ebecc4317a24ea4f7527d246ae1bee6c0157452f8021c0df691ff8b33d71c8b96bd246328ebd3a2f91d2be2ade9a7c2643cbf + +# Test 301 (pseudorandom signature) +Signature = 303d021d00e14a319fd627669f24ce1a51f7ec2333da3b2c3de62c3aaf2b02e76b021c7845a14342c67c2f1ccd0a8a3a34ca0f382386964cd4c07360dd7bf8 + +# Test 302 (pseudorandom signature) +Signature = 303b021c098c7a8a3b6c5659e7a013efbd8e907935d0606b6c2a868455abf489021b7730907f494e81ddceb19215fa7e9398e7aa9144ac74d9fbf8c519 + +# Test 303 (pseudorandom signature) +Signature = 303e021d009e5db35801390400d1c6d496ba9d9ff5fddb688bdad6c8144d12e3b4021d00f8a618180b6b76c9bd837a67547a826c3cf270be1f2f50af690b8285 + +# Test 304 (pseudorandom signature) +Signature = 303e021d00f1b4f951e32e2ae47b776cdb87654cb18b74106d6b81f29e4d98f3cc021d00f1ea4b08a530d55982eb4a895d28f75fc2b831d7e46fd835bf8d8a33 + +# Test 305 (pseudorandom signature) +Signature = 303c021c50e80890e6b9b25b1aae3f8ddbc48026f57ad0f117694b0377bf4b9e021c7e804b9aaeb1df008cb3ac44f54d7d9ff159ca37d7f869a642c65eb6 + +# Test 306 (pseudorandom signature) +Signature = 303e021d00bdd75697eeb16df9b85ba07a14bcd200997a64bf1ec12e6e24bbe81b021d00d6f8396d399baa426c70d9cf00f1e392281755bff240752ca544e433 + +# Test 307 (pseudorandom signature) +Signature = 303d021c36766ad3607b8b63a4d7ce4132b46c90c8b99f44afb589720efffe4d021d00ded14db5945f5f84ba235f8eb2ada604ae8a9cf92527f692bf066629 + +Px = 0xaed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf +Py = 0x8a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000 +# Test 308 (y-coordinate of the public key has many trailing 0's) +Msg = 4d657373616765 +Signature = 303d021c77b38da37079d27b837613ac3e8248d66eabd5d637076c8e62c7991e021d00d40cd9f81efc52db4429c0c1af7c1d8a22b6c7babbe7fbd8b5b3f02f + +# Test 309 (y-coordinate of the public key has many trailing 0's) +Signature = 303d021d008c03b32c166c0c8b99d7f876acd109447efb13f6b82945e78d51a269021c657568f1a0a8bd7df5ffa43097ebb2b64435c8e3335bcaafc63f9ed5 + +# Test 310 (y-coordinate of the public key has many trailing 0's) +Signature = 303d021d00d199a375253d30f1d2b4493542e9934f9f1f8b0680117679f5bc4ad2021c11419ddbf02c8ad5f518f8dac33f86a85e777af51a034132e2767a6d + +Px = 0xbf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f1 +Py = 0x73d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff +# Test 311 (y-coordinate of the public key has many trailing 1's) +Signature = 303d021d008ff82699e2e82870be9cfdd8a408bb34f8f38a83a4ac8370f18f2bc8021c7e5008fab6a0d4159200077ef9918dad6592cd8359838852c636ac05 + +# Test 312 (y-coordinate of the public key has many trailing 1's) +Signature = 303d021c3f3b60b529ae0f950c517264adf2e481616bc47416742d5103589660021d00f731ebe98e58384b3a64b4696d4cc9619828ad51d7c39980749709a6 + +# Test 313 (y-coordinate of the public key has many trailing 1's) +Signature = 303d021d00dc11ffdc6b78754a335f168c4033916a2158d125a3f4fed9dc736661021c6dd84364717d9f4b0790f2b282f9245ecb316874eac025600397f109 + +Px = 0x26e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000 +Py = 0xeab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0 +# Test 314 (x-coordinate of the public key has many trailing 0's) +Signature = 303e021d00a59b25b786d55f26b04dfe90ee02a6bde64ed6e431dc9fbdc3ab360e021d00fc14b5ad20f39da9900e35437936c8626fccf6632e7a3d9e587e3311 + +# Test 315 (x-coordinate of the public key has many trailing 0's) +Signature = 303d021c2eda1f96c1a6e3ad8a3321ce82cbb13a5b935b501abf6c06f7fd2b3f021d00e81050c3e5f53a3c7b9d0bdb9ed92a326dfeac44791ba1abe4d6e973 + +# Test 316 (x-coordinate of the public key has many trailing 0's) +Signature = 303d021c60f5e093fda08fc14ac99d820a18ad1370c58150bea0aca24fc6db9d021d00c2220a0ebbf4896e68fdb5bd824f88291c1c862b916f9c4af87f8f5f + +Px = 0xec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff +Py = 0x41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd +# Test 317 (x-coordinate of the public key has many trailing 1's) +Signature = 303d021c2ead37846a5e36a490b75140bdc7b636c6e9f6d8f980f6fadb08f769021d00e1fe130ae1798c196d7be62c7a5ddb3168cf4b8d48b6b6b4dc94ab3b + +# Test 318 (x-coordinate of the public key has many trailing 1's) +Signature = 303d021d00a8a4c9416d72c860573d073281cb08c86ad65313f06b15a329e82eb2021c5a6edd2f0816b7263d915d72c67d50a854e3abee5cde1b679a0cef09 + +# Test 319 (x-coordinate of the public key has many trailing 1's) +Signature = 303c021c576bb86c517bfecdc930a4c8501725548d425afbb96d93f5c1e2a0e1021c77248c5ecd620c431438c50e6bee6858091b54a87f8548ae35c21027 + +Px = 0x15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a +Py = 0x762d28f1fdc219184f81681fbff566d465b5f1f31e872df5 +# Test 320 (y-coordinate of the public key is small) +Signature = 303d021c34e41cba628fd8787ba1a528f6015d2cae015c1c9a866e08a7133801021d0083d422ffdd99cc3c6d7096ef927f0b11988d1824e6e93840ff666ccd + +# Test 321 (y-coordinate of the public key is small) +Signature = 303c021c2558a42e79689244bccd5e855f6a1e42b4ff726873f30b532b89ef53021c07f9bd947785187175d848b6e2d79f7ab3bbc1087b42590b0cfb256a + +# Test 322 (y-coordinate of the public key is small) +Signature = 303e021d00d5fe7dd5fb4fd1ea5ce66c0824f53f96ce47fd9b6c63b4d57827fd17021d00bce5bc3af705afaacb81bfa6d552d6198962fece9fba41546c602ddc + +Px = 0x15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a +Py = 0xffffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c +# Test 323 (y-coordinate of the public key is large) +Signature = 303d021d008c1da2f07cdcbce4db8067b863468cfc728df52980229028689e57b6021c32175c1390a4b2cab6359bab9f854957d4fd7976c9c6d920c871c051 + +# Test 324 (y-coordinate of the public key is large) +Signature = 303e021d00e46d4f11b86b5a12f6fe781d1f934ef2b30e78f6f9cc86a9996e20c0021d008351974b965526034a0ccef0e7d3bc13d91798151488c91533143f7b + +# Test 325 (y-coordinate of the public key is large) +Signature = 303c021c305ccf0b5d0cf33dc745bb7c7964c233f6cfd8892a1c1ae9f50b2f3f021c785f6e85f5e652587c6e15d0c45c427278cf65bb1429a57d8826ca39 + +Px = 0xf7e4713d085112112c37cdf4601ff688da796016b71a727a +Py = 0xde5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1 +# Test 326 (x-coordinate of the public key is small) +Signature = 303d021c0e4fde0ac8d37536505f7b8bdc2d22c5c334b064ac5ed27bea9c179e021d00c4d6bf829dd547000d6f70b9ad9e9c1503bebcf1d95c2608942ca19d + +# Test 327 (x-coordinate of the public key is small) +Signature = 303e021d00818afcaf491da9d08a7cc29318d5e85dce568dcca7018059f44e9b7e021d00bf32a233d5fc6ed8e2d9270b1bdad4bbd2a0f2c293d289bd91ffbcf3 + +# Test 328 (x-coordinate of the public key is small) +Signature = 303c021c0e05ed675c673e5e70a4fdd5a47b114c5d542d4f6d7a367597d713ea021c26d70d65c48430373363987810bdcc556e02718eab214403ae008db4 + +Px = 0xffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f725 +Py = 0x86c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e +# Test 329 (x-coordinate of the public key is large) +Signature = 303e021d00ab7a19eecf63e9668278963b65236b2768e57cae0e268cb86a0ddda1021d008829f5d3a3394f9467ba62e66ef1768e3e54f93ed23ec962bc443c2e + +# Test 330 (x-coordinate of the public key is large) +Signature = 303d021c17111a77cf79bead456ed86a7d8a935531440281eb8b15a885e341c0021d00fdc3958d04f037b1d4bb2cee307b5201be062e0d4e089df1c1917668 + +# Test 331 (x-coordinate of the public key is large) +Signature = 303d021d00acafa1e33345eeba0c338c2204b4cd8ba21de7ec3e1213317038e968021c0b42fbbaeda98a35da0de4c79546f3a0f7d9dec275d2cd671f93c874 + +Px = 0xb0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1 +Py = 0xe2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc +# Test 332 (y-coordinate of the public key is small) +Signature = 303d021d00a3fe71a2a56f554e98fd10a8098c2a543c98bc6b3602ef39f2412308021c5d1d68f9a870ef2bc87484b3386549fae95811ab72bc0e3a514720da + +# Test 333 (y-coordinate of the public key is small) +Signature = 303d021c132f7625704756c13f2bfa449e60952f836f4904660b5b1da07e5a9f021d0082b4abafc40e8fd19b0c967f02fff152737ce01153658df445c4d7b7 + +# Test 334 (y-coordinate of the public key is small) +Signature = 303e021d00f36a8347c6fe0397a1161a364cbc4bdfb4d8b7894cbaa6edc55a4ff7021d009c9c90515da5e602d62e99f48eac414e913dd0b7cbf680c1a5399952 + +Px = 0xb0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1 +Py = 0xfffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945 +# Test 335 (y-coordinate of the public key is large) +Signature = 303d021c2125ecc08e52e9e39e590117de2145bd879626cb87180e52e9d3ce03021d008f7e838d0e8fb80005fe3c72fca1b7cc08ed321a34487896b0c90b04 + +# Test 336 (y-coordinate of the public key is large) +Signature = 303e021d00e485747ac2f3d045e010cdadab4fd5dbd5556c0008445fb73e07cd90021d00e2133a7906aeac504852e09e6d057f29ab21368cfc4e2394be565e68 + +# Test 337 (y-coordinate of the public key is large) +Signature = 303d021d00a4de0d931ddab90e667ebc0ad800ce49e971c60543abdc46cefff926021c550816170bd87593b9fb8ad5ed9ab4ddb12403ff6fe032252833bac4 + +Hash = SHA-256 + +Px = 0xeada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7 +Py = 0xeca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5 +# Test 1 (signature malleability) +Msg = 313233343030 +Signature = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d009e82950ebe102f37ff3645cc7d3c1bab8864e5e03a5011eeba8150bc + +# Test 2 (random signature) +Signature = 303d021c684caf7bdbcd579b1d8a17591e98630040e1bda6d6d5780af206a0b9021d00c006293694f152d326ba30011d95554d09189c7735b26068c5101c0d + +# Test 3 (random signature) +Signature = 303e021d008f59422c1b4482269602cd7486aee41817a36c64d232fc411f3a1d09021d00d61e33aaaa743e2d10f55c302318c41d2236b2478a4f85fca09319fd + +# Test 4 (random signature) +Signature = 303e021d008c451662a222b7ed1d4e55744761bc47b8015e570e9b5390b56adf4e021d00acbe66d485b3c9cba373401f8e37fb4ff3c12bc6302cd7f8a6a65ebb + +# Test 5 (random signature) +Signature = 303e021d00d269d4150eb8ba7d590f35c6ad28e015d2f8cc4474c3b28d6d2c4af8021d00add458ae2267a4b3aba251104cc7b5d82c9aed339f4856b2e8397096 + +# Test 6 (random signature) +Signature = 303e021d00df70013e990003e109e47b31e517715cd40628fe461c690b5447abff021d00838b89938718900c0b572545d4c556f9c00e46b0da22ae3840cb03e6 + +# Test 7 (valid) +Signature = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 8 (long form encoding of length) +Valid = 0 +Signature = 30813c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 9 (long form encoding of length) +Signature = 303d02811c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 10 (long form encoding of length) +Signature = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0402811c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 11 (length contains leading 0) +Signature = 3082003c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 12 (length contains leading 0) +Signature = 303e0282001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 13 (length contains leading 0) +Signature = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040282001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 14 (wrong length) +Signature = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 15 (wrong length) +Signature = 303b021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 16 (wrong length) +Signature = 303c021d3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 17 (wrong length) +Signature = 303c021b3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 18 (wrong length) +Signature = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 19 (wrong length) +Signature = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021b617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 20 (uint32 overflow in length) +Signature = 3085010000003c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 21 (uint32 overflow in length) +Signature = 30410285010000001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 22 (uint32 overflow in length) +Signature = 3041021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040285010000001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 23 (uint64 overflow in length) +Signature = 308901000000000000003c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 24 (uint64 overflow in length) +Signature = 3045028901000000000000001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 25 (uint64 overflow in length) +Signature = 3045021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04028901000000000000001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 26 (length = 2**31 - 1) +Signature = 30847fffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 27 (length = 2**31 - 1) +Signature = 304002847fffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 28 (length = 2**31 - 1) +Signature = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0402847fffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 29 (length = 2**32 - 1) +Signature = 3084ffffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 30 (length = 2**32 - 1) +Signature = 30400284ffffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 31 (length = 2**32 - 1) +Signature = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040284ffffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 32 (length = 2**40 - 1) +Signature = 3085ffffffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 33 (length = 2**40 - 1) +Signature = 30410285ffffffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 34 (length = 2**40 - 1) +Signature = 3041021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040285ffffffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 35 (length = 2**64 - 1) +Signature = 3088ffffffffffffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 36 (length = 2**64 - 1) +Signature = 30440288ffffffffffffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 37 (length = 2**64 - 1) +Signature = 3044021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040288ffffffffffffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 38 (incorrect length) +Signature = 30ff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 39 (incorrect length) +Signature = 303c02ff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 40 (incorrect length) +Signature = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0402ff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 41 (indefinite length without termination) +Signature = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 42 (indefinite length without termination) +Signature = 303c02803ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 43 (indefinite length without termination) +Signature = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040280617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 44 (removing sequence) +Signature = + +# Test 45 (appending 0's to sequence) +Signature = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000 + +# Test 46 (prepending 0's to sequence) +Signature = 303e0000021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 47 (appending unused 0's) +Signature = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000 + +# Test 48 (appending unused 0's) +Signature = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 49 (appending null value) +Signature = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810500 + +# Test 50 (appending null value) +Signature = 303e021e3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040500021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 51 (appending null value) +Signature = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021e617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810500 + +# Test 52 (including garbage) +Signature = 3041498177303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 53 (including garbage) +Signature = 30402500303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 54 (including garbage) +Signature = 303e303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810004deadbeef + +# Test 55 (including garbage) +Signature = 30412221498177021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 56 (including garbage) +Signature = 304022202500021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 57 (including garbage) +Signature = 3044221e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040004deadbeef021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 58 (including garbage) +Signature = 3041021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042221498177021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 59 (including garbage) +Signature = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0422202500021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 60 (including garbage) +Signature = 3044021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04221e021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810004deadbeef + +# Test 61 (including undefined tags) +Signature = 3044aa00bb00cd00303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 62 (including undefined tags) +Signature = 3042aa02aabb303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 63 (including undefined tags) +Signature = 30442224aa00bb00cd00021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 64 (including undefined tags) +Signature = 30422222aa02aabb021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 65 (including undefined tags) +Signature = 3044021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042224aa00bb00cd00021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 66 (including undefined tags) +Signature = 3042021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042222aa02aabb021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 67 (using composition with indefinite length) +Signature = 3080303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000 + +# Test 68 (using composition with indefinite length) +Signature = 30402280021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 69 (using composition with indefinite length) +Signature = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042280021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000 + +# Test 70 (using composition with wrong tag) +Signature = 3080313c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000 + +# Test 71 (using composition with wrong tag) +Signature = 30402280031c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 72 (using composition with wrong tag) +Signature = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042280031c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000 + +# Test 73 (Replacing sequence with NULL) +Signature = 0500 + +# Test 74 (changing tag value) +Signature = 2e3c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 75 (changing tag value) +Signature = 2f3c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 76 (changing tag value) +Signature = 313c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 77 (changing tag value) +Signature = 323c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 78 (changing tag value) +Signature = ff3c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 79 (changing tag value) +Signature = 303c001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 80 (changing tag value) +Signature = 303c011c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 81 (changing tag value) +Signature = 303c031c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 82 (changing tag value) +Signature = 303c041c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 83 (changing tag value) +Signature = 303cff1c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 84 (changing tag value) +Signature = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 85 (changing tag value) +Signature = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04011c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 86 (changing tag value) +Signature = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04031c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 87 (changing tag value) +Signature = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04041c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 88 (changing tag value) +Signature = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04ff1c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 89 (dropping value of sequence) +Signature = 3000 + +# Test 90 (using composition) +Signature = 3040300102303b1c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 91 (using composition) +Signature = 3040222002013a021bde5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 92 (using composition) +Signature = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042220020161021b7d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 93 (truncate sequence) +Signature = 303b021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9 + +# Test 94 (truncate sequence) +Signature = 303b1c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 95 (indefinite length) +Signature = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000 + +# Test 96 (indefinite length with truncated delimiter) +Signature = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad98100 + +# Test 97 (indefinite length with additional element) +Signature = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad98105000000 + +# Test 98 (indefinite length with truncated element) +Signature = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981060811220000 + +# Test 99 (indefinite length with garbage) +Signature = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000fe02beef + +# Test 100 (indefinite length with nonempty EOC) +Signature = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810002beef + +# Test 101 (prepend empty sequence) +Signature = 303e3000021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 102 (append empty sequence) +Signature = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9813000 + +# Test 103 (sequence of sequence) +Signature = 303e303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 104 (truncated sequence) +Signature = 301e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04 + +# Test 105 (repeat element in sequence) +Signature = 305a021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 106 (removing integer) +Signature = 301e021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 107 (appending 0's to integer) +Signature = 303e021e3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 108 (appending 0's to integer) +Signature = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021e617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000 + +# Test 109 (prepending 0's to integer) +Signature = 303e021e00003ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 110 (prepending 0's to integer) +Signature = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021e0000617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 111 (Replacing integer with NULL) +Signature = 30200500021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 112 (Replacing integer with NULL) +Signature = 3020021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040500 + +# Test 113 (dropping value of integer) +Signature = 30200200021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 114 (dropping value of integer) +Signature = 3020021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040200 + +# Test 115 (modify first byte of integer) +Signature = 303c021c38de5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 116 (modify first byte of integer) +Signature = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c637d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 117 (modify last byte of integer) +Signature = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a84021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 118 (modify last byte of integer) +Signature = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad901 + +# Test 119 (truncate integer) +Signature = 303b021b3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 120 (truncate integer) +Signature = 303b021bde5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 121 (truncate integer) +Signature = 303b021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021b617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9 + +# Test 122 (truncate integer) +Signature = 303b021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021b7d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 123 (leading ff in integer) +Signature = 303d021dff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 124 (leading ff in integer) +Signature = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021dff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 125 (infinity) +Signature = 3021090180021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 126 (infinity) +Signature = 3021021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04090180 + +# Test 127 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021d013ade5c0624a5677ed7b6450d941fd283098d8a004fc718e2e7e6b441021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 128 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021dff3ade5c0624a5677ed7b6450d9421a53d481ba984280cc6582f2e5fc7021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 129 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303c021cc521a3f9db5a98812849baf26bdf441fd72b663dc4161062747575fc021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 130 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021d00c521a3f9db5a98812849baf26bde5ac2b7e4567bd7f339a7d0d1a039021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 131 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021dfec521a3f9db5a98812849baf26be02d7cf67275ffb038e71d18194bbf021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 132 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021d013ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 133 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021d00c521a3f9db5a98812849baf26bdf441fd72b663dc4161062747575fc021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 134 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d01617d6af141efd0c800c9ba3382c2119a390cfa9bed6a409bfe3703be + +# Test 135 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021dff617d6af141efd0c800c9ba3382c3e454779b1a1fc5afee11457eaf44 + +# Test 136 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c9e82950ebe102f37ff3645cc7d3d0508a7abf5a22672e8a95e25267f + +# Test 137 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021dfe9e82950ebe102f37ff3645cc7d3dee65c6f305641295bf6401c8fc42 + +# Test 138 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d01617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981 + +# Test 139 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d009e82950ebe102f37ff3645cc7d3d0508a7abf5a22672e8a95e25267f + +# Test 140 (Signature with special case values for r and s) +Signature = 3006020100020100 + +# Test 141 (Signature with special case values for r and s) +Signature = 3006020100020101 + +# Test 142 (Signature with special case values for r and s) +Signature = 30060201000201ff + +# Test 143 (Signature with special case values for r and s) +Signature = 3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 144 (Signature with special case values for r and s) +Signature = 3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 145 (Signature with special case values for r and s) +Signature = 3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 146 (Signature with special case values for r and s) +Signature = 3022020100021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 147 (Signature with special case values for r and s) +Signature = 3022020100021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 148 (Signature with special case values for r and s) +Signature = 3008020100090380fe01 + +# Test 149 (Signature with special case values for r and s) +Signature = 3006020101020100 + +# Test 150 (Signature with special case values for r and s) +Signature = 3006020101020101 + +# Test 151 (Signature with special case values for r and s) +Signature = 30060201010201ff + +# Test 152 (Signature with special case values for r and s) +Signature = 3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 153 (Signature with special case values for r and s) +Signature = 3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 154 (Signature with special case values for r and s) +Signature = 3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 155 (Signature with special case values for r and s) +Signature = 3022020101021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 156 (Signature with special case values for r and s) +Signature = 3022020101021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 157 (Signature with special case values for r and s) +Signature = 3008020101090380fe01 + +# Test 158 (Signature with special case values for r and s) +Signature = 30060201ff020100 + +# Test 159 (Signature with special case values for r and s) +Signature = 30060201ff020101 + +# Test 160 (Signature with special case values for r and s) +Signature = 30060201ff0201ff + +# Test 161 (Signature with special case values for r and s) +Signature = 30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 162 (Signature with special case values for r and s) +Signature = 30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 163 (Signature with special case values for r and s) +Signature = 30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 164 (Signature with special case values for r and s) +Signature = 30220201ff021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 165 (Signature with special case values for r and s) +Signature = 30220201ff021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 166 (Signature with special case values for r and s) +Signature = 30080201ff090380fe01 + +# Test 167 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020100 + +# Test 168 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101 + +# Test 169 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d0201ff + +# Test 170 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 171 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 172 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 173 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 174 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 175 (Signature with special case values for r and s) +Signature = 3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d090380fe01 + +# Test 176 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c020100 + +# Test 177 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c020101 + +# Test 178 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c0201ff + +# Test 179 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 180 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 181 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 182 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 183 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 184 (Signature with special case values for r and s) +Signature = 3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c090380fe01 + +# Test 185 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e020100 + +# Test 186 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e020101 + +# Test 187 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e0201ff + +# Test 188 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 189 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 190 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 191 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 192 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 193 (Signature with special case values for r and s) +Signature = 3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e090380fe01 + +# Test 194 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000001020100 + +# Test 195 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000001020101 + +# Test 196 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffffffff0000000000000000000000010201ff + +# Test 197 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 198 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 199 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 200 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 201 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 202 (Signature with special case values for r and s) +Signature = 3024021d00ffffffffffffffffffffffffffffffff000000000000000000000001090380fe01 + +# Test 203 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000002020100 + +# Test 204 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000002020101 + +# Test 205 (Signature with special case values for r and s) +Signature = 3022021d00ffffffffffffffffffffffffffffffff0000000000000000000000020201ff + +# Test 206 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + +# Test 207 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c + +# Test 208 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e + +# Test 209 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffffffff000000000000000000000001 + +# Test 210 (Signature with special case values for r and s) +Signature = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffffffff000000000000000000000002 + +# Test 211 (Signature with special case values for r and s) +Signature = 3024021d00ffffffffffffffffffffffffffffffff000000000000000000000002090380fe01 + +# Test 212 (Edge case for Shamir multiplication) +Msg = 3839313737 +Valid = 1 +Signature = 303d021c326bc06353f7f9c9f77b8f4b55464e8619944e7879402cca572e041a021d0096ad91f02a3bc40c118abd416ed5c6203ed7ced0330860d7b88c10ab + +Px = 0x93b4c28f032d00f80e77491edc158359909ee9e30a7327b74219e5e2 +Py = 0x482c19ae35cb28afc9b95ca1ed7ad91c812d5fcceb4beddbf1a16d92 +# Test 213 (k*G has a large x-coordinate) +Msg = 313233343030 +Signature = 3030020f00e95c1f470fc1ec22d6baa3a3d5c1021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a + +# Test 214 (r too large) +Valid = 0 +Signature = 303e021d00fffffffffffffffffffffffffffffffefffffffffffffffffffffffe021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a + +Px = 0xda927f4ba88b639bf5334221d2f54d8ef9ccc1a1125fad18c7bfb789 +Py = 0xac51ae53de6d834a9db3947b8dd4c6ac2b084b85496bfa72d86b6948 +# Test 215 (r,s are large) +Valid = 1 +Signature = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3b + +Px = 0x20888e1c0f5694c4c0363b36482beb6e1e6649b3d3b26f127febb6fc +Py = 0xde00c2f3d8e4a7e8a0bafd417c96d3e81c975946a2f3686aa39d35f1 +# Test 216 (r and s^-1 have a large Hamming weight) +Signature = 303c021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021c3d5052691b8dc89debad360466f2a39e82e8ae2aefb77c3c92ad7cd1 + +Px = 0x9545c86f032c5df255a4490bb0b83eca201181792ad74246874db229 +Py = 0x405264c283063327b70f4c2be5ab4d2e9407b866e121d6145d124c04 +# Test 217 (r and s^-1 have a large Hamming weight) +Signature = 303d021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021d00bf19ab4d3ebf5a1a49d765909308daa88c2b7be3969db552ea30562b + +Px = 0x579d53f39d5109bd440e3e3e7efd603740963348ff9c72c03b0fe6b8 +Py = 0xdf02f133ecd60b072a0812adc752708f2be9d8c9ad5953d8c7bf3965 +# Test 218 (small r and s) +Signature = 3006020103020101 + +Px = 0xd2a14c8106d89f3536faebdafcd4680f65ab4bf2243164ca1464b628 +Py = 0xacaf2bee52e6231d3c980f52f8e189a41c3e3a05e591195ec864217a +# Test 219 (small r and s) +Signature = 3006020103020103 + +Px = 0xe892479153ad13ea5ca45d4c323ebf1fc3cd0cdf787c34306a3f79a4 +Py = 0x326ca9645f2b517608dc1f08b7a84cfc61e6ff68d14f27d2043c7ef5 +# Test 220 (small r and s) +Signature = 3006020103020104 + +# Test 221 (r is larger than n) +Valid = 0 +Signature = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a40020104 + +Px = 0x2b0eac35c0b294f6d435dcaffa8633b0123005465c30080adbcc103a +Py = 0xd465a63bfb71d4aee09328697fe1088753646d8369b8dc103217c219 +# Test 222 (s is larger than n) +Signature = 3022020103021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c6f00c4 + +Px = 0xd156e01e33becede8f4fb4ae9521d751e7f8eb795ca00857db2fd7af +Py = 0xd73a450ec60e6a9218a8431870687e0968944f6dc5ffeb30e4693b7c +# Test 223 (small r and s^-1) +Valid = 1 +Signature = 302302020100021d00c993264c993264c993264c99326411d2e55b3214a8d67528812a55ab + +Px = 0xf293a8a2b4aff0bed95c663b364afe69778d38dd7e7a304f7d3c74e6 +Py = 0x17dfd09e7803c4439a6c075cb579cde652d03f7559ff58846312fa4c +# Test 224 (smallish r and s^-1) +Signature = 302702072d9b4d347952cc021c3e85d56474b5c55fbe86608442a84b2bf093b7d75f53a47250e1c70c + +Px = 0xd4ddf003b298cbaa7d2edc584b28b474a76162ed4b5b0f6222c54317 +Py = 0xd4e4fe030f178fb4aa4a6d7f61265ecd7ef13c313606b8d341a8b954 +# Test 225 (100-bit r and small s^-1) +Signature = 302d020d1033e67e37b32b445580bf4efb021c02fd02fd02fd02fd02fd02fd02fd0043a4fd2da317247308c74dc6b8 + +Px = 0x8a5bf0028f1e3eb6841dee7b8f873f68b0c560e592e3182074f51ce8 +Py = 0x9668c32224b65b6849713d35e3acf1786862e65b5a664b47a098caa0 +# Test 226 (small r and 100 bit s^-1) +Signature = 302302020100021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e + +Px = 0xb53e569b18e9361567e5713ee69ecbe7949911b0257546a24c3dd137 +Py = 0xf29a83334cff1c44d8c0c33b6dadb8568c024fa1fbb694cd9e705f5a +# Test 227 (100-bit r and s^-1) +Signature = 302e020d062522bbd3ecbe7c39e93e7c24021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e + +Px = 0x77f3ebf52725c809acbb19adf093126a2a3a065ca654c22099c97812 +Py = 0x9f1948d23c5158ec2adff455eb2fedf1075d4ec22d660977424a10f7 +# Test 228 (r and s^-1 are close to n) +Signature = 303d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c29bd021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14 + +Px = 0xa7f7b99e5cdc6fec8928eff773ccdf3b68b19d43cdb41809e19c60f3 +Py = 0x1736b7a0c12a9c2d706671912915142b3e05c89ef3ad497bd6c34699 +# Test 229 (s == 1) +Signature = 3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020101 + +# Test 230 (s == 0) +Valid = 0 +Signature = 3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020100 + +Px = 0x9cf00010b4ad86636f6cc70fb58c3b995c0d12e46fc58e24b0d28f69 +Py = 0x21c8a8a320cc450ccb15ebd71617f4ed25db4d3413fbdf157d31dbb6 +# Test 231 (point at infinity during verify) +Signature = 303c021c7fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e151e021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14 + +Px = 0x10518eb7a926b5f7b65be801ec9b2abf76adce25c6152e452a3512c8 +Py = 0x3f322b9ab57ea8352ad29beb99ef356b713432fcc4aef31f903045d9 +# Test 232 (u1 == 1) +Valid = 1 +Signature = 303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d00bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419fe + +Px = 0x8a5dfedc9dd1cb9a439c88b3dd472b2e66173f7866855db6bb6c12fd +Py = 0x3badfbb8a4c6fd80e66510957927c78a2aa02ecef62816d0356b49c3 +# Test 233 (u1 == n - 1) +Signature = 303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c44a5ad0bd0636d9e12bc9e0a6bdc74bfe082087ae8b61cbd54b8103f + +Px = 0x83a59fc3df295e84c290b32d0b550a06f99456fc2298e4a68c4f2bff +Py = 0x1b34f483db30db3a51d8288732c107d8b1a858cd54c3936e1b5c11a4 +# Test 234 (u2 == 1) +Signature = 303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14 + +Px = 0x58bada578a205d6e170722c8ed6c7715011fe33d7eba869ed1d448a7 +Py = 0x5be4730c1d2d2ef881e02f028a241b7d7d3b0d0b4a9c0565fcb49977 +# Test 235 (u2 == n - 1) +Signature = 303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d00aaaaaaaaaaaaaaaaaaaaaaaaaaaa0f17407b4ad40d3e1b8392e81c29 + +Px = 0x7fcc799b919fe9789ce01dd9202731cb7d815158bc6cb8468760247c +Py = 0xf9d2957e0dd5e4c40124bd5e0dd1be41c038fce2cd1dc814e0af37d +# Test 236 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0093c8c651653430cb4f1675fc86b5e82ca04ff2ab1501674476aac169 + +Px = 0x3ddd68f69d0bfd47ad19370fa3dc72eb258268c2b5f3768852151674 +Py = 0xfbe0e155d94d2373a01a5e70f1a105259e7b8b1d2fdf4dba3cf4c780 +# Test 237 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d009df50acc33b3625a2d5940dd13dbb97d1f7dd56afff8b7de7545127c + +Px = 0x1cb1f564c29ebf60a342b3bc33c8945cb279c6c1a012255c874e1c37 +Py = 0xb75191ab3b2bb730914ebfa14080410970b71eaf4fe01e2d48be9891 +# Test 238 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00dce8c223f235699d1f5d2dcde4809d013390b59129f783239525c08f + +Px = 0x44e309eb686e7af7f1e2cc17fd56542b38910b3b7908ea54fb038d36 +Py = 0x477e829d4c8332e5b29f344ad27a21c18dab24a31ce7985b63a21304 +# Test 239 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c074aae944ee7a7d544a5ad0bd06366f872d2250ba3018a63d2a7f2e6 + +Px = 0xc728064542cb5142f5eefe638124dcd7a1ad0b3555842a47dd5108e1 +Py = 0x10129dd878ebd47313276cec86f521ea9585cd105b3dc421141993b8 +# Test 240 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00aae944ee7a7d544a5ad0bd0636d9455f4e83de0f186f89bca56b3c5c + +Px = 0xc46c1ad3d3d0df8e9c0f525c21ce8d81ef9d66297f442d6309966722 +Py = 0xcfa2253aa31a98d8966b85969bf9c819c019292ef6a53ac1db2a108 +# Test 241 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c55d289dcf4faa894b5a17a0c6db3741bbc4ecbe01d01ea33ee7a4e7b + +Px = 0xb7b2e48c1e60e20925f4d9b6be600dd83786a936c9bfab00639c33ca +Py = 0xa967cbc65070739a3379da80d54843a18d9c11a29a32234a0b303c12 +# Test 242 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c4ee7a7d544a5ad0bd0636d9e12bc561ce04faaf1312bba3a15601ebc + +Px = 0xf4a3d4598875af7f2741bbd67b1733b6541bc5325b3bcb4d3267c27e +Py = 0xc30bf322f58a45c6c2aa2ced55f175d1cbf72a7c5bfc464d74f666c0 +# Test 243 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c361b9cd74d65e79a5874c501bca4973b20347ec97f6de10072d8b46a + +Px = 0x56d1e5c1d664f6ce2fc1fcb937a7ce231a29486abf36c73f77a2bd11 +Py = 0x6cb282c9d7c6fc05f399c183e880ea362edf043cd28ffac9f94f2141 +# Test 244 (edge case for u1) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c6c3739ae9acbcf34b0e98a0379492e764068fd92fedbc200e5b168d4 + +Px = 0x30bce8c6b7f1bbba040b8d121d85d55167ac99b2e2cf1cfac8b018b5 +Py = 0xf1c384c35be0ae309a5cb55aba982343d2125f2d4a559d8c545359cd +# Test 245 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00a252d685e831b6cf095e4f0535edc5b1609d7c5c7e49a301588a1d3e + +Px = 0xe87e538a978cf187908beb27a4a247d496a8421dab1fe79f8744d2b5 +Py = 0x539b9f8fe8bddcf7c97c44c55a4fc22f4d78f6a961447a5b613b5c49 +# Test 246 (edge case for u1) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00ee746111f91ab4ce8fae96e6f23fd9d20a24d2e79eea563478c0f566 + +Px = 0x113a2cc57c8ee7de11bc45e14546c72a29725b9a7218114ac31f0281 +Py = 0x6c765b9a46b0215312a3292f5979c98d37b35883baa156281b1bae8c +# Test 247 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffffb2364ae85014b149b86c741eb8be + +Px = 0x23dd9c3f1a4b478b01fa2c5e997d0482073b32918de44be583dcf74a +Py = 0xd661a5ed579a2f09d2ff56d6b80f26568d93a237ca6444b0cadc7951 +# Test 248 (edge case for u2) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00855f5b2dc8e46ec428a593f73219cf65dae793e8346e30cc3701309c + +Px = 0xbbce4b17d45d24a1c80bc8eca98c359d5e1e458058a00b950643256d +Py = 0xfe09e092318e39303dca03688e4ecf300300784312d617e5088c584c +# Test 249 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c2db5f61aea817276af2064e104c7a30e32034cb526dd0aacfa56566f + +Px = 0x35f58446c1bdbeaa56660a897ebf965f2d18820c7cd0630f04a4953 +Py = 0x47bdfaea60091f405e09929cb2c0e2f6eed53e0871b7fe0cd5a15d85 +# Test 250 (edge case for u2) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0084a6c7513e5f48c07fffffffffff8713f3cba1293e4f3e95597fe6bd + +Px = 0x911c0033eac46332691cb7920c4950eed57354761e1081a1ea9f1279 +Py = 0x508ebf7cfd3eab5dabdee1be14ce8296b1fc20acfaac16f7824c6002 +# Test 251 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c6c7513e5f48c07ffffffffffffff9d21fd1b31544cb13ca86a75b25e + +Px = 0x62b2abb70bb9c7efdfb57181f433b64751f108130dce180d6992e7d3 +Py = 0x124b3aa8a53e5eedf72aa67e6edcc71f19e36e6ad1d099a59ffd9555 +# Test 252 (edge case for u2) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d8ea27cbe9180fffffffffffffff3a43fa3662a899627950d4eb64bc + +Px = 0xf759330e7992752aae6a85f7bb0599784bea53e288ff7ee8d53d5e6 +Py = 0xdefe617362380e92f9a23c4fdcc34e09713aab9cc44119418f6f2fd1 +# Test 253 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3e5f48c07fffffffffffffffffffc724968c0ecf9ed783744a7337b3 + +Px = 0x8f2eda42742ab31f5d4cf666892d1d623efd3b26f7df9aa70296e80d +Py = 0x3beaf235cfea41fadb98c533a8fdeb5841d69ee65f6e71914711f138 +# Test 254 (edge case for u2) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00bfffffffffffffffffffffffffff3d87bb44c833bb384d0f224ccdde + +Px = 0x2bcf4371b319a691ed0e2e0c4a55a8a9b987dec86b863621e97b9c09 +Py = 0x5b8660a74cc964a6af0311edc6b1cd980f9c7bf3a6c9b7f9132a0b2f +# Test 255 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffff646c95d0a029629370d8e83d717f + +Px = 0xa6f252568f6fbd1ae045e602344359c0c216911723748f9a3e7fadec +Py = 0x3b76efc75ba030bfe7de2ded686991e6183d40241a05b479693c7015 +# Test 256 (edge case for u2) +Signature = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e1520 + +Px = 0xa74c1c3a31c7d493ab2c0af89cf5e688621ca9466d2ba1d8761c3fe8 +Py = 0x2ba0d08f4c9f76856c2b7138c8f1e780b6959992b16ccdfd925f4b3a +# Test 257 (edge case for u2) +Signature = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0096dafb0d7540b93b5790327082635cd8895e1e799d5d19f92b594056 + +Px = 0x34ea72798257f33f24f64c49438fc43e8f67ddc7170fd127e2c43f2 +Py = 0x80562acc9b49f2d7fcc89421d2a5db2ea8dd0361fb48d897d4612627 +# Test 258 (point duplication during verification) +Signature = 303d021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021c3f552f1c2b01651edf5902650fe9ab046f71999ac928edc0087bdb13 + +Px = 0x34ea72798257f33f24f64c49438fc43e8f67ddc7170fd127e2c43f2 +Py = 0x7fa9d53364b60d2803376bde2d5a24d05722fc9e04b727682b9ed9da +# Test 259 (duplication bug) +Valid = 0 +Signature = 303d021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021c3f552f1c2b01651edf5902650fe9ab046f71999ac928edc0087bdb13 + +Px = 0x3672ba9718e60d00eab4295c819ea366a778dd6fd621fa9665259cb6 +Py = 0x7ae5e847eeaea674beeb636379e968f79265502e414a1d444f04ae79 +# Test 260 (comparison with point at infinity ) +Signature = 303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c + +Px = 0x33eeefbfc77229136e56b575144863ed90b4c0f8a9e315816d6de648 +Py = 0x51749dd11480c141fb5a1946313163c0141265b68a26216bcb9936a +# Test 261 (extreme value for k) +Valid = 1 +Signature = 303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14 + +Px = 0xc520b18003b356094147ee2f9df1178572bed837bd89443b25ebceb8 +Py = 0xe2e93a998fbbabe82192ea4c85651cf09a95ab0dc2e3d975ee7be98 +# Test 262 (extreme value for k) +Signature = 303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14 + +Px = 0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21 +Py = 0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34 +# Test 263 (testing point duplication) +Valid = 0 +Signature = 303d021d00bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419fe021c249249249249249249249249249227ce201a6b76951f982e7ae89851 + +# Test 264 (testing point duplication) +Signature = 303c021c44a5ad0bd0636d9e12bc9e0a6bdc74bfe082087ae8b61cbd54b8103f021c249249249249249249249249249227ce201a6b76951f982e7ae89851 + +Px = 0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21 +Py = 0x42c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd +# Test 265 (testing point duplication) +Signature = 303d021d00bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419fe021c249249249249249249249249249227ce201a6b76951f982e7ae89851 + +# Test 266 (testing point duplication) +Signature = 303c021c44a5ad0bd0636d9e12bc9e0a6bdc74bfe082087ae8b61cbd54b8103f021c249249249249249249249249249227ce201a6b76951f982e7ae89851 + +Px = 0x4c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466 +Py = 0xddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176 +# Test 267 (pseudorandom signature) +Msg = +Valid = 1 +Signature = 303d021c0364e7d96832614a80216e730c353534d4bffd2c26649c0b4b0e2628021d008f40064b412fe38c5ba9cf664e6172ed48e6e79f0fe5e31a54985dfc + +# Test 268 (pseudorandom signature) +Signature = 303e021d00b41091a5d3fbacfb8cf5633536cbe1d9fcf21e6d68cc9778490e058d021d00fb62cf967601d20f34f43cb138f57b7e0ba1f0b900faf0ea2bb1fc14 + +# Test 269 (pseudorandom signature) +Signature = 303d021d00d0f1072fd6283d4d60ee043f6c78b6e3ca9c1cce4caaf9ae4874b2c9021c49e7aa1cc6e8c7833bd67a8880329b96ece3d4fda1c0fcaf53daadac + +# Test 270 (pseudorandom signature) +Signature = 303d021d009124453ca4b811d8a50834a092ef6a32ce6db98e72a66a140fe33b9f021c20cd9182f7d9d42e1e67ea77b92190afaaa4ff664cfc684e0f384eb1 + +# Test 271 (pseudorandom signature) +Signature = 303e021d00c8db428f70740b9a2769e50ef6c8897a58f2b805d3630556a23025e1021d00a1eaa6d5b7f44109f839a66ee6463f16c2ca7ca0fb20ea4eb992ac10 + +# Test 272 (pseudorandom signature) +Signature = 303e021d00f3142ef7e66d0434c9d2db4187183504d7ab2692d5a8c92e4dc08883021d00b8f43460ff89694721da3d8dfa21d9cf09eccc4ec97ad8216719b3c4 + +# Test 273 (pseudorandom signature) +Signature = 303d021c5b1c9ef283f70dbacae11eaa63f13e6b5a33dbcdb329c3ceeab98848021d00f70ebe657369f642c61d643bdf52d49b07a68d80279561958c3102d9 + +# Test 274 (pseudorandom signature) +Signature = 303d021d00d4340200c221c443f6763120ecafca40a327dd6e40dae29641b11205021c3c9b65e174695e62117579f4ca5903044320e48d6ccec91446426325 + +# Test 275 (pseudorandom signature) +Signature = 303d021c53df2654f17e3c002c7f464e9aff8c3dcaa1b8f0122c8a4b86e9c4e5021d00cae45907fa41b790c7e90f0669ae3e76ff0a3de0b585998e81df34c1 + +# Test 276 (pseudorandom signature) +Signature = 303d021d00bea17b9096e2bc7e041cdef9ec91f42b827ee8c8228d65d9bf7a9711021c13e245afc9277f7e32714fd7b3d95872aa689b219ac0acf050c1d9ec + +# Test 277 (pseudorandom signature) +Msg = 4d7367 +Signature = 303d021d00f4b68df62b9238363ccc1bbee00deb3fb2693f7894178e14eeac596a021c7f51c9451adacd2bcbc721f7df0643d7cd18a6b52064b507e1912f23 + +# Test 278 (pseudorandom signature) +Signature = 303d021c6f66f0f4d6fe7620666bb98e24769a58af83693d42cd7769b3caeabf021d00818ad21034973894236d27a9bcd736eb9ac631caeb196ed4c97ce7f5 + +# Test 279 (pseudorandom signature) +Signature = 303c021c30d85a8bd9d7750d036da6cd2e8d590d23d54d60a07fb32e1c170402021c420de69e400c572c36ce3b35e40a4b47bedfbe3a7af58f8ceb4066ed + +# Test 280 (pseudorandom signature) +Signature = 303d021d00e01302d4273341f11ef9788ac1e525a45f2659d7a8a64885aec54ae1021c3a886ab91681c019476753253fdda416731aad946b91886214fe0650 + +# Test 281 (pseudorandom signature) +Signature = 303c021c3afd7abd885aae32de3ef49cb331155334bb4309e4eda73ac4aee400021c1d51e8a79b85335560dfb118a8f4cf16ee3641a782d3ee5e455a63b6 + +# Test 282 (pseudorandom signature) +Signature = 303d021c07c73dae6b6f894bf1aeb340eaf06cbdf5556887aeed306ca87bb4a7021d00f0e98ce504608ac63b30b7d581a9ee44a5b439736a20661a0d0656a8 + +# Test 283 (pseudorandom signature) +Signature = 303d021c3d8216344b7480e25230dd4608b7ca09a63ae352f9961c2a3088676f021d00e71d2d7e78aae7f826b1d30a06f89f8fbe8702e639d85cf15b3ecb06 + +# Test 284 (pseudorandom signature) +Signature = 303d021c24e768c333808f0f0eb05b3ddf95d5530f8670334e742ff4ad783ef9021d00f4da768f939e12c7cecc90c45cfff173ea1fc4237290b17d2acbf8a9 + +# Test 285 (pseudorandom signature) +Signature = 303d021d00b1d7988d9bcd4f7a7b643e391f5b37d9f56a6ca4ab81c9a5a2b72d14021c518da4c39db722cdae6d1a8f0268ded4e4522926b672b4bd14ef8564 + +# Test 286 (pseudorandom signature) +Signature = 303c021c6374f85c920dace4b5828384b05696d0bd7cc0992f804a8059247538021c01b8f519efc35f104cc83be9280c44b4345cafcda02b944744a931c7 + +# Test 287 (pseudorandom signature) +Msg = 313233343030 +Signature = 303d021d00b2970cdec29c70294a18bbc49985efa33acc0af509c326a3977a35e8021c0cea3ed8ebaaf6ee6aef6049a23cbc39f61fcf8fc6be4bab13385579 + +# Test 288 (pseudorandom signature) +Signature = 303d021d00bc9052305d076c009f0250d888d0fae950bbdf53e42fc5b35850d4c5021c400a143f82c3b045ce46742aca8a1af966cc4b04e10fe96090374d36 + +# Test 289 (pseudorandom signature) +Signature = 303c021c7a57cfac41911d334dde984ef64bacf978fb04c77ffe00892e611fad021c52a3f891c2877d433b6b5799ca6f774941370654e17811b2fc401974 + +# Test 290 (pseudorandom signature) +Signature = 303c021c2092d6e7a86055b119e1f6f97b21ac3789e78804d0e25ff2945ad240021c3099207c5088715cb79437724b84018459553e82e6a72e6791cc2b02 + +# Test 291 (pseudorandom signature) +Signature = 303e021d0089b1dfa081bc9200d86bcf63c75e80fab8b8b11270768fa0ed07d45e021d008c2299775762dd15aefb1a18d9adac8dc756f4619e5fc3c526922100 + +# Test 292 (pseudorandom signature) +Signature = 303d021d00b16307867551b63b168131371c2eb6e8fab7d1ecfec6fde744e0ec51021c2f3ad86ba61343dc7d33908f83feb28a5b63aba08e3e990bdd441ab1 + +# Test 293 (pseudorandom signature) +Signature = 303e021d00b712f2b41da5c8265797d52b946fb79ecfe70544f83be0badbe4b71c021d00b02018a67a61d7df4d04aef55bafabd50e56840733b99b781185667f + +# Test 294 (pseudorandom signature) +Signature = 303d021d008972a6fc414736cfc4a57704dc2d76857738366a4175acb71eb3aa59021c0bfdc4fd4b6d9e6afb62b9f5e41c8cbac2790dd9fa06a72df6e0d0d8 + +# Test 295 (pseudorandom signature) +Signature = 303e021d00da7640586f3f0aae5fb1c3e32da59b3322c24d6303d1d006d50f74b5021d00c5462bf20238cdd4e534494629561aa111480d08b48557e69fc17f3e + +# Test 296 (pseudorandom signature) +Signature = 303c021c05c302ce36d5b7ba053cc9c9c26095e887df0f7e190396e13e487905021c52cb970da954ac97f3c507399451dcf28a4d37871b66b46f99c58531 + +# Test 297 (pseudorandom signature) +Msg = 0000000000000000000000000000000000000000 +Signature = 303d021c7e7b0eb7da8c68a7072b11404ee95a5c407fbfe3d69646802e28ae77021d00d409a2f6bbaae59bb60fc0a092b12fa4e67dc8d088cf19a833322fd6 + +# Test 298 (pseudorandom signature) +Signature = 303d021c0d81b5454f87f6000460dc7819b6fc712c042645340e0f4196f046e9021d00aa2efd27ccc7b942bcfebce7e735125227e2bdadcb943efa88f1f42e + +# Test 299 (pseudorandom signature) +Signature = 303c021c09b59a8f079529fad06c514abaf356537f9bc2eedfefc595aace6c48021c721310942b44535e02f455015143fffe3dae9e5193a4ef1eeff94686 + +# Test 300 (pseudorandom signature) +Signature = 303d021d0092f268abc43239955edad0766503714b4e156ec436df34b1da00b2c2021c580cab7733f22244b5c74ceae56e048b260c2d1e8b96b15997145ba4 + +# Test 301 (pseudorandom signature) +Signature = 303c021c514ef0e344b5cb8de93212d0493192437f86090ecc284dae54f74a60021c42e510fc18cd8c39113d4153dc2fc59dd2efaf22bd9330119458820a + +# Test 302 (pseudorandom signature) +Signature = 303e021d008a16dcf2e449678047e967a2c281c6500b6cdfddf631d784ff60fb68021d00b16ac240544d86b9b40e4baf4d53f1ee33fdf8161830ccad4d2f354e + +# Test 303 (pseudorandom signature) +Signature = 303c021c6f84179e3ea956abbf31daebace7b443c7a0e9f9641fa8fe4f4f9be9021c39df090fbe36b37c2aab1cbd61d7a5138c4b709e70606bcf99ff16ae + +# Test 304 (pseudorandom signature) +Signature = 303d021d00c0f2d12d910cf6bc0c4d09443a6da8247649e1724f95bddd711e2f64021c766bf054f829d02db13c6aa8536e00e5e30e5313a868e0a7851fcdcc + +# Test 305 (pseudorandom signature) +Signature = 303e021d00ca3d5f3822b905db4786b88e0ca370555825971d1a4b7fcc37bb1ed0021d00a3c21935732cd227a4f592c91cdd2509c078984b38a37cf530338364 + +# Test 306 (pseudorandom signature) +Signature = 303d021d00e1e6139431452e5cb96dc75677cbb3f1892b98e8fa2ba3f62ed8ea1a021c735daa1083e15eefad9357f76f83198448daffea42d34946d6c48b1f + +Px = 0xaed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf +Py = 0x8a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000 +# Test 307 (y-coordinate of the public key has many trailing 0's) +Msg = 4d657373616765 +Signature = 303c021c519bf185ff4635271961fa491be257231deeea9c53a6ede3b4a89ed1021c486bdad484a6a3134e1471cf56a9df0fac50f773b3e37d6f327617d7 + +# Test 308 (y-coordinate of the public key has many trailing 0's) +Signature = 303d021c09fd644898b7cb5d018b52234e7b4ef2b54789afd0ce9c434e9e5515021d00f19309532164ea2053cae55df7bdcbab536c83ea7bfe6fe10d60c1ab + +# Test 309 (y-coordinate of the public key has many trailing 0's) +Signature = 303d021d00ec919d4e283ccf1f71a9e3c0f781a36758d3f38b1b78a87a74288e80021c4c4663044a73c79bd88f0dc245ab1a32f89f06f40a704b31e9fabc51 + +Px = 0xbf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f1 +Py = 0x73d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff +# Test 310 (y-coordinate of the public key has many trailing 1's) +Signature = 303e021d00c51760478447217597ecc6f4001bd45088d53c90f53103608bf88aea021d00a201253aa903f9781e8992101d7171d2dd3a5d48c44d8e1d544cd6d7 + +# Test 311 (y-coordinate of the public key has many trailing 1's) +Signature = 303c021c76be0112674ec29128823e1af7512e6143872fef30a64e2f1799bd56021c187e503e1a48c27b549fe0a4ce5e581e242c8663fc9efb02d6f2b193 + +# Test 312 (y-coordinate of the public key has many trailing 1's) +Signature = 303c021c36245ef126b5b51e459f84eaaad5a495061f0471dc8c23f1c5f16282021c39e31d72a06ba8e14fcf95778e07bc16a2628e39449da8857d506edc + +Px = 0x26e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000 +Py = 0xeab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0 +# Test 313 (x-coordinate of the public key has many trailing 0's) +Signature = 303c021c258682975df8bca7f203f771ebeb478ef637360c860fc386cfb21745021c7663e70188047e41469a2a35c8c330dd900f2340ba82aafd22962a96 + +# Test 314 (x-coordinate of the public key has many trailing 0's) +Signature = 303e021d0085c98614f36c0d66f8d87834cae978611b7b4eebf59a46bea1b89ae9021d00d1a18e378dda840e06b60f6279bf0a2231d9fa2d8d2c31e88bc1bdd7 + +# Test 315 (x-coordinate of the public key has many trailing 0's) +Signature = 303e021d00ca7b7432ba41ff2112e1116fffde89bbd68f5ce67fe5513d16c8e6f7021d00e421b7599e0180798acc2006451603cda2db1d582741116e6033ce5f + +Px = 0xec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff +Py = 0x41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd +# Test 316 (x-coordinate of the public key has many trailing 1's) +Signature = 303c021c19397fe5d3ecabf80fc624c1bf379564387517c185087dc97d605069021c33b5773e9aaf6c34cb612cfc81efd3bf9c22224e8c4fa1bfccf5c501 + +# Test 317 (x-coordinate of the public key has many trailing 1's) +Signature = 303d021c70f24f5c164164bfbb8459aa12a981aa312dbcf00204326ebaaabdc8021d00f5cebee8caedae8662c43501665084b45d2f494fb70d603043543dc4 + +# Test 318 (x-coordinate of the public key has many trailing 1's) +Signature = 303d021c0bf2d86ecaa8b56aca5e8f8ebcb45081d078a14555b75f5be8e9b132021d009a55b3ce4734849966b5034ccd9b19f76407ee0241c3f58e7b8fc89a + +Px = 0x15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a +Py = 0x762d28f1fdc219184f81681fbff566d465b5f1f31e872df5 +# Test 319 (y-coordinate of the public key is small) +Signature = 303e021d00bfc5dc4434cd09369610687d38d2d418b63fd475dea246a456b25a3a021d00b171dfa6cf722f20816370a868785da842b37bac31d7b78e6751fc50 + +# Test 320 (y-coordinate of the public key is small) +Signature = 303e021d008fdbe8da646c5642d767c7dbeb3872b1edab6e37365805f0e94ce0a9021d00bcf35ab81222883dd3526cb0cf93138f4687cd0b10c2b0a126385161 + +# Test 321 (y-coordinate of the public key is small) +Signature = 303d021d00e23a11275848fd4f8b6f4ac4fc305eae981d3b7dc453e5a980c46422021c1a875693f24a03ea1614c4c3bbd0dd7221429f22b337ea7d98348ca4 + +Px = 0x15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a +Py = 0xffffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c +# Test 322 (y-coordinate of the public key is large) +Signature = 303d021c76645164ff9af3a1a9205fda2eef326d2bffc795dcc4829547fe01dd021d00b65bba503719314b27734dd06b1395d540af8396029b78b84e0149eb + +# Test 323 (y-coordinate of the public key is large) +Signature = 303c021c32fa0ca7e07f1f86ac350734994e1f31b6da9c82f93dced2b983c29c021c7b7891282206a45711bdfcb2a102b5d289df84ff5778548603574004 + +# Test 324 (y-coordinate of the public key is large) +Signature = 303d021c2d5492478ca64e5111dfd8521867b6477b7e78227849ad090b855694021d00a532f5a2fa3594af81cd5928b81b4057da717be5fb42a3a86c68190d + +Px = 0xf7e4713d085112112c37cdf4601ff688da796016b71a727a +Py = 0xde5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1 +# Test 325 (x-coordinate of the public key is small) +Signature = 303d021c191eee5daf55cd499e8539cb2cff797cfec5d566d2027bf9f8d64693021d00dadfeae8131f64d96b94fd340197caa2bc04818554812feef3343070 + +# Test 326 (x-coordinate of the public key is small) +Signature = 303e021d00e0e2c08180b8a207ee9105a7d379fa112368e8370fa09dfde4a45c45021d00c717bc0860e016e7ce48f8fe6a299b36906a6055adad93b416ce8838 + +# Test 327 (x-coordinate of the public key is small) +Signature = 303d021c1b919ef93532292743bb2e1b7b4894fd847c6e5de52a08e1b0f2dcfb021d00c2d30d6b7594d8dbd261491ae1d58779505b075b64e5564dc97a418b + +Px = 0xffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f725 +Py = 0x86c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e +# Test 328 (x-coordinate of the public key is large) +Signature = 303d021d00e75db49ed33ff2885ea6100cc95b8fe1b9242ea4248db07bcac2e020021c796c866142ae8eb75bb0499c668c6fe45497692fbcc66b37c2e4624f + +# Test 329 (x-coordinate of the public key is large) +Signature = 303c021c1f81cd924362ec825890307b9b3936e0d8f728a7c84bdb43c5cf0433021c39d3e46a03040ad41ac026b18e0629f6145e3dc8d1e6bbe200c8482b + +# Test 330 (x-coordinate of the public key is large) +Signature = 303c021c00fda613aa67ca42673ad4309f3f0f05b2569f3dee63f4aa9cc54cf3021c1e5a64b68a37e5b201c918303dc7a40439aaeacf019c5892a8f6d0ce + +Px = 0xb0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1 +Py = 0xe2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc +# Test 331 (y-coordinate of the public key is small) +Signature = 303e021d00b932b3f7e6467e1ec7a561f31160248c7f224550a8508788634b53ce021d00a0c5312acf9e801aff6d6fc98550cfa712bbf65937165a36f2c32dc9 + +# Test 332 (y-coordinate of the public key is small) +Signature = 303d021d00e509593fb09245ee8226ce72786b0cc352be555a7486be628f4fd00c021c0b7abde0061b1e07bf13319150a4ff6a464abab636ab4e297b0d7633 + +# Test 333 (y-coordinate of the public key is small) +Signature = 303c021c6e54f941204d4639b863c98a65b7bee318d51ab1900a8f345eac6f07021c0da5054829214ecde5e10579b36a2fe6426c24b064ed77c38590f25c + +Px = 0xb0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1 +Py = 0xfffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945 +# Test 334 (y-coordinate of the public key is large) +Signature = 303d021d0085ea4ab3ffdc992330c0ca8152faf991386bce82877dbb239ba654f6021c0806c6baf0ebea4c1aaa190e7d4325d46d1f7789d550632b70b5fc9b + +# Test 335 (y-coordinate of the public key is large) +Signature = 303d021c44d53debb646b73485402eab2d099081b97b1243c025b624f0dd67ea021d00e5de789a7d4b77eac6d7bba41658e6e4dc347dabed2f9680c04a6f55 + +# Test 336 (y-coordinate of the public key is large) +Signature = 303c021c1526eb2f657ebea9af4ca184b975c02372c88e24e835f3f5774c0e12021c1f1ecce38ee52372cb201907794de17b6d6c1afa13c316c51cb07bc7 + +Group = secp256k1 +Px = 0xb838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6f +Py = 0xf0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9 +# Test 1 (signature malleability) +Msg = 313233343030 +Signature = 3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365022100900e75ad233fcc908509dbff5922647db37c21f4afd3203ae8dc4ae7794b0f87 + +# Test 2 (random signature) +Signature = 304502210089fba57f428b69cff33f19092dcdc368fc87d4d0f0086c42729f8e409a48b8b902203d0f0f73c590218154952d69df5b406f140161c5600c274d69d475de987d2999 + +# Test 3 (random signature) +Signature = 3045022051dcc058c70a215bcef1d12b3d6e5c30bc57e079ab64d5cc993d84cafbedb548022100d24666691c695e2aa68ea6ac38c78cfd50179a2ddfe7fc2a9efbbc574b9963d6 + +# Test 4 (random signature) +Signature = 3046022100c384928d75b911cdfcf994bc809b5adb4ae0e7747a08dc7b50734708ec2b375e0221009da4c98e1822874450c1551df725ca89cd50ec33aec2052a54d0d853f6c5e1cb + +# Test 5 (random signature) +Signature = 3044022027340377d4b3f30b3930729654c3a4e527ca12b843fc67dd51ea60627df916f202207b7b8c92512bb6b64f4ba46ae4fee6f376d93285e9a96701c42e60c416239007 + +# Test 6 (random signature) +Signature = 30460221009cbf94ef2aba2beb60315981f4ce44ed302d0fbc819a058722c29df53a3c7c1d0221009f36bbbb6aaa36e78023f3dd559f0f380e2d60aebd54c1472695ff35bb19bc47 + +# Test 7 (Legacy:ASN encoding of r misses leading 0) +Valid = 0 +Signature = 30440220813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 8 (valid) +Valid = 1 +Signature = 3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 9 (long form encoding of length) +Valid = 0 +Signature = 308145022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 10 (long form encoding of length) +Signature = 304602812100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 11 (long form encoding of length) +Signature = 3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650281206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 12 (length contains leading 0) +Signature = 30820045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 13 (length contains leading 0) +Signature = 30470282002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 14 (length contains leading 0) +Signature = 3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365028200206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 15 (wrong length) +Signature = 3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 16 (wrong length) +Signature = 3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 17 (wrong length) +Signature = 3045022200813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 18 (wrong length) +Signature = 3045022000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 19 (wrong length) +Signature = 3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502216ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 20 (wrong length) +Signature = 3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365021f6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 21 (uint32 overflow in length) +Signature = 30850100000045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 22 (uint32 overflow in length) +Signature = 304a0285010000002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 23 (uint32 overflow in length) +Signature = 304a022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365028501000000206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 24 (uint64 overflow in length) +Signature = 3089010000000000000045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 25 (uint64 overflow in length) +Signature = 304e028901000000000000002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 26 (uint64 overflow in length) +Signature = 304e022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502890100000000000000206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 27 (length = 2**31 - 1) +Signature = 30847fffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 28 (length = 2**31 - 1) +Signature = 304902847fffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 29 (length = 2**31 - 1) +Signature = 3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502847fffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 30 (length = 2**32 - 1) +Signature = 3084ffffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 31 (length = 2**32 - 1) +Signature = 30490284ffffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 32 (length = 2**32 - 1) +Signature = 3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650284ffffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 33 (length = 2**40 - 1) +Signature = 3085ffffffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 34 (length = 2**40 - 1) +Signature = 304a0285ffffffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 35 (length = 2**40 - 1) +Signature = 304a022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650285ffffffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 36 (length = 2**64 - 1) +Signature = 3088ffffffffffffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 37 (length = 2**64 - 1) +Signature = 304d0288ffffffffffffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 38 (length = 2**64 - 1) +Signature = 304d022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650288ffffffffffffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 39 (incorrect length) +Signature = 30ff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 40 (incorrect length) +Signature = 304502ff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 41 (incorrect length) +Signature = 3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502ff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 42 (indefinite length without termination) +Signature = 3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 43 (indefinite length without termination) +Signature = 3045028000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 44 (indefinite length without termination) +Signature = 3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502806ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 45 (removing sequence) +Signature = + +# Test 46 (appending 0's to sequence) +Signature = 3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000 + +# Test 47 (prepending 0's to sequence) +Signature = 30470000022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 48 (appending unused 0's) +Signature = 3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000 + +# Test 49 (appending unused 0's) +Signature = 3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 50 (appending null value) +Signature = 3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0500 + +# Test 51 (appending null value) +Signature = 3047022300813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365050002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 52 (appending null value) +Signature = 3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502226ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0500 + +# Test 53 (including garbage) +Signature = 304a4981773045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 54 (including garbage) +Signature = 304925003045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 55 (including garbage) +Signature = 30473045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0004deadbeef + +# Test 56 (including garbage) +Signature = 304a2226498177022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 57 (including garbage) +Signature = 304922252500022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 58 (including garbage) +Signature = 304d2223022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650004deadbeef02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 59 (including garbage) +Signature = 304a022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365222549817702206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 60 (including garbage) +Signature = 3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323652224250002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 61 (including garbage) +Signature = 304d022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365222202206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0004deadbeef + +# Test 62 (including undefined tags) +Signature = 304daa00bb00cd003045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 63 (including undefined tags) +Signature = 304baa02aabb3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 64 (including undefined tags) +Signature = 304d2229aa00bb00cd00022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 65 (including undefined tags) +Signature = 304b2227aa02aabb022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 66 (including undefined tags) +Signature = 304d022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323652228aa00bb00cd0002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 67 (including undefined tags) +Signature = 304b022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323652226aa02aabb02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 68 (using composition with indefinite length) +Signature = 30803045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000 + +# Test 69 (using composition with indefinite length) +Signature = 30492280022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 70 (using composition with indefinite length) +Signature = 3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365228002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000 + +# Test 71 (using composition with wrong tag) +Signature = 30803145022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000 + +# Test 72 (using composition with wrong tag) +Signature = 30492280032100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 73 (using composition with wrong tag) +Signature = 3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365228003206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000 + +# Test 74 (Replacing sequence with NULL) +Signature = 0500 + +# Test 75 (changing tag value) +Signature = 2e45022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 76 (changing tag value) +Signature = 2f45022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 77 (changing tag value) +Signature = 3145022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 78 (changing tag value) +Signature = 3245022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 79 (changing tag value) +Signature = ff45022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 80 (changing tag value) +Signature = 3045002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 81 (changing tag value) +Signature = 3045012100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 82 (changing tag value) +Signature = 3045032100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 83 (changing tag value) +Signature = 3045042100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 84 (changing tag value) +Signature = 3045ff2100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 85 (changing tag value) +Signature = 3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236500206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 86 (changing tag value) +Signature = 3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236501206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 87 (changing tag value) +Signature = 3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236503206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 88 (changing tag value) +Signature = 3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236504206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 89 (changing tag value) +Signature = 3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365ff206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 90 (dropping value of sequence) +Signature = 3000 + +# Test 91 (using composition) +Signature = 304930010230442100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 92 (using composition) +Signature = 304922250201000220813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 93 (using composition) +Signature = 3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365222402016f021ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 94 (truncate sequence) +Signature = 3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31 + +# Test 95 (truncate sequence) +Signature = 30442100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 96 (indefinite length) +Signature = 3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000 + +# Test 97 (indefinite length with truncated delimiter) +Signature = 3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba00 + +# Test 98 (indefinite length with additional element) +Signature = 3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba05000000 + +# Test 99 (indefinite length with truncated element) +Signature = 3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba060811220000 + +# Test 100 (indefinite length with garbage) +Signature = 3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000fe02beef + +# Test 101 (indefinite length with nonempty EOC) +Signature = 3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0002beef + +# Test 102 (prepend empty sequence) +Signature = 30473000022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 103 (append empty sequence) +Signature = 3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba3000 + +# Test 104 (sequence of sequence) +Signature = 30473045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 105 (truncated sequence) +Signature = 3023022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365 + +# Test 106 (repeat element in sequence) +Signature = 3067022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 107 (removing integer) +Signature = 302202206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 108 (appending 0's to integer) +Signature = 3047022300813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 109 (appending 0's to integer) +Signature = 3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502226ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000 + +# Test 110 (prepending 0's to integer) +Signature = 30470223000000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 111 (prepending 0's to integer) +Signature = 3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365022200006ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 112 (Replacing integer with NULL) +Signature = 3024050002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 113 (Replacing integer with NULL) +Signature = 3025022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650500 + +# Test 114 (dropping value of integer) +Signature = 3024020002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 115 (dropping value of integer) +Signature = 3025022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650200 + +# Test 116 (modify first byte of integer) +Signature = 3045022102813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 117 (modify first byte of integer) +Signature = 3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206df18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 118 (modify last byte of integer) +Signature = 3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323e502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 119 (modify last byte of integer) +Signature = 3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb313a + +# Test 120 (truncate integer) +Signature = 3044022000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832302206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 121 (truncate integer) +Signature = 30440220813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 122 (truncate integer) +Signature = 3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365021f6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31 + +# Test 123 (truncate integer) +Signature = 3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365021ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 124 (leading ff in integer) +Signature = 30460222ff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 125 (leading ff in integer) +Signature = 3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221ff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 126 (infinity) +Signature = 302509018002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 127 (infinity) +Signature = 3026022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365090180 + +# Test 128 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3045022101813ef79ccefa9a56f7ba805f0e478583b90deabca4b05c4574e49b5899b964a602206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 129 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30440220813ef79ccefa9a56f7ba805f0e47858643b030ef461f1bcdf53fde3ef94ce22402206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 130 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30450221ff7ec10863310565a908457fa0f1b87a7b01a0f22a0a9843f64aedc334367cdc9b02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 131 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 304402207ec10863310565a908457fa0f1b87a79bc4fcf10b9e0e4320ac021c106b31ddc02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 132 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30450221fe7ec10863310565a908457fa0f1b87a7c46f215435b4fa3ba8b1b64a766469b5a02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 133 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3045022101813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 134 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 304402207ec10863310565a908457fa0f1b87a7b01a0f22a0a9843f64aedc334367cdc9b02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 135 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221016ff18a52dcc0336f7af62400a6dd9b7fc1e197d8aebe203c96c87232272172fb + +# Test 136 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221ff6ff18a52dcc0336f7af62400a6dd9b824c83de0b502cdfc51723b51886b4f079 + +# Test 137 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650220900e75ad233fcc908509dbff5922647ef8cd450e008a7fff2909ec5aa914ce46 + +# Test 138 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221fe900e75ad233fcc908509dbff592264803e1e68275141dfc369378dcdd8de8d05 + +# Test 139 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221016ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba + +# Test 140 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365022100900e75ad233fcc908509dbff5922647ef8cd450e008a7fff2909ec5aa914ce46 + +# Test 141 (Signature with special case values for r and s) +Signature = 3006020100020100 + +# Test 142 (Signature with special case values for r and s) +Signature = 3006020100020101 + +# Test 143 (Signature with special case values for r and s) +Signature = 30060201000201ff + +# Test 144 (Signature with special case values for r and s) +Signature = 3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 + +# Test 145 (Signature with special case values for r and s) +Signature = 3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140 + +# Test 146 (Signature with special case values for r and s) +Signature = 3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142 + +# Test 147 (Signature with special case values for r and s) +Signature = 3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f + +# Test 148 (Signature with special case values for r and s) +Signature = 3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30 + +# Test 149 (Signature with special case values for r and s) +Signature = 3008020100090380fe01 + +# Test 150 (Signature with special case values for r and s) +Signature = 3006020101020100 + +# Test 151 (Signature with special case values for r and s) +Signature = 3006020101020101 + +# Test 152 (Signature with special case values for r and s) +Signature = 30060201010201ff + +# Test 153 (Signature with special case values for r and s) +Signature = 3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 + +# Test 154 (Signature with special case values for r and s) +Signature = 3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140 + +# Test 155 (Signature with special case values for r and s) +Signature = 3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142 + +# Test 156 (Signature with special case values for r and s) +Signature = 3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f + +# Test 157 (Signature with special case values for r and s) +Signature = 3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30 + +# Test 158 (Signature with special case values for r and s) +Signature = 3008020101090380fe01 + +# Test 159 (Signature with special case values for r and s) +Signature = 30060201ff020100 + +# Test 160 (Signature with special case values for r and s) +Signature = 30060201ff020101 + +# Test 161 (Signature with special case values for r and s) +Signature = 30060201ff0201ff + +# Test 162 (Signature with special case values for r and s) +Signature = 30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 + +# Test 163 (Signature with special case values for r and s) +Signature = 30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140 + +# Test 164 (Signature with special case values for r and s) +Signature = 30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142 + +# Test 165 (Signature with special case values for r and s) +Signature = 30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f + +# Test 166 (Signature with special case values for r and s) +Signature = 30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30 + +# Test 167 (Signature with special case values for r and s) +Signature = 30080201ff090380fe01 + +# Test 168 (Signature with special case values for r and s) +Signature = 3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020100 + +# Test 169 (Signature with special case values for r and s) +Signature = 3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020101 + +# Test 170 (Signature with special case values for r and s) +Signature = 3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201ff + +# Test 171 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 + +# Test 172 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140 + +# Test 173 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142 + +# Test 174 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f + +# Test 175 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30 + +# Test 176 (Signature with special case values for r and s) +Signature = 3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141090380fe01 + +# Test 177 (Signature with special case values for r and s) +Signature = 3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020100 + +# Test 178 (Signature with special case values for r and s) +Signature = 3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020101 + +# Test 179 (Signature with special case values for r and s) +Signature = 3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641400201ff + +# Test 180 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 + +# Test 181 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140 + +# Test 182 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142 + +# Test 183 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f + +# Test 184 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30 + +# Test 185 (Signature with special case values for r and s) +Signature = 3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140090380fe01 + +# Test 186 (Signature with special case values for r and s) +Signature = 3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020100 + +# Test 187 (Signature with special case values for r and s) +Signature = 3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020101 + +# Test 188 (Signature with special case values for r and s) +Signature = 3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641420201ff + +# Test 189 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 + +# Test 190 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140 + +# Test 191 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142 + +# Test 192 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f + +# Test 193 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30 + +# Test 194 (Signature with special case values for r and s) +Signature = 3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142090380fe01 + +# Test 195 (Signature with special case values for r and s) +Signature = 3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020100 + +# Test 196 (Signature with special case values for r and s) +Signature = 3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020101 + +# Test 197 (Signature with special case values for r and s) +Signature = 3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0201ff + +# Test 198 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 + +# Test 199 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140 + +# Test 200 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142 + +# Test 201 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f + +# Test 202 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30 + +# Test 203 (Signature with special case values for r and s) +Signature = 3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f090380fe01 + +# Test 204 (Signature with special case values for r and s) +Signature = 3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020100 + +# Test 205 (Signature with special case values for r and s) +Signature = 3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020101 + +# Test 206 (Signature with special case values for r and s) +Signature = 3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc300201ff + +# Test 207 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 + +# Test 208 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140 + +# Test 209 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142 + +# Test 210 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f + +# Test 211 (Signature with special case values for r and s) +Signature = 3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30 + +# Test 212 (Signature with special case values for r and s) +Signature = 3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30090380fe01 + +# Test 213 (Edge case for Shamir multiplication) +Msg = 3235353835 +Valid = 1 +Signature = 3045022100dd1b7d09a7bd8218961034a39a87fecf5314f00c4d25eb58a07ac85e85eab516022035138c401ef8d3493d65c9002fe62b43aee568731b744548358996d9cc427e06 + +Px = 0x7310f90a9eae149a08402f54194a0f7b4ac427bf8d9bd6c7681071dc47dc362 +Py = 0x26a6d37ac46d61fd600c0bf1bff87689ed117dda6b0e59318ae010a197a26ca0 +# Test 214 (k*G has a large x-coordinate) +Msg = 313233343030 +Signature = 30360211014551231950b75fc4402da1722fc9baeb022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e + +# Test 215 (r too large) +Valid = 0 +Signature = 3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2c022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e + +Px = 0xbc97e7585eecad48e16683bc4091708e1a930c683fc47001d4b383594f2c4e22 +Py = 0x705989cf69daeadd4e4e4b8151ed888dfec20fb01728d89d56b3f38f2ae9c8c5 +# Test 216 (r,s are large) +Valid = 1 +Signature = 3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e + +Px = 0x44ad339afbc21e9abf7b602a5ca535ea378135b6d10d81310bdd8293d1df3252 +Py = 0xb63ff7d0774770f8fe1d1722fa83acd02f434e4fc110a0cc8f6dddd37d56c463 +# Test 217 (r and s^-1 have a large Hamming weight) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203e9a7582886089c62fb840cf3b83061cd1cff3ae4341808bb5bdee6191174177 + +Px = 0x1260c2122c9e244e1af5151bede0c3ae23b54d7c596881d3eebad21f37dd878c +Py = 0x5c9a0c1a9ade76737a8811bd6a7f9287c978ee396aa89c11e47229d2ccb552f0 +# Test 218 (r and s^-1 have a large Hamming weight) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022024238e70b431b1a64efdf9032669939d4b77f249503fc6905feb7540dea3e6d2 + +Px = 0x1877045be25d34a1d0600f9d5c00d0645a2a54379b6ceefad2e6bf5c2a3352ce +Py = 0x821a532cc1751ee1d36d41c3d6ab4e9b143e44ec46d73478ea6a79a5c0e54159 +# Test 219 (small r and s) +Signature = 3006020101020101 + +Px = 0x455439fcc3d2deeceddeaece60e7bd17304f36ebb602adf5a22e0b8f1db46a50 +Py = 0xaec38fb2baf221e9a8d1887c7bf6222dd1834634e77263315af6d23609d04f77 +# Test 220 (small r and s) +Signature = 3006020101020102 + +Px = 0x2e1f466b024c0c3ace2437de09127fed04b706f94b19a21bb1c2acf35cece718 +Py = 0x449ae3523d72534e964972cfd3b38af0bddd9619e5af223e4d1a40f34cf9f1d +# Test 221 (small r and s) +Signature = 3006020101020103 + +# Test 222 (r is larger than n) +Valid = 0 +Signature = 3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020103 + +Px = 0xdda95d7b0698de5d2d0b4f0034dbe35b50f978fcc518a84abf9c99efd96a2530 +Py = 0x5adc08d6a63dbe831ab99cd9146e3c4c45492ad19521612542256d6af60e7888 +# Test 223 (s is larger than n) +Signature = 3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd04917c8 + +Px = 0x2ef4d6d6cfd5a94f1d7784226e3e2a6c0a436c55839619f38fb4472b5f9ee77 +Py = 0x7eb4acd4eebda5cd72875ffd2a2f26229c2dc6b46500919a432c86739f3ae866 +# Test 224 (small r and s^-1) +Valid = 1 +Signature = 302702020101022100c58b162c58b162c58b162c58b162c58a1b242973853e16db75c8a1a71da4d39d + +Px = 0x464f4ff715729cae5072ca3bd801d3195b67aec65e9b01aad20a2943dcbcb584 +Py = 0xb1afd29d31a39a11d570aa1597439b3b2d1971bf2f1abf15432d0207b10d1d08 +# Test 225 (smallish r and s^-1) +Signature = 302c02072d9b4d347952cc022100fcbc5103d0da267477d1791461cf2aa44bf9d43198f79507bd8779d69a13108e + +Px = 0x157f8fddf373eb5f49cfcf10d8b853cf91cbcd7d665c3522ba7dd738ddb79a4c +Py = 0xdeadf1a5c448ea3c9f4191a8999abfcc757ac6d64567ef072c47fec613443b8f +# Test 226 (100-bit r and small s^-1) +Signature = 3032020d1033e67e37b32b445580bf4efc022100906f906f906f906f906f906f906f906ed8e426f7b1968c35a204236a579723d2 + +Px = 0x934a537466c07430e2c48feb990bb19fb78cecc9cee424ea4d130291aa237f0 +Py = 0xd4f92d23b462804b5b68c52558c01c9996dbf727fccabbeedb9621a400535afa +# Test 227 (small r and 100 bit s^-1) +Signature = 3026020201010220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57 + +Px = 0xd6ef20be66c893f741a9bf90d9b74675d1c2a31296397acb3ef174fd0b300c65 +Py = 0x4a0c95478ca00399162d7f0f2dc89efdc2b28a30fbabe285857295a4b0c4e265 +# Test 228 (100-bit r and s^-1) +Signature = 3031020d062522bbd3ecbe7c39e93e7c260220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57 + +Px = 0xb7291d1404e0c0c07dab9372189f4bd58d2ceaa8d15ede544d9514545ba9ee06 +Py = 0x29c9a63d5e308769cc30ec276a410e6464a27eeafd9e599db10f053a4fe4a829 +# Test 229 (r and s^-1 are close to n) +Signature = 3045022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03640c1022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0 + +Px = 0xbb79f61857f743bfa1b6e7111ce4094377256969e4e15159123d9548acc3be6c +Py = 0x1f9d9f8860dcffd3eb36dd6c31ff2e7226c2009c4c94d8d7d2b5686bf7abd677 +# Test 230 (s == 1) +Signature = 3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020101 + +# Test 231 (s == 0) +Valid = 0 +Signature = 3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020100 + +Px = 0xd533b789a4af890fa7a82a1fae58c404f9a62a50b49adafab349c513b4150874 +Py = 0x1b4171b803e76b34a9861e10f7bc289a066fd01bd29f84c987a10a5fb18c2d4 +# Test 232 (point at infinity during verify) +Signature = 304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0 + +Px = 0xfeb5163b0ece30ff3e03c7d55c4380fa2fa81ee2c0354942ff6f08c99d0cd82c +Py = 0xe87de05ee1bda089d3e4e248fa0f721102acfffdf50e654be281433999df897e +# Test 233 (u1 == 1) +Valid = 1 +Signature = 3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023 + +Px = 0x238ced001cf22b8853e02edc89cbeca5050ba7e042a7a77f9382cd4149228976 +Py = 0x40683d3094643840f295890aa4c18aa39b41d77dd0fb3bb2700e4f9ec284ffc2 +# Test 234 (u1 == n - 1) +Signature = 3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022044a5ad0bd0636d9e12bc9e0a6bdd5e1bba77f523842193b3b82e448e05d5f11e + +Px = 0x961cf64817c06c0e51b3c2736c922fde18bd8c4906fcd7f5ef66c4678508f35e +Py = 0xd2c5d18168cfbe70f2f123bd7419232bb92dd69113e2941061889481c5a027bf +# Test 235 (u2 == 1) +Signature = 3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8 + +Px = 0x13681eae168cd4ea7cf2e2a45d052742d10a9f64e796867dbdcb829fe0b10288 +Py = 0x16528760d177376c09df79de39557c329cc1753517acffe8fa2ec298026b8384 +# Test 236 (u2 == n - 1) +Signature = 3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b89 + +Px = 0x5aa7abfdb6b4086d543325e5d79c6e95ce42f866d2bb84909633a04bb1aa31c2 +Py = 0x91c80088794905e1da33336d874e2f91ccf45cc59185bede5dd6f3f7acaae18b +# Test 237 (edge case for u1) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100e91e1ba6ba898620a46bcb51dc0b8b4ad1dc35dad892c4552d1847b2ce444637 + +Px = 0x277791b305a45b2b39590b2f05d3392a6c8182cef4eb540120e0f5c206c3e4 +Py = 0x64108233fb0b8c3ac892d79ef8e0fbf92ed133addb4554270132584dc52eef41 +# Test 238 (edge case for u1) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100e36bf0cec06d9b841da81332812f74f30bbaec9f202319206c6f0b8a0a400ff7 + +Px = 0x6efa092b68de9460f0bcc919005a5f6e80e19de98968be3cd2c770a9949bfb1a +Py = 0xc75e6e5087d6550d5f9beb1e79e5029307bc255235e2d5dc99241ac3ab886c49 +# Test 239 (edge case for u1) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ea26b57af884b6c06e348efe139c1e4e9ec9518d60c340f6bac7d278ca08d8a6 + +Px = 0x72d4a19c4f9d2cf5848ea40445b70d4696b5f02d632c0c654cc7d7eeb0c6d058 +Py = 0xe8c4cd9943e459174c7ac01fa742198e47e6c19a6bdb0c4f6c237831c1b3f942 +# Test 240 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205b1d27a7694c146244a5ad0bd0636d9d9ef3b9fb58385418d9c982105077d1b7 + +Px = 0x2a8ea2f50dcced0c217575bdfa7cd47d1c6f100041ec0e35512794c1be7e7402 +Py = 0x58f8c17122ed303fda7143eb58bede70295b653266013b0b0ebd3f053137f6ec +# Test 241 (edge case for u1) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d27a7694c146244a5ad0bd0636d9e12abe687897e8e9998ddbd4e59a78520d0f + +Px = 0x88de689ce9af1e94be6a2089c8a8b1253ffdbb6c8e9c86249ba220001a4ad3b8 +Py = 0xc4998e54842f413b9edb1825acbb6335e81e4d184b2b01c8bebdc85d1f28946 +# Test 242 (edge case for u1) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100a4f4ed29828c4894b5a17a0c6db3c256c2221449228a92dff7d76ca8206dd8dd + +Px = 0xfea2d31f70f90d5fb3e00e186ac42ab3c1615cee714e0b4e1131b3d4d8225bf7 +Py = 0xb037a18df2ac15343f30f74067ddf29e817d5f77f8dce05714da59c094f0cda9 +# Test 243 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220694c146244a5ad0bd0636d9e12bc9e09e60e68b90d0b5e6c5dddd0cb694d8799 + +Px = 0x7258911e3d423349166479dbe0b8341af7fbd03d0a7e10edccb36b6ceea5a3db +Py = 0x17ac2b8992791128fa3b96dc2fbd4ca3bfa782ef2832fc6656943db18e7346b0 +# Test 244 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203d7f487c07bfc5f30846938a3dcef696444707cf9677254a92b06c63ab867d22 + +Px = 0x4f28461dea64474d6bb34d1499c97d37b9e95633df1ceeeaacd45016c98b3914 +Py = 0xc8818810b8cc06ddb40e8a1261c528faa589455d5a6df93b77bc5e0e493c7470 +# Test 245 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206c7648fc0fbf8a06adb8b839f97b4ff7a800f11b1e37c593b261394599792ba4 + +Px = 0x74f2a814fb5d8eca91a69b5e60712732b3937de32829be974ed7b68c5c2f5d66 +Py = 0xeff0f07c56f987a657f42196205f588c0f1d96fd8a63a5f238b48f478788fe3b +# Test 246 (edge case for u1) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0221009be363a286f23f6322c205449d320baad417953ecb70f6214e90d49d7d1f26a8 + +Px = 0x195b51a7cc4a21b8274a70a90de779814c3c8ca358328208c09a29f336b82d6a +Py = 0xb2416b7c92fffdc29c3b1282dd2a77a4d04df7f7452047393d849989c5cee9ad +# Test 247 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022029798c5c45bdf58b4a7b2fdc2c46ab4af1218c7eeb9f0f27a88f1267674de3b0 + +Px = 0x622fc74732034bec2ddf3bc16d34b3d1f7a327dd2a8c19bab4bb4fe3a24b58aa +Py = 0x736b2f2fae76f4dfaecc9096333b01328d51eb3fda9c9227e90d0b449983c4f0 +# Test 248 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02200b70f22ca2bb3cefadca1a5711fa3a59f4695385eb5aedf3495d0b6d00f8fd85 + +Px = 0x1f7f85caf2d7550e7af9b65023ebb4dce3450311692309db269969b834b611c7 +Py = 0x827f45b78020ecbbaf484fdd5bfaae6870f1184c21581baf6ef82bd7b530f93 +# Test 249 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022016e1e459457679df5b9434ae23f474b3e8d2a70bd6b5dbe692ba16da01f1fb0a + +Px = 0x49c197dc80ad1da47a4342b93893e8e1fb0bb94fc33a83e783c00b24c781377a +Py = 0xefc20da92bac762951f72474becc734d4cc22ba81b895e282fdac4df7af0f37d +# Test 250 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202252d685e831b6cf095e4f0535eeaf0ddd3bfa91c210c9d9dc17224702eaf88f + +Px = 0xd8cb68517b616a56400aa3868635e54b6f699598a2f6167757654980baf6acbe +Py = 0x7ec8cf449c849aa03461a30efada41453c57c6e6fbc93bbc6fa49ada6dc0555c +# Test 251 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022075135abd7c425b60371a477f09ce0f274f64a8c6b061a07b5d63e93c65046c53 + +Px = 0x30713fb63f2aa6fe2cadf1b20efc259c77445dafa87dac398b84065ca347df3 +Py = 0xb227818de1a39b589cb071d83e5317cccdc2338e51e312fe31d8dc34a4801750 +# Test 252 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d55555555555555555555555555555547c74934474db157d2a8c3f088aced62a + +Px = 0xbabb3677b0955802d8e929a41355640eaf1ea1353f8a771331c4946e3480afa7 +Py = 0x252f196c87ed3d2a59d3b1b559137fed0013fecefc19fb5a92682b9bca51b950 +# Test 253 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100c1777c8853938e536213c02464a936000ba1e21c0fc62075d46c624e23b52f31 + +Px = 0x1aab2018793471111a8a0e9b143fde02fc95920796d3a63de329b424396fba60 +Py = 0xbbe4130705174792441b318d3aa31dfe8577821e9b446ec573d272e036c4ebe9 +# Test 254 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022030bbb794db588363b40679f6c182a50d3ce9679acdd3ffbe36d7813dacbdc818 + +Px = 0x8cb0b909499c83ea806cd885b1dd467a0119f06a88a0276eb0cfda274535a8ff +Py = 0x47b5428833bc3f2c8bf9d9041158cf33718a69961cd01729bc0011d1e586ab75 +# Test 255 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202c37fd995622c4fb7fffffffffffffffc7cee745110cb45ab558ed7c90c15a2f + +Px = 0x8f03cf1a42272bb1532723093f72e6feeac85e1700e9fbe9a6a2dd642d74bf5d +Py = 0x3b89a7189dad8cf75fc22f6f158aa27f9c2ca00daca785be3358f2bda3862ca0 +# Test 256 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02207fd995622c4fb7ffffffffffffffffff5d883ffab5b32652ccdcaa290fccb97d + +Px = 0x44de3b9c7a57a8c9e820952753421e7d987bb3d79f71f013805c897e018f8ace +Py = 0xa2460758c8f98d3fdce121a943659e372c326fff2e5fc2ae7fa3f79daae13c12 +# Test 257 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ffb32ac4589f6ffffffffffffffffffebb107ff56b664ca599b954521f9972fa + +Px = 0x6fb8b2b48e33031268ad6a517484dc8839ea90f6669ea0c7ac3233e2ac31394a +Py = 0xac8bbe7f73c2ff4df9978727ac1dfc2fd58647d20f31f99105316b64671f204 +# Test 258 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205622c4fb7fffffffffffffffffffffff928a8f1c7ac7bec1808b9f61c01ec327 + +Px = 0xbea71122a048693e905ff602b3cf9dd18af69b9fc9d8431d2b1dd26b942c95e6 +Py = 0xf43c7b8b95eb62082c12db9dbda7fe38e45cbe4a4886907fb81bdb0c5ea9246c +# Test 259 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022044104104104104104104104104104103b87853fd3b7d3f8e175125b4382f25ed + +Px = 0xda918c731ba06a20cb94ef33b778e981a404a305f1941fe33666b45b03353156 +Py = 0xe2bb2694f575b45183be78e5c9b5210bf3bf488fd4c8294516d89572ca4f5391 +# Test 260 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202739ce739ce739ce739ce739ce739ce705560298d1f2f08dc419ac273a5b54d9 + +Px = 0x3007e92c3937dade7964dfa35b0eff031f7eb02aed0a0314411106cdeb70fe3d +Py = 0x5a7546fc0552997b20e3d6f413e75e2cb66e116322697114b79bac734bfc4dc5 +# Test 261 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100b777777777777777777777777777777688e6a1fe808a97a348671222ff16b863 + +Px = 0x60e734ef5624d3cbf0ddd375011bd663d6d6aebc644eb599fdf98dbdcd18ce9b +Py = 0xd2d90b3ac31f139af832cccf6ccbbb2c6ea11fa97370dc9906da474d7d8a7567 +# Test 262 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206492492492492492492492492492492406dd3a19b8d5fb875235963c593bd2d3 + +Px = 0x85a900e97858f693c0b7dfa261e380dad6ea046d1f65ddeeedd5f7d8af0ba337 +Py = 0x69744d15add4f6c0bc3b0da2aec93b34cb8c65f9340ddf74e7b0009eeeccce3c +# Test 263 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100955555555555555555555555555555547c74934474db157d2a8c3f088aced62c + +Px = 0x38066f75d88efc4c93de36f49e037b234cc18b1de5608750a62cab0345401046 +Py = 0xa3e84bed8cfcb819ef4d550444f2ce4b651766b69e2e2901f88836ff90034fed +# Test 264 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3e3a49a23a6d8abe95461f8445676b17 + +Px = 0x98f68177dc95c1b4cbfa5245488ca523a7d5629470d035d621a443c72f39aabf +Py = 0xa33d29546fa1c648f2c7d5ccf70cf1ce4ab79b5db1ac059dbecd068dbdff1b89 +# Test 265 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100bffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364143 + +Px = 0x5c2bbfa23c9b9ad07f038aa89b4930bf267d9401e4255de9e8da0a5078ec8277 +Py = 0xe3e882a31d5e6a379e0793983ccded39b95c4353ab2ff01ea5369ba47b0c3191 +# Test 266 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220185ddbca6dac41b1da033cfb60c152869e74b3cd66e9ffdf1b6bc09ed65ee40c + +Px = 0x2ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a385 +Py = 0x3547808298448edb5e701ade84cd5fb1ac9567ba5e8fb68a6b933ec4b5cc84cc +# Test 267 (point duplication during verification) +Signature = 3045022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda022100d612c2984c2afa416aa7f2882a486d4a8426cb6cfc91ed5b737278f9fca8be68 + +Px = 0x2ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a385 +Py = 0xcab87f7d67bb7124a18fe5217b32a04e536a9845a1704975946cc13a4a337763 +# Test 268 (duplication bug) +Valid = 0 +Signature = 3045022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda022100d612c2984c2afa416aa7f2882a486d4a8426cb6cfc91ed5b737278f9fca8be68 + +Px = 0x8aa2c64fa9c6437563abfbcbd00b2048d48c18c152a2a6f49036de7647ebe82e +Py = 0x1ce64387995c68a060fa3bc0399b05cc06eec7d598f75041a4917e692b7f51ff +# Test 269 (comparison with point at infinity ) +Signature = 3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0022033333333333333333333333333333332f222f8faefdb533f265d461c29a47373 + +Px = 0x391427ff7ee78013c14aec7d96a8a062209298a783835e94fd6549d502fff71f +Py = 0xdd6624ec343ad9fcf4d9872181e59f842f9ba4cccae09a6c0972fb6ac6b4c6bd +# Test 270 (extreme value for k) +Valid = 1 +Signature = 3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0 + +Px = 0x3f3952199774c7cf39b38b66cb1042a6260d8680803845e4d433adba3bb24818 +Py = 0x5ea495b68cbc7ed4173ee63c9042dc502625c7eb7e21fb02ca9a9114e0a3a18d +# Test 271 (extreme value for k) +Signature = 3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0 + +Px = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 +Py = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 +# Test 272 (testing point duplication) +Valid = 0 +Signature = 3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca60502302202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952 + +# Test 273 (testing point duplication) +Signature = 3044022044a5ad0bd0636d9e12bc9e0a6bdd5e1bba77f523842193b3b82e448e05d5f11e02202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952 + +Px = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 +Py = 0xb7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777 +# Test 274 (testing point duplication) +Signature = 3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca60502302202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952 + +# Test 275 (testing point duplication) +Signature = 3044022044a5ad0bd0636d9e12bc9e0a6bdd5e1bba77f523842193b3b82e448e05d5f11e02202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952 + +Px = 0x782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963 +Py = 0xaf9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152 +# Test 276 (pseudorandom signature) +Msg = +Valid = 1 +Signature = 3046022100f80ae4f96cdbc9d853f83d47aae225bf407d51c56b7776cd67d0dc195d99a9dc022100b303e26be1f73465315221f0b331528807a1a9b6eb068ede6eebeaaa49af8a36 + +# Test 277 (pseudorandom signature) +Signature = 3045022046c6a602c620ad6dd9bcc38fdbde3786a8b39186595aa110485279d27d08af0d0221008653eae21ae129a1133188611946d73f56c7cd63454397ea9ea4db46f7e8e77e + +# Test 278 (pseudorandom signature) +Signature = 3045022100e1d93efb91cd529957a435f3e7638b4a5eae4f32ed6c639e9975178a79389bbc02206929c855b1d62009586260fb3507d89271a2f0356156a7017a628bfb4dba3d6a + +# Test 279 (pseudorandom signature) +Signature = 304502201b3dbb40c2f3d2ed950b32f0b49464f3d4e57e533f9d6d20e8bfb5b8fe3f10660221008effca43042829b985a4c4f839168e111fbfe496a6e631a9ca6b4616b56d34ce + +# Test 280 (pseudorandom signature) +Signature = 304402200f97f629b81d7b795deb6f7cb13934701c55b050a407e9ae2472c077eac7c3d302205b73afed87128d98d41e50b639b92c1a4ace56959410ac2542ce0a366e27d248 + +# Test 281 (pseudorandom signature) +Signature = 3046022100dcdbe5ccd4caa1c29e72f88c8c4d68480a46a639f6c15c1876990513605f6250022100819b949534af8952d203e84470f92faad40dc7eb373c44d0a1dd7c0bde78e7df + +# Test 282 (pseudorandom signature) +Signature = 3046022100b232ec1e548d0099a131ebca06f69233bdd5e8b0e40836555d3a011697021b51022100febcf8aeabb0d837f13eb3282714c9145932ceec359faffbb191b081436832bf + +# Test 283 (pseudorandom signature) +Signature = 30440220405881c4921cb39611b7da245a3f16fc47065a5a4b5bf0b8168eac6e970e2b1f02202f3ec1022ccc0788b9a85567b896dacec87e4f1737bd2db5a10519690740cc63 + +# Test 284 (pseudorandom signature) +Signature = 30450220070b3ac51f721c3c256d0af38e6c8665189e125540bf24cb0143333f9d011ead022100b17016b278f763fdbc185e648ffad2bed15803ce43af7c4865c066a4e86fb523 + +# Test 285 (pseudorandom signature) +Signature = 304402204e264eb2ab4133aa7fa687f972f1e63fcf9e8e215918a76f27b8fc7443d397db022034634536ea7d4babcad17eb108f70ded16937d3bb1c679393e55583e17b0e9d1 + +# Test 286 (pseudorandom signature) +Msg = 4d7367 +Signature = 30450220109cd8ae0374358984a8249c0a843628f2835ffad1df1a9a69aa2fe72355545c022100ac6f00daf53bd8b1e34da329359b6e08019c5b037fed79ee383ae39f85a159c6 + +# Test 287 (pseudorandom signature) +Signature = 3045022100b75c7a80d04d252fc4de897faa22778007d04d84f05dffd446a0e20f707faf8302204b86a97e3c3c4b2eb2f29568c663ff6dcf1d0bfbadcf465f209933bd6dd22d6d + +# Test 288 (pseudorandom signature) +Signature = 304502204df1eb0f8f8d552865c3115c62cde2c3c1e3498e8e42b9a0edd51610f8c83bf1022100a94c200a354237fd789d17d2effb21a1958ae608da1452402fe94065ac37f332 + +# Test 289 (pseudorandom signature) +Signature = 304502202ea8eda3df2968e21ffc7af2a0bf960d11bb1677d35e74cf2225221d1531c880022100a0fc494bca24f8aab343479f53f3749d80d0479b983c013a6c0cb3cd7d359f74 + +# Test 290 (pseudorandom signature) +Signature = 304502206b0e22b021a0169a07c9585e04c750e56e6112851ccb791b7fa9216c043c3a18022100b41078a9452b3f708322585ee2bb063c106c24c998b321c45c0860f3fb889125 + +# Test 291 (pseudorandom signature) +Signature = 30460221008111b8f2f92e729d540c24192b468980288dc6d29f39b3c87c17d0fdacc8831e022100b6684fb2b413a1f496677ba1adb845aa6e5a109b9b398260e1dc98b5e4931f06 + +# Test 292 (pseudorandom signature) +Signature = 3045022100bedcc4a861790226833df84cc110dc68ff4299458c9b3ada6d085a1c722a3d5b022059f2580b59e751a02efbdd0637c444f843d602c9df153d611b16e6e604356f1a + +# Test 293 (pseudorandom signature) +Signature = 304402206b3ffb0f27a25790cbd38358b6365a6b80c66bbacb710e548d348ec23831218f022065386fce0e4194b7c1370485712611c178da62a60ddc27185d0682c842c812f5 + +# Test 294 (pseudorandom signature) +Signature = 304502204aef876a310ed2ff28b48a3ff393463afd5f2ecff75738a1dee6487a6bb5f5ed022100c2545ca60c5e3cfd38796f1f375b9393db1697ec7e718cf0bd4942288ebd23d4 + +# Test 295 (pseudorandom signature) +Signature = 3045022100d341dd19d66897465a42c5f74434553f3ffe43caeeea7348d1f046fa945344ac022048e39471186694e32a5e615d371fbfbc14cce501e5453bae3e8e218bccc43e59 + +# Test 296 (pseudorandom signature) +Msg = 313233343030 +Signature = 3045022100d035ee1f17fdb0b2681b163e33c359932659990af77dca632012b30b27a057b302201939d9f3b2858bc13e3474cb50e6a82be44faa71940f876c1cba4c3e989202b6 + +# Test 297 (pseudorandom signature) +Signature = 3046022100a2d376c52ef94bf6e458502ddf32b43e52cb6d7ca0aaf50f2e00421005507e4c022100d144a2f15c45eb048513756479eaf3fba64775297593c344596e6b3c19662c05 + +# Test 298 (pseudorandom signature) +Signature = 3046022100f0fd2a0a44f1a2444a8b49f6de26828ee161c238ed113a722405eec674d1a71802210099a2ce92ee0a0fe669ddbe0ef8ea2c1d51110c2136893fadf4db87f3d99d6fec + +# Test 299 (pseudorandom signature) +Signature = 3045022067acccba4288731964d2c74d4f4d001285105ea16a9223de721aa0aa0e6fd724022100fdf87529c6fdafca416bbb071a9ecbead4687f8fd948c3c5a48675a4cbee226f + +# Test 300 (pseudorandom signature) +Signature = 30460221009cf78df6b7686451059d3ca9647f1371daf216a21788b85ec11f54969d6fc1af022100c7f983d6ae7c76b7257ff3ae58014b6fc9853819b83279be91ed04a529c6551e + +# Test 301 (pseudorandom signature) +Signature = 3046022100fed6582391724cbdd28c5b814f5e357480b87277bb8d6872ceee9952440603bc022100f0cc3470b86bf97fd7ccd6cc1e1aa963a6159bdaa5c76eea77bf923363b77ca0 + +# Test 302 (pseudorandom signature) +Signature = 30450221009a2a710a7be6ec784fe7369543f77b44b2bb62a8e50be7098ca9226802652de10220070c8fcc0725750cfbb0c9efbad090a534fb2dd62487671bfd0ea6eb10000283 + +# Test 303 (pseudorandom signature) +Signature = 3045022072838caadc9e97cb56f81e98a99f14a3a07bd0e5ca8df695240be9533cb76fe7022100e13aaa4a7cdf7600d9c333cffbe7d75f796df2440d0be68a46a9267ff312a56d + +# Test 304 (pseudorandom signature) +Signature = 304502206e68dcc3b4a48cd0b031674a2d02d9e06868f218af75aae889a7fe09d9ed7574022100f951cf44dc5ed5069b43f7758f9ff1e96bfb936b2bb5d305fc929712a9f3adf3 + +# Test 305 (pseudorandom signature) +Signature = 304402203fe91e6efd953769e8c016619d851cdadc6979d0dc337956cb4464cb756aa8770220596e2605e17a12f84d96d0321ecad44f4cb7f019d69fed9ca9ea67c9454b3ee0 + +# Test 306 (pseudorandom signature) +Msg = 0000000000000000000000000000000000000000 +Signature = 304402204f053f563ad34b74fd8c9934ce59e79c2eb8e6eca0fef5b323ca67d5ac7ed23802204d4b05daa0719e773d8617dce5631c5fd6f59c9bdc748e4b55c970040af01be5 + +# Test 307 (pseudorandom signature) +Signature = 3046022100e2f7b85c9f8bf762fa478180e983a35ac1cd686ffcce7b2375f52e8919f7b7a5022100b72ad2cac62d18005f89b973924f65104a6f04dca5bb974e3b08d057c3683a74 + +# Test 308 (pseudorandom signature) +Signature = 3045022100ff89d088eac71769a192339c28bdddc4b0cd7d8c1e86b14dc469748a7040475702204b99e739a65bdbd32957e913dcbc72f7022a1679b095516496d92c785f0d1fe9 + +# Test 309 (pseudorandom signature) +Signature = 3046022100a4437b483cd616d650cd5200621fc3b298e9a2bbab2c3606289f65d8f16d64c1022100e7450d20cb0a63308ee9c77c18c67ba1b8caecb69ae5bf420c64124c8aab79b8 + +# Test 310 (pseudorandom signature) +Signature = 304602210096d3703f3090e60bb60f7c91d6d9e3ad1d7bde144a3c8b2c6000e40381dbdfbf022100e331e363e91a2ae3eedbdc6d1a8ff3bfa614e277795d12ed909ef78c527412f2 + +# Test 311 (pseudorandom signature) +Signature = 304502200a7a8c229fb5bf41cc36fb62c01aa83a237c36325e1bdcbc35576058b56f05dc022100bfd63a7787e3322eddbeacceb1cb9a5ee449d506cd3d4b361124c9d106409135 + +# Test 312 (pseudorandom signature) +Signature = 3045022100a09cc138a2e1f90b142fe2958780e8081c624a0c72941a2cb584b3ab683f0e47022049eff087ef11d3e3f621d3bef8b9f44123cc6c250cc2de150af5ffaaf60cd60c + +# Test 313 (pseudorandom signature) +Signature = 304402207c94d4b2805e696cb40bfabaa29747cd54600c87100e2f38bd8f5f84afafc1aa02203222524423f4756f95235958d2e4170ef9cfa3181465369214ef556415bbf42b + +# Test 314 (pseudorandom signature) +Signature = 304502205a53a0291cb7e6f6e0a7264ce62b85ea366daede336553f9e15da76a9bdfb4a3022100d6caf6bc6f199c452c5bc04878697bfe815bf2015e66b04a9fc4ad63591ea2ff + +# Test 315 (pseudorandom signature) +Signature = 30460221008ab746e7e79bf53962ec0fc67917fd55e5bc9f4e459afd89f9ac90260705247d022100b5edfecab34048daf4db6c59fcddfc78429377215d2394cb31de1437103e52c1 + +Px = 0x6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff +Py = 0x1060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1 +# Test 316 (y-coordinate of the public key is small) +Msg = 4d657373616765 +Signature = 304402206d6a4f556ccce154e7fb9f19e76c3deca13d59cc2aeb4ecad968aab2ded45965022053b9fa74803ede0fc4441bf683d56c564d3e274e09ccf47390badd1471c05fb7 + +# Test 317 (y-coordinate of the public key is small) +Signature = 3046022100aad503de9b9fd66b948e9acf596f0a0e65e700b28b26ec56e6e45e846489b3c4022100fff223c5d0765447e8447a3f9d31fd0696e89d244422022ff61a110b2a8c2f04 + +# Test 318 (y-coordinate of the public key is small) +Signature = 30460221009182cebd3bb8ab572e167174397209ef4b1d439af3b200cdf003620089e43225022100abb88367d15fe62d1efffb6803da03109ee22e90bc9c78e8b4ed23630b82ea9d + +Px = 0x6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff +Py = 0xfffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e +# Test 319 (y-coordinate of the public key is large) +Signature = 304502203854a3998aebdf2dbc28adac4181462ccac7873907ab7f212c42db0e69b56ed8022100c12c09475c772fd0c1b2060d5163e42bf71d727e4ae7c03eeba954bf50b43bb3 + +# Test 320 (y-coordinate of the public key is large) +Signature = 3046022100e94dbdc38795fe5c904d8f16d969d3b587f0a25d2de90b6d8c5c53ff887e3607022100856b8c963e9b68dade44750bf97ec4d11b1a0a3804f4cb79aa27bdea78ac14e4 + +# Test 321 (y-coordinate of the public key is large) +Signature = 3044022049fc102a08ca47b60e0858cd0284d22cddd7233f94aaffbb2db1dd2cf08425e102205b16fca5a12cdb39701697ad8e39ffd6bdec0024298afaa2326aea09200b14d6 + +Px = 0x13fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0 +Py = 0xf6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d +# Test 322 (x-coordinate of the public key is small) +Signature = 3045022041efa7d3f05a0010675fcb918a45c693da4b348df21a59d6f9cd73e0d831d67a022100bbab52596c1a1d9484296cdc92cbf07e665259a13791a8fe8845e2c07cf3fc67 + +# Test 323 (x-coordinate of the public key is small) +Signature = 3046022100b615698c358b35920dd883eca625a6c5f7563970cdfc378f8fe0cee17092144c022100da0b84cd94a41e049ef477aeac157b2a9bfa6b7ac8de06ed3858c5eede6ddd6d + +# Test 324 (x-coordinate of the public key is small) +Signature = 304602210087cf8c0eb82d44f69c60a2ff5457d3aaa322e7ec61ae5aecfd678ae1c1932b0e022100c522c4eea7eafb82914cbf5c1ff76760109f55ddddcf58274d41c9bc4311e06e + +Px = 0x25afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dffffffff +Py = 0xfa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35 +# Test 325 (x-coordinate of the public key has many trailing 1's) +Signature = 3045022062f48ef71ace27bf5a01834de1f7e3f948b9dce1ca1e911d5e13d3b104471d82022100a1570cc0f388768d3ba7df7f212564caa256ff825df997f21f72f5280d53011f + +# Test 326 (x-coordinate of the public key has many trailing 1's) +Signature = 3046022100f6b0e2f6fe020cf7c0c20137434344ed7add6c4be51861e2d14cbda472a6ffb40221009be93722c1a3ad7d4cf91723700cb5486de5479d8c1b38ae4e8e5ba1638e9732 + +# Test 327 (x-coordinate of the public key has many trailing 1's) +Signature = 3045022100db09d8460f05eff23bc7e436b67da563fa4b4edb58ac24ce201fa8a358125057022046da116754602940c8999c8d665f786c50f5772c0a3cdbda075e77eabc64df16 + +Px = 0xd12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb9 +Py = 0x3f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff +# Test 328 (y-coordinate of the public key has many trailing 1's) +Signature = 30450220592c41e16517f12fcabd98267674f974b588e9f35d35406c1a7bb2ed1d19b7b8022100c19a5f942607c3551484ff0dc97281f0cdc82bc48e2205a0645c0cf3d7f59da0 + +# Test 329 (y-coordinate of the public key has many trailing 1's) +Signature = 3046022100be0d70887d5e40821a61b68047de4ea03debfdf51cdf4d4b195558b959a032b20221008266b4d270e24414ecacb14c091a233134b918d37320c6557d60ad0a63544ac4 + +# Test 330 (y-coordinate of the public key has many trailing 1's) +Signature = 3046022100fae92dfcb2ee392d270af3a5739faa26d4f97bfd39ed3cbee4d29e26af3b206a02210093645c80605595e02c09a0dc4b17ac2a51846a728b3e8d60442ed6449fd3342b + +Px = 0x6d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000 +Py = 0xe659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb +# Test 331 (x-coordinate of the public key has many trailing 0's) +Signature = 30450220176a2557566ffa518b11226694eb9802ed2098bfe278e5570fe1d5d7af18a943022100ed6e2095f12a03f2eaf6718f430ec5fe2829fd1646ab648701656fd31221b97d + +# Test 332 (x-coordinate of the public key has many trailing 0's) +Signature = 3045022060be20c3dbc162dd34d26780621c104bbe5dace630171b2daef0d826409ee5c2022100bd8081b27762ab6e8f425956bf604e332fa066a99b59f87e27dc1198b26f5caa + +# Test 333 (x-coordinate of the public key has many trailing 0's) +Signature = 3046022100edf03cf63f658883289a1a593d1007895b9f236d27c9c1f1313089aaed6b16ae022100e5b22903f7eb23adc2e01057e39b0408d495f694c83f306f1216c9bf87506074 + +Group = secp256r1 +Px = 0x2927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838 +Py = 0xc7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e +# Test 1 (signature malleability) +Msg = 313233343030 +Signature = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802204cd60b855d442f5b3c7b11eb6c4e0ae7525fe710fab9aa7c77a67f79e6fadd76 + +# Test 2 (random signature) +Signature = 3046022100e43dc0edacf7345544d7c28547949164bf882dedcc9db1be918caa02a5f7f7ca022100eb313df522aa9e6dbc0cd45d1ea6edaebd858dca4780a940014363ff7600118d + +# Test 3 (random signature) +Signature = 304502204d1b36126feee49ec974650f8d1a335f8d210e60949642348ad71e476a35cdfe022100a890b9ddbb3f2089ea69fd117fb349ed054c0f0830f671c1a639ed88eec0bc75 + +# Test 4 (random signature) +Signature = 304502200e285057b2f96995a3e6a6511cc4a83a791491610ae3f3571d8ab1080b726cc4022100d8b8325f25fb663eda57d958cc174fa8c36d19d2ccb76d5ac4488d776fcf0b8d + +# Test 5 (random signature) +Signature = 3046022100caf80e1656e0a20237b7c39c8bffdf1831efef84a0b5bd7d404fec77b20efecd022100e8352a15bf01544331281f2f71fd913003acabbc6ab0f47cdc58c8d7bc8a6cd5 + +# Test 6 (random signature) +Signature = 304502206160cb08f98f68d6c62b45babea51bd439d9003a40acb38295f63929bf26027e0221008f6b86c954822054da763c5dc9e5ce22e08814904e438311fa4ff2d79e9f9795 + +# Test 7 (Legacy:ASN encoding of s misses leading 0) +Valid = 0 +Signature = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 8 (valid) +Valid = 1 +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 9 (long form encoding of length) +Valid = 0 +Signature = 30814502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 10 (long form encoding of length) +Signature = 30460281202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 11 (long form encoding of length) +Signature = 304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802812100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 12 (length contains leading 0) +Signature = 3082004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 13 (length contains leading 0) +Signature = 3047028200202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 14 (length contains leading 0) +Signature = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180282002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 15 (wrong length) +Signature = 304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 16 (wrong length) +Signature = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 17 (wrong length) +Signature = 304502212ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 18 (wrong length) +Signature = 3045021f2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 19 (wrong length) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022200b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 20 (wrong length) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 21 (uint32 overflow in length) +Signature = 3085010000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 22 (uint32 overflow in length) +Signature = 304a028501000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 23 (uint32 overflow in length) +Signature = 304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285010000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 24 (uint64 overflow in length) +Signature = 308901000000000000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 25 (uint64 overflow in length) +Signature = 304e02890100000000000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 26 (uint64 overflow in length) +Signature = 304e02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028901000000000000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 27 (length = 2**31 - 1) +Signature = 30847fffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 28 (length = 2**31 - 1) +Signature = 304902847fffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 29 (length = 2**31 - 1) +Signature = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802847fffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 30 (length = 2**32 - 1) +Signature = 3084ffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 31 (length = 2**32 - 1) +Signature = 30490284ffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 32 (length = 2**32 - 1) +Signature = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180284ffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 33 (length = 2**40 - 1) +Signature = 3085ffffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 34 (length = 2**40 - 1) +Signature = 304a0285ffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 35 (length = 2**40 - 1) +Signature = 304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285ffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 36 (length = 2**64 - 1) +Signature = 3088ffffffffffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 37 (length = 2**64 - 1) +Signature = 304d0288ffffffffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 38 (length = 2**64 - 1) +Signature = 304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180288ffffffffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 39 (incorrect length) +Signature = 30ff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 40 (incorrect length) +Signature = 304502ff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 41 (incorrect length) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802ff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 42 (indefinite length without termination) +Signature = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 43 (indefinite length without termination) +Signature = 304502802ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 44 (indefinite length without termination) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 45 (removing sequence) +Signature = + +# Test 46 (appending 0's to sequence) +Signature = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000 + +# Test 47 (prepending 0's to sequence) +Signature = 3047000002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 48 (appending unused 0's) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000 + +# Test 49 (appending unused 0's) +Signature = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 50 (appending null value) +Signature = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500 + +# Test 51 (appending null value) +Signature = 304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 52 (appending null value) +Signature = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500 + +# Test 53 (including garbage) +Signature = 304a498177304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 54 (including garbage) +Signature = 30492500304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 55 (including garbage) +Signature = 3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef + +# Test 56 (including garbage) +Signature = 304a222549817702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 57 (including garbage) +Signature = 30492224250002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 58 (including garbage) +Signature = 304d222202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180004deadbeef022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 59 (including garbage) +Signature = 304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182226498177022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 60 (including garbage) +Signature = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1822252500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 61 (including garbage) +Signature = 304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182223022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef + +# Test 62 (including undefined tags) +Signature = 304daa00bb00cd00304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 63 (including undefined tags) +Signature = 304baa02aabb304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 64 (including undefined tags) +Signature = 304d2228aa00bb00cd0002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 65 (including undefined tags) +Signature = 304b2226aa02aabb02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 66 (including undefined tags) +Signature = 304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182229aa00bb00cd00022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 67 (including undefined tags) +Signature = 304b02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182227aa02aabb022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 68 (using composition with indefinite length) +Signature = 3080304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000 + +# Test 69 (using composition with indefinite length) +Signature = 3049228002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 70 (using composition with indefinite length) +Signature = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000 + +# Test 71 (using composition with wrong tag) +Signature = 3080314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000 + +# Test 72 (using composition with wrong tag) +Signature = 3049228003202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 73 (using composition with wrong tag) +Signature = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280032100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000 + +# Test 74 (Replacing sequence with NULL) +Signature = 0500 + +# Test 75 (changing tag value) +Signature = 2e4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 76 (changing tag value) +Signature = 2f4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 77 (changing tag value) +Signature = 314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 78 (changing tag value) +Signature = 324502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 79 (changing tag value) +Signature = ff4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 80 (changing tag value) +Signature = 304500202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 81 (changing tag value) +Signature = 304501202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 82 (changing tag value) +Signature = 304503202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 83 (changing tag value) +Signature = 304504202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 84 (changing tag value) +Signature = 3045ff202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 85 (changing tag value) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 86 (changing tag value) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18012100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 87 (changing tag value) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18032100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 88 (changing tag value) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18042100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 89 (changing tag value) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18ff2100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 90 (dropping value of sequence) +Signature = 3000 + +# Test 91 (using composition) +Signature = 30493001023044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 92 (using composition) +Signature = 3049222402012b021fa3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 93 (using composition) +Signature = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1822250201000220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 94 (truncate sequence) +Signature = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847 + +# Test 95 (truncate sequence) +Signature = 3044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 96 (indefinite length) +Signature = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000 + +# Test 97 (indefinite length with truncated delimiter) +Signature = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db00 + +# Test 98 (indefinite length with additional element) +Signature = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db05000000 + +# Test 99 (indefinite length with truncated element) +Signature = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db060811220000 + +# Test 100 (indefinite length with garbage) +Signature = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000fe02beef + +# Test 101 (indefinite length with nonempty EOC) +Signature = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0002beef + +# Test 102 (prepend empty sequence) +Signature = 3047300002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 103 (append empty sequence) +Signature = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db3000 + +# Test 104 (sequence of sequence) +Signature = 3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 105 (truncated sequence) +Signature = 302202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18 + +# Test 106 (repeat element in sequence) +Signature = 306802202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 107 (removing integer) +Signature = 3023022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 108 (appending 0's to integer) +Signature = 304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 109 (appending 0's to integer) +Signature = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000 + +# Test 110 (prepending 0's to integer) +Signature = 3047022200002ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 111 (prepending 0's to integer) +Signature = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180223000000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 112 (Replacing integer with NULL) +Signature = 30250500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 113 (Replacing integer with NULL) +Signature = 302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500 + +# Test 114 (dropping value of integer) +Signature = 30250200022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 115 (dropping value of integer) +Signature = 302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180200 + +# Test 116 (modify first byte of integer) +Signature = 3045022029a3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 117 (modify first byte of integer) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022102b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 118 (modify last byte of integer) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e98022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 119 (modify last byte of integer) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b491568475b + +# Test 120 (truncate integer) +Signature = 3044021f2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 121 (truncate integer) +Signature = 3044021fa3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 122 (truncate integer) +Signature = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847 + +# Test 123 (truncate integer) +Signature = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 124 (leading ff in integer) +Signature = 30460221ff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 125 (leading ff in integer) +Signature = 304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180222ff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 126 (infinity) +Signature = 3026090180022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 127 (infinity) +Signature = 302502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18090180 + +# Test 128 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30460221012ba3a8bd6b94d5ed80a6d9d1190a436ebccc0833490686deac8635bcb9bf5369022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 129 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30460221ff2ba3a8bf6b94d5eb80a6d9d1190a436f42fe12d7fad749d4c512a036c0f908c7022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 130 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30450220d45c5741946b2a137f59262ee6f5bc91001af27a5e1117a64733950642a3d1e8022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 131 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3046022100d45c5740946b2a147f59262ee6f5bc90bd01ed280528b62b3aed5fc93f06f739022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 132 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30460221fed45c5742946b2a127f59262ee6f5bc914333f7ccb6f979215379ca434640ac97022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 133 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30460221012ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 134 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3046022100d45c5741946b2a137f59262ee6f5bc91001af27a5e1117a64733950642a3d1e8022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 135 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022101b329f478a2bbd0a6c384ee1493b1f518276e0e4a5375928d6fcd160c11cb6d2c + +# Test 136 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f47aa2bbd0a4c384ee1493b1f518ada018ef05465583885980861905228a + +# Test 137 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180221ff4cd60b865d442f5a3c7b11eb6c4e0ae79578ec6353a20bf783ecb4b6ea97b825 + +# Test 138 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180221fe4cd60b875d442f593c7b11eb6c4e0ae7d891f1b5ac8a6d729032e9f3ee3492d4 + +# Test 139 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022101b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db + +# Test 140 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802204cd60b865d442f5a3c7b11eb6c4e0ae79578ec6353a20bf783ecb4b6ea97b825 + +# Test 141 (Signature with special case values for r and s) +Signature = 3006020100020100 + +# Test 142 (Signature with special case values for r and s) +Signature = 3006020100020101 + +# Test 143 (Signature with special case values for r and s) +Signature = 30060201000201ff + +# Test 144 (Signature with special case values for r and s) +Signature = 3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 + +# Test 145 (Signature with special case values for r and s) +Signature = 3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 + +# Test 146 (Signature with special case values for r and s) +Signature = 3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552 + +# Test 147 (Signature with special case values for r and s) +Signature = 3026020100022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff + +# Test 148 (Signature with special case values for r and s) +Signature = 3026020100022100ffffffff00000001000000000000000000000001000000000000000000000000 + +# Test 149 (Signature with special case values for r and s) +Signature = 3008020100090380fe01 + +# Test 150 (Signature with special case values for r and s) +Signature = 3006020101020100 + +# Test 151 (Signature with special case values for r and s) +Signature = 3006020101020101 + +# Test 152 (Signature with special case values for r and s) +Signature = 30060201010201ff + +# Test 153 (Signature with special case values for r and s) +Signature = 3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 + +# Test 154 (Signature with special case values for r and s) +Signature = 3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 + +# Test 155 (Signature with special case values for r and s) +Signature = 3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552 + +# Test 156 (Signature with special case values for r and s) +Signature = 3026020101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff + +# Test 157 (Signature with special case values for r and s) +Signature = 3026020101022100ffffffff00000001000000000000000000000001000000000000000000000000 + +# Test 158 (Signature with special case values for r and s) +Signature = 3008020101090380fe01 + +# Test 159 (Signature with special case values for r and s) +Signature = 30060201ff020100 + +# Test 160 (Signature with special case values for r and s) +Signature = 30060201ff020101 + +# Test 161 (Signature with special case values for r and s) +Signature = 30060201ff0201ff + +# Test 162 (Signature with special case values for r and s) +Signature = 30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 + +# Test 163 (Signature with special case values for r and s) +Signature = 30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 + +# Test 164 (Signature with special case values for r and s) +Signature = 30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552 + +# Test 165 (Signature with special case values for r and s) +Signature = 30260201ff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff + +# Test 166 (Signature with special case values for r and s) +Signature = 30260201ff022100ffffffff00000001000000000000000000000001000000000000000000000000 + +# Test 167 (Signature with special case values for r and s) +Signature = 30080201ff090380fe01 + +# Test 168 (Signature with special case values for r and s) +Signature = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020100 + +# Test 169 (Signature with special case values for r and s) +Signature = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101 + +# Test 170 (Signature with special case values for r and s) +Signature = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510201ff + +# Test 171 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 + +# Test 172 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 + +# Test 173 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552 + +# Test 174 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff + +# Test 175 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000001000000000000000000000000 + +# Test 176 (Signature with special case values for r and s) +Signature = 3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090380fe01 + +# Test 177 (Signature with special case values for r and s) +Signature = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020100 + +# Test 178 (Signature with special case values for r and s) +Signature = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020101 + +# Test 179 (Signature with special case values for r and s) +Signature = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325500201ff + +# Test 180 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 + +# Test 181 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 + +# Test 182 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552 + +# Test 183 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff + +# Test 184 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000001000000000000000000000000 + +# Test 185 (Signature with special case values for r and s) +Signature = 3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550090380fe01 + +# Test 186 (Signature with special case values for r and s) +Signature = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020100 + +# Test 187 (Signature with special case values for r and s) +Signature = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020101 + +# Test 188 (Signature with special case values for r and s) +Signature = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325520201ff + +# Test 189 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 + +# Test 190 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 + +# Test 191 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552 + +# Test 192 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff + +# Test 193 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000001000000000000000000000000 + +# Test 194 (Signature with special case values for r and s) +Signature = 3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552090380fe01 + +# Test 195 (Signature with special case values for r and s) +Signature = 3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020100 + +# Test 196 (Signature with special case values for r and s) +Signature = 3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020101 + +# Test 197 (Signature with special case values for r and s) +Signature = 3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0201ff + +# Test 198 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 + +# Test 199 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 + +# Test 200 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552 + +# Test 201 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff + +# Test 202 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000001000000000000000000000000 + +# Test 203 (Signature with special case values for r and s) +Signature = 3028022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090380fe01 + +# Test 204 (Signature with special case values for r and s) +Signature = 3026022100ffffffff00000001000000000000000000000001000000000000000000000000020100 + +# Test 205 (Signature with special case values for r and s) +Signature = 3026022100ffffffff00000001000000000000000000000001000000000000000000000000020101 + +# Test 206 (Signature with special case values for r and s) +Signature = 3026022100ffffffff000000010000000000000000000000010000000000000000000000000201ff + +# Test 207 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 + +# Test 208 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 + +# Test 209 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552 + +# Test 210 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff + +# Test 211 (Signature with special case values for r and s) +Signature = 3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000001000000000000000000000000 + +# Test 212 (Signature with special case values for r and s) +Signature = 3028022100ffffffff00000001000000000000000000000001000000000000000000000000090380fe01 + +# Test 213 (Edge case for Shamir multiplication) +Msg = 3639383139 +Valid = 1 +Signature = 3044022064a1aab5000d0e804f3e2fc02bdee9be8ff312334e2ba16d11547c97711c898e02206af015971cc30be6d1a206d4e013e0997772a2f91d73286ffd683b9bb2cf4f1b + +Px = 0xad99500288d466940031d72a9f5445a4d43784640855bf0a69874d2de5fe103 +Py = 0xc5011e6ef2c42dcd50d5d3d29f99ae6eba2c80c9244f4c5422f0979ff0c3ba5e +# Test 214 (k*G has a large x-coordinate) +Msg = 313233343030 +Signature = 303502104319055358e8617b0c46353d039cdaab022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e + +# Test 215 (r too large) +Valid = 0 +Signature = 3046022100ffffffff00000001000000000000000000000000fffffffffffffffffffffffc022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e + +Px = 0xab05fd9d0de26b9ce6f4819652d9fc69193d0aa398f0fba8013e09c582204554 +Py = 0x19235271228c786759095d12b75af0692dd4103f19f6a8c32f49435a1e9b8d45 +# Test 216 (r,s are large) +Valid = 1 +Signature = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e + +Px = 0x80984f39a1ff38a86a68aa4201b6be5dfbfecf876219710b07badf6fdd4c6c56 +Py = 0x11feb97390d9826e7a06dfb41871c940d74415ed3cac2089f1445019bb55ed95 +# Test 217 (r and s^-1 have a large Hamming weight) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100909135bdb6799286170f5ead2de4f6511453fe50914f3df2de54a36383df8dd4 + +Px = 0x4201b4272944201c3294f5baa9a3232b6dd687495fcc19a70a95bc602b4f7c05 +Py = 0x95c37eba9ee8171c1bb5ac6feaf753bc36f463e3aef16629572c0c0a8fb0800e +# Test 218 (r and s^-1 have a large Hamming weight) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022027b4577ca009376f71303fd5dd227dcef5deb773ad5f5a84360644669ca249a5 + +Px = 0xa71af64de5126a4a4e02b7922d66ce9415ce88a4c9d25514d91082c8725ac957 +Py = 0x5d47723c8fbe580bb369fec9c2665d8e30a435b9932645482e7c9f11e872296b +# Test 219 (small r and s) +Signature = 3006020105020101 + +Px = 0x6627cec4f0731ea23fc2931f90ebe5b7572f597d20df08fc2b31ee8ef16b1572 +Py = 0x6170ed77d8d0a14fc5c9c3c4c9be7f0d3ee18f709bb275eaf2073e258fe694a5 +# Test 220 (small r and s) +Signature = 3006020105020103 + +Px = 0x5a7c8825e85691cce1f5e7544c54e73f14afc010cb731343262ca7ec5a77f5bf +Py = 0xef6edf62a4497c1bd7b147fb6c3d22af3c39bfce95f30e13a16d3d7b2812f813 +# Test 221 (small r and s) +Signature = 3006020105020105 + +Px = 0xcbe0c29132cd738364fedd603152990c048e5e2fff996d883fa6caca7978c737 +Py = 0x70af6a8ce44cb41224b2603606f4c04d188e80bff7cc31ad5189d4ab0d70e8c1 +# Test 222 (small r and s) +Signature = 3006020105020106 + +# Test 223 (r is larger than n) +Valid = 0 +Signature = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632556020106 + +Px = 0x4be4178097002f0deab68f0d9a130e0ed33a6795d02a20796db83444b037e139 +Py = 0x20f13051e0eecdcfce4dacea0f50d1f247caa669f193c1b4075b51ae296d2d56 +# Test 224 (s is larger than n) +Signature = 3026020105022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc75fbd8 + +Px = 0xd0f73792203716afd4be4329faa48d269f15313ebbba379d7783c97bf3e890d9 +Py = 0x971f4a3206605bec21782bf5e275c714417e8f566549e6bc68690d2363c89cc1 +# Test 225 (small r and s^-1) +Valid = 1 +Signature = 3027020201000221008f1e3c7862c58b16bb76eddbb76eddbb516af4f63f2d74d76e0d28c9bb75ea88 + +Px = 0x4838b2be35a6276a80ef9e228140f9d9b96ce83b7a254f71ccdebbb8054ce05f +Py = 0xfa9cbc123c919b19e00238198d04069043bd660a828814051fcb8aac738a6c6b +# Test 226 (smallish r and s^-1) +Signature = 302c02072d9b4d347952d6022100ef3043e7329581dbb3974497710ab11505ee1c87ff907beebadd195a0ffe6d7a + +Px = 0x7393983ca30a520bbc4783dc9960746aab444ef520c0a8e771119aa4e74b0f64 +Py = 0xe9d7be1ab01a0bf626e709863e6a486dbaf32793afccf774e2c6cd27b1857526 +# Test 227 (100-bit r and small s^-1) +Signature = 3032020d1033e67e37b32b445580bf4eff0221008b748b74000000008b748b748b748b7466e769ad4a16d3dcd87129b8e91d1b4d + +Px = 0x5ac331a1103fe966697379f356a937f350588a05477e308851b8a502d5dfcdc5 +Py = 0xfe9993df4b57939b2b8da095bf6d794265204cfe03be995a02e65d408c871c0b +# Test 228 (small r and 100 bit s^-1) +Signature = 302702020100022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b + +Px = 0x1d209be8de2de877095a399d3904c74cc458d926e27bb8e58e5eae5767c41509 +Py = 0xdd59e04c214f7b18dce351fc2a549893a6860e80163f38cc60a4f2c9d040d8c9 +# Test 229 (100-bit r and s^-1) +Signature = 3032020d062522bbd3ecbe7c39e93e7c25022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b + +Px = 0x83539fbee44625e3acaafa2fcb41349392cef0633a1b8fabecee0c133b10e99 +Py = 0x915c1ebe7bf00df8535196770a58047ae2a402f26326bb7d41d4d7616337911e +# Test 230 (r and s^-1 are close to n) +Signature = 3045022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d50220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70 + +Px = 0x8aeb368a7027a4d64abdea37390c0c1d6a26f399e2d9734de1eb3d0e19373874 +Py = 0x5bd13834715e1dbae9b875cf07bd55e1b6691c7f7536aef3b19bf7a4adf576d +# Test 231 (s == 1) +Signature = 30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020101 + +# Test 232 (s == 0) +Valid = 0 +Signature = 30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020100 + +Px = 0xb533d4695dd5b8c5e07757e55e6e516f7e2c88fa0239e23f60e8ec07dd70f287 +Py = 0x1b134ee58cc583278456863f33c3a85d881f7d4a39850143e29d4eaf009afe47 +# Test 233 (point at infinity during verify) +Signature = 304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a80220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70 + +Px = 0x69da0364734d2e530fece94019265fefb781a0f1b08f6c8897bdf6557927c8b8 +Py = 0x66d2d3c7dcd518b23d726960f069ad71a933d86ef8abbcce8b20f71e2a847002 +# Test 234 (u1 == 1) +Valid = 1 +Signature = 30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023 + +Px = 0xd8adc00023a8edc02576e2b63e3e30621a471e2b2320620187bf067a1ac1ff32 +Py = 0x33e2b50ec09807accb36131fff95ed12a09a86b4ea9690aa32861576ba2362e1 +# Test 235 (u1 == n - 1) +Signature = 30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e + +Px = 0x3623ac973ced0a56fa6d882f03a7d5c7edca02cfc7b2401fab3690dbe75ab785 +Py = 0x8db06908e64b28613da7257e737f39793da8e713ba0643b92e9bb3252be7f8fe +# Test 236 (u2 == 1) +Signature = 30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70 + +Px = 0xcf04ea77e9622523d894b93ff52dc3027b31959503b6fa3890e5e04263f922f1 +Py = 0xe8528fb7c006b3983c8b8400e57b4ed71740c2f3975438821199bedeaecab2e9 +# Test 237 (u2 == n - 1) +Signature = 30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1 + +Px = 0xdb7a2c8a1ab573e5929dc24077b508d7e683d49227996bda3e9f78dbeff77350 +Py = 0x4f417f3bc9a88075c2e0aadd5a13311730cf7cc76a82f11a36eaf08a6c99a206 +# Test 238 (edge case for u1) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100e91e1ba60fdedb76a46bcb51dc0b8b4b7e019f0a28721885fa5d3a8196623397 + +Px = 0xdead11c7a5b396862f21974dc4752fadeff994efe9bbd05ab413765ea80b6e1f +Py = 0x1de3f0640e8ac6edcf89cff53c40e265bb94078a343736df07aa0318fc7fe1ff +# Test 239 (edge case for u1) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100fdea5843ffeb73af94313ba4831b53fe24f799e525b1e8e8c87b59b95b430ad9 + +Px = 0xd0bc472e0d7c81ebaed3a6ef96c18613bb1fea6f994326fbe80e00dfde67c7e9 +Py = 0x986c723ea4843d48389b946f64ad56c83ad70ff17ba85335667d1bb9fa619efd +# Test 240 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022003ffcabf2f1b4d2a65190db1680d62bb994e41c5251cd73b3c3dfc5e5bafc035 + +Px = 0xa0a44ca947d66a2acb736008b9c08d1ab2ad03776e02640f78495d458dd51c32 +Py = 0x6337fe5cf8c4604b1f1c409dc2d872d4294a4762420df43a30a2392e40426add +# Test 241 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02204dfbc401f971cd304b33dfdb17d0fed0fe4c1a88ae648e0d2847f74977534989 + +Px = 0xc9c2115290d008b45fb65fad0f602389298c25420b775019d42b62c3ce8a96b7 +Py = 0x3877d25a8080dc02d987ca730f0405c2c9dbefac46f9e601cc3f06e9713973fd +# Test 242 (edge case for u1) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bc4024761cd2ffd43dfdb17d0fed112b988977055cd3a8e54971eba9cda5ca71 + +Px = 0x5eca1ef4c287dddc66b8bccf1b88e8a24c0018962f3c5e7efa83bc1a5ff6033e +Py = 0x5e79c4cb2c245b8c45abdce8a8e4da758d92a607c32cd407ecaef22f1c934a71 +# Test 243 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220788048ed39a5ffa77bfb62fa1fda2257742bf35d128fb3459f2a0c909ee86f91 + +Px = 0x5caaa030e7fdf0e4936bc7ab5a96353e0a01e4130c3f8bf22d473e317029a47a +Py = 0xdeb6adc462f7058f2a20d371e9702254e9b201642005b3ceda926b42b178bef9 +# Test 244 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220476d9131fd381bd917d0fed112bc9e0a5924b5ed5b11167edd8b23582b3cb15e + +Px = 0xc2fd20bac06e555bb8ac0ce69eb1ea20f83a1fc3501c8a66469b1a31f619b098 +Py = 0x6237050779f52b615bd7b8d76a25fc95ca2ed32525c75f27ffc87ac397e6cbaf +# Test 245 (edge case for u1) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008374253e3e21bd154448d0a8f640fe46fafa8b19ce78d538f6cc0a19662d3601 + +Px = 0x3fd6a1ca7f77fb3b0bbe726c372010068426e11ea6ae78ce17bedae4bba86ced +Py = 0x3ce5516406bf8cfaab8745eac1cd69018ad6f50b5461872ddfc56e0db3c8ff4 +# Test 246 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220357cfd3be4d01d413c5b9ede36cba5452c11ee7fe14879e749ae6a2d897a52d6 + +Px = 0x9cb8e51e27a5ae3b624a60d6dc32734e4989db20e9bca3ede1edf7b086911114 +Py = 0xb4c104ab3c677e4b36d6556e8ad5f523410a19f2e277aa895fc57322b4427544 +# Test 247 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022029798c5c0ee287d4a5e8e6b799fd86b8df5225298e6ffc807cd2f2bc27a0a6d8 + +Px = 0xa3e52c156dcaf10502620b7955bc2b40bc78ef3d569e1223c262512d8f49602a +Py = 0x4a2039f31c1097024ad3cc86e57321de032355463486164cf192944977df147f +# Test 248 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02200b70f22c781092452dca1a5711fa3a5a1f72add1bf52c2ff7cae4820b30078dd + +Px = 0xf19b78928720d5bee8e670fb90010fb15c37bf91b58a5157c3f3c059b2655e88 +Py = 0xcf701ec962fb4a11dcf273f5dc357e58468560c7cfeb942d074abd4329260509 +# Test 249 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022016e1e458f021248a5b9434ae23f474b43ee55ba37ea585fef95c90416600f1ba + +Px = 0x83a744459ecdfb01a5cf52b27a05bb7337482d242f235d7b4cb89345545c90a8 +Py = 0xc05d49337b9649813287de9ffe90355fd905df5f3c32945828121f37cc50de6e +# Test 250 (edge case for u1) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02202252d6856831b6cf895e4f0535eeaf0e5e5809753df848fe760ad86219016a97 + +Px = 0xdd13c6b34c56982ddae124f039dfd23f4b19bbe88cee8e528ae51e5d6f3a21d7 +Py = 0xbfad4c2e6f263fe5eb59ca974d039fc0e4c3345692fb5320bdae4bd3b42a45ff +# Test 251 (edge case for u1) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02210081ffe55f178da695b28c86d8b406b15dab1a9e39661a3ae017fbe390ac0972c3 + +Px = 0x67e6f659cdde869a2f65f094e94e5b4dfad636bbf95192feeed01b0f3deb7460 +Py = 0xa37e0a51f258b7aeb51dfe592f5cfd5685bbe58712c8d9233c62886437c38ba0 +# Test 252 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffffaaaaaaaaffffffffffffffffe9a2538f37b28a2c513dee40fecbb71a + +Px = 0x2eb6412505aec05c6545f029932087e490d05511e8ec1f599617bb367f9ecaaf +Py = 0x805f51efcc4803403f9b1ae0124890f06a43fedcddb31830f6669af292895cb0 +# Test 253 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100b62f26b5f2a2b26f6de86d42ad8a13da3ab3cccd0459b201de009e526adf21f2 + +Px = 0x84db645868eab35e3a9fd80e056e2e855435e3a6b68d75a50a854625fe0d7f35 +Py = 0x6d2589ac655edc9a11ef3e075eddda9abf92e72171570ef7bf43a2ee39338cfe +# Test 254 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bb1d9ac949dd748cd02bbbe749bd351cd57b38bb61403d700686aa7b4c90851e + +Px = 0x91b9e47c56278662d75c0983b22ca8ea6aa5059b7a2ff7637eb2975e386ad663 +Py = 0x49aa8ff283d0f77c18d6d11dc062165fd13c3c0310679c1408302a16854ecfbd +# Test 255 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022066755a00638cdaec1c732513ca0234ece52545dac11f816e818f725b4f60aaf2 + +Px = 0xf3ec2f13caf04d0192b47fb4c5311fb6d4dc6b0a9e802e5327f7ec5ee8e4834d +Py = 0xf97e3e468b7d0db867d6ecfe81e2b0f9531df87efdb47c1338ac321fefe5a432 +# Test 256 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022055a00c9fcdaebb6032513ca0234ecfffe98ebe492fdf02e48ca48e982beb3669 + +Px = 0xd92b200aefcab6ac7dafd9acaf2fa10b3180235b8f46b4503e4693c670fccc88 +Py = 0x5ef2f3aebf5b317475336256768f7c19efb7352d27e4cccadc85b6b8ab922c72 +# Test 257 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ab40193f9b5d76c064a27940469d9fffd31d7c925fbe05c919491d3057d66cd2 + +Px = 0xa88361eb92ecca2625b38e5f98bbabb96bf179b3d76fc48140a3bcd881523cd +Py = 0xe6bdf56033f84a5054035597375d90866aa2c96b86a41ccf6edebf47298ad489 +# Test 258 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ca0234ebb5fdcb13ca0234ecffffffffcb0dadbbc7f549f8a26b4408d0dc8600 + +Px = 0xd0fb17ccd8fafe827e0c1afc5d8d80366e2b20e7f14a563a2ba50469d84375e8 +Py = 0x68612569d39e2bb9f554355564646de99ac602cc6349cf8c1e236a7de7637d93 +# Test 259 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff3ea3677e082b9310572620ae19933a9e65b285598711c77298815ad3 + +Px = 0x836f33bbc1dc0d3d3abbcef0d91f11e2ac4181076c9af0a22b1e4309d3edb276 +Py = 0x9ab443ff6f901e30c773867582997c2bec2b0cb8120d760236f3a95bbe881f75 +# Test 260 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220266666663bbbbbbbe6666666666666665b37902e023fab7c8f055d86e5cc41f4 + +Px = 0x92f99fbe973ed4a299719baee4b432741237034dec8d72ba5103cb33e55feeb8 +Py = 0x33dd0e91134c734174889f3ebcf1b7a1ac05767289280ee7a794cebd6e69697 +# Test 261 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff36db6db7a492492492492492146c573f4c6dfc8d08a443e258970b09 + +Px = 0xd35ba58da30197d378e618ec0fa7e2e2d12cffd73ebbb2049d130bba434af09e +Py = 0xff83986e6875e41ea432b7585a49b3a6c77cbb3c47919f8e82874c794635c1d2 +# Test 262 (edge case for u2) +Signature = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff2aaaaaab7fffffffffffffffc815d0e60b3e596ecb1ad3a27cfd49c4 + +Px = 0x8651ce490f1b46d73f3ff475149be29136697334a519d7ddab0725c8d0793224 +Py = 0xe11c65bd8ca92dc8bc9ae82911f0b52751ce21dd9003ae60900bd825f590cc28 +# Test 263 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffff55555555ffffffffffffffffd344a71e6f651458a27bdc81fd976e37 + +Px = 0x6d8e1b12c831a0da8795650ff95f101ed921d9e2f72b15b1cdaca9826b9cfc6d +Py = 0xef6d63e2bc5c089570394a4bc9f892d5e6c7a6a637b20469a58c106ad486bf37 +# Test 264 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02203fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192aa + +Px = 0xae580bae933b4ef2997cbdbb0922328ca9a410f627a0f7dff24cb4d920e1542 +Py = 0x8911e7f8cc365a8a88eb81421a361ccc2b99e309d8dcd9a98ba83c3949d893e3 +# Test 265 (edge case for u2) +Signature = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205d8ecd64a4eeba466815ddf3a4de9a8e6abd9c5db0a01eb80343553da648428f + +Px = 0x5b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc46963 +Py = 0x838a40f2a36092e9004e92d8d940cf5638550ce672ce8b8d4e15eba5499249e9 +# Test 266 (point duplication during verification) +Signature = 304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100bb726660235793aa9957a61e76e00c2c435109cf9a15dd624d53f4301047856b + +Px = 0x5b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc46963 +Py = 0x7c75bf0c5c9f6d17ffb16d2726bf30a9c7aaf31a8d317472b1ea145ab66db616 +# Test 267 (duplication bug) +Valid = 0 +Signature = 304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100bb726660235793aa9957a61e76e00c2c435109cf9a15dd624d53f4301047856b + +Px = 0x6adda82b90261b0f319faa0d878665a6b6da497f09c903176222c34acfef72a6 +Py = 0x47e6f50dcc40ad5d9b59f7602bb222fad71a41bf5e1f9df4959a364c62e488d9 +# Test 268 (point with x-coordinate 0) +Signature = 30250201010220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70 + +Px = 0x2fca0d0a47914de77ed56e7eccc3276a601120c6df0069c825c8f6a01c9f3820 +Py = 0x65f3450a1d17c6b24989a39beb1c7decfca8384fbdc294418e5d807b3c6ed7de +# Test 269 (point with x-coordinate 0) +Signature = 3045022101000000000000000000000000000000000000000000000000000000000000000002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9 + +Px = 0xdd86d3b5f4a13e8511083b78002081c53ff467f11ebd98a51a633db76665d250 +Py = 0x45d5c8200c89f2fa10d849349226d21d8dfaed6ff8d5cb3e1b7e17474ebc18f7 +# Test 270 (comparison with point at infinity ) +Signature = 30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9 + +Px = 0x4fea55b32cb32aca0c12c4cd0abfb4e64b0f5a516e578c016591a93f5a0fbcc5 +Py = 0xd7d3fd10b2be668c547b212f6bb14c88f0fecd38a8a4b2c785ed3be62ce4b280 +# Test 271 (extreme value for k) +Valid = 1 +Signature = 304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699780220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70 + +Px = 0x5e59f50708646be8a589355014308e60b668fb670196206c41e748e64e4dca21 +Py = 0x5de37fee5c97bcaf7144d5b459982f52eeeafbdf03aacbafef38e213624a01de +# Test 272 (extreme value for k) +Signature = 304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2960220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70 + +Px = 0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296 +Py = 0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5 +# Test 273 (testing point duplication) +Valid = 0 +Signature = 3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2 + +# Test 274 (testing point duplication) +Signature = 3044022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2 + +Px = 0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296 +Py = 0xb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a +# Test 275 (testing point duplication) +Signature = 3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2 + +# Test 276 (testing point duplication) +Signature = 3044022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2 + +Px = 0x4aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad5 +Py = 0x87d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d +# Test 277 (pseudorandom signature) +Msg = +Valid = 1 +Signature = 3045022100b292a619339f6e567a305c951c0dcbcc42d16e47f219f9e98e76e09d8770b34a02200177e60492c5a8242f76f07bfe3661bde59ec2a17ce5bd2dab2abebdf89a62e2 + +# Test 278 (pseudorandom signature) +Signature = 3045022100e502de07f887e60119f9668cec69d2760839e6e74b9e6ff8cb7fa8d5a24f66c802207605e8b6afdbef06db7f89d06e2add2cf064eb4054d5ff0b101d815e813a8c08 + +# Test 279 (pseudorandom signature) +Signature = 3044022030fbfb3d662f0f07e8d51c6c3ebbc3ae9cf17b985db10e38116f1ba584cccf4102206fcc086c907209fe3d3d3a3724af44ce3d5af9345ac8864de18ad2b2f9617819 + +# Test 280 (pseudorandom signature) +Signature = 304602210097dde41357ef913cb8b9cd8e8c8c858831ec69298c739cd7fb14edcafc519d4e022100c8e032ad4432814ba4ddf3e25004594fa8c5137e39fd360ca36aedabaa934db3 + +# Test 281 (pseudorandom signature) +Signature = 3044022047bf21626d4b879fc51774251d7e3a380104e2c8170f13d32e86358c63d6b50102203f9c9d81b5e20b94766a62efdee7f3edfada68ab4d74487a24978fb574358830 + +# Test 282 (pseudorandom signature) +Signature = 3045022100d7908fbd16c6a3ffd7c315bfc2f87d8d42bda8fac5d6024069b5df6b101420e0022066a4771722eef9f166f037629c0d210010727dd114049fe2159ffa228fc11798 + +# Test 283 (pseudorandom signature) +Signature = 3046022100d48907279f401ee511d2e78d15f4c17539c93373d72bb66cff066a9114801a6d022100c7b709d88a367836a66cdb4b3bd4e0b2a76c97e551505c2969c98b6709600733 + +# Test 284 (pseudorandom signature) +Signature = 30450220743d6d5a99bcf2f7e011d6cac86a73582014419d3803c8d61128b23e4683cf96022100fa1270b7406b13cdbea376cb502f01f388f97dc5b660c9f3ba92c40233ae853f + +# Test 285 (pseudorandom signature) +Signature = 304502201c8e26e3a84892b12d6946fa39aa15ee8989f32c647db31c48c7276718907734022100e486719b597f52356d20afc98af82301d3ed33e2c3ec61c23601de687c432893 + +# Test 286 (pseudorandom signature) +Signature = 3046022100f8f074bad4cc63ce49b1a7101f5f1e5dd7e8d28e1654e3052e9dea4e8830a247022100d232383e83d2b4e0c12ee6127dd8cc3fcfcdff971571b07e18ea0d59d1bd75e9 + +# Test 287 (pseudorandom signature) +Msg = 4d7367 +Signature = 30450220530bd6b0c9af2d69ba897f6b5fb59695cfbf33afe66dbadcf5b8d2a2a6538e23022100d85e489cb7a161fd55ededcedbf4cc0c0987e3e3f0f242cae934c72caa3f43e9 + +# Test 288 (pseudorandom signature) +Signature = 304502202a95faa048e78949b27dd4f2a69bf26f809d565cca4fd0205aac95382e19df1c022100c7de7183db22fb7015697d8f15874529c1c37b3506b32e2969c6345ba6431eea + +# Test 289 (pseudorandom signature) +Signature = 3046022100ef18b2f9d187e6d6ebd0fe0ff63ebbee44e4e8c3812fb53f7399a2db757965fc022100ff2f438009b409c18fb908851115a00f3ac250428c0485cb8e8066e27608dc2a + +# Test 290 (pseudorandom signature) +Signature = 3045022100d1ba6053e65dd564d24a99aeabb181529f48ed9564bfcf8d9b7950d05dfbf1f702204b4d69402ba634983534a599f49c47d4fef03ace4446a7934124e7b4cd212be2 + +# Test 291 (pseudorandom signature) +Signature = 3045022100d8df1a77d439e1a68621712e5cf65ecc503398f7a87a6b53fbd1d7251d1a62bd02203276f956f733314b20eb399f2027702463e203cd8f15f1dbe41fe157dcaac618 + +# Test 292 (pseudorandom signature) +Signature = 30440220771b9696276b14cf4e0342272f65be8ddf3d603036b03d13a82f522c0446843c022062e7b425f0e2d8a6a207e8324014a6d4d569d80e0fe5509ba1cd1581446d5a2b + +# Test 293 (pseudorandom signature) +Signature = 3046022100f052476d9a28b34372a358481c650f2aee5c91b88fa307ad39719c11d2ae2b79022100d5da4b0f6bab8923ec17533d455ed259d379fe265956b7106f2c44c4f56a70ed + +# Test 294 (pseudorandom signature) +Signature = 3046022100a6a63a03be4a3505ba28907fb2b028268387b657ae561fb5bf9c011a330a8dae022100bacb589b58eeb74b7ab85b1abdaf50f59ed03ea4a73dde66470b86dc34e25768 + +# Test 295 (pseudorandom signature) +Signature = 3046022100f547541d72fad13c84399a2e74e00c2f2b6ee9c24b48bb06c00c321786273c07022100d28d340d5e507b1fd87011bc8a21b388f7a4ea6acbc67916667e278dd52c5c1b + +# Test 296 (pseudorandom signature) +Signature = 304402205b64337764e6b896219a3502e4ea632fc03afe12c27ad0501640f46f7a6e62950220100cd011a79cbcba991f0994e4e406de9a390d8ede12d4a116f39072d8373463 + +# Test 297 (pseudorandom signature) +Msg = 313233343030 +Signature = 3046022100a8ea150cb80125d7381c4c1f1da8e9de2711f9917060406a73d7904519e51388022100f3ab9fa68bd47973a73b2d40480c2ba50c22c9d76ec217257288293285449b86 + +# Test 298 (pseudorandom signature) +Signature = 304402206d5091f9497241fb2a99137f56734d70797c1620fa58f292f3ddc1c21980768a02207d4681372addeec97da13d3834429a49cf94c68cc6d8380fcc1fb897caeaa4d7 + +# Test 299 (pseudorandom signature) +Signature = 30440220111af92aa721abe4492468a6ad410f85351c3f71f6f076c5160eac1665bf08a002205d9f4658ec427e54fd64ccc367f50d48c7e5c2822299e258f443cc7890d25db9 + +# Test 300 (pseudorandom signature) +Signature = 3046022100ecd42e0caddf730e79911ea0725402d3e4519e93299217cfff7f27eb06383bcb022100b9002348257e8aa55de6326e8588d1e5ac7803e912dca2b6aac1c0b6c6ce887d + +# Test 301 (pseudorandom signature) +Signature = 3046022100dd7ff4894d875b82698e738cd6af3e06df3dfe519c63c83bda6cb780003212680221008ae21af20504ca943014f87bc06eff0c72222900e7b78e49e7107d1d27f78d7a + +# Test 302 (pseudorandom signature) +Signature = 304502202c4ffe7eba452ab8147fbd117091b6a6aed2c022b51a0559f45a210149827585022100f8f713031c6747382a930183f508cb5ba3dee9918623ed7b9246f7792895806f + +# Test 303 (pseudorandom signature) +Signature = 30450220036e58fdd99c73206d0b989e315d4e7445853b29756abd9be4988043ee575318022100bca3bdbd7b13d674a507755a1fb25d6b9ad533e6aea4c07da2b662bf64074c1f + +# Test 304 (pseudorandom signature) +Signature = 3045022100e8967620ea0878093f914bc670e9fd49e5e1d120cd8296f67934806921edd1eb0220091fe9cc8158606b7a93a87b830d8bf892c8086bc3ccb364b885adc11c5a2f5b + +# Test 305 (pseudorandom signature) +Signature = 30450221008053d20f27c43e96e7cb99f0fb5ed638f391dbb8c49228bb164e3c5c7ed98df802200f8f909a360d019c8cd8cc4936c471cb0e81eec812a7815a413f015e5020a83a + +# Test 306 (pseudorandom signature) +Signature = 304402201a05d145760911a0d03a3f9e04183b4fa12052ab08e8e2a61cecd685abe06ccd022015a45cdddd5b271b460fd23970e3f09bd3e428c5935a141131f7bb9cdcb31ffe + +# Test 307 (pseudorandom signature) +Msg = 0000000000000000000000000000000000000000 +Signature = 3045022100986e65933ef2ed4ee5aada139f52b70539aaf63f00a91f29c69178490d57fb7102203dafedfb8da6189d372308cbf1489bbbdabf0c0217d1c0ff0f701aaa7a694b9c + +# Test 308 (pseudorandom signature) +Signature = 304502200a1ba2c8595e428eb8efe4d0d527b57a9d65a18f2adb74a8d42b079cca3ded47022100a9b1d33b3b0498f08a46b3602d216cddd909b46a4531bb0c8eda027c813701ea + +# Test 309 (pseudorandom signature) +Signature = 3044022051a2d733ccc576739d202cac29631dd4a4c2b7bca274a88bed819b4fa74bc13a02203332485952b2bafdd23bb4bdd5b182c17d68fa989fb297e522f58267f579858b + +# Test 310 (pseudorandom signature) +Signature = 30450221008523fa05039757ff31734c5a97512e16d36a2b44cfeaf698bf99a3da10192ce102201a4a46d618146dbd6f8b96bde830c1cd6b3c40b3c3f076b0525327b81421703c + +# Test 311 (pseudorandom signature) +Signature = 30450221008b7c16aead127ff236229edf3b3d685389d833a6706f8baaf8d18c42c8e0fcb402207c007ac920eb885009bb826dacf204affc995b8b1da3088ab8233372e77bfcb9 + +# Test 312 (pseudorandom signature) +Signature = 3046022100eb05151d10844480bb1da9bbd5fadeb94653979ce6473e1eae877c04b5dc136b022100f5626ba78e4936461be857439da72310f0159c53076ed7602b802b5c79296db6 + +# Test 313 (pseudorandom signature) +Signature = 3046022100b1ef5e5b2ed946f33e3f14a755af39520397d425aa184e24c3a1ab2071bd28ad022100f06c9370a8fd969f14fe9fb10d18e593c1469e5716c7264880dd35a8589c4747 + +# Test 314 (pseudorandom signature) +Signature = 304502206da6c71eb7d8a2435999c8f6b7a1de30f2a863a2f07a8aad4d321d52cc619679022100ab1abe0cbd07504de3fd9ac64bed3bf89fb0061e251a1b1de2925e6635d523ec + +# Test 315 (pseudorandom signature) +Signature = 30450220450e205ad97a14760979e1d5a24f2277c88382810b73c94ea53fa0d768ee18d1022100ba73359c371c5ff36c338bcd9761096647e0437db6a01b95df8cfa15ffc29bf4 + +# Test 316 (pseudorandom signature) +Signature = 304502201814378a581d4584664c2e24d695edeec6ce96971887a35a67df515e8788d44c022100c96da4442349d041183bba91d8f2b0279501c85b7b31f993c82268b6703c7b3f + +Px = 0x4f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000 +Py = 0xed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685 +# Test 317 (x-coordinate of the public key has many trailing 0's) +Msg = 4d657373616765 +Signature = 3046022100d434e262a49eab7781e353a3565e482550dd0fd5defa013c7f29745eff3569f10221009b0c0a93f267fb6052fd8077be769c2b98953195d7bc10de844218305c6ba17a + +# Test 318 (x-coordinate of the public key has many trailing 0's) +Signature = 304402200fe774355c04d060f76d79fd7a772e421463489221bf0a33add0be9b1979110b0220500dcba1c69a8fbd43fa4f57f743ce124ca8b91a1f325f3fac6181175df55737 + +# Test 319 (x-coordinate of the public key has many trailing 0's) +Signature = 3045022100bb40bf217bed3fb3950c7d39f03d36dc8e3b2cd79693f125bfd06595ee1135e30220541bf3532351ebb032710bdb6a1bf1bfc89a1e291ac692b3fa4780745bb55677 + +Px = 0x3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935 +Py = 0x84fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000 +# Test 320 (y-coordinate of the public key has many trailing 0's) +Signature = 30440220664eb7ee6db84a34df3c86ea31389a5405badd5ca99231ff556d3e75a233e73a022059f3c752e52eca46137642490a51560ce0badc678754b8f72e51a2901426a1bd + +# Test 321 (y-coordinate of the public key has many trailing 0's) +Signature = 304502204cd0429bbabd2827009d6fcd843d4ce39c3e42e2d1631fd001985a79d1fd8b430221009638bf12dd682f60be7ef1d0e0d98f08b7bca77a1a2b869ae466189d2acdabe3 + +# Test 322 (y-coordinate of the public key has many trailing 0's) +Signature = 3046022100e56c6ea2d1b017091c44d8b6cb62b9f460e3ce9aed5e5fd41e8added97c56c04022100a308ec31f281e955be20b457e463440b4fcf2b80258078207fc1378180f89b55 + +Px = 0x3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935 +Py = 0x7b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff +# Test 323 (y-coordinate of the public key has many trailing 1's) +Signature = 304402201158a08d291500b4cabed3346d891eee57c176356a2624fb011f8fbbf34668300220228a8c486a736006e082325b85290c5bc91f378b75d487dda46798c18f285519 + +# Test 324 (y-coordinate of the public key has many trailing 1's) +Signature = 3045022100b1db9289649f59410ea36b0c0fc8d6aa2687b29176939dd23e0dde56d309fa9d02203e1535e4280559015b0dbd987366dcf43a6d1af5c23c7d584e1c3f48a1251336 + +# Test 325 (y-coordinate of the public key has many trailing 1's) +Signature = 3046022100b7b16e762286cb96446aa8d4e6e7578b0a341a79f2dd1a220ac6f0ca4e24ed86022100ddc60a700a139b04661c547d07bbb0721780146df799ccf55e55234ecb8f12bc + +Px = 0x2829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffff +Py = 0xa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e +# Test 326 (x-coordinate of the public key has many trailing 1's) +Signature = 3045022100d82a7c2717261187c8e00d8df963ff35d796edad36bc6e6bd1c91c670d9105b402203dcabddaf8fcaa61f4603e7cbac0f3c0351ecd5988efb23f680d07debd139929 + +# Test 327 (x-coordinate of the public key has many trailing 1's) +Signature = 304402205eb9c8845de68eb13d5befe719f462d77787802baff30ce96a5cba063254af7802202c026ae9be2e2a5e7ca0ff9bbd92fb6e44972186228ee9a62b87ddbe2ef66fb5 + +# Test 328 (x-coordinate of the public key has many trailing 1's) +Signature = 304602210096843dd03c22abd2f3b782b170239f90f277921becc117d0404a8e4e36230c28022100f2be378f526f74a543f67165976de9ed9a31214eb4d7e6db19e1ede123dd991d + +Px = 0xfffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f5 +Py = 0x5a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73 +# Test 329 (x-coordinate of the public key is large) +Signature = 30440220766456dce1857c906f9996af729339464d27e9d98edc2d0e3b760297067421f60220402385ecadae0d8081dccaf5d19037ec4e55376eced699e93646bfbbf19d0b41 + +# Test 330 (x-coordinate of the public key is large) +Signature = 3046022100c605c4b2edeab20419e6518a11b2dbc2b97ed8b07cced0b19c34f777de7b9fd9022100edf0f612c5f46e03c719647bc8af1b29b2cde2eda700fb1cff5e159d47326dba + +# Test 331 (x-coordinate of the public key is large) +Signature = 3046022100d48b68e6cabfe03cf6141c9ac54141f210e64485d9929ad7b732bfe3b7eb8a84022100feedae50c61bd00e19dc26f9b7e2265e4508c389109ad2f208f0772315b6c941 + +Px = 0x3fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e +Py = 0x1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71 +# Test 332 (x-coordinate of the public key is small) +Signature = 3046022100b7c81457d4aeb6aa65957098569f0479710ad7f6595d5874c35a93d12a5dd4c7022100b7961a0b652878c2d568069a432ca18a1a9199f2ca574dad4b9e3a05c0a1cdb3 + +# Test 333 (x-coordinate of the public key is small) +Signature = 304402206b01332ddb6edfa9a30a1321d5858e1ee3cf97e263e669f8de5e9652e76ff3f702205939545fced457309a6a04ace2bd0f70139c8f7d86b02cb1cc58f9e69e96cd5a + +# Test 334 (x-coordinate of the public key is small) +Signature = 3046022100efdb884720eaeadc349f9fc356b6c0344101cd2fd8436b7d0e6a4fb93f106361022100f24bee6ad5dc05f7613975473aadf3aacba9e77de7d69b6ce48cb60d8113385d + +Px = 0xbcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015 +Py = 0x1352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2 +# Test 335 (y-coordinate of the public key is small) +Signature = 3044022031230428405560dcb88fb5a646836aea9b23a23dd973dcbe8014c87b8b20eb0702200f9344d6e812ce166646747694a41b0aaf97374e19f3c5fb8bd7ae3d9bd0beff + +# Test 336 (y-coordinate of the public key is small) +Signature = 3046022100caa797da65b320ab0d5c470cda0b36b294359c7db9841d679174db34c4855743022100cf543a62f23e212745391aaf7505f345123d2685ee3b941d3de6d9b36242e5a0 + +# Test 337 (y-coordinate of the public key is small) +Signature = 304502207e5f0ab5d900d3d3d7867657e5d6d36519bc54084536e7d21c336ed8001859450221009450c07f201faec94b82dfb322e5ac676688294aad35aa72e727ff0b19b646aa + +Px = 0xbcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015 +Py = 0xfffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d +# Test 338 (y-coordinate of the public key is large) +Signature = 3046022100d7d70c581ae9e3f66dc6a480bf037ae23f8a1e4a2136fe4b03aa69f0ca25b35602210089c460f8a5a5c2bbba962c8a3ee833a413e85658e62a59e2af41d9127cc47224 + +# Test 339 (y-coordinate of the public key is large) +Signature = 30440220341c1b9ff3c83dd5e0dfa0bf68bcdf4bb7aa20c625975e5eeee34bb396266b34022072b69f061b750fd5121b22b11366fad549c634e77765a017902a67099e0a4469 + +# Test 340 (y-coordinate of the public key is large) +Signature = 3045022070bebe684cdcb5ca72a42f0d873879359bd1781a591809947628d313a3814f67022100aec03aca8f5587a4d535fa31027bbe9cc0e464b1c3577f4c2dcde6b2094798a9 + +Group = secp384r1 +Hash = SHA-384 + +Px = 0x2da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa +Py = 0x4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f +# Test 1 (signature malleability) +Msg = 313233343030 +Signature = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702301840da9fc1d2f8f8900cf485d5413b8c2574ee3a8d4ca03995ca30240e09513805bf6209b58ac7aa9cff54eecd82b9f1 + +# Test 2 (random signature) +Signature = 3064023077391f04a7b47a003a9b68ae641d6022093a5fa29464b1826228cbffc35a3a655f9712d478dec2f72dd3c02ce31c075a02305e8daba38b616460ec0e4b6477ce0266aa2f62b0cdb224907a8f999abfa68b48657677b018a29767c0926a1640fd9b0a + +# Test 3 (random signature) +Signature = 3065023100c46c6312342ad3b2d260d33a0cc41d13378daf8570d7b937980761ea0cc18c9948b40fcd790bb2021afaa8cb4fc76ff502307a7547ed765905268768027bc59f1edf367e4088b779c2618f4c1e6f0f56154351aac80cd59d4907ef2f93155c16523d + +# Test 4 (random signature) +Signature = 30660231009584b8a737f417dfeef0eb1a8f727e14b231ec372eb0520a2357b44478bd076e7a3e4e8bac670bfd3419296c9d854da1023100beca69a1c97e08af8e9a5cb76d9c46c6ee022b670962dc1e59850e6a9266d216aa816225d8ebcb7c4de88ceb3c1bae3d + +# Test 5 (random signature) +Signature = 30650230700041c0719c076f07280dec96763c88efdb903660d57182c9c7753b0334abb2e4dd2726f63ce1a8acd0eb67a492161f0231008028097fd011fea390fba8f50c36e5676867325d0bce627c3ddc3581ed3ba7ff1e76f5ece6304c172e9144756f47b2b8 + +# Test 6 (random signature) +Signature = 30650230409616ba406241c624514057defe1c868e655bca413af7aa0fb3d80c4969df41d9bb5d3a733b400705453a965e80d46d023100da24d79fdb11e4612faf34b8b64af8067492d6510c4eddb1310e578d1f49a43e427dcd188b259f9012791718776253ab + +# Test 7 (Legacy:ASN encoding of s misses leading 0) +Valid = 0 +Signature = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70230e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 8 (valid) +Valid = 1 +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 9 (long form encoding of length) +Valid = 0 +Signature = 308165023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 10 (long form encoding of length) +Signature = 306602813012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 11 (long form encoding of length) +Signature = 3066023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702813100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 12 (length contains leading 0) +Signature = 30820065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 13 (length contains leading 0) +Signature = 30670282003012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 14 (length contains leading 0) +Signature = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70282003100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 15 (wrong length) +Signature = 3066023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 16 (wrong length) +Signature = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 17 (wrong length) +Signature = 3065023112b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 18 (wrong length) +Signature = 3065022f12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 19 (wrong length) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023200e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 20 (wrong length) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 21 (uint32 overflow in length) +Signature = 30850100000065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 22 (uint32 overflow in length) +Signature = 306a0285010000003012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 23 (uint32 overflow in length) +Signature = 306a023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70285010000003100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 24 (uint64 overflow in length) +Signature = 3089010000000000000065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 25 (uint64 overflow in length) +Signature = 306e028901000000000000003012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 26 (uint64 overflow in length) +Signature = 306e023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7028901000000000000003100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 27 (length = 2**31 - 1) +Signature = 30847fffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 28 (length = 2**31 - 1) +Signature = 306902847fffffff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 29 (length = 2**31 - 1) +Signature = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702847fffffff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 30 (length = 2**32 - 1) +Signature = 3084ffffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 31 (length = 2**32 - 1) +Signature = 30690284ffffffff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 32 (length = 2**32 - 1) +Signature = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70284ffffffff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 33 (length = 2**40 - 1) +Signature = 3085ffffffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 34 (length = 2**40 - 1) +Signature = 306a0285ffffffffff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 35 (length = 2**40 - 1) +Signature = 306a023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70285ffffffffff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 36 (length = 2**64 - 1) +Signature = 3088ffffffffffffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 37 (length = 2**64 - 1) +Signature = 306d0288ffffffffffffffff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 38 (length = 2**64 - 1) +Signature = 306d023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70288ffffffffffffffff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 39 (incorrect length) +Signature = 30ff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 40 (incorrect length) +Signature = 306502ff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 41 (incorrect length) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702ff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 42 (indefinite length without termination) +Signature = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 43 (indefinite length without termination) +Signature = 3065028012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 44 (indefinite length without termination) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7028000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 45 (removing sequence) +Signature = + +# Test 46 (appending 0's to sequence) +Signature = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000 + +# Test 47 (prepending 0's to sequence) +Signature = 30670000023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 48 (appending unused 0's) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000 + +# Test 49 (appending unused 0's) +Signature = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70000023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 50 (appending null value) +Signature = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820500 + +# Test 51 (appending null value) +Signature = 3067023212b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70500023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 52 (appending null value) +Signature = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023300e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820500 + +# Test 53 (including garbage) +Signature = 306a4981773065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 54 (including garbage) +Signature = 306925003065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 55 (including garbage) +Signature = 30673065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820004deadbeef + +# Test 56 (including garbage) +Signature = 306a2235498177023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 57 (including garbage) +Signature = 306922342500023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 58 (including garbage) +Signature = 306d2232023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70004deadbeef023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 59 (including garbage) +Signature = 306a023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72236498177023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 60 (including garbage) +Signature = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d722352500023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 61 (including garbage) +Signature = 306d023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72233023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820004deadbeef + +# Test 62 (including undefined tags) +Signature = 306daa00bb00cd003065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 63 (including undefined tags) +Signature = 306baa02aabb3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 64 (including undefined tags) +Signature = 306d2238aa00bb00cd00023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 65 (including undefined tags) +Signature = 306b2236aa02aabb023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 66 (including undefined tags) +Signature = 306d023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72239aa00bb00cd00023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 67 (including undefined tags) +Signature = 306b023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72237aa02aabb023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 68 (using composition with indefinite length) +Signature = 30803065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000 + +# Test 69 (using composition with indefinite length) +Signature = 30692280023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70000023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 70 (using composition with indefinite length) +Signature = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72280023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000 + +# Test 71 (using composition with wrong tag) +Signature = 30803165023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000 + +# Test 72 (using composition with wrong tag) +Signature = 30692280033012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70000023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 73 (using composition with wrong tag) +Signature = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72280033100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000 + +# Test 74 (Replacing sequence with NULL) +Signature = 0500 + +# Test 75 (changing tag value) +Signature = 2e65023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 76 (changing tag value) +Signature = 2f65023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 77 (changing tag value) +Signature = 3165023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 78 (changing tag value) +Signature = 3265023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 79 (changing tag value) +Signature = ff65023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 80 (changing tag value) +Signature = 3065003012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 81 (changing tag value) +Signature = 3065013012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 82 (changing tag value) +Signature = 3065033012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 83 (changing tag value) +Signature = 3065043012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 84 (changing tag value) +Signature = 3065ff3012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 85 (changing tag value) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7003100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 86 (changing tag value) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7013100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 87 (changing tag value) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7033100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 88 (changing tag value) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7043100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 89 (changing tag value) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7ff3100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 90 (dropping value of sequence) +Signature = 3000 + +# Test 91 (using composition) +Signature = 306930010230643012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 92 (using composition) +Signature = 30692234020112022fb30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 93 (using composition) +Signature = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d722350201000230e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 94 (truncate sequence) +Signature = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f + +# Test 95 (truncate sequence) +Signature = 30643012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 96 (indefinite length) +Signature = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000 + +# Test 97 (indefinite length with truncated delimiter) +Signature = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f8200 + +# Test 98 (indefinite length with additional element) +Signature = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f8205000000 + +# Test 99 (indefinite length with truncated element) +Signature = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82060811220000 + +# Test 100 (indefinite length with garbage) +Signature = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000fe02beef + +# Test 101 (indefinite length with nonempty EOC) +Signature = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820002beef + +# Test 102 (prepend empty sequence) +Signature = 30673000023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 103 (append empty sequence) +Signature = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f823000 + +# Test 104 (sequence of sequence) +Signature = 30673065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 105 (truncated sequence) +Signature = 3032023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7 + +# Test 106 (repeat element in sequence) +Signature = 308198023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 107 (removing integer) +Signature = 3033023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 108 (appending 0's to integer) +Signature = 3067023212b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70000023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 109 (appending 0's to integer) +Signature = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023300e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000 + +# Test 110 (prepending 0's to integer) +Signature = 30670232000012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 111 (prepending 0's to integer) +Signature = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70233000000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 112 (Replacing integer with NULL) +Signature = 30350500023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 113 (Replacing integer with NULL) +Signature = 3034023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70500 + +# Test 114 (dropping value of integer) +Signature = 30350200023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 115 (dropping value of integer) +Signature = 3034023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70200 + +# Test 116 (modify first byte of integer) +Signature = 3065023010b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 117 (modify first byte of integer) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023102e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 118 (modify last byte of integer) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c54857023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 119 (modify last byte of integer) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f02 + +# Test 120 (truncate integer) +Signature = 3064022f12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 121 (truncate integer) +Signature = 3064022fb30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 122 (truncate integer) +Signature = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f + +# Test 123 (truncate integer) +Signature = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70230e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 124 (leading ff in integer) +Signature = 30660231ff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 125 (leading ff in integer) +Signature = 3066023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70232ff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 126 (infinity) +Signature = 3036090180023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 127 (infinity) +Signature = 3035023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7090180 + +# Test 128 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 306602310112b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19a25617aad7485e6312a8589714f647acf7a94cffbe8a724a023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 129 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30660231ff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe1a138f7ca6eeda02a462743d328394f8b71dd11a2a25001f64023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 130 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30650230ed4cf541094ab8901949ed51aa83fbda99e1d94bb4e401e6250d35d71ceecf7c4571b51b33ba5fcdf542cc6b0e3ab729023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 131 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3066023100ed4cf541094ab8901949ed51aa83fbda99e1d94bb4e401e5ec7083591125fd5b9d8bc2cd7c6b0748e22ee5d5daffe09c023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 132 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30660231feed4cf541094ab8901949ed51aa83fbda99e1d94bb4e401e65da9e85528b7a19ced57a768eb09b8530856b30041758db6023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 133 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 306602310112b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 134 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3066023100ed4cf541094ab8901949ed51aa83fbda99e1d94bb4e401e6250d35d71ceecf7c4571b51b33ba5fcdf542cc6b0e3ab729023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 135 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023101e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc5f8fc6adfda650a86aa74b95adbd6874b3cd8dde6cc0798f5 + +# Test 136 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70230e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc66a35cfdbf1f6aec7fa409df64a7538556300ab11327d460f + +# Test 137 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70231ff1840da9fc1d2f8f8900cf485d5413b8c2574ee3a8d4ca039ce66e2a219d22358ada554576cda202fb0133b8400bd907e + +# Test 138 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70231fe1840da9fc1d2f8f8900cf485d5413b8c2574ee3a8d4ca03a07039520259af579558b46a5242978b4c327221933f8670b + +# Test 139 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023101e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82 + +# Test 140 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702301840da9fc1d2f8f8900cf485d5413b8c2574ee3a8d4ca039ce66e2a219d22358ada554576cda202fb0133b8400bd907e + +# Test 141 (Signature with special case values for r and s) +Signature = 3006020100020100 + +# Test 142 (Signature with special case values for r and s) +Signature = 3006020100020101 + +# Test 143 (Signature with special case values for r and s) +Signature = 30060201000201ff + +# Test 144 (Signature with special case values for r and s) +Signature = 3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 145 (Signature with special case values for r and s) +Signature = 3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 146 (Signature with special case values for r and s) +Signature = 3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 147 (Signature with special case values for r and s) +Signature = 3036020100023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 148 (Signature with special case values for r and s) +Signature = 3036020100023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 149 (Signature with special case values for r and s) +Signature = 3008020100090380fe01 + +# Test 150 (Signature with special case values for r and s) +Signature = 3006020101020100 + +# Test 151 (Signature with special case values for r and s) +Signature = 3006020101020101 + +# Test 152 (Signature with special case values for r and s) +Signature = 30060201010201ff + +# Test 153 (Signature with special case values for r and s) +Signature = 3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 154 (Signature with special case values for r and s) +Signature = 3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 155 (Signature with special case values for r and s) +Signature = 3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 156 (Signature with special case values for r and s) +Signature = 3036020101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 157 (Signature with special case values for r and s) +Signature = 3036020101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 158 (Signature with special case values for r and s) +Signature = 3008020101090380fe01 + +# Test 159 (Signature with special case values for r and s) +Signature = 30060201ff020100 + +# Test 160 (Signature with special case values for r and s) +Signature = 30060201ff020101 + +# Test 161 (Signature with special case values for r and s) +Signature = 30060201ff0201ff + +# Test 162 (Signature with special case values for r and s) +Signature = 30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 163 (Signature with special case values for r and s) +Signature = 30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 164 (Signature with special case values for r and s) +Signature = 30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 165 (Signature with special case values for r and s) +Signature = 30360201ff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 166 (Signature with special case values for r and s) +Signature = 30360201ff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 167 (Signature with special case values for r and s) +Signature = 30080201ff090380fe01 + +# Test 168 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020100 + +# Test 169 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020101 + +# Test 170 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529730201ff + +# Test 171 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 172 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 173 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 174 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 175 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 176 (Signature with special case values for r and s) +Signature = 3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973090380fe01 + +# Test 177 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972020100 + +# Test 178 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972020101 + +# Test 179 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529720201ff + +# Test 180 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 181 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 182 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 183 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 184 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 185 (Signature with special case values for r and s) +Signature = 3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972090380fe01 + +# Test 186 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974020100 + +# Test 187 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974020101 + +# Test 188 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529740201ff + +# Test 189 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 190 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 191 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 192 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 193 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 194 (Signature with special case values for r and s) +Signature = 3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974090380fe01 + +# Test 195 (Signature with special case values for r and s) +Signature = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff020100 + +# Test 196 (Signature with special case values for r and s) +Signature = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff020101 + +# Test 197 (Signature with special case values for r and s) +Signature = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff0201ff + +# Test 198 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 199 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 200 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 201 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 202 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 203 (Signature with special case values for r and s) +Signature = 3038023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff090380fe01 + +# Test 204 (Signature with special case values for r and s) +Signature = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000020100 + +# Test 205 (Signature with special case values for r and s) +Signature = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000020101 + +# Test 206 (Signature with special case values for r and s) +Signature = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000001000000000201ff + +# Test 207 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 208 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 209 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 210 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 211 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 212 (Signature with special case values for r and s) +Signature = 3038023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000090380fe01 + +# Test 213 (Edge case for Shamir multiplication) +Msg = 3133323237 +Valid = 1 +Signature = 3066023100ac042e13ab83394692019170707bc21dd3d7b8d233d11b651757085bdd5767eabbb85322984f14437335de0cdf565684023100bd770d3ee4beadbabe7ca46e8c4702783435228d46e2dd360e322fe61c86926fa49c8116ec940f72ac8c30d9beb3e12f + +Px = 0x4bf4e52f958427ebb5915fb8c9595551b4d3a3fdab67badd9d6c3093f425ba43630df71f42f0eb7ceaa94d9f6448a85d +Py = 0xd30331588249fd2fdc0b309ec7ed8481bc16f27800c13d7db700fc82e1b1c8545aa0c0d3b56e3bfe789fc18a916887c2 +# Test 214 (k*G has a large x-coordinate) +Msg = 313233343030 +Signature = 304d0218389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68b023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 + +# Test 215 (r too large) +Valid = 0 +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 + +Px = 0x3623bb296b88f626d0f92656bf016f115b721277ccb4930739bfbd81f9c1e734630e0685d32e154e0b4a5c62e43851f6 +Py = 0x768356b4a5764c128c7b1105e3d778a89d1e01da297ede1bc4312c2583e0bbddd21613583dd09ab895c63be479f94576 +# Test 216 (r,s are large) +Valid = 1 +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971 + +Px = 0xd516cb8ac8e4457b693d5192beeb6ce7d9a46bef48eecf3ea823286f101f98d130f5a26dc6fec23662eff07f14486fd5 +Py = 0x8456932e74894b7f0e3bb0dfd362502b3765dd80a3177209fb221dc9b51aaf4470b245391405bef514176b13a267a720 +# Test 217 (r and s^-1 have a large Hamming weight) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d1aee55fdc2a716ba2fabcb57020b72e539bf05c7902f98e105bf83d4cc10c2a159a3cf7e01d749d2205f4da6bd8fcf1 + +Px = 0xa8380cd35026e13bf87be693cdb6e75a82d765b4019b529e8d277c4af6c9db27ebb5d3f86e88add9d5b61186f04c83a9 +Py = 0x92a187507c737325d2cc624acef3cd036bfa99e0c1518be65c88bb51f900f94123acabad81d15130d3ade7ff7e4364e1 +# Test 218 (r and s^-1 have a large Hamming weight) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b6b681dc484f4f020fd3f7e626d88edc6ded1b382ef3e143d60887b51394260832d4d8f2ef70458f9fa90e38c2e19e4f + +Px = 0x554f2fd0b700a9f4568752b673d9c0d29dc96c10fe67e38c6d6d339bfafe05f970da8c3d2164e82031307a44bd322511 +Py = 0x71312b61b59113ff0bd3b8a9a4934df262aa8096f840e9d8bffa5d7491ded87b38c496f9b9e4f0ba1089f8d3ffc88a9f +# Test 219 (small r and s) +Signature = 3006020102020101 + +Px = 0x44ee3335fa77d2fb02e4bd7074f45e598a879c0fa822ec718c21dc13b83440edc4e3c10a1858423e03044c9eff22591c +Py = 0xd027c49933e5510557d6b4b2c6f66fe5dcb9302a3b13fdc68048c3fcac88ba152b6a9833c87fdc6280afc5d11ab7c107 +# Test 220 (small r and s) +Signature = 3006020102020102 + +Px = 0xe2f87f72e3c66c73037fe77607d42ad2d9c4cc159893b4b9b8b0365d3a7766dbe8678b02e2b68f58e5a4f7681061a390 +Py = 0xe38f2142818542bef6b2bc3a2c4f43c95e5259d6bd5401531378c7ca125a1f6cc609d4fadfc5c9a99358ee77ff780c8d +# Test 221 (small r and s) +Signature = 3006020102020103 + +# Test 222 (r is larger than n) +Valid = 0 +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52975020103 + +Px = 0x5e67c44fc0cbc9a8eb343b4d6f596c7d00cac5da8594caf45b7209397496214c42d856a015ce589bc9ba865a4fab5ab +Py = 0x88a01c7b5d09efaf878fcb9102fb3875a8381af234d1c593076e452225a56f51674f347126d3009b44dcbb003a64d95f +# Test 223 (s is larger than n) +Signature = 3036020102023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accd7fffa + +Px = 0xbb03fce3c01ebcf0873abd134a8682f5fb8dbffa22da674047e5c3e71e43de582ed6abb908c2e4faa5d96186278b6c1 +Py = 0xba3b22123e68ccc56f17dd79ff15565706f71a0b6123c77af3cd88f0af024cc5259781516edcaf5fe990646e7b66999d +# Test 224 (small r and s^-1) +Valid = 1 +Signature = 3036020201000230489122448912244891224489122448912244891224489122347ce79bc437f4d071aaa92c7d6c882ae8734dc18cb0d553 + +Px = 0x58f246090d5e49863bc0bf2d501ff72f551c5f1c5e679eb49064fd02e221a2707326ec2d140bcc817afaad5065761566 +Py = 0x497c823fd736882cbf78fb92b1a5589b67e8067497c710a4cbb39dee2c5431bc45cfb96c9f8454385c9f2b3ef2d3d31a +# Test 225 (smallish r and s^-1) +Signature = 303c02072d9b4d347952cd023100ce751512561b6f57c75342848a3ff98ccf9c3f0219b6b68d00449e6c971a85d2e2ce73554b59219d54d2083b46327351 + +Px = 0xfc6984dd6830d1485fb2581a45a791d8dca2c727c73d3d44c89f0082c1868af5ca74b4ca4ae22802640a9ebfe8c7ae12 +Py = 0x998d63a5b5ad1b72b899f0b132e4952aaa19d41fdeea48b1ed6b8358dd1db207fd66e01453ad40f67b836adc802d5fe8 +# Test 226 (100-bit r and small s^-1) +Signature = 3041020d1033e67e37b32b445580bf4efb02302ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad5215c51b320e460542f9cc38968ccdf4263684004eb79a452 + +Px = 0x1b8def5922303d647e8eb07e3bad92f924b79b769eef168e7541de1f4e0d28ae9733eb98cf8a1fb6dd52ca02c8c75b51 +Py = 0xc7aa4bf679d49d8114122074da8f6044a427371796a5654a6106162d5f686abb73ebd896ab08c7062687f12171fbe4a3 +# Test 227 (small r and 100 bit s^-1) +Signature = 303602020100023077a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b + +Px = 0x1734a039a88a16c2ff4aa97d2399121f56f52ef01ed5e50887f736f65b6e51d6e8786abb4e063da5d1ba812dff998403 +Py = 0xccd698e6c296d5cd69178f8a82481a865da331627f1c4b324fbc02b36e8b5ed58a31f728e904d203a388755302195765 +# Test 228 (100-bit r and s^-1) +Signature = 3041020d062522bbd3ecbe7c39e93e7c24023077a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b + +Px = 0x52ca47dda99172cb8321495acf988548295988ec973c1b4ea9462c53e5768a704a936410ee847b5dbf1e9d0c131da6c7 +Py = 0x87a47027e6655792eb002d4228ee72f7c814c9a0cecbff267948f81c9903ac10eb35f6cb86369224ed609811cdf390f4 +# Test 229 (r and s^-1 are close to n) +Signature = 3065023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f3023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326 + +Px = 0xbd3d91f003e18adbea73079d4eba23b91fc17fcec14c9eb15a193fbc9ca39c8c747cd7a2c9623e05dd587ccbb8ab4c44 +Py = 0x3adb0a0706aa5ea7a68042082fccefc979612a7a1a3d694b00793b03f89bff866a8b97c8e77990c29360ce795036c764 +# Test 230 (s == 1) +Signature = 3035023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326020101 + +# Test 231 (s == 0) +Valid = 0 +Signature = 3035023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326020100 + +Px = 0xf896353cc3a8afdd543ec3aef062ca97bc32ed1724ea38b940b8c0ea0e23b34187afbe70daf8dbaa5b511557e5d2bdda +Py = 0xc4bd265da67ceeafca636f6f4c0472f22a9d02e2289184f73bbb700ae8fc921eff4920f290bfcb49fbb232cc13a21028 +# Test 232 (point at infinity during verify) +Signature = 306402307fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326 + +Px = 0x3ecfd58a3ce583866e0471d16eb3c10a411ec3b8671f3a04769b1ed8464a71cf1c76d8d9b7e3670bbe712d6f554a9383 +Py = 0xd980d8bedf57470d6b45cc1ad0c6426dc70a0e4be901106a36663bfcab04fcb86008777b92445120d5e3641d97396362 +# Test 233 (u1 == 1) +Valid = 1 +Signature = 3065023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace + +Px = 0x4150ccd0fa45aa2ef6b5042ddbb1b87c5ffd1115a8fe5995641948acda82a7b190762d84352cd74d1ca01e79f68f9cb4 +Py = 0xeb11be9d494c181c156e23e77e532bdf0a20c3cc74ba8c29b1f3eb2bd99129ee0d70ff0d593f0d7a6d6887e7c55930d2 +# Test 234 (u1 == n - 1) +Signature = 3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec63260230064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea5 + +Px = 0xe78fe2c11beac7090ee0af7fed469a8ccebd3cccc4ee9fccc8ef3fc0455b69aaa082dc13e1d84f34026cb6f0af9e992f +Py = 0xf34ebba71bf3a4050bf28e4084b5c5f5d4098ec46f10a31b02fb4bf20cc9362f6f02a66e802f817507535fac3ec0b099 +# Test 235 (u2 == 1) +Signature = 3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326 + +Px = 0xee24ab8a34d05af684939357f32759cc5a14f3c717529a20aea8e0c5965d8a41e68925f688471994b72021ba51b28c09 +Py = 0xa55693c92ad0cbae9edcf515e2b4c060b888d82c81e4a3b6a173b62ed04a46fa95db1a2f3949980fba2e371263c4fa9 +# Test 236 (u2 == n - 1) +Signature = 3065023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa84ecde56a2cf73ea3abc092185cb1a51f34810f1ddd8c64d + +Px = 0x3d2e916055c92e1b36133f5937b37c1b0102834eb77008a3ba9c3da446e9065971d68ba913091851e10cff5b4cd875c1 +Py = 0x39aa7aadfc2caf7107b17ae1aea8b299d61bf15aca0cb3fd6f1ffde8192bfe58f0822bbbc1f55bddf6b4fe9c8f2b0eac +# Test 237 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0230533b0d50480a3ef07e7e8af8b1097759bc03ac9a1c7ed6075a052869f57f12b285613162d08ee7aab9fe54aaa984a39a + +Px = 0xae596697427aa250156c05ac4338e48980a7f093ea1f1fe67098b43f6539c1b20ae74338f9bf270d33663c50abe8fd00 +Py = 0x1ca6a52732db74ab15d2f249a3d839080f898367dfd64992cdce2708deaad523a2a236b43400424241c91a35b530fa50 +# Test 238 (edge case for u1) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d49a253986bbaa8ce9c3d3808313d39c3b950a478372edc009bc0566b73be7b05dad0737e16960257cc16db6ec6c620f + +Px = 0x88738f9981dd4d1fabb60ad83c2dd6dfc9da302209ae3e53498a883b6e39a38bead9b02709f352d3e6b6578154eab252 +Py = 0x9388a05c6b9f3a4028abb9950a51f5264ecd7580a423fdec9472faeeb57f92e31c46bef2a781fe5edad026009f198262 +# Test 239 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0230285090b0d6a6820bbba394efbee5c24a2281e825d2f6c55fb7a85b8251db00f75ab07cc993ceaf664f3c116baf34b021 + +Px = 0xf421541311c94fdd79fc298f8ab1a3adfd08029fdad439a94d4cea11f7e799bc439609f2fb7be3f349d55e484d0a0d36 +Py = 0xb35330bbdbec1e75f2984483d96bf210d722c1830292ffc35a2f6a21a4b50519f565f024bbccc97228a2f8ad8fadc0d5 +# Test 240 (edge case for u1) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b39af4a81ee4ae79064ed80f27e1432e84845f15ece399f2a43d2505a0a8c72c5731f4fd967420b1000e3f75502ed7b7 + +Px = 0x399be4cfc439f94f2421cbd34c2cd90bae53eb60ddfafca52f7275d165d14fa659b636713b5d4b39e62fd48bae141d0e +Py = 0x1b23e3b4f0c202ed7b59db78a35c12ac698c603eab144fd09ac2ed8f4495f607e4d2c87a23ce2ec33e410ca47ecc2555 +# Test 241 (edge case for u1) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100af4a81ee4ae79064ed80f27e1432e84845f15ece399f2cbf28df829ccd30f5ef62ec23957b837d73fe4e156edccd4465 + +Px = 0x1578bbff72137c4bca33d7385a892be94cb059f9091ddfe890345f712a9fba5fc77084cec11084ed048491604a07f66c +Py = 0x76bbaa872f0710d82a08d9dddd833c7be7c7e8e265f49145157eb4e8e8280076a37ee5873271db510034da19da24415b +# Test 242 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02305e9503dc95cf20c9db01e4fc2865d0908be2bd9c733e597e8a5bb7b7a62abdff6dbe3978ae56536d0fb01172ecd55f57 + +Px = 0x33ba451c85e729058f83041077a4695eb47df93e718b09a4618c753ac803cd75c1a91290c2ff5a635389d07149571dab +Py = 0x1fc7d8a71776851ff244ff632fe6f92e1652e5284893c4244fe775d8efc589d823dd03f3919027f004537bd8ee09f3a3 +# Test 243 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02301ee4ae79064ed80f27e1432e84845f15ece399f2cbf4fa31a3ae8edab84dc3330a39f70938e3912bd59753de5aed3088 + +Px = 0x40771e3390216fed2c6208bdf5bfea83ab1915b166e626569f12efd410a39b7e7c76f70f0012843a26debf4ccc33dda +Py = 0xe5bc5f7e62d054eac31cd022afdb71b7c638f24c30cbad0ef35ed2fc9917f356e9c3f04391b21d1035274b81537fcbf3 +# Test 244 (edge case for u1) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100bb51cd3ba8eb201f53ddb4e34e08c0ff7dff9378106784d798d5a3440bd6dc34be3a0eaef8776619a0c97fefb15720b3 + +Px = 0x98d3f16e1c510a933e648e78d01588319f002e9475df8942a2a89db0666bb7c88b32bb248140e44ac4ab28111b2b7923 +Py = 0x99a926f4a66fbe28ff65c09f8306893aec094b89d0fe529e3577c5ecf30a7944caaf530f4575eb113fcf4c200d2dd4bd +# Test 245 (edge case for u1) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100e707e267ea635384a6da09823149f5cb7acbb29e910d2630c5fb5afbc42aa8436349b214a3b8fb9481ec999e005091f8 + +Px = 0xd1fd602feef80be9e55a19d1a9799c72a899110c6ac21fb3c21357069809d591a8775b64d1867a8cfff124f6a5e3a4f5 +Py = 0xf9548064f01b9af8868705493a37a037193b48f53b7c7973023f53e6ceff6830ca2f7a14ef51536d453af43b3058d8a9 +# Test 246 (edge case for u1) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100acc4f2afb7f5c10f818175074ef688a643fc5365e38129f86d5e2517feb81b2cd2b8dc4f7821bfd032edc4c0234085d9 + +Px = 0x82f37604f66664c2883dba6d98397c281045cbf59f1d16dddb1381126a246553a8b4d2aaea48ad9185a1645f65567d31 +Py = 0x8a4d7b19f1d2e4434c9a8ecad396304abc82221bbab0679935071c72fd975e7b021c04b1d16ea36fc2d051ef5a8e117c +# Test 247 (edge case for u1) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02310083276c0793f0a19742422f8af671ccf965fa7d18d541bef4c05b90e303f891d39008439e0fda4bfad5ee9a6ace7e340c + +Px = 0xf052dfc27bf8a6d36f3739f239b981f5b53fe08d999ec683b01e43e7596156206ba08b8b9f59229e2fbdce05f1e40f99 +Py = 0x90f0fdfb7029f9b3e8c6144dad0339208b7cdcb3820a554259db9d27afdd18f4a750296c59bad6b62df076f90d53be0d +# Test 248 (edge case for u1) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100942848586b534105ddd1ca77df72e1251140f412e97b62afbf85d4822309176b5965453dee3fab709e14156b3dfcecca + +Px = 0xf877bd6e2a9273e322a3298ea3add13d1104b32172283669ca6688f0cb591524a7f15dd41496681eda98939aae729fed +Py = 0xe85ca37c81ef19e3dc9ab16908a3720d86875a51a6a6d932e37492a6ec7a344eabc482377f14891fbd1da7faeffa1178 +# Test 249 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02307fffffffffffffffffffffffffffffffffffffffffffffffed2119d5fc12649fc808af3b6d9037d3a44eb32399970dd0 + +Px = 0x14249bbcfeeceab06c75654d361c0df8d56b320ea3bc1d4627ec0a2f4b8fa3577445694664f569a91f480741381e494a +Py = 0x28479f2186d715a56788f67073056aa0cb0b6a7f7893e77b9a6976ef6663d80226896d7f43bb502e1b4d49558a27dd8b +# Test 250 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023079b95c013b0472de04d8faeec3b779c39fe729ea84fb554cd091c7178c2f054eabbc62c3e1cfbac2c2e69d7aa45d9072 + +Px = 0x50a438c98ee94025ce13e27d36b8280d4843585836eb47011a070cd77729245684a0db31fde980620349c796832b2c6c +Py = 0xbdb72dba9f3f9cc878559f50b6bd1290f10a6bccbc1eeef7708b1b72059022987979e35221c51259f337c7288a2f86bc +# Test 251 (edge case for u2) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100bfd40d0caa4d9d42381f3d72a25683f52b03a1ed96fb72d03f08dcb9a8bc8f23c1a459deab03bcd39396c0d1e9053c81 + +Px = 0x4d3fc5dcfaf741113cda3ce2f8dff4c912143e4d36314c361d7ed5656b68448bcca114ba9e8124281234660b7726ddcd +Py = 0x680ddfef7ea07bfbcede10803d38d7211631ca11466078819eb66e11921ab7ffa3c4560c732e77595fd408e917dd9afc +# Test 252 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02304c7d219db9af94ce7fffffffffffffffffffffffffffffffef15cf1058c8d8ba1e634c4122db95ec1facd4bb13ebf09a + +Px = 0x63d65cdfeb1f1a42000f43bd1ddd130537a7b6f635e8d2bd81a97da168221183da433ca78429fd2b33c5f94895a9c13a +Py = 0xa9d1d5ea328725653a5a9d00f85a5516236f3b1428a8629287d3b0487a2e82dd57f93bb2aa3d9783dc74131e13756034 +# Test 253 (edge case for u2) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d219db9af94ce7ffffffffffffffffffffffffffffffffffd189bdb6d9ef7be8504ca374756ea5b8f15e44067d209b9b + +Px = 0xd22c9c348b9745711f57debac3a07df90a527c06bd02a8454f41437d54224e071698f03fdc64b1d652414edc3f2239c4 +Py = 0x9ae9812a4b92f099d6659a659691768d57e530ed3c91d5455781605850997a58221f22a2451c3932470606c23f3ab1b8 +# Test 254 (edge case for u2) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100a433b735f299cfffffffffffffffffffffffffffffffffffdbb02debbfa7c9f1487f3936a22ca3f6f5d06ea22d7c0dc3 + +Px = 0x31f05c0c29e9da49aa2fbbedee770c68d10f85e7f77e72ac3cfa9c8623a2bb42eeb2f24ac8f2aef7ab0c4b4782314003 +Py = 0x5bb32fc1ec04bbff5eab96e070c938ba1b53fe63970f649ae02e2a4ada420a249b6f7c525e2c4b9b0d5562ae26f2278c +# Test 255 (edge case for u2) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b9af94ce7fffffffffffffffffffffffffffffffffffffffd6efeefc876c9f23217b443c80637ef939e911219f96c179 + +Px = 0xbc26eec95e26c980bc0334264cbcfc26b897c3571c96ce9ab2a67b49bb0f26a6272fdc27806d7a4c572ae0f78149f1f3 +Py = 0xc8af5f41b99d2066018165513fb3b55e4255dcd0659647ed55e1e2602cae4efbd6eae1dfe2ff63e2c748d4acc7430139 +# Test 256 (edge case for u2) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100a276276276276276276276276276276276276276276276273d7228d4f84b769be0fd57b97e4c1ebcae9a5f635e80e9df + +Px = 0x6fa0964dd054250af176891c0c822b013b70f059c347172cafc6b36cd16cf3b0f9d19f2598bd0d580ac16c46acb167d4 +Py = 0x375bef701c002dcc040fd54824b14cc2df0154eb20e74464e1fe7b833426dd7d636bf2d79603fdde5ddaab23ab0cf426 +# Test 257 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023073333333333333333333333333333333333333333333333316e4d9f42d4eca22df403a0c578b86f0a9a93fe89995c7ed + +Px = 0xbaa4e712ee0786a5ab0e5a5dafdcdcf87b38830ab2ec86faedda9fdf65332f6a9688269412f050356530d4664a7fb8cd +Py = 0xecc46a901b016e6bb8a336ad9aa6f19abf9ada69705d1c905beafb95a44f52af43de4bf80c050cf996b7796dfcee8e1b +# Test 258 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02307fffffffffffffffffffffffffffffffffffffffffffffffda4233abf824c93f90115e76db206fa7489d6647332e1ba3 + +Px = 0x81e78a52ae0695583f7a601ab9b6fbfaf434f2befa1f8c833d59deb627a927c2f42d48eb617fe042f584e105c23c2317 +Py = 0xcf22d565f5f3b425ef7937df629b6864dac71264b288c1a987210f523071319ce3f64411910ac23765c4266e615112bc +# Test 259 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02303fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294bb + +Px = 0x41fa8765b19d3108031e28c9a781a385c9c10b2bfd42e6437e5c4bd711cf2a031750847d17a82f9376a30ae182a6d6e7 +Py = 0x1c20af96324147d4155a4d0c867ca8e36eba204fbed2087e0fcbdc8baabe07bb3123f9f7259e771cd9f1ad17d1a23787 +# Test 260 (edge case for u2) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100dfea06865526cea11c0f9eb9512b41fa9581d0f6cb7db9680336151dce79de818cdf33c879da322740416d1e5ae532fa + +Px = 0xe585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86b +Py = 0x572c1e06dd2c7b94b873f0578fcb2b99d60e246e51245d0804edd44b32f0f000c8f8f88f1d4a65fea51dbbb4ab1e2823 +# Test 261 (point duplication during verification) +Signature = 3065023100b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60023064adb4d51a93f96bed4665de2d4e1169cc95819ec6e9333edfd5c07ca134ceef7c95957b719ae349fc439eaa49fbbe34 + +Px = 0xe585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86b +Py = 0xa8d3e1f922d3846b478c0fa87034d46629f1db91aedba2f7fb122bb4cd0f0ffe3707076fe2b59a015ae2444c54e1d7dc +# Test 262 (duplication bug) +Valid = 0 +Signature = 3065023100b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60023064adb4d51a93f96bed4665de2d4e1169cc95819ec6e9333edfd5c07ca134ceef7c95957b719ae349fc439eaa49fbbe34 + +Px = 0xb4d78cccbced8065c0ebdc330b4670ec99309273e442b9be341196c1043e4441fc57b914085595bfc755c64fc409f0ba +Py = 0x1fee31cbbbaed5c1323f09c87df9b0712c12e99733fa23ef91b4e6ca666b09dd7540ebf1068a15155bc069e3d595c8c +# Test 263 (point with x-coordinate 0) +Signature = 3035020101023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326 + +Px = 0x6e3c68be53aade81ef89e096d841e2845a23331e7ec8a6a839d58d07fa016c0973ed75de4f99177bfdc74db566e9d15a +Py = 0x4972ea08e577ce1f61c13a6ca1bad1deef2982ee01a2826f002b769f2c46098d3baff068a405d09ca3840d2fafe4e46e +# Test 264 (point with x-coordinate 0) +Signature = 3065023101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0 + +Px = 0xb101cdb3eba20e112adbb4bbd2cb479a69e590a44ea902631832abfab8af2c3041b3df7f1665b2c6eb533f546217100a +Py = 0x1a61aa9951578ad4f00ae17339a8a6f1359bbd0ac355678ed4df21338f08763c1d3702ec132b634c7bcc0118efb1d0dd +# Test 265 (comparison with point at infinity ) +Signature = 3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0 + +Px = 0x6761044a040a4979db269b4a377e42f11b4be0ce24611f677674dcf770f5887ca4db565303283809e6d65f7fc6bc2736 +Py = 0x5c7daa403fca53549f75ff3372909642d02b7fdcac1e68242814d6e925ab01a80836cfbb35581960079e2fb44c0d186 +# Test 266 (extreme value for k) +Valid = 1 +Signature = 3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326 + +Px = 0x34d74ec088bab6c6323968d1f468993812f690d6edca5b97604d718e12b8cdfdd96d42e57d33afe312f0ee3c3d0a13f7 +Py = 0x86f4922bb2c13bdf7752a3ecb69393e997bd65461c46867ebeef6296b23f2c56df63acfde648f3f5002dbc239ffd1582 +# Test 267 (extreme value for k) +Signature = 3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326 + +Px = 0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7 +Py = 0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f +# Test 268 (testing point duplication) +Valid = 0 +Signature = 3065023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e + +# Test 269 (testing point duplication) +Signature = 30640230064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea502302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e + +Px = 0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7 +Py = 0xc9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0 +# Test 270 (testing point duplication) +Signature = 3065023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e + +# Test 271 (testing point duplication) +Signature = 30640230064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea502302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e + +Px = 0x29bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc +Py = 0x9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3 +# Test 272 (pseudorandom signature) +Msg = +Valid = 1 +Signature = 3064023032401249714e9091f05a5e109d5c1216fdc05e98614261aa0dbd9e9cd4415dee29238afbd3b103c1e40ee5c9144aee0f02304326756fb2c4fd726360dd6479b5849478c7a9d054a833a58c1631c33b63c3441336ddf2c7fe0ed129aae6d4ddfeb753 + +# Test 273 (pseudorandom signature) +Signature = 3065023100b713d2bfbe31b816d8cd9664b96f3383ecaac5a4d1f7e1d9ae64e2b99f9bccac04749052b45d119a39f8b2c11a385b780230690dfcac264fd52f6b26207d74f9fa2bea2ca3d59e405140c94248fb2839eb42c502581b89a964c93cc2e1752dd8b145 + +# Test 274 (pseudorandom signature) +Signature = 3066023100e16bf26ea4fff5d11027bcb3ef305991171e10056986fb03643c5b3c32e88a4f83ea290931fb30f99577ac0f18b733e802310080ff5982d87f575300940c106d84de8af66e16aae7fb31debcb06dfc61fae3f5dbddf6c91211f59f4f5b69962b1f554c + +# Test 275 (pseudorandom signature) +Signature = 3066023100c137d4933acbdce166768125db5e42d0764ccad43b0104870761086072cce89de2f3819ca305dc3073a941ae78dbbf55023100f990907818a7c67ecfedd56629cc6fb334edafa233f08a79d21be8653f012994e7736a060428b45deec34140c496302e + +# Test 276 (pseudorandom signature) +Signature = 3065023000f5579516d13ca92114bf230093f2462ef65e97b111051e62fbb73d06e0635a8d70e04b20f86e5e7ed211eebc653342023100e425e475ee6e27df44eeafbb268356bcd70aee82f0b971c994b49d1aae86fec12d3b7db4aaa2ff7de5b4bfb2eedcacc0 + +# Test 277 (pseudorandom signature) +Signature = 306502304e7989e8d6498df3d1b34d8f45fc922197dd023ef9f3594a7ec52dd575d24e3d93ef16e11bc77893dd341c8d1ab2c4b302310088a4178d2ba03c6acc79eda01e742dcd82fb2614cabd8bc586145c97da3d170b884678abdb2dc80b3b9bf6244e966ba1 + +# Test 278 (pseudorandom signature) +Signature = 306502302b1ff7fafd59899258d6b8c69bd3410f1d983e6b167674591d9c25387263e7e25438b30dcbd2c8ff76db8ebec2c77e2a0231008c44cf1a90610d9deefbf23c935741530f9f190dae4d7ba3d6efaef3bbb0e2d47296b65ef65241ef3b98934639fb50bd + +# Test 279 (pseudorandom signature) +Signature = 3066023100c0583e25c9298fdcc1695f04d3fc32de300ec5470c584b85b7d3c3c2915e9de3c22516907852dd801d7f1ef1645157bb023100c01f7df3954501aee191ead82e68a408549a09fb3a839325111b195938df984c9cf1383cfb88800757bade4d585ec906 + +# Test 280 (pseudorandom signature) +Signature = 306502304131dda169326aaac2714d0ff8a98d7439d2f353ab98e40bdde29d3b20dec87daef1358adc611280384a631f38c2cf70023100d72f8e5dbd73950cb6e941a563387ed1ae707db38f0f8a80518cf3d4885a56d8ecf7f278a1b24f0a973347b4a160bcf6 + +# Test 281 (pseudorandom signature) +Signature = 3065023048e82f614523c83dfc873730d02541aab03214825d21aac689c3b851c20f9e4d563439999372fc781f4351202ddef8d1023100c54ceb0786726ce16d74d259813e6ab859e42a09639a39da77f412ab86c17a9b8b5add2bbcda564f650ca304c081be3f + +# Test 282 (pseudorandom signature) +Msg = 4d7367 +Signature = 3066023100d7143a836608b25599a7f28dec6635494c2992ad1e2bbeecb7ef601a9c01746e710ce0d9c48accb38a79ede5b9638f3402310080f9e165e8c61035bf8aa7b5533960e46dd0e211c904a064edb6de41f797c0eae4e327612ee3f816f4157272bb4fabc9 + +# Test 283 (pseudorandom signature) +Signature = 306402307ff92abef367440ba54256a5fd5d679a9741d5a63fa0ef9ab34351239c67804eaff32f86d69b984096a1c0c76d36b79802301120223ea279522dbea4eb4297452fd9bdc723e0752b1fd7fdfcdb90d2a4e06ea3ac2e680e6823c57ddb5cbea22da451 + +# Test 284 (pseudorandom signature) +Signature = 3066023100dc2a42181fac07068e0d3ee845d21f38c1464199009f99f4e88b99f540436401b514cd72ecdafd0e5b3808c9a9130928023100de979bef97b779c29b80e38fb17e8a3072f84560793d936051f5fca6013e11e743b4efc10f9bd45a9a0e5dc3d71c8f6a + +# Test 285 (pseudorandom signature) +Signature = 30640230239542d8e4ee6f48e7d10657ba3d0a9a92c66f0e10c82b5919afba50c129b2d01124ae5bdc643bfa8bb3be67814f6b6502305d5a5a89149eefd34d1f00fe8922b06e62fca3d57d1c0a8daabd3f2160706830fdb3579cf6e64ed8ee635908239e8e6d + +# Test 286 (pseudorandom signature) +Signature = 3065023100929edc580377e5f1f0a6bed840a14ac1ac3fdd98f7d0cd56735583b521e9f6f2d7caabed6688fed3ffcaf0554e9aecf4023008e571b8052b5b59f2251b33b609681e7128d765b8b2b169eaccd7238f372c994c99aee46c8bf4fa039d0070b544c8d3 + +# Test 287 (pseudorandom signature) +Signature = 306602310091df8d8c1a2f4fedad280883f1d54b43e9bbbc1a626df57f58cfa020159c3f91571939f06e6d32748fbb3a224c7c0559023100ab40e8c6b98b16afdf556b16fe50d3baffaf742e56cd552d5efa7307bff708923c4e9080dc46d1c23b15bc3036982fd3 + +# Test 288 (pseudorandom signature) +Signature = 3065023058a891b20baeb6430fc44e3684900d9eee4566ee90cb3a6f175e1963d9e1e706e753ab3be82e6ab438a61fece74e3788023100bcd637e78b7a944533525c9d51b045743381c778133a5ad9d95d5d0692bea05695ff1a72419ca2929a215bc769707c1e + +# Test 289 (pseudorandom signature) +Signature = 3066023100ec4fbd25bd38a23ce5c98c6e582d0810cd918fc04be2b78df107765baefe3783a8e917bf6d6768e8f8b79f67a6b6e023023100ee8b5d4b8c8b1b26960984c3226654a829d9c28d3b050ae464c8399c936be431ad0ac22b6df23589f77cf752b965e4de + +# Test 290 (pseudorandom signature) +Signature = 3065023100f2a9b27da3c72a037f3ff2fe5f4c776df8383c7955636260a66316525089bbbb1719f96bc4ed132923ec168e6f3143320230476e427ec28bc4a04c485dde1d34243f1fe283616e0b632195eb71950de75e61061ca7c522a305eaacf61294339eec11 + +# Test 291 (pseudorandom signature) +Signature = 3065023100938c88f4937f8cab933d7879f04a316d2b6976d8bfb6b86742a2442839806726723dbed366f4004537e759e77fe07e2102306415396d8690b380b4eb1b4d78016cf6d407259bad568bee662dd594731fabae115534cc7db00b2ec46326926646d029 + +# Test 292 (pseudorandom signature) +Msg = 313233343030 +Signature = 30650230234503fcca578121986d96be07fbc8da5d894ed8588c6dbcdbe974b4b813b21c52d20a8928f2e2fdac14705b0705498c023100cd7b9b766b97b53d1a80fc0b760af16a11bf4a59c7c367c6c7275dfb6e18a88091eed3734bf5cf41b3dc6fecd6d3baaf + +# Test 293 (pseudorandom signature) +Signature = 3065023100ac5559ad224e76aa6637515357c5f0ac4ffef4f7e21297f8b65d72e6b5cc547511ddb2f0c36125b6b11c0a82308c44d20230542aea18bf5fe640d5e94fc27d69176e21cd15f0f817741e982f51e7a9d5bd4f33cd8846fbd9f6cd1ae7d0cff31de2e4 + +# Test 294 (pseudorandom signature) +Signature = 3065023100d48578efe0200370eb3dba190629c584f4505b3d18dcb7176e81c94eaaba9be4b35f16b2f558cf42f6e49bb13a8c52a3023062d7450e411ce64d8349a9e90a07fc09e5521efec1b9739cc9f68d0877b4a4b4d50a5f5647ef6dc3e6a9495ccabbeae4 + +# Test 295 (pseudorandom signature) +Signature = 3064023019a87de40615da310fbc062ab5954a4a5d538f7bb18407e9c9e852fead9d03fed7c7fbd6034e1ad8c30b978bfed75a3202304e0c8a9da62e78c60c417fa8870cc879e4d5ec92b6ec8648fd6ce4e576f1e09eaad3867f5441d800e659207c8a1bba86 + +# Test 296 (pseudorandom signature) +Signature = 306402306e6c0aed8fb6d30d7fd6064ad34316c9cfb4eb4a0c5bef44660a3b993ab199a934fc8e69cdf764abf05639cc16ef2e1d0230758560ba98b0b522327e2ae8a8ba843e4255c1742eb69174d3ce806c8a91ef330d186311c99062626a81fe38ad6d10c0 + +# Test 297 (pseudorandom signature) +Signature = 306502305acb49557723224e81e2a58e633d38cd78dcc1c905e61e2a16ade32420e198b9cd6120fcc3a57c0c986f80658dc4c4a0023100addee5259c644f68219827a73ddeb4d46123b3afd9c5812d2c6738f7e46f69115923464b7dcf214388e37a62bf2b6e8e + +# Test 298 (pseudorandom signature) +Signature = 306502310083ae547fe0e176a792cb77ca7af6acdd7670f168565c7d918e8f90cbaafe59d57a425dd33d1140167446f34067fc276f0230384ce801465758c5c4b1c1684f51c36a70a844aa9b0607a4cef6e16cf59298c281cf01c712d1022d22b24cb21ebb326b + +# Test 299 (pseudorandom signature) +Signature = 3066023100ef29e1a82a785f06532f48954482c53677d2dbf6b2b1e7d1b3869a846bde4d12e03ae0d873dc36a9ac8a00c4560760e7023100de7f161069409d8c66842ee3cd9564703565c533027f12a4ca1dd6d3f276e46d42b712789b3426a36741bbe989d2dfa2 + +# Test 300 (pseudorandom signature) +Signature = 306602310087c8bd783eef6a4c6d7fa736f04988ff9f8c0c5dbcc217dbd1ec581d19e0f0febf5e00ae17d8c06002c8819922f3bdc4023100d678c7b67e2e915a8d082374d0f881bea2bec6ddd588835fed0dc4fc22589104330904ff877f88e43c3b4370dd7e8534 + +# Test 301 (pseudorandom signature) +Signature = 3066023100baac6d6ce7f04ae4c4c857ef84b15fa80fc65ae28094039b9650e519770725bb9a025b9ae11a01af606b05bc821fe5ec023100e4f63ca843015dbe2b5b0d416eeffde83c3551c577fae2e51439c3914e25c3bfb88926189d8bae17914d5da25fd95d4d + +# Test 302 (pseudorandom signature) +Msg = 0000000000000000000000000000000000000000 +Signature = 306502305cad9ae1565f2588f86d821c2cc1b4d0fdf874331326568f5b0e130e4e0c0ec497f8f5f564212bd2a26ecb782cf0a18d023100bf2e9d0980fbb00696673e7fbb03e1f854b9d7596b759a17bf6e6e67a95ea6c1664f82dc449ae5ea779abd99c78e6840 + +# Test 303 (pseudorandom signature) +Signature = 306402306c8c296baf417e4a24df7461c2de9e9cf5d571bf5385b638fddb79fb085df7649b2f92302bc2c5fd5f5e5329b66cbf59023053757b85d794471f605b02fb5ff537b745b743cab0ebd9d23719fd287c35fc76db0faae9acd714387ade4598afbcfe7f + +# Test 304 (pseudorandom signature) +Signature = 306502302790f0cc0c6b246039e10903c8fc31b422ae1556828211f0d161d0faebdf2c2de291aa27eb0e4e77acdf9c26c9b93ecf023100f3ae4e3438d6ec9b2226b2fbfc91531c84ee662f373fb0758d037878e389e1d41a72e79deea65566769f1a6517a5bd3d + +# Test 305 (pseudorandom signature) +Signature = 306402305acf4d0f3774877235bdb1451bab6b9213afafbf0167d0344b759ba7a25585108d47a800ff16fe931fb015fa5905554f02304b23183cf53319e1520e5b27b3329494e1a2f293095b6fa5e0246ae2541348fadcbfee925b28892edda4d05eac5e5c69 + +# Test 306 (pseudorandom signature) +Signature = 306402301bc3589fc58f43ef7d7361cf0d1f0b89214e151ebd2a9757b1af0c753b19e7459ec0d83b2c030e19e56eb010ff28ca5802303943d4aabfa9f3705bfd5d544b0347e5b41651c1b5b58ba6d1d200d868193a31ccc45d955fddbb869bd0a8c16530c61e + +# Test 307 (pseudorandom signature) +Signature = 3064023024f9ee63092fd4ea83bddecb5f120d41b61ec39a5faf037b24c8fdd4036ab3ecc3368a60b82b735321ce91c23b5ea69a02306495015984abae9ab9335d0ea705b93cad15f1df84bc73a47ae38fd338f1a9a89bbd8a0dff83ff69e93c4f5ac5fb2032 + +# Test 308 (pseudorandom signature) +Signature = 3066023100e8ec3ba983144d851f617b28a76097335f4cdaa2d08af546f6ef13863c2293138e2d049661c671565f9fb507cfd200e40231008614ed1d49c27fce7798537a6f5ca13a25183787941aefd2282269e3a86d444742a3b546ce474d6f916a57d9ab63b6ad + +# Test 309 (pseudorandom signature) +Signature = 306502310080a7f5589456796f2287b8d875bca222907b9cc30f0d667e126f56bae9e758da271d10624ac2b2b7ef472614c06530de02303beaf667ddacecf76d6ca6a5fff559c0a3099a267f84f0f29eb481c3b2e719c14373c90218670f0dca5fa77bf95ad294 + +# Test 310 (pseudorandom signature) +Signature = 3066023100e3aa89289f644082c98a80aacae011381bcbc6056007b4d81a180b3681da2e3f1fc0808b018d14fbd6afd09880e6f168023100ef6f95647ba3db06a703af6836b2fea8f1a02248d55621d0fb8b6dada63926a0a93a71a75283929f67082977cb1158b6 + +# Test 311 (pseudorandom signature) +Signature = 3065023071c7c3bf3ce2d458c047f91ba180930fddf878c0f8dae3cdd9fd6d2da516c47265f9c3e3f51a33ef38b63c5a39de0f1e023100c080c819a34b8968bd36a60251d75464910039cdcc0ea8d18d681144960b8a566aecf27d23b47ce2b38e7ed0a4d27bf4 + +Px = 0xffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aac +Py = 0xacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1 +# Test 312 (x-coordinate of the public key is large) +Msg = 4d657373616765 +Signature = 3065023007648b6660d01ba2520a09d298adf3b1a02c32744bd2877208f5a4162f6c984373139d800a4cdc1ffea15bce4871a0ed02310099fd367012cb9e02cde2749455e0d495c52818f3c14f6e6aad105b0925e2a7290ac4a06d9fadf4b15b578556fe332a5f + +# Test 313 (x-coordinate of the public key is large) +Signature = 3065023100a049dcd96c72e4f36144a51bba30417b451a305dd01c9e30a5e04df94342617dc383f17727708e3277cd7246ca44074102303970e264d85b228bf9e9b9c4947c5dd041ea8b5bde30b93aa59fedf2c428d3e2540a54e0530688acccb83ac7b29b79a2 + +# Test 314 (x-coordinate of the public key is large) +Signature = 30650230441800ea9377c27865be000ad008eb3d7502bdd105824b26d15cf3d06452969a9d0607a915a8fe989215fc4d61af6e05023100dce29faa5137f75ad77e03918c8ee6747cc7a39b0a69f8b915654cac4cf4bfd9c87cc46ae1631b5c6baebd4fc08ff8fd + +Px = 0xd1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422 +Py = 0xc6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000 +# Test 315 (y-coordinate of the public key has many trailing 0's) +Signature = 306402303244768016457c463b74f2097f216d9670b191f76281c74bc6a1a1971d19f209bf4696468f5eb75d6326a0a43c0a65290230501e0ad985ed9f95697bd17fdbe3f9ca92e0f76426d3664e6896648d9c750bf588d0ce7d011c1a1e8d6c2e082422dc93 + +# Test 316 (y-coordinate of the public key has many trailing 0's) +Signature = 306402305e1af40f2480e3d97c4ae4bfd34a9f45269241356f3a46becd86a4a7c9716d73ca5aebdb3db1a7765650666683bc856b02307e7c4b473a2baaa4953785be8aa2a10006f6d36b400ab981864d69cecec046718d0404b9647454b159aa5a92d76d7955 + +# Test 317 (y-coordinate of the public key has many trailing 0's) +Signature = 306502306688e36a26f15bdc1c3f91367f8a7667f7bb3e30a335d6f0900e9534eb88b260cb29344c723fedfbe7ac9c5a33f4bf0d023100aa35fddf0fdc9017860b378f801cd806f3e2d754cd2fd94eb7bb36a46ce828cef87e9ebbf447068e630b87fee385ad8f + +Px = 0x1099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000 +Py = 0xe6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557 +# Test 318 (x-coordinate of the public key has many trailing 0's) +Signature = 3065023100d4a8f3b0b4d3a5769e3a0bbc644b35f1d509355ed1fe401e170f667b661f693b32598e8c143a817a958982845042bb48023004cc07578bbd1981dbf6e8a97a354c98d41b8b6f6e8a2c2b1763c7c2a29d79e24f8476075c9aed9aec6c64dff50461ae + +# Test 319 (x-coordinate of the public key has many trailing 0's) +Signature = 3065023100c286d1928e9c79fdd3bebdf22a1dbd37c8105e8ecf41e9e3777fe341b6b8d5a89b9d986827d6d1dbb381cd8239484a220230201119ae305b9360aa9b5e5d1567e0674c09e4f025556ebf81b987466b0f421b8d31f72bbe95f3ce2aa9874a84edfd40 + +# Test 320 (x-coordinate of the public key has many trailing 0's) +Signature = 3065023100d9c678550167f10c511e62acb4bd0a3f7f336bc090c94e6c6b02622439c348a2159c5f41f9b5aa4b470590d40dcd7cc202301fd5eaee295abb4081cb626745f4ad279ceb44604062830b58e6c0465c562d41f02ba588fc0db1ebbe339cdc008d7a1b + +Px = 0x2b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69 +Py = 0xd1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98 +# Test 321 (x-coordinate of the public key is small) +Signature = 3065023020fee7c71b6cb0d1da3641ec6622c055a3b16a1f596c64b34da1b2d0b868b66a8f0a0d0db983b3dc7e53bb7295da81970231008141a931d3579aec1cac9887d2fff9c6f12d47a27e4aab8cf262a9d14a715bca0b2057cbc3f18b6fd3d1df76f7410f16 + +# Test 322 (x-coordinate of the public key is small) +Signature = 3065023100913eecc559b3cf7108a65d6cc3076bfdf36c6f94dcc6693d06690470f34a2e81564241e1de5f5f51421de30af467f10f0230649bd3717244e8ef3c6b0eda983f84dca5ea86d1bec15386b9c473ec43a8cd0ba558eee819f791d9ff9272b9afd59551 + +# Test 323 (x-coordinate of the public key is small) +Signature = 3064023023855c46403a97b76cbb316ec3fe7e2c422b818387604bda8c3d91121b4f20179d9107c5f92dedc8b620d7db87fccccd023050f57343ab148e50662320c4161e44543c35bc992011ea5b1680b94382cf224ea0ec5da511e102f566cb67201f30a2ee + +Px = 0xfb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336 +Py = 0x208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4 +# Test 324 (y-coordinate of the public key is small) +Signature = 3066023100d200958d491fcebde667cd736c9dba0961c70db2ecaf573c31dd7fa41ecca32b40b5896f9a0ddf272110e3d21e84593a023100c2ecf73943b9adce596bac14fce62495ae93825c5ff6f61c247d1d8afcba52082fc96f63a26e55bccfc3779f88cfd799 + +# Test 325 (y-coordinate of the public key is small) +Signature = 306402306ac17d71260c79f81a7566124738cb3ee5d0aa690e73a98ae9e766f1336691e500cad51ba1302366c09cc06b8f7049e0023032ca965d6d7012ec187c7cab9544334d66c2a7658ddefa67e4ad40429815518ecc87b1492ddd57333bd2300b4660a835 + +# Test 326 (y-coordinate of the public key is small) +Signature = 3065023100e19a4646f0ed8a271fe86ba533f8be4fd81bbf4674716f668efa89a40cac51eec2a6cfbd92327d25efe91ca4ff712bc502304a86b2e8e12378e633dec2691e3b1eed4e932cc48b28e45fa3d464cc0e948c02cc9decf2bb43b25937fcf37e9ad86ef0 + +Px = 0xfb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336 +Py = 0xffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b +# Test 327 (y-coordinate of the public key is large) +Signature = 3064023015aac6c0f435cb662d110db5cf686caee53c64fe2d6d600a83ebe505a0e6fc62dc5705160477c47528c8c903fa865b5d02307f94ddc01a603f9bec5d10c9f2c89fb23b3ffab6b2b68d0f04336d499085e32d22bf3ab67a49a74c743f72473172b59f + +# Test 328 (y-coordinate of the public key is large) +Signature = 306602310090b95a7d194b73498fba5afc95c1aea9be073162a9edc57c4d12f459f0a1730baf2f87d7d6624aea7b931ec53370fe47023100cbc1ef470e666010604c609384b872db7fa7b8a5a9f20fdefd656be2fcc75db53948102f7ab203ea1860a6a32af246a1 + +# Test 329 (y-coordinate of the public key is large) +Signature = 3066023100dd4391ce7557cbd005e3d5d727cd264399dcc3c6501e4547505b6d57b40bbf0a7fac794dcc8d4233159dd0aa40d4e0b9023100a77fa1374fd60aa91600912200fc83c6aa447f8171ecea72ae322df32dccd68951dc5caf6c50380e400e45bf5c0e626b + +Hash = SHA-512 + +Px = 0x2da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa +Py = 0x4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f +# Test 1 (signature malleability) +Msg = 313233343030 +Signature = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202307b0a10ee2dd0dd2fab75095af240d095e446faba7a50a19fbb197e4c4250926e30c5303a2c2d34250f17fcf5ab3181a6 + +# Test 2 (random signature) +Signature = 306402301d526c8b0d7b0858c58e843fd9d7c779a519f0c34aa789f36cdbb6f0820a506b3631ccc2b335f78350f7c50337d0f5190230454ccaa7aec6e4bec81886203e5a8743a67a265dd9c048f47b7b6a4d2a18e27992e727757788e0c4b22ef0c16ec0643a + +# Test 3 (random signature) +Signature = 3065023100e2cc9ba64c14225cee38c83c0f060e4df6977efafde3df2abeddb0a6b55f68e29a3842c5064540f020c940c14cb066ab0230504f4d0fd25a10f866bb15c5bbfd2a56a157e01a67530d02f737f62f2cb661e5e133569d5f870ac1c629b2edd010a19e + +# Test 4 (random signature) +Signature = 3066023100cd5d45c993e29a8dfab724cfd83eec1da56a101dc12ab26242c72c8196db8b07e5cba3e84d720d0120b38c25a938e4ec02310088f6d024d7a40232b81816246ca44e69ad0f2dee19312c3937028a91e843d386e649923059c28025a3017e1228b7a2eb + +# Test 5 (random signature) +Signature = 30640230425ebeaf08d3a75c61e193b6fd0d27ab04cecc4f35a9cf1e1d1420795ec34bc7301216248f265d759fdc39e687bd49ff0230500819b4abc358e7139eb3c481bb73d88322e7467e617a47143989844b5d95b7c79b3192075faa7a157ca8278376b109 + +# Test 6 (random signature) +Signature = 306402300b1d031c018d70070d27e3b0c565c2c887206711567d35b79060c9273a03e2cc022c2711a983fee92a24d81ec1269cdb02303df76cc45d142a5ef8f1c4fae7ef1d10f267606089dc4b53aaac719835a2768e9a7a0e85649a22f0e50aae7cb52149cc + +# Test 7 (Legacy:ASN encoding of r misses leading 0) +Valid = 0 +Signature = 30650230814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 8 (Legacy:ASN encoding of s misses leading 0) +Signature = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2023084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 9 (valid) +Valid = 1 +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 10 (long form encoding of length) +Valid = 0 +Signature = 308166023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 11 (long form encoding of length) +Signature = 306702813100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 12 (long form encoding of length) +Signature = 3067023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20281310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 13 (length contains leading 0) +Signature = 30820066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 14 (length contains leading 0) +Signature = 30680282003100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 15 (length contains leading 0) +Signature = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2028200310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 16 (wrong length) +Signature = 3067023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 17 (wrong length) +Signature = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 18 (wrong length) +Signature = 3066023200814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 19 (wrong length) +Signature = 3066023000814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 20 (wrong length) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202320084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 21 (wrong length) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202300084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 22 (uint32 overflow in length) +Signature = 30850100000066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 23 (uint32 overflow in length) +Signature = 306b0285010000003100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 24 (uint32 overflow in length) +Signature = 306b023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2028501000000310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 25 (uint64 overflow in length) +Signature = 3089010000000000000066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 26 (uint64 overflow in length) +Signature = 306f028901000000000000003100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 27 (uint64 overflow in length) +Signature = 306f023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202890100000000000000310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 28 (length = 2**31 - 1) +Signature = 30847fffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 29 (length = 2**31 - 1) +Signature = 306a02847fffffff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 30 (length = 2**31 - 1) +Signature = 306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202847fffffff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 31 (length = 2**32 - 1) +Signature = 3084ffffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 32 (length = 2**32 - 1) +Signature = 306a0284ffffffff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 33 (length = 2**32 - 1) +Signature = 306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20284ffffffff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 34 (length = 2**40 - 1) +Signature = 3085ffffffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 35 (length = 2**40 - 1) +Signature = 306b0285ffffffffff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 36 (length = 2**40 - 1) +Signature = 306b023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20285ffffffffff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 37 (length = 2**64 - 1) +Signature = 3088ffffffffffffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 38 (length = 2**64 - 1) +Signature = 306e0288ffffffffffffffff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 39 (length = 2**64 - 1) +Signature = 306e023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20288ffffffffffffffff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 40 (incorrect length) +Signature = 30ff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 41 (incorrect length) +Signature = 306602ff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 42 (incorrect length) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202ff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 43 (indefinite length without termination) +Signature = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 44 (indefinite length without termination) +Signature = 3066028000814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 45 (indefinite length without termination) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202800084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 46 (removing sequence) +Signature = + +# Test 47 (appending 0's to sequence) +Signature = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000 + +# Test 48 (prepending 0's to sequence) +Signature = 30680000023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 49 (appending unused 0's) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000 + +# Test 50 (appending unused 0's) +Signature = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2000002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 51 (appending null value) +Signature = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0500 + +# Test 52 (appending null value) +Signature = 3068023300814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2050002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 53 (appending null value) +Signature = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202330084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0500 + +# Test 54 (including garbage) +Signature = 306b4981773066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 55 (including garbage) +Signature = 306a25003066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 56 (including garbage) +Signature = 30683066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0004deadbeef + +# Test 57 (including garbage) +Signature = 306b2236498177023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 58 (including garbage) +Signature = 306a22352500023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 59 (including garbage) +Signature = 306e2233023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20004deadbeef02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 60 (including garbage) +Signature = 306b023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2223649817702310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 61 (including garbage) +Signature = 306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e22235250002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 62 (including garbage) +Signature = 306e023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2223302310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0004deadbeef + +# Test 63 (including undefined tags) +Signature = 306eaa00bb00cd003066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 64 (including undefined tags) +Signature = 306caa02aabb3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 65 (including undefined tags) +Signature = 306e2239aa00bb00cd00023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 66 (including undefined tags) +Signature = 306c2237aa02aabb023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 67 (including undefined tags) +Signature = 306e023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e22239aa00bb00cd0002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 68 (including undefined tags) +Signature = 306c023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e22237aa02aabb02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 69 (using composition with indefinite length) +Signature = 30803066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000 + +# Test 70 (using composition with indefinite length) +Signature = 306a2280023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2000002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 71 (using composition with indefinite length) +Signature = 306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2228002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000 + +# Test 72 (using composition with wrong tag) +Signature = 30803166023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000 + +# Test 73 (using composition with wrong tag) +Signature = 306a2280033100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2000002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 74 (using composition with wrong tag) +Signature = 306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2228003310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000 + +# Test 75 (Replacing sequence with NULL) +Signature = 0500 + +# Test 76 (changing tag value) +Signature = 2e66023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 77 (changing tag value) +Signature = 2f66023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 78 (changing tag value) +Signature = 3166023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 79 (changing tag value) +Signature = 3266023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 80 (changing tag value) +Signature = ff66023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 81 (changing tag value) +Signature = 3066003100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 82 (changing tag value) +Signature = 3066013100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 83 (changing tag value) +Signature = 3066033100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 84 (changing tag value) +Signature = 3066043100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 85 (changing tag value) +Signature = 3066ff3100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 86 (changing tag value) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e200310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 87 (changing tag value) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e201310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 88 (changing tag value) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e203310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 89 (changing tag value) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e204310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 90 (changing tag value) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2ff310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 91 (dropping value of sequence) +Signature = 3000 + +# Test 92 (using composition) +Signature = 306a30010230653100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 93 (using composition) +Signature = 306a22350201000230814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 94 (using composition) +Signature = 306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e22235020100023084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 95 (truncate sequence) +Signature = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7 + +# Test 96 (truncate sequence) +Signature = 30653100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 97 (indefinite length) +Signature = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000 + +# Test 98 (indefinite length with truncated delimiter) +Signature = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd00 + +# Test 99 (indefinite length with additional element) +Signature = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd05000000 + +# Test 100 (indefinite length with truncated element) +Signature = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd060811220000 + +# Test 101 (indefinite length with garbage) +Signature = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000fe02beef + +# Test 102 (indefinite length with nonempty EOC) +Signature = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0002beef + +# Test 103 (prepend empty sequence) +Signature = 30683000023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 104 (append empty sequence) +Signature = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd3000 + +# Test 105 (sequence of sequence) +Signature = 30683066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 106 (truncated sequence) +Signature = 3033023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2 + +# Test 107 (repeat element in sequence) +Signature = 308199023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 108 (removing integer) +Signature = 303302310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 109 (appending 0's to integer) +Signature = 3068023300814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2000002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 110 (appending 0's to integer) +Signature = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202330084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000 + +# Test 111 (prepending 0's to integer) +Signature = 30680233000000814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 112 (prepending 0's to integer) +Signature = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2023300000084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 113 (Replacing integer with NULL) +Signature = 3035050002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 114 (Replacing integer with NULL) +Signature = 3035023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20500 + +# Test 115 (dropping value of integer) +Signature = 3035020002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 116 (dropping value of integer) +Signature = 3035023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20200 + +# Test 117 (modify first byte of integer) +Signature = 3066023102814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 118 (modify first byte of integer) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310284f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 119 (modify last byte of integer) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a156202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 120 (modify last byte of integer) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a74d + +# Test 121 (truncate integer) +Signature = 3065023000814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a1502310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 122 (truncate integer) +Signature = 30650230814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 123 (truncate integer) +Signature = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202300084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7 + +# Test 124 (truncate integer) +Signature = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2023084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 125 (leading ff in integer) +Signature = 30670232ff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 126 (leading ff in integer) +Signature = 3067023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20232ff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 127 (infinity) +Signature = 303609018002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 128 (infinity) +Signature = 3036023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2090180 + +# Test 129 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3066023101814cc9a70febda342d4ada87fc39426f403d5e8980842845d38217e2bcceedb5caa7aef8bc35edeec4beb155610f3f5502310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 130 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30650230814cc9a70febda342d4ada87fc39426f403d5e898084284644bb7cded46091f71a7393942ad49ef8eae67e7fc784ec6f02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 131 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30660231ff7eb33658f01425cbd2b5257803c6bd90bfc2a1767f7bd7b9f3e1359f376840298d725eb98c7ab98c282d68156bb5ea1e02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 132 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 306502307eb33658f01425cbd2b5257803c6bd90bfc2a1767f7bd7b9bb4483212b9f6e08e58c6c6bd52b610715198180387b139102310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 133 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30660231fe7eb33658f01425cbd2b5257803c6bd90bfc2a1767f7bd7ba2c7de81d4331124a3558510743ca12113b414eaa9ef0c0ab02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 134 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3066023101814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 135 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 306502307eb33658f01425cbd2b5257803c6bd90bfc2a1767f7bd7b9f3e1359f376840298d725eb98c7ab98c282d68156bb5ea1e02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 136 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310184f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e5fd3ad1cb7a61dc9507f6eeb2a65341ad0cac035dfee58d140 + +# Test 137 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2023084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e6044e681b3bdaf6d91cf3acfc5d3d2cbdaf0e8030a54ce7e5a + +# Test 138 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20231ff7b0a10ee2dd0dd2fab75095af240d095e446faba7a50a19ff3b630ca4e19648ed8ab2287e37c8caa222be38ade6c5833 + +# Test 139 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20231fe7b0a10ee2dd0dd2fab75095af240d095e446faba7a50a1a02c52e34859e236af809114d59acbe52f353fca2011a72ec0 + +# Test 140 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310184f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd + +# Test 141 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202307b0a10ee2dd0dd2fab75095af240d095e446faba7a50a19ff3b630ca4e19648ed8ab2287e37c8caa222be38ade6c5833 + +# Test 142 (Signature with special case values for r and s) +Signature = 3006020100020100 + +# Test 143 (Signature with special case values for r and s) +Signature = 3006020100020101 + +# Test 144 (Signature with special case values for r and s) +Signature = 30060201000201ff + +# Test 145 (Signature with special case values for r and s) +Signature = 3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 146 (Signature with special case values for r and s) +Signature = 3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 147 (Signature with special case values for r and s) +Signature = 3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 148 (Signature with special case values for r and s) +Signature = 3036020100023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 149 (Signature with special case values for r and s) +Signature = 3036020100023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 150 (Signature with special case values for r and s) +Signature = 3008020100090380fe01 + +# Test 151 (Signature with special case values for r and s) +Signature = 3006020101020100 + +# Test 152 (Signature with special case values for r and s) +Signature = 3006020101020101 + +# Test 153 (Signature with special case values for r and s) +Signature = 30060201010201ff + +# Test 154 (Signature with special case values for r and s) +Signature = 3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 155 (Signature with special case values for r and s) +Signature = 3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 156 (Signature with special case values for r and s) +Signature = 3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 157 (Signature with special case values for r and s) +Signature = 3036020101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 158 (Signature with special case values for r and s) +Signature = 3036020101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 159 (Signature with special case values for r and s) +Signature = 3008020101090380fe01 + +# Test 160 (Signature with special case values for r and s) +Signature = 30060201ff020100 + +# Test 161 (Signature with special case values for r and s) +Signature = 30060201ff020101 + +# Test 162 (Signature with special case values for r and s) +Signature = 30060201ff0201ff + +# Test 163 (Signature with special case values for r and s) +Signature = 30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 164 (Signature with special case values for r and s) +Signature = 30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 165 (Signature with special case values for r and s) +Signature = 30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 166 (Signature with special case values for r and s) +Signature = 30360201ff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 167 (Signature with special case values for r and s) +Signature = 30360201ff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 168 (Signature with special case values for r and s) +Signature = 30080201ff090380fe01 + +# Test 169 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020100 + +# Test 170 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020101 + +# Test 171 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529730201ff + +# Test 172 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 173 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 174 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 175 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 176 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 177 (Signature with special case values for r and s) +Signature = 3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973090380fe01 + +# Test 178 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972020100 + +# Test 179 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972020101 + +# Test 180 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529720201ff + +# Test 181 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 182 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 183 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 184 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 185 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 186 (Signature with special case values for r and s) +Signature = 3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972090380fe01 + +# Test 187 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974020100 + +# Test 188 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974020101 + +# Test 189 (Signature with special case values for r and s) +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529740201ff + +# Test 190 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 191 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 192 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 193 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 194 (Signature with special case values for r and s) +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 195 (Signature with special case values for r and s) +Signature = 3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974090380fe01 + +# Test 196 (Signature with special case values for r and s) +Signature = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff020100 + +# Test 197 (Signature with special case values for r and s) +Signature = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff020101 + +# Test 198 (Signature with special case values for r and s) +Signature = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff0201ff + +# Test 199 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 200 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 201 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 202 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 203 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 204 (Signature with special case values for r and s) +Signature = 3038023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff090380fe01 + +# Test 205 (Signature with special case values for r and s) +Signature = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000020100 + +# Test 206 (Signature with special case values for r and s) +Signature = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000020101 + +# Test 207 (Signature with special case values for r and s) +Signature = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000001000000000201ff + +# Test 208 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# Test 209 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 + +# Test 210 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974 + +# Test 211 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + +# Test 212 (Signature with special case values for r and s) +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000 + +# Test 213 (Signature with special case values for r and s) +Signature = 3038023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000090380fe01 + +# Test 214 (Edge case for Shamir multiplication) +Msg = 3637323636 +Valid = 1 +Signature = 3066023100ac042e13ab83394692019170707bc21dd3d7b8d233d11b651757085bdd5767eabbb85322984f14437335de0cdf5656840231008f8a277dde5282671af958e3315e795a20e2885157b77663a67a77ef2379020c5d12be6c732fd725402cb9ee8c345284 + +Px = 0xca5ee479ad6624ab5870539a56a23b3816eef7bbc67156836dfb58c425fdb7213e31770f12b43152e887d88a3afb4b18 +Py = 0x2aceec92b3139aca8396402a8f81bb5014e748eab2e2059f8656a883e62d78b9dc988b98332627f95232d37df26585d3 +# Test 215 (k*G has a large x-coordinate) +Msg = 313233343030 +Signature = 304d0218389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68b023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 + +# Test 216 (r too large) +Valid = 0 +Signature = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 + +Px = 0x70e6a90b4e076bf51dfa01fa44de49b448f7afa0f3d07677f1682ca776d404b2a0feef66b005ea28ba99b6ce21d0ca12 +Py = 0x424f7d179951fb89156cdf04aed6db056c98592c651b5a881abc34e2401127fb81c64e90cee83269c5141f9a3c7bce78 +# Test 217 (r,s are large) +Valid = 1 +Signature = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971 + +Px = 0x5a568474805fbf9acc1e5756d296696290b73d4d1c3b197f48aff03b919f0111823f90ea024af1c78e7c803e2297662d +Py = 0x4c1c79edc9c694620c1f5b5cc7dd9ff89a42442747857cace26b6ebc99962ec3a68a8e4072226d6d98a2a866dd97c203 +# Test 218 (r and s^-1 have a large Hamming weight) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d1aee55fdc2a716ba2fabcb57020b72e539bf05c7902f98e105bf83d4cc10c2a159a3cf7e01d749d2205f4da6bd8fcf1 + +Px = 0x88531382963bfe4e179f0b457ecd446528b98d349edbd8e7d0f6c1673b4ae2a7629b3345a7eae2e7c48358c13bdbe038 +Py = 0x9375c849dd571d91f2a3bf8994f53f82261f38172806c4d725de2029e887bfe036f38d6985ea5a22c52169db6e4213da +# Test 219 (r and s^-1 have a large Hamming weight) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b6b681dc484f4f020fd3f7e626d88edc6ded1b382ef3e143d60887b51394260832d4d8f2ef70458f9fa90e38c2e19e4f + +Px = 0x80da57d67dba48eb50eef484cf668d981e1bf30c357c3fd21a43cdc41f267c3f186bf87e3680239bac09930f144263c +Py = 0x5f28777ad8bcbfc3eb0369e0f7b18392a12397a4fbe15a2a1f6e2e5b4067c82681c89c73db25eca18c6b25768429cef0 +# Test 220 (small r and s) +Signature = 3006020102020101 + +Px = 0xe74a096d7f6ee1be9b4160d6b79baba4d25b4fb6fbdd38f5a9ed5cc1ac79943be71ede093e504c7dc0832daeb898a05 +Py = 0xa8d005b30c894686f6ecb2bc696e25effaccd3c9e4b48122db567c0118a0b983b757c2f40082dc374f8f6117a8e76fc0 +# Test 221 (small r and s) +Signature = 3006020102020102 + +Px = 0xa2ad0e27b40410d16077ddc5e415f109d328bf75e73a0f56876fef731285f83188b207a68690a40e76ed23e2c5e49fcf +Py = 0x604f1c5d7d7df365005d40e209f4da7bb06f310d5a1660ad6236577fbb47955261f507d23b83013ffb951bd76908e76c +# Test 222 (small r and s) +Signature = 3006020102020103 + +# Test 223 (r is larger than n) +Valid = 0 +Signature = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52975020103 + +Px = 0xa233025c12d20f49dc50dc802e79f03c7ce1750b9204b51325d90b5ade08f4a74ef6efb081ed3156d64a0110d60fffab +Py = 0xb924881891ee984cf51949dee96cfd7c9759b1ff00f0dbdc718d52117079d5d8bd6c86c6f532276af38b779bf2350d7f +# Test 224 (s is larger than n) +Signature = 3036020102023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accd7fffa + +Px = 0x3c9bb63607cdea0585f38d9780c9ac3e9a5a58153e2aacc4bc7a1d638d12e32c4d3a90c0c114b232c6f16e23e4bebb24 +Py = 0xda2ac2ccedc5494fe534a9abaea3013de0176f1b0e91bcd62154bdf3f604091a5008b2466702d0e2f93e4a4b6c601a54 +# Test 225 (small r and s^-1) +Valid = 1 +Signature = 3036020201000230489122448912244891224489122448912244891224489122347ce79bc437f4d071aaa92c7d6c882ae8734dc18cb0d553 + +Px = 0x559a66ef77752fd856976f36ed315619932204599bd7ef91d1a53ac1e7c90b3969cab8143b7a53c4bf5a3fe39f649eb6 +Py = 0x1f00f86dd8b8556c4815b2a01c59eb6cc03c97b94b6db4318249fe489e36ac9635876b1ca2ec0999caef5e1a6a58a70d +# Test 226 (smallish r and s^-1) +Signature = 303c02072d9b4d347952cd023100ce751512561b6f57c75342848a3ff98ccf9c3f0219b6b68d00449e6c971a85d2e2ce73554b59219d54d2083b46327351 + +Px = 0x548e79a17fd3a114d830ea88f218ee1ef7aa3f8dc139e0a8b9b60e25049a816ef449e8bd5dae867446495fdf20f4770 +Py = 0x363a1e8afefb02ebfd59df90b6d23ff7d5f706f9b26daebae1d4657ac342844ee9c2e0e9269f7efe7ab91e0303c115d +# Test 227 (100-bit r and small s^-1) +Signature = 3041020d1033e67e37b32b445580bf4efb02302ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad5215c51b320e460542f9cc38968ccdf4263684004eb79a452 + +Px = 0xa0eb670630f9bbbd963c5750de7bcbae4ddfd37b13fe7690eec6861a3c56c8efb87dbbf85ccd953c659d382c3d7df76a +Py = 0xfb08840635a16ac7ecf3de2dc28a77c8af9d49e5a832551e3354a2b311e52be86720d9b2fbb78d11a8aec61606a29f0d +# Test 228 (small r and 100 bit s^-1) +Signature = 303602020100023077a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b + +Px = 0x254bce3041b00468445cb9ae597bc76c1279a8506142ce2427185b1d7f753d1c0aad94156b531a2071aa61c83ec842a3 +Py = 0x710d6c8c96766ae8b63396133e5872805e47d9ba39113e122d676d54dbb2460b59d986bdd33be346c021e8a71bb41ba9 +# Test 229 (100-bit r and s^-1) +Signature = 3041020d062522bbd3ecbe7c39e93e7c24023077a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b + +Px = 0x9129db4446c2c598c4f81070f70f66c37c39323e01418c095de9902e0e1b20f26bc3e011ba84c10626ffdce836690c9f +Py = 0x8e4a104fec4aaa4350c238617ee50456accc49efc3b73eb9548e1600c2483f1c4bae9ddf3ff92af17afd19f86274589c +# Test 230 (r and s^-1 are close to n) +Signature = 3065023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f3023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326 + +Px = 0xa701a8111cdf97ced74a00a4514b2b526be8113e7df6cf7163aaee465880d26275b833b186d80f1862dc67ff768dde43 +Py = 0xe5a991f16f8f777311b17eabdc90b6ece3b5da776cfbebbc504382ca1abae1c6aa6a64d9c41110d97950514e99578ed8 +# Test 231 (s == 1) +Signature = 3035023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326020101 + +# Test 232 (s == 0) +Valid = 0 +Signature = 3035023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326020100 + +Px = 0xb6815ba05413bcf34f4c0704af590c1998d7fcd169541e1efe1567ca1dd71a22e35ac838b20c75281582044a57b58f45 +Py = 0x6cdceb10612062779abadd8742c6e93ed74adf306f3b3a0f96b70dd1134b7558b64b55b200c5732c50f05aa032ae7c00 +# Test 233 (point at infinity during verify) +Signature = 306402307fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326 + +Px = 0xb4b2d5a8b50ffabd34748e94498c1d4728d084f943fbddd4b3b6ee16eaa4da91613a82c98017132c94cd6fe4b87232f1 +Py = 0x6d612228ed5d7d08bf0c8699677e3b8f3e718073b945a6c108d97a3b1433c79052b2655a18a3b2e621baa88198cb5f3c +# Test 234 (u1 == 1) +Valid = 1 +Signature = 3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158ca + +Px = 0x842b3d89e54d9a4b5694d9251bba20ae4854c510dc0b6ef7033e4045ba4e64b6ddcd36299aac554dbac6db3e27c98123 +Py = 0x868258190297e1d6bae648a6dee2285886233afd1c3d6f196ad1db14262a579d74cf7855fffc65f5abd242b135ae87df +# Test 235 (u1 == n - 1) +Signature = 3065023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023100bc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d322ff6d1d1162b5de29edcd0b69803fe2f8af8e3d103d0a9 + +Px = 0x9ab73dcfffc820e739a3ed9c316c6f15d27a032f8aa59325f7842cf4a34198ac6ff09eb1a311ce226bf1abb49d808511 +Py = 0x135f4b0c2b6b195da9bbe1993e985b8607664f1a4b3d499ea1a112b6afc7e6b88357c9348b614ddfdc846a3f38bbdca +# Test 236 (u2 == 1) +Signature = 3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326 + +Px = 0x28771b137fb7d74c0ed0290416f47c8118997923c7b3b717fbbd5308a4bb0e494714bd3f1ff5e9e368887377284272eb +Py = 0xf92e5df476a2fa0906ce4fad121c641abb539ab4ef270cd8f0497cc3e6e05b18561b730670f010741238a5d07b077045 +# Test 237 (u2 == n - 1) +Signature = 3065023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa84ecde56a2cf73ea3abc092185cb1a51f34810f1ddd8c64d + +Px = 0x9d1baad217829d5f2d7db5bd085e9126232e8c49c58707cb153db1d1e20a109c90f7bcbae4f2c74d6595207cb0e5dd27 +Py = 0x1eea30752a1425905d0811d0f42019e5088142b41945bee03948f206f2e7c3c1081ba9a297180e36b247ee9e70832035 +# Test 238 (edge case for u1) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100c152aafea3a8612ec83a7dc9448f01941899d7041319bbd60bfdfb3c03da74c00c8fc4176128a6263268711edc6e8e90 + +Px = 0x8e39e1e44f782b810ea93037c344371c4fb141c8bf196ea618f3a176547139a6d02121d2794cbe6481061694db579315 +Py = 0xc3184e8cd9b6c16b37699633d87f5600654b44cbcb5ab50ba872dfa001769eb765b2d1902e01d2e8af4e1fd6e9c0f30f +# Test 239 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02304764eeac3e7a08daacfad7d1e1e3696042164b06f77bd78c3213ddea6f9fd449a34c97b9e560a6bf7195da41333c7565 + +Px = 0xb96fca0e3f6ebf7326f0a8ce8bdf226a2560c22526bf154f7b467010f3a46baca73414070db0f7ab039f345548452ae2 +Py = 0x6f7b744274e9bd6c791f47513e6b51eb42fea3816b3032b33a81695f04d4e775be06484cf7e6a69cba8bacbcb597b3e3 +# Test 240 (edge case for u1) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100cb4d5c0ff0abe29b2771fe9f179a5614e2e4c3cc1134a7aad08d8ec3fd8fcd07fd34b3473ca65ead1c7bb20bcf3ea5c9 + +Px = 0x4fd52b11ff747b59ef609e065a462cd85b73172d20f406fdd845d4eaa3ec173e06ee58a58e1810f051b275bbaa47ccb4 +Py = 0x84d2382b9e72c526dc3764a11a4a962a7a4c7355e6f057fc976ab73cc384f9a29da50769809ecbf37358dd83c74fc25f +# Test 241 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02306e441db253bf798dbc07ff041506dc73a75086a43252fb439dd016110475d8381f65f7f27f9e1cfc9b48f06a2dfa8eb6 + +Px = 0x7d123e3dbab9913d698891023e28654cba2a94dc408a0dc386e63d8d22ff0f33358a231860b7c2e4f8429e9e8c9a1c5b +Py = 0xe7c95d1875f24ecdfeffc6136cf56f800f5434490f234f14d78505c2d4aea51e2a3a6a5d1693e72c4b1dd2a8746b875a +# Test 242 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023041db253bf798dbc07ff041506dc73a75086a43252fb43b63191efcd0914b6afb4bf8c77d008dbeac04277ef4aa59c394 + +Px = 0x608ce23a383452f8f4dcc5c0085d6793ec518985f0276a3409a23d7b7ca7e7dcb163601aca73840c3bd470aff70250bf +Py = 0x674005a0be08939339363e314dca7ea67adfb60cd530628fe35f05416da8f20d5fb3b0ccd183a21dbb41c4e195d6303d +# Test 243 (edge case for u1) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02310083b64a77ef31b780ffe082a0db8e74ea10d4864a5f6876c6323df9a12296d5f697f18efa011b7d58084efde954b38728 + +Px = 0x48d23de1869475a1de532399da1240bab560eb74a6c7b0871bf8ac8fb6cc17cf7b34fcd7c79fd99c76c605bdf3fcbe18 +Py = 0xe15b66ab91d0a03e203c2ff914d4bedc38c1ec5dcd1d12db9b43ef6f44581632683bf785aa4326566227ece3c16be796 +# Test 244 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023053bf798dbc07ff041506dc73a75086a43252fb43b6327af3b42da6d3e9a72cde0b5c2de6bf072e780e94ad12dcab270a + +Px = 0x5d5eb470f9c6a0bb18e8960b67011acf9f01df405ac5b4bf9f4611d6a8af1a26b11b0790e93ae2361525dde51bacac94 +Py = 0xd42ce151793b80cee679c848362ec272000316590ebc91547b3b6608dfbade21e04de1548ebb45cc4721eb64a16b8318 +# Test 245 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023024c53b0a00cf087a9a20a2b78bc81d5b383d04ba9b55a567405239d224387344c41cceff0f68ffc930dbaa0b3d346f45 + +Px = 0x1da34a149ed562c8ec13e84cb067107bc28b50bfa47575d5a9948cde5a3d7357c38ea41fcfcdd1ab1a1bd9b6592b33d9 +Py = 0xe14aedfd0cfffcfecbdc21276e6a2c78b8729412c48339ae538b799b7d8e61163047a64cfcec9018aa00f99ae740e3f3 +# Test 246 (edge case for u1) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100c600ccb39bb3e2d85d880d76d1d519205f050c4b93deae0c5d63e8898ca8d7a5babbb944debe0f3c44332aae5770cb7b + +Px = 0x8b8675211b321f8b318ba60337cde32a6b04243979546383127a068a8749cb5e98c4231b198de62a2b069d3a94d1c7b1 +Py = 0x9d33468a130b4fef66a59d4aee00ca40bdbeaf044b8b22841bb4c8ba419f891b3855f4bddf8dae3577d97120b9d3fa44 +# Test 247 (edge case for u1) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02303ead55015c579ed137c58236bb70fe6be76628fbece64429bb655245f05cb91f4b8a499ae7880154ba83a84bf0569ae3 + +Px = 0x442766bdb8b2cf4fef5f65d5d86b61681ec89220c983b51f15bfe12fb0bf9780e0c38bbcc888afb3c55ee828774b86f7 +Py = 0x56b7f399c534c7acd46be4bc8bb38f087b0023b8f5166ab34192ca0b1cad62d663aa474c6f9286c8a054ef94ea42e3c7 +# Test 248 (edge case for u1) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100de03ff820a836e39d3a8435219297da1db193d79e359663e7cc9a229e2a6ac9e9d5c75417fa455bc8e3b89274ee47d0e + +Px = 0x11342b314f31648931abb897c1371dd3a23e91f2405c4a81744be18e753919752208779de2d54e865eeefbb0bfb4998a +Py = 0xf533d7a4d6fc6cb5cb98915ce08d0f656e37a502e78f8c1b8baca728c2ecb05a2156f01cff16595b363cdb49c00c1aa2 +# Test 249 (edge case for u1) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100e5a6ae07f855f14d93b8ff4f8bcd2b0a717261e6089a53d54bf86e22f8e37d73aaa7607cc2ab831404b3e5bb4e01e79e + +Px = 0x3c96b49ff60ff05951b7b1aca65664f13128b714da620697ef0d90bfc01ef643baa5c608f16ca885038322a443aed3e6 +Py = 0x169a27f2ea7a36376ef92a900e5389a7b441fd051d693ce65250b881cfdd6487370372292c84369742b18106188b05c0 +# Test 250 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02307fffffffffffffffffffffffffffffffffffffffffffffffed2119d5fc12649fc808af3b6d9037d3a44eb32399970dd0 + +Px = 0x388dae49ea48afb558456fdb1d0b04d4f8f1c46f14d22de25862d35069a28ae9284d7a8074546e779ad2c5f17ce9b89b +Py = 0xb353298f3c526aa0a10ed23bcb1ed9788812c8a3a6cbea82a3d9d8d465a4cca59dbd3d3d8a36098d644f1b45d36df537 +# Test 251 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023079b95c013b0472de04d8faeec3b779c39fe729ea84fb554cd091c7178c2f054eabbc62c3e1cfbac2c2e69d7aa45d9072 + +Px = 0xc85200ac6411423573e3ebc1b7aea95e74add5ce3b41282baa885972acc085c8365c05c539ce47e799afc353d6788ce8 +Py = 0x68cfce1eb2bfe009990084fb03c0919ab892313d7a12efc3514e8273685b9071892faefca4306adf7854afcebafffbf4 +# Test 252 (edge case for u2) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100bfd40d0caa4d9d42381f3d72a25683f52b03a1ed96fb72d03f08dcb9a8bc8f23c1a459deab03bcd39396c0d1e9053c81 + +Px = 0xe63ae2881ed60884ef1aef52178a297bdfedf67f4e3c1d876ad10b42c03b5e67f7f8cfaf4dfea4def7ab82fde3ed9b91 +Py = 0xe2be22bc3fa46a2ed094ebd7c86a9512c8c40cd542fb539c34347ef2be4e7f1543af960fd2347354a7a1df71a237d51 +# Test 253 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02304c7d219db9af94ce7fffffffffffffffffffffffffffffffef15cf1058c8d8ba1e634c4122db95ec1facd4bb13ebf09a + +Px = 0xe9c415f8a72055239570c3c370cf9380cdfabb6ebdbd8058e2fc65193080707895ea1566eeb26149603f4b4d4c1e79d4 +Py = 0x96ae17a001424d21eae4eaa01067048bcd919625fdd7efd896d980633a0e2ca1f8c9b02c99b69a1e4fa53468a2fe244d +# Test 254 (edge case for u2) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d219db9af94ce7ffffffffffffffffffffffffffffffffffd189bdb6d9ef7be8504ca374756ea5b8f15e44067d209b9b + +Px = 0x637223a93dd63af6b348f246e7b3bcb30beaa1dcc888af8e12e5086aa00f7792fbe457463c52422d435f430ad1bb4b21 +Py = 0xf9a1e01758d1e025b162d09d3df8b403226ed3b35e414c41651740d509d8cf6b5e558118607d10669902abebda3ca28d +# Test 255 (edge case for u2) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100a433b735f299cfffffffffffffffffffffffffffffffffffdbb02debbfa7c9f1487f3936a22ca3f6f5d06ea22d7c0dc3 + +Px = 0x7f4dc23982ecc8b84f54241715c7e94e950f596ce033237639a15fefa5eb5c37cb2e562d6d5b3051ea15600e3341a565 +Py = 0xfed2b55b89d2793321374887b78827ee4ca2216eac2993b1b095844db76adc560450135c072ac1a2c4167520237fbc9d +# Test 256 (edge case for u2) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b9af94ce7fffffffffffffffffffffffffffffffffffffffd6efeefc876c9f23217b443c80637ef939e911219f96c179 + +Px = 0xa0ae8c949f63f1b6a5d024c99e0a296ecd12d196d3b1625d4a76600082a14d455aab267c68f571d89ad0619cb8e476a1 +Py = 0x34634336611e1fd1d728bcea588d0e1b652bbca0e52c1bfbd4387a6337ff41ce13a65c8306915d2a39897b985d909b36 +# Test 257 (edge case for u2) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100a276276276276276276276276276276276276276276276273d7228d4f84b769be0fd57b97e4c1ebcae9a5f635e80e9df + +Px = 0x7cad1637721f5988cb7967238b1f47fd0b63f30f207a165951fc6fb74ba868e5b462628595edc80f75182e564a89c7a0 +Py = 0xfc04c405938aab3d6828e72e86bc59a400719270f8ee3cb5ef929ab53287bb308b51abd2e3ffbc3d93b87471bc2e3730 +# Test 258 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023073333333333333333333333333333333333333333333333316e4d9f42d4eca22df403a0c578b86f0a9a93fe89995c7ed + +Px = 0x2024ecde0e61262955b0301ae6b0a4fbd7771762feb2de35eed1823d2636c6e001f7bfcdbc4e65b1ea40224090411906 +Py = 0xd55362a570e80a2126f01d919b608440294039be03419d518b13cca6a1595414717f1b4ddb842b2c9d4f543e683b86a0 +# Test 259 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02307fffffffffffffffffffffffffffffffffffffffffffffffda4233abf824c93f90115e76db206fa7489d6647332e1ba3 + +Px = 0x40c5f2608956380c39695c7457ddce0880b5e8fab0a9a3726d0c8535b2ff6ca15814d83ed82c0ab33aba76e05e5c0476 +Py = 0xc9d15a2a0b2041237ff61c26519d1d74b141d7a4499fbdefc414a900937a8faf6ef560550c73cdb7edfe9314c480bb2b +# Test 260 (edge case for u2) +Signature = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02303fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294bb + +Px = 0x74acdfd2ab763c593bca30d248f2bf26f1843acf9eb89b4dfcb8451d59683812cf3cbe9a264ea435912a8969c53d7cb8 +Py = 0x496dcb0a4efed69b87110fda20e68eb6feed2d5101a4955d43759f10b73e8ffc3131e0c12a765b68bd216ed1ec4f5d2f +# Test 261 (edge case for u2) +Signature = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100dfea06865526cea11c0f9eb9512b41fa9581d0f6cb7db9680336151dce79de818cdf33c879da322740416d1e5ae532fa + +Px = 0xda35d6a82818ae5254cb65fc86ac42a47873ab247a5ca664e9f095e8de9a57fe721860e66cbc6bd499431a48a3991734 +Py = 0x945baab27ca6383737b7dd45023f997aff5e165f0fd7d8e5c0b5f9c5e731588af2fe5bd8976a0b871c132edf21f363af +# Test 262 (point duplication during verification) +Signature = 3066023100b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60023100e16043c2face20228dba6366e19ecc6db71b918bbe8a890b9dad2fcead184e071c9ac4acaee2f831a1e4cc337994f5ec + +Px = 0xda35d6a82818ae5254cb65fc86ac42a47873ab247a5ca664e9f095e8de9a57fe721860e66cbc6bd499431a48a3991734 +Py = 0x6ba4554d8359c7c8c84822bafdc0668500a1e9a0f028271a3f4a063a18cea7740d01a4266895f478e3ecd121de0c9c50 +# Test 263 (duplication bug) +Valid = 0 +Signature = 3066023100b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60023100e16043c2face20228dba6366e19ecc6db71b918bbe8a890b9dad2fcead184e071c9ac4acaee2f831a1e4cc337994f5ec + +Px = 0x820064193c71c7141fe41e711fe843a7474be6b05f50cb0be411cdf7fc78ea7ec96aeb3991ef7646bbde59152d381a32 +Py = 0x631c5adf93d488b45e67cc9890d8e779f63960193dc16bd1cc136b3e28cf499dfa8e7bff482a0115e6083987f7c042fc +# Test 264 (point with x-coordinate 0) +Signature = 3035020101023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326 + +Px = 0x52fabc58eacfd3a4828f51c413205c20888941ee45ecac076ffc23145d83542034aa01253d6ebf34eeefaa371d6cee11 +Py = 0x9f340712cd78155712746578f5632ded2b2e5afb43b085f81732792108e331a4b50d27f3578252ffb0daa9d78655a0ab +# Test 265 (point with x-coordinate 0) +Signature = 3065023101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0 + +Px = 0xa8fdb1a022d4e3a7ee29612bb110acbea27daecb827d344cb6c6a7acad61d371ddc7842147b74a18767e618712f04c1c +Py = 0x64ac6daf8e08cd7b90a0c9d9123884c7a7abb4664a75b0897064c3c8956b0ca9c417237f8d5a7dd8421b0d48c9d52c7c +# Test 266 (comparison with point at infinity ) +Signature = 3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0 + +Px = 0x878e414a5d6a0e0d1ab3c5563c44e80c3b2ef265f27a33ed5cac109ad664c1269beae9031d8d178cbfdb1bfa7cc3cc79 +Py = 0xfabbb2b6f7ce54026863b0f297a4fe3de82d5044dacafede49d5afc60bc875f4b659c06c19bb74c7c27351687f52b411 +# Test 267 (extreme value for k) +Valid = 1 +Signature = 3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326 + +Px = 0x984a1c04446a52ad6a54d64f2c6c49b61f23abe7dc6f33714896aefb0befb9a52b95b048561132c28c9850e851a6d00e +Py = 0xb4e19f9de59d30ca26801f2789a3330b081e6bf57f84f3c6107defd05a959cef5f298acea5a6b87b38e22c5409ec9f71 +# Test 268 (extreme value for k) +Signature = 3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326 + +Px = 0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7 +Py = 0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f +# Test 269 (testing point duplication) +Valid = 0 +Signature = 3064023043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158ca02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e + +# Test 270 (testing point duplication) +Signature = 3065023100bc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d322ff6d1d1162b5de29edcd0b69803fe2f8af8e3d103d0a902302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e + +Px = 0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7 +Py = 0xc9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0 +# Test 271 (testing point duplication) +Signature = 3064023043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158ca02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e + +# Test 272 (testing point duplication) +Signature = 3065023100bc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d322ff6d1d1162b5de29edcd0b69803fe2f8af8e3d103d0a902302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e + +Px = 0x29bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc +Py = 0x9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3 +# Test 273 (pseudorandom signature) +Msg = +Valid = 1 +Signature = 306402302290c886bbad8f53089583d543a269a727665626d6b94a3796324c62d08988f66f6011e845811a03589e92abe1f17faf023066e2cb4380997f4e7f85022541adb22d24d1196be68a3db888b03eb3d2d40b0d9a3a6a00a1a4782ee0a00e8410ba2d86 + +# Test 274 (pseudorandom signature) +Signature = 3066023100a3f1102e92ebe46d67e47c61e54a109347ddd7dced3721bffab6847607678f1d15bc1cb5b39b43ee52b02d684bf37850023100eeebb277b55c8748c47675f5e1cf85c1634cea8ce043040de5e76b1bd72e8067a7c6bfa6813b21396348dd01ac7ab61c + +# Test 275 (pseudorandom signature) +Signature = 3065023100f290946361f7b733316210d91fc06c1459893f5dbfcf1e086183e5d7730661ef9b3587a9b690438e92d2278779a4d3fd02307b8bdc03bd4cc0026befb1551c75cd6f6b962a80b96fa5b2bbe135cd7b37580501b931b273b298b2ae0ab1198c920e1a + +# Test 276 (pseudorandom signature) +Signature = 306502304da0ba312f61a16a1c9878408ba142b9809a25a089d53089e852d13670fe5050898105af571e1c02c32617a7b77e16e0023100ce54b6ba8d60e21ca6e3bbbc305dc946a92b72f167c412088ab77c08273c2cabe1cd4c89d1f508ffd420e1dae2efdaad + +# Test 277 (pseudorandom signature) +Signature = 306602310087e01c452f47c3a87bf083ed5f8db2fccf89722b56f8cd7a39fc850172f3033ec08c8dcde6015c032084aef34b3638bf023100f3676ef5f43ff23f303fddc5f59bdd0362c3953d48c383f950ef62e88f72e93138c0dbca4b933fa78f94cf3ce5da5cfc + +# Test 278 (pseudorandom signature) +Signature = 30650230557a8ad54ec9ea3806071f75621ed1c4bc3c9fda897066d7b3c827c1832dfc2520d6598265a89208241b852ce932e2e8023100c6629483a2a00da078aa35177833fdaa9956925dc10eca31d358c5403a0ab003858b7c08f383b44c0c658b1b18d354e9 + +# Test 279 (pseudorandom signature) +Signature = 3065023100db72e945913b3f8b421f2e87893a119e4de350fa899017efa7afa709e3c898972ffa70413d70de6dab9738ffb82a89920230767853ae338f0f0405eaf8a59302200a6bc291edd3a0355c8844c01e7aa59a0b39691d15b94827b07ebb3175584a7d58 + +# Test 280 (pseudorandom signature) +Signature = 30650231008c1b2c1610665be24f03b47527dced5cc82d8991e13b906f22c9847b73c066934e1457afc14465761c61ca3a4cb144ed023046f7127854b68a76efa6ec4cda7929d20bff808e624fcb824d544cdf322ff21df61d737631965360a3a198a457aa33e1 + +# Test 281 (pseudorandom signature) +Signature = 306502303a8ddef86bfbf861d75ecbf8e8a3612decc043252538286b15af1a87fda64142dd1f139af7678ae7f7104e5090724e3f0231009933cd18a87341a94f1dbee88044cd8b72b394693d2503dc7cf9337aa3f6f83662c61b374a27fa45c4b3fbef9aff29fe + +# Test 282 (pseudorandom signature) +Signature = 306402306a28f6e429413f3f03c20f3c7841b83adade75054c2237a060787646712d09df8b7283eda1c2bfc039d0453639aab5a602306c3837367c65397024a0dc910735132219c1c1ed9e127528c3549efc6f897806416f9c41296175c61cd70d06e90e003e + +# Test 283 (pseudorandom signature) +Msg = 4d7367 +Signature = 30650231008071d8cf9df9efef696ebafc59f74db90c1f1ecf5ccde18858de22fe4d7df2a25cb3001695d706dfd7984b39df65a0f4023027291e6339c2a7fed7a174bb97ffe41d8cfdc20c1260c6ec85d7259f0cc7781bf2ae7a6e6fb4c08e0d75b7381bb7d9b8 + +# Test 284 (pseudorandom signature) +Signature = 3065023100c89ec4718c55edfdb5ba2ecf4cb12277b49e59f5f3ee3f57b8905f585ce04f79ba0032380ea35922d7ea63f064c93d2002306d212828521c0cae11ae4a8c89a996a3557e10f975b1837f401622c257e3a3cb72b38cc6bb0ee595e5c876a1646441fe + +# Test 285 (pseudorandom signature) +Signature = 3065023100d01de802b92ea4ca0baa4c14cfb491ca03f2fe3905b6a8d02fac21d8f0d65fe0743776d1473195f0e2f021361db83a490230791231dc4382dcded690ee9edf8d0ccfc90704dcf1bd211a873b6d6c704e745cabd305a51f9238d0f406998e735895b8 + +# Test 286 (pseudorandom signature) +Signature = 3065023100b2623abbdc4e5d0cf47b4d629734fd39171cd2e1cfc231ad467f8470e0bc83fcf9e391c68409d3421d7492a7d25d72a90230167750548143e8239b73ce6f7ff2eddb14b8290fc7a92deae483c112d111d04cf4c0ae55ca65f9aa27fb36bc16b64a55 + +# Test 287 (pseudorandom signature) +Signature = 3065023100ad08aa6dcbcec824cb6c92d6506b1ea7b0228185a446e0cad5961a36272755845a12f8300984f3a9f55004204d17b87b023003dd40f67bfe14a875a453321d84645273420bc16c4ac3e237035740c5712f837afcc5329eeb4adcfa1ef2bcd53c09b9 + +# Test 288 (pseudorandom signature) +Signature = 3066023100a6f16b617020bcf0f31ded86fcb8001acfe856bb5267baf7cdb862d396b7619432559240e471f80f506b186eabf84bb3023100bd748eea34293676c7cb21a7aea1871aad4e06363d5ed33abebc6c9dd72160c24c0f15d807f3a435fe4c8fcbe63a6f25 + +# Test 289 (pseudorandom signature) +Signature = 3066023100f72891f7c26020b0487c60d58d0f9663d4e508045268937c23f84b023f991ce92d33fe33dc78083b53a6da02cfb10faf023100f17ea544d497229b54cd49194a6c9d68db6b4db2d0e024daaaf4d19c200d7687cad5e33c893ed59d7627418211dde679 + +# Test 290 (pseudorandom signature) +Signature = 30640230773332032272abf6efb4f91947af3503433003149807d95a6d318541835aa93cc2e41b6b8735b7a5ed4028ab6b3c4d80023068316b3263a5e34c32c338b9cf329f6b64cebe6e4d73bef9ac4b12013027cf6db87b31ed6128a47525b72a139c10752d + +# Test 291 (pseudorandom signature) +Signature = 3066023100fa0c7636f79cd35e1af317354adb4ce9aaddc6b70a89c972ead222b48dfff4a320fc62d90ef737a642b347c752d5e468023100fafaaa2b3f7e92ea0b0f2b89088ec1adcbd3b9c7b97e8893ad9ca07e9ced7fd37b1aabab68114fe42a4abbeaa32d84ae + +# Test 292 (pseudorandom signature) +Signature = 3065023017fbfd972e166d5a788d9af84160f6ecfcd86f5287945bc816bfc644f9849bc1608095de69533699fc465f4e4f074fb7023100d0c71ce90c5ffaef356a1d28ebe6b4e047c678c489f219e12e353a94fbd6478d2fd8bc8f363614cb532b7669943aefd8 + +# Test 293 (pseudorandom signature) +Msg = 313233343030 +Signature = 30650230470014ccd7a1a5e5333d301c8ea528ac3b07b01944af30cec60f4bad94db108509e45ba381818b5bdfaf9daf0d372301023100e3d49d6a05a755aa871d7cb96fffb79fed7625f83f69498ba07c0d65166a67107c9a17ae6e1028e244377a44096217b2 + +# Test 294 (pseudorandom signature) +Signature = 3066023100fb766fd8f8d4142b57252b38e958fbcc802031776f5a2ed33a089b150d57f1e5b61820c9db9429b9d4a0d0dac0724779023100ab4dd8ed8989bb38a33a90e898383dc01d5e93f283700890f9c52fb18ef5c82304dfb6b719fcfcf4911ec7c5c2fc8bdb + +# Test 295 (pseudorandom signature) +Signature = 30640230455a32ff77b60c69cef3660a8372d82b3ea3f5ae39151c481e8aceb7d0ebed159a6f2981c00e2db7b0961452b400f35c02305774e8505bfcb77f3a3d751c31d7e19b3d172228826d1d7ea177d418c58f792d36e13ebd14202197c2070e0223fd3900 + +# Test 296 (pseudorandom signature) +Signature = 306502302ff98892d18cc048dbb9e5dafebc222300b3ae8a8364f9d2f98ffd4a336fc1ee8bcb89bfe28d9c3e8abac7d153370d760231009045438e28185061d05fdff63cd314d9fc59891bf616bf5e001d313a560d49714dd7864099a09b8032ea870d31d451b6 + +# Test 297 (pseudorandom signature) +Signature = 30660231009cafe84002716b7aa1bc76517177e6188f031c066f41cc5e4e4429ef11b855070e91ad94299d7df1e66457336d40774902310094a341146eb31c97759199cada842bf4f9c5e205ef49663939dcce2d40db7f947b91d8e9b0c8398e2f7028cf1e529b8c + +# Test 298 (pseudorandom signature) +Signature = 3065023100a1a5d4820fe5226f2f547b238c96eb62c299ad17bb43298fbf39607cbd908256351a41f44a62d0f20eba1001f22f7b5e02307431dc7ead3664a8aea70efb317af12947e7b49e41e660e522295a0a04c1f6a526158ead5644d82ac4cca618bf01becd + +# Test 299 (pseudorandom signature) +Signature = 306502302c14d1df832aa0eb10e7ce221735ad7584ac0887531b32402e3c1e57fc863be5bc5a2bb87b86165df64f3a4233e761c5023100bdfc8c3579e2417f49d5628dc8286b32663188e017d936e10d61cd3f6edb97919b109c5567b46f4708106fe671f1d5fb + +# Test 300 (pseudorandom signature) +Signature = 3065023009a8643aee4ec1119c836373e167064a53888ef7abe5faeed250c1f9960c6c06bcd42a11f13181d3aab8246767dc5368023100bbb6dd94750e6656babd4e159e27a2fa986bc7e4441771ef87b2280f93056dc5a4a38d1c45b8bc2aa20a4b0c5945b57b + +# Test 301 (pseudorandom signature) +Signature = 3066023100841721e96c44524e86c56d84a5aaea1ac439b060aa11d3e2a1961babd4778075f138dfc0189d3ceac0caccf5bbc1943d023100c9b0df9963daa9b2fe5d75edad22a9316af0132bbda41f7b6754425e9378fa12af0111baabcd37b43714171fcadd978b + +# Test 302 (pseudorandom signature) +Signature = 306402300a453df160ea5a79926517f16dba255826b87aebabd6fe9f0332100f94ca5cce86f1a528cf4e0010add0eaa7d86b84be023023a1fae44f99681c9b7b2495fb056e206a0e8c4b60a065a576d0bac6f867ef06c402bc8e8584392a3c97accaa0a36cbc + +# Test 303 (pseudorandom signature) +Msg = 0000000000000000000000000000000000000000 +Signature = 30640230377044d343f900175ac6833071be74964cd636417039e10e837da94b6919bffc3f5a517b945a450852af3259f5cbf108023032ea25006375c153581e80c09f53ad585c736f823c70147aba4fb47bb0a224fae4d8819adad80d4c144ecc2380954a9e + +# Test 304 (pseudorandom signature) +Signature = 3065023002881912e33e93b3d6d4daaffbb8bdc421240934f006be89d918ef43a82ea072921f940748c59d1368511355e936c5360231008a77df61061022893e15a793a6a5e332bf4c963b2f8ccd4e1a3193ce196b09afac6740a32118adafffcab61cbc96b5df + +# Test 305 (pseudorandom signature) +Signature = 3065023100d55902bc90b4ba98054c751746a0109edb8c2ca928585c5c847bc4abf65482ecac190541248e905e7ce5ca313341c6d8023063bd0c665fd69f43ad50417b5bfd2c669f10d12b33e119c605978069f45457beaff125e3492ffa3d166fbc6735d996c4 + +# Test 306 (pseudorandom signature) +Signature = 3065023100867551b1271ca957a4f71a645ec14be9973633efbb5d23fb7adaa234b47ad618c6dca48301d8791baf9eaa69155a8cb202301623c18f1a4cd4703756418e6d8bc4868de44f170b094700d6b73e5b9b8a461598f8d0c7041e2cef0411b16f0b5485ed + +# Test 307 (pseudorandom signature) +Signature = 3065023100b0f8b43879c5241e40981335abbc66cce82868a2ded3d9dd40a7ed882d59ad8bda1f51f382608380917a92d99e45380602301fc0128240724d16b8cb1cc481f4b5fb972b2f7fc984e488550313443b409151c93171da08222253d0c46bb121f0c418 + +# Test 308 (pseudorandom signature) +Signature = 3065023100a04b68197390cacb812b47c28158689f11df11f61029b0cfb4989aa4faa7ee4a15c0837642c24d450ca6ea05a79b914102304a243a2491b8f54e5cdf34ee80b2571956e7df6ea0680443a2da089db84c5bd68e489e108e1064fd291c9fb23603469d + +# Test 309 (pseudorandom signature) +Signature = 3064023047bc5ab70e4fc533f42fb58ab387f7444d2c655093e47fc988b64ba279fa03a93191eae120b7642795c50a9be44216590230347ad7008ba5f47043858e5a6bc04f05cffb91045cc9a29d6b224cd4e1f50bda10449a2d2e054581a00f1f65062223c0 + +# Test 310 (pseudorandom signature) +Signature = 3065023008fb1f88f24104bc8d0f3c5ff573d9e714fa87856255503da7a13a2cce87ae4cc383000eb3940374f2b09fcd152e8097023100e86fa46404216031e00a0df4360d49feed084eb7a88a8d1264a4842c802d60bae44b117cba233cc567360c4626913f0b + +# Test 311 (pseudorandom signature) +Signature = 3066023100d4353b7c73abaaefdb11321f374ac8584d9d1fd72836300d8353bf9fe35f269f9225e58630a4182f16c07b00efce32e502310082e4180a271b4571835ebe0299ac13a2053500be7f31747e30318d6dd69e95a59b7f3e1fb457c6929f3e7c84ba6fdd43 + +# Test 312 (pseudorandom signature) +Signature = 30650231009d124af0982f176a7f7ac202861a8e3eec892956f0987d8a6c141cf8073b27eeca265bd668ced4280c4a64408cdc38e9023065dd8e11cc71ba60a492fe03b35a8dcec34ff47e99bc3e258e877784ebe0ee77b1d0b67ebc9d2c4b37257fa30bdfaa87 + +Px = 0xffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aac +Py = 0xacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1 +# Test 313 (x-coordinate of the public key is large) +Msg = 4d657373616765 +Signature = 3066023100ccb13c4dc9805a9b4e06ee25ef8c7593eaff7326c432d4b12b923163cf1cbe5fe1cfd3546c1d0761d8874e83ffd2e15d023100db1b0c082ae314b539f05e8a14ad51e5db37f29cacea9b2aab63a04917d58d008cf3f7ba41d5ea280f3b6a67be3ae8f8 + +# Test 314 (x-coordinate of the public key is large) +Signature = 3065023100c79a30e36d2126b348dd9eb2f5db6aa98f79d80214027e51bcf3cabec188a7ebaf25cb7bbe9ec6bfed135e2a3b70e9160230241338ee2ac931adea9a56e7bfe909947128d54d5122a47b00c278e684e10102740d26e89e343290a5b2fa8b401faec6 + +# Test 315 (x-coordinate of the public key is large) +Signature = 306402300df82e4ec2960e3df614f8b49cec9a4ee1054365414241361feec9d9d9b6909d8775f222ec385a14afab46266db390c302300968485e854addba0f8354e677e955e1ef2df973d564c49f65f2562cb2a2b80d75e92f8784042955f7b8765f609ce221 + +Px = 0xd1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422 +Py = 0xc6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000 +# Test 316 (y-coordinate of the public key has many trailing 0's) +Signature = 306402301fafd83d728422e1485f1e52e5b631548647cc3c76c109c3177a73751d91a19012fa4628b218f2229fc4d55f105fe00102304474f9af7b4b0bb96fdb05ae918f799024e8d5b864e49ccd047cf97e7b9f8763cce015c11cf1f461c9027cb901055101 + +# Test 317 (y-coordinate of the public key has many trailing 0's) +Signature = 3066023100e6025bb957ab197fb4c080d0a5c647e428afb0d7cc235c605ae97545494fd31a9979790bb2da6e1cf186789422b15c970231008ae9872291430d1bb371ef72360dad5afbb6fb001f403d9aaa1445f0326eb1eef775c9dfe1d7ef8bf4e744822108d27e + +# Test 318 (y-coordinate of the public key has many trailing 0's) +Signature = 3066023100877d5567c18fa568259005a89c2300d1b3825b732fa14964c1477d4b3098afd09384b97d497464adba41e9df8a74d339023100c40f0760717b4b3bae75742b6dc3dcf04cc22a449cfea19d305e0658cb705fda75163e7399e0b3125ca7d1919c13851e + +Px = 0x1099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000 +Py = 0xe6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557 +# Test 319 (x-coordinate of the public key has many trailing 0's) +Signature = 3065023100e706b0045a6f54bd175e2437b48767b0204f93d8a4d9d3d00838278137e5b670de4305c5c55e49059b8b5f6e264654c90230405741adff94afd9a88e08d0b1021911fa4cedb2466b1a8fd302a5b5d96566ada63ccb82b6c5e8452fde860c545e0a19 + +# Test 320 (x-coordinate of the public key has many trailing 0's) +Signature = 306502300c57ce2bc579fbd3a759dfbf5e84c3cef2414846a2e300453e1e4c5188f24432b14ca647a733b6ad35c980a880d36145023100f12a119e22d48b82049df611f1c851fb22795056498a873c730fcb9fd8f314728de0298b9b22c348abc6de2aba97e972 + +# Test 321 (x-coordinate of the public key has many trailing 0's) +Signature = 30660231009a8f80697ccf2e0617612027d861a3a3a657fb75cc82810b40dd5072d39ff37eca29008390da356137e2c9babd814198023100a86537a83c3d57da50e4b29b47dcc3717c5a1ed0fff18ade8dcce4220eac63aab60b9bfed5f1bdd241dab655a9bdd75f + +Px = 0x2b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69 +Py = 0xd1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98 +# Test 322 (x-coordinate of the public key is small) +Signature = 306602310093718f6f8542725f62de7039fc193d3fcc81d622230ccc94e9e265390b385af3a3ba50c91a9d6a5b1e07d79af2bd80b2023100d08499f3d298e8afecea122265a36dbf337259020654739783c8ec8ef783d072555b5907285ce83fc8ced9c8398c6269 + +# Test 323 (x-coordinate of the public key is small) +Signature = 3066023100ce26e42c490dec92cf59d6b1ba75c9a1400d6e5c3fd7c47e1eeb1cded30a3a3d18c81cdfdcbad2742a97293369ce21c202310094671085d941fd27d495452a4c8559a1fe24f3225f5b8ef75faf9d3fb01372c586e23b82714359d0e47144ff5d946161 + +# Test 324 (x-coordinate of the public key is small) +Signature = 3066023100ffc4738acf71f04a13104c328c138b331fb7202aef66f583ba543ed490d12993c18f724c81ad0f7ea18dae352e5c6480023100e67d4ccdeb68a9a731f06f77eae00175be076d92529b109a62542692c8749ddfde03bed1c119a5901a4e852f2115578f + +Px = 0xfb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336 +Py = 0x208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4 +# Test 325 (y-coordinate of the public key is small) +Signature = 3065023100e6fa8455bc14e730e4ca1eb5faf6c8180f2f231069b93a0bb17d33ad5513d93a36214f5ce82ca6bd785ccbacf7249a4c02303979b4b480f496357c25aa3fc850c67ff1c5a2aabd80b6020d2eac3dd7833cf2387d0be64df54a0e9b59f12c3bebf886 + +# Test 326 (y-coordinate of the public key is small) +Signature = 306502301b49b037783838867fbaa57305b2aa28df1b0ec40f43140067fafdea63f87c02dfb0e6f41b760fbdf51005e90c0c3715023100e7d4eb6ee61611264ea8a668a70287e3d63489273da2b30ad0c221f1893feaea3e878c9a81c6cec865899dbda4fa79ae + +# Test 327 (y-coordinate of the public key is small) +Signature = 306502310091d9da3d577408189dcaae33d95ed0a0118afd460d5228fa352b6ea671b172eb413816a70621ddaf23c5e2ef79df0c110230053dadbfcd564bddbe44e0ecb4d1e608dbd35d4e83b6634cc72afb87a2d61675ee13960c243f6be70519e167b1d3ceb0 + +Px = 0xfb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336 +Py = 0xffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b +# Test 328 (y-coordinate of the public key is large) +Signature = 3065023100af0ed6ce6419662db80f02a2b632675445c7bf8a34bbacdc81cc5dd306c657ca4c5a3fb1b05f358d8f36fda8ae238806023046b472c0badb17e089c8f9697fd0b4ce71f0f4471b235483d4c8dd3d00aa282cde990253df38ba733b2ad82a601c7508 + +# Test 329 (y-coordinate of the public key is large) +Signature = 3066023100e2aa9468ccaaadad8b9f43a429c97f0c6a7eedcb4d4af72d639df0fe53f610b953408a8e24e8db138551770750680f7a023100d81020846d1c50ee9ae23601dd638cb71b38d37fb555268c2fa1ad8a761fa7b27afcab2fa69224d1f976699914e09de2 + +# Test 330 (y-coordinate of the public key is large) +Signature = 306402306bf6fa7a663802c3382cc5fd02004ec71e5a031e3d9bfc0858fa994e88497a7782308bc265b8237a6bbbdd38658b36fc02303a9d5941a013bf70d99cc3ff255ce85573688dac40344b5db7144b19bf57bb2701e6850a8f819796b67f7d0b6aea7e50 + +Group = secp521r1 +Px = 0x5c6457ec088d532f482093965ae53ccd07e556ed59e2af945cd8c7a95c1c644f8a56a8a8a3cd77392ddd861e8a924dac99c69069093bd52a52fa6c56004a074508 +Py = 0x7878d6d42e4b4dd1e9c0696cb3e19f63033c3db4e60d473259b3ebe079aaf0a986ee6177f8217a78c68b813f7e149a4e56fd9562c07fed3d895942d7d101cb83f6 +# Test 1 (signature malleability) +Msg = 313233343030 +Signature = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024201d74a2f6d95be8d4cb64f02d16d6b785a1246b4ebd206dc596818bb953253245f5a27a24a1aae1e218fdccd8cd7d4990b666d4bf4902b84fdad123f941fe906d948 + +# Test 2 (random signature) +Signature = 30818802420081d7b378e361fe518b0afc37ffb88f0dcc62be9a9e03d23412efb8c799b803a96ccb37886a57c4f61b228ae2609cb6f14033494846f79aeb2c4fc70c9c020bc1530242010b2471c2a7ebbc5e48f03d2dbbbf89c847a44dedc7ffcddd073f1f814cb0fd1418bd524ba1ec74abef8e4a27f19eab93db20d4553a603f04a0c3719430d80e1197 + +# Test 3 (random signature) +Signature = 308188024200e819b543589aa13fddef2531dd1c67caa775493b2d307e8130a765f7772d5056d3a5eb6bb37979d9606c1b36862e8397d38d7aae666c558705ce13667cc832d4af02420162398631365bde51182b0b8869b2d924defff46abcbb5fd07dd90240644f623c15f5ed7ad32f6f9a2b81db7f9eb4e8b25ca53e30f1ffc21cdfed6c437b8b03fcbb + +# Test 4 (random signature) +Signature = 308188024201ac089cee6fceeb3c00cf74492744b63121d94e7a3d480e59627d64afba97b8745b724ec54f9bf1d4601acdca547404771d06213e3357ebdb729bcfd70cd069fc2d024201ce834aedf2bda5e7fc97aad2df904b9f4ed7a6c26aed152e46de2eda517704fe8d2955a9c1a5790e2f86a4b3c09ac61aff8bc8dfe000cd0e016891806065e51f4a + +# Test 5 (random signature) +Signature = 308186024156b7aa356f1584b4c209aa24eadb3de60775e1273bee4f0e9d247ceae97e3d6f701798e883be932cd60d95fb0e659a7f3e2a8291b757f851a0a284b28932f6cf28024127aa41b0bf9ed8202f46f7eb312574601028831cef64d9e1dc7a4e553e8d3c0d5a837baaccfe065bff0bc4e8d389fc1335edaeecc7862bec41af6ed5bb4bc8a19f + +# Test 6 (random signature) +Signature = 308188024200bb73df934eef063702468f828c2338cbdc4f9cb71b07334f68f44f9189322cfe0a1c499545bab1195e4b6f9368a848cbead4c77fee1aa4edd0b617a51dd075a604024201171cf378b95cd4032e42c789a315b51632be03620dae45d58f024b9f3cb90b2bdb15b3ebddb89f2f811d06482962adab8d31b2894296846e28f520efe63d725f7c + +# Test 7 (valid) +Signature = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 8 (length contains leading 0) +Valid = 0 +Signature = 3082008602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 9 (length contains leading 0) +Signature = 308188028200414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 10 (length contains leading 0) +Signature = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450282004128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 11 (wrong length) +Signature = 308702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 12 (wrong length) +Signature = 308502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 13 (wrong length) +Signature = 30818602424e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 14 (wrong length) +Signature = 30818602404e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 15 (wrong length) +Signature = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024228b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 16 (wrong length) +Signature = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 17 (uint32 overflow in length) +Signature = 3085010000008602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 18 (uint32 overflow in length) +Signature = 30818b028501000000414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 19 (uint32 overflow in length) +Signature = 30818b02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450285010000004128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 20 (uint64 overflow in length) +Signature = 308901000000000000008602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 21 (uint64 overflow in length) +Signature = 30818f02890100000000000000414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 22 (uint64 overflow in length) +Signature = 30818f02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645028901000000000000004128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 23 (length = 2**31 - 1) +Signature = 30847fffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 24 (length = 2**31 - 1) +Signature = 30818a02847fffffff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 25 (length = 2**31 - 1) +Signature = 30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502847fffffff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 26 (length = 2**32 - 1) +Signature = 3084ffffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 27 (length = 2**32 - 1) +Signature = 30818a0284ffffffff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 28 (length = 2**32 - 1) +Signature = 30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450284ffffffff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 29 (length = 2**40 - 1) +Signature = 3085ffffffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 30 (length = 2**40 - 1) +Signature = 30818b0285ffffffffff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 31 (length = 2**40 - 1) +Signature = 30818b02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450285ffffffffff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 32 (length = 2**64 - 1) +Signature = 3088ffffffffffffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 33 (length = 2**64 - 1) +Signature = 30818e0288ffffffffffffffff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 34 (length = 2**64 - 1) +Signature = 30818e02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450288ffffffffffffffff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 35 (incorrect length) +Signature = 30ff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 36 (incorrect length) +Signature = 30818602ff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 37 (incorrect length) +Signature = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502ff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 38 (indefinite length without termination) +Signature = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 39 (indefinite length without termination) +Signature = 30818602804e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 40 (indefinite length without termination) +Signature = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645028028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 41 (removing sequence) +Signature = + +# Test 42 (appending 0's to sequence) +Signature = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000 + +# Test 43 (prepending 0's to sequence) +Signature = 308188000002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 44 (appending unused 0's) +Signature = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000 + +# Test 45 (appending unused 0's) +Signature = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450000024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 46 (appending null value) +Signature = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10500 + +# Test 47 (appending null value) +Signature = 30818802434e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450500024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 48 (appending null value) +Signature = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024328b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10500 + +# Test 49 (including garbage) +Signature = 30818c49817730818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 50 (including garbage) +Signature = 30818b250030818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 51 (including garbage) +Signature = 30818930818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10004deadbeef + +# Test 52 (including garbage) +Signature = 30818b224649817702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 53 (including garbage) +Signature = 30818a2245250002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 54 (including garbage) +Signature = 30818e224302414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450004deadbeef024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 55 (including garbage) +Signature = 30818b02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452246498177024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 56 (including garbage) +Signature = 30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864522452500024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 57 (including garbage) +Signature = 30818e02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452243024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10004deadbeef + +# Test 58 (including undefined tags) +Signature = 30818faa00bb00cd0030818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 59 (including undefined tags) +Signature = 30818daa02aabb30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 60 (including undefined tags) +Signature = 30818e2249aa00bb00cd0002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 61 (including undefined tags) +Signature = 30818c2247aa02aabb02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 62 (including undefined tags) +Signature = 30818e02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452249aa00bb00cd00024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 63 (including undefined tags) +Signature = 30818c02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452247aa02aabb024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 64 (using composition with indefinite length) +Signature = 308030818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000 + +# Test 65 (using composition with indefinite length) +Signature = 30818a228002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450000024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 66 (using composition with indefinite length) +Signature = 30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452280024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000 + +# Test 67 (using composition with wrong tag) +Signature = 308031818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000 + +# Test 68 (using composition with wrong tag) +Signature = 30818a228003414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450000024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 69 (using composition with wrong tag) +Signature = 30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452280034128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000 + +# Test 70 (Replacing sequence with NULL) +Signature = 0500 + +# Test 71 (changing tag value) +Signature = 2e818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 72 (changing tag value) +Signature = 2f818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 73 (changing tag value) +Signature = 31818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 74 (changing tag value) +Signature = 32818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 75 (changing tag value) +Signature = ff818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 76 (changing tag value) +Signature = 30818600414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 77 (changing tag value) +Signature = 30818601414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 78 (changing tag value) +Signature = 30818603414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 79 (changing tag value) +Signature = 30818604414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 80 (changing tag value) +Signature = 308186ff414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 81 (changing tag value) +Signature = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645004128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 82 (changing tag value) +Signature = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645014128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 83 (changing tag value) +Signature = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645034128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 84 (changing tag value) +Signature = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645044128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 85 (changing tag value) +Signature = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645ff4128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 86 (dropping value of sequence) +Signature = 3000 + +# Test 87 (using composition) +Signature = 30818b300102308185414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 88 (using composition) +Signature = 30818a224502014e02404223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 89 (using composition) +Signature = 30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864522450201280240b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 90 (truncate sequence) +Signature = 30818502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318a + +# Test 91 (truncate sequence) +Signature = 308185414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 92 (indefinite length) +Signature = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000 + +# Test 93 (indefinite length with truncated delimiter) +Signature = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac100 + +# Test 94 (indefinite length with additional element) +Signature = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac105000000 + +# Test 95 (indefinite length with truncated element) +Signature = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1060811220000 + +# Test 96 (indefinite length with garbage) +Signature = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000fe02beef + +# Test 97 (indefinite length with nonempty EOC) +Signature = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10002beef + +# Test 98 (prepend empty sequence) +Signature = 308188300002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 99 (append empty sequence) +Signature = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac13000 + +# Test 100 (sequence of sequence) +Signature = 30818930818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 101 (truncated sequence) +Signature = 304302414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645 + +# Test 102 (repeat element in sequence) +Signature = 3081c902414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 103 (long form encoding of length) +Signature = 3081870281414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 104 (long form encoding of length) +Signature = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502814128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 105 (removing integer) +Signature = 3043024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 106 (appending 0's to integer) +Signature = 30818802434e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450000024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 107 (appending 0's to integer) +Signature = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024328b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000 + +# Test 108 (prepending 0's to integer) +Signature = 308188024300004e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 109 (prepending 0's to integer) +Signature = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450243000028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 110 (Replacing integer with NULL) +Signature = 30450500024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 111 (Replacing integer with NULL) +Signature = 304502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450500 + +# Test 112 (dropping value of integer) +Signature = 30450200024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 113 (dropping value of integer) +Signature = 304502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450200 + +# Test 114 (modify first byte of integer) +Signature = 30818602414c4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 115 (modify first byte of integer) +Signature = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502412ab5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 116 (modify last byte of integer) +Signature = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86c5024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 117 (modify last byte of integer) +Signature = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318a41 + +# Test 118 (truncate integer) +Signature = 30818502404e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 119 (truncate integer) +Signature = 30818502404223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 120 (truncate integer) +Signature = 30818502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318a + +# Test 121 (truncate integer) +Signature = 30818502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450240b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 122 (leading ff in integer) +Signature = 3081870242ff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 123 (leading ff in integer) +Signature = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450242ff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 124 (infinity) +Signature = 3046090180024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 125 (infinity) +Signature = 304602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645090180 + +# Test 126 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3081870242024e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbe97b3367122fa4a20584c271233f3ec3b7f7b31b0faa4d340b92a6b0d5cd17ea4e024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 127 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3081870242fe4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbf4d826580ab145752e852a6e91512b78178047879e9714a4ae1bc74298aaa7223c024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 128 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3081860241b1bddc11bc17347621c4ecc6003d861a7d07d3854f08e4421bc241c8b538a00410d65320718f8af465fb099025b7cae2184402aea8df4f13a328c90648c42079bb024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 129 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 308187024201b1bddc11bc17347621c4ecc6003d861a7d07d3854f08e4421bc241c8b538a0040b27d9a7f54eba8ad17ad5916eaed487e87fb8786168eb5b51e438bd675558ddc4024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 130 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3081870242fdb1bddc11bc17347621c4ecc6003d861a7d07d3854f08e4421bc241c8b538a0041684cc98edd05b5dfa7b3d8edcc0c13c48084ce4f055b2cbf46d594f2a32e815b2024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 131 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3081870242024e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 132 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 3081870242fe4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 133 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 308187024201b1bddc11bc17347621c4ecc6003d861a7d07d3854f08e4421bc241c8b538a00410d65320718f8af465fb099025b7cae2184402aea8df4f13a328c90648c42079bb024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 134 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502420228b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba09a7b6ac4ecd0410b4722ca75ba197a403a0a1f9ee0e7b391b0649fda1d3969eeca + +# Test 135 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450242fe28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a5d85db5e551e1de70233273282b66f49992b40b6fd47b0252edc06be016f926b8 + +# Test 136 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450241d74a2f6d95be8d4cb64f02d16d6b785a1246b4ebd206dc596818bb953253245f5fd61bc296eeee8b245d018b8edd8f659631962ad7a1e8b5fe56cfdd0157ce753f + +# Test 137 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450242fdd74a2f6d95be8d4cb64f02d16d6b785a1246b4ebd206dc596818bb953253245f6584953b132fbef4b8dd358a45e685bfc5f5e0611f184c6e4f9b6025e2c6961136 + +# Test 138 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502420228b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 139 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450242fe28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1 + +# Test 140 (Modified r or s, e.g. by adding or subtracting the order of the group) +Signature = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024201d74a2f6d95be8d4cb64f02d16d6b785a1246b4ebd206dc596818bb953253245f5fd61bc296eeee8b245d018b8edd8f659631962ad7a1e8b5fe56cfdd0157ce753f + +# Test 141 (Signature with special case values for r and s) +Signature = 3006020100020100 + +# Test 142 (Signature with special case values for r and s) +Signature = 3006020100020101 + +# Test 143 (Signature with special case values for r and s) +Signature = 30060201000201ff + +# Test 144 (Signature with special case values for r and s) +Signature = 3047020100024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409 + +# Test 145 (Signature with special case values for r and s) +Signature = 3047020100024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408 + +# Test 146 (Signature with special case values for r and s) +Signature = 3047020100024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a + +# Test 147 (Signature with special case values for r and s) +Signature = 3047020100024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +# Test 148 (Signature with special case values for r and s) +Signature = 30470201000242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +# Test 149 (Signature with special case values for r and s) +Signature = 3008020100090380fe01 + +# Test 150 (Signature with special case values for r and s) +Signature = 3006020101020100 + +# Test 151 (Signature with special case values for r and s) +Signature = 3006020101020101 + +# Test 152 (Signature with special case values for r and s) +Signature = 30060201010201ff + +# Test 153 (Signature with special case values for r and s) +Signature = 3047020101024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409 + +# Test 154 (Signature with special case values for r and s) +Signature = 3047020101024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408 + +# Test 155 (Signature with special case values for r and s) +Signature = 3047020101024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a + +# Test 156 (Signature with special case values for r and s) +Signature = 3047020101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +# Test 157 (Signature with special case values for r and s) +Signature = 30470201010242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +# Test 158 (Signature with special case values for r and s) +Signature = 3008020101090380fe01 + +# Test 159 (Signature with special case values for r and s) +Signature = 30060201ff020100 + +# Test 160 (Signature with special case values for r and s) +Signature = 30060201ff020101 + +# Test 161 (Signature with special case values for r and s) +Signature = 30060201ff0201ff + +# Test 162 (Signature with special case values for r and s) +Signature = 30470201ff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409 + +# Test 163 (Signature with special case values for r and s) +Signature = 30470201ff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408 + +# Test 164 (Signature with special case values for r and s) +Signature = 30470201ff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a + +# Test 165 (Signature with special case values for r and s) +Signature = 30470201ff024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +# Test 166 (Signature with special case values for r and s) +Signature = 30470201ff0242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +# Test 167 (Signature with special case values for r and s) +Signature = 30080201ff090380fe01 + +# Test 168 (Signature with special case values for r and s) +Signature = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020100 + +# Test 169 (Signature with special case values for r and s) +Signature = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020101 + +# Test 170 (Signature with special case values for r and s) +Signature = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864090201ff + +# Test 171 (Signature with special case values for r and s) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409 + +# Test 172 (Signature with special case values for r and s) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408 + +# Test 173 (Signature with special case values for r and s) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a + +# Test 174 (Signature with special case values for r and s) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +# Test 175 (Signature with special case values for r and s) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864090242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +# Test 176 (Signature with special case values for r and s) +Signature = 3049024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409090380fe01 + +# Test 177 (Signature with special case values for r and s) +Signature = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408020100 + +# Test 178 (Signature with special case values for r and s) +Signature = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408020101 + +# Test 179 (Signature with special case values for r and s) +Signature = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864080201ff + +# Test 180 (Signature with special case values for r and s) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409 + +# Test 181 (Signature with special case values for r and s) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408 + +# Test 182 (Signature with special case values for r and s) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a + +# Test 183 (Signature with special case values for r and s) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +# Test 184 (Signature with special case values for r and s) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864080242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +# Test 185 (Signature with special case values for r and s) +Signature = 3049024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408090380fe01 + +# Test 186 (Signature with special case values for r and s) +Signature = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a020100 + +# Test 187 (Signature with special case values for r and s) +Signature = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a020101 + +# Test 188 (Signature with special case values for r and s) +Signature = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a0201ff + +# Test 189 (Signature with special case values for r and s) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409 + +# Test 190 (Signature with special case values for r and s) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408 + +# Test 191 (Signature with special case values for r and s) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a + +# Test 192 (Signature with special case values for r and s) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +# Test 193 (Signature with special case values for r and s) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a0242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +# Test 194 (Signature with special case values for r and s) +Signature = 3049024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a090380fe01 + +# Test 195 (Signature with special case values for r and s) +Signature = 3047024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff020100 + +# Test 196 (Signature with special case values for r and s) +Signature = 3047024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff020101 + +# Test 197 (Signature with special case values for r and s) +Signature = 3047024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0201ff + +# Test 198 (Signature with special case values for r and s) +Signature = 308188024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409 + +# Test 199 (Signature with special case values for r and s) +Signature = 308188024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408 + +# Test 200 (Signature with special case values for r and s) +Signature = 308188024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a + +# Test 201 (Signature with special case values for r and s) +Signature = 308188024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +# Test 202 (Signature with special case values for r and s) +Signature = 308188024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +# Test 203 (Signature with special case values for r and s) +Signature = 3049024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff090380fe01 + +# Test 204 (Signature with special case values for r and s) +Signature = 30470242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020100 + +# Test 205 (Signature with special case values for r and s) +Signature = 30470242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020101 + +# Test 206 (Signature with special case values for r and s) +Signature = 304702420200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000201ff + +# Test 207 (Signature with special case values for r and s) +Signature = 3081880242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409 + +# Test 208 (Signature with special case values for r and s) +Signature = 3081880242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408 + +# Test 209 (Signature with special case values for r and s) +Signature = 3081880242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a + +# Test 210 (Signature with special case values for r and s) +Signature = 3081880242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +# Test 211 (Signature with special case values for r and s) +Signature = 30818802420200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +# Test 212 (Signature with special case values for r and s) +Signature = 30490242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090380fe01 + +# Test 213 (Edge case for Shamir multiplication) +Msg = 39353032 +Valid = 1 +Signature = 308187024200b4b10646a668c385e1c4da613eb6592c0976fc4df843fc446f20673be5ac18c7d8608a943f019d96216254b09de5f20f3159402ced88ef805a4154f780e093e044024165cd4e7f2d8b752c35a62fc11a4ab745a91ca80698a226b41f156fb764b79f4d76548140eb94d2c477c0a9be3e1d4d1acbf9cf449701c10bd47c2e3698b3287934 + +Px = 0x491cd6c5f93b7414d6d45cfe3d264bd077fc4427a4b0afede76cac537a7ca5ee2c44564258260f7691b81fdfecebfd03ba672277875c5b311ea920e74fb3978af5 +Py = 0x144a353a251b4297894161bae12d16a89c33b719f904cfccc277df78cea5379198642fd549df919904dc0cf3662eeab01ef11b8e3cb49b51b853d98f042600c0997 +# Test 214 (k*G has a large x-coordinate) +Msg = 313233343030 +Signature = 3067022105ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf5024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406 + +# Test 215 (r too large) +Valid = 0 +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406 + +Px = 0x15f281dcdc976641ce024dca1eac8ddd7f949e3290d3b2de11c4873f3676a06ff9f704c24813bd8d63528b2e813f78b869ff38112527e79b383a3bd527badb929ff +Py = 0x1502e4cc7032d3ec35b0f8d05409438a86966d623f7a2f432bf712f76dc6345405dfcfcdc36d477831d38eec64ede7f4d39aa91bffcc56ec4241cb06735b2809fbe +# Test 216 (r,s are large) +Valid = 1 +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386407024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406 + +Px = 0x336d5d08fe75c50946e6dddd36c550bb054d9925c8f254cfe1c3388f720b1d6500a90412b020b3db592b92ab9f68f1c693b8d1365371635e21bc43eaadf89e4e74 +Py = 0x1d48d60319dfd06f935fc46488c229b611eecd038804ae9f681a078dde8ed8f8e20ad9504bcf3c24a0b566b1e85b2d3ed0a1273292ff5f87bae5b3c87857e67ed81 +# Test 217 (r and s^-1 have a large Hamming weight) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe02420095e19fd2b755d603bf994562d9a11f63cf4eadecbdc0ecb5a394e54529e8da58a527bc6d85725043786362ab4de6cbc7d80e625ae0a98861aea1c7bf7109c91f66 + +Px = 0x6f8fadedbae63701072c287c633f9c0052ea1e6cd00a84342cc0f626210071576abfd0875664b0746cdaf2745effc18d94905b0fc9d2cad4ba375c0ea2298c8d1c +Py = 0x150d128cb62a527ae6df3e92f1f280ea33248711ffe4b35c1b162a9508576860165e0ddc361d96fafcd2ff82776c743b9cd6845db61eb56739f5c4ef561e6c20d8c +# Test 218 (r and s^-1 have a large Hamming weight) +Signature = 308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe024115837645583a37a7a665f983c5e347f65dca47647aa80fd2498a791d44d9b2850a151a6e86fce7d7bb814e724ff11b9ef726bf36c6e7548c37f82a24902876ee19 + +Px = 0x5e7eb6c4f481830abaad8a60ddb09891164ee418ea4cd2995062e227d33c229fb737bf330703097d6b3b69a3f09e79c9de0b402bf846dd26b5bb1191cff801355d +Py = 0x1789c9afda567e61de414437b0e93a17611e6e76853762bc0aff1e2bc9e46ce1285b931651d7129b85aef2c1fab1728e7eb4449b2956dec33e6cd7c9ba125c5cd9d +# Test 219 (small r and s) +Signature = 3006020101020101 + +Px = 0xb420fb1fecdd9cc5ea7d7c7617e70538db32e6d7a0ad722c63580f1f6a1f5537eb50930b90fd6fdd9abd40015f746d2fd8adf945a75621407edb6863588e41979e +Py = 0x295108a7e9d2191a287fd160bd24f498055dc9badbd61c6a89fede27b4f9d479d86a20b6dc07c90f008ebe68a0e0cc15a4a03b8cf990e4ff7ed6e3892b21c52153 +# Test 220 (small r and s) +Signature = 3006020101020102 + +Px = 0x32b9a17c201aec34d29b8c2764e7c7f6aeef10fb61bf9837117fad879f8c6a22a300006d2018cf42b25898ffc9a1bf507352e59e6a52e627cda160e17ea2f46005 +Py = 0x317a89899b7cb3a0d33eafa02b0137a0fb1b05102b22b676f35b9ff6c050ddee9f185609ffb7f5165a769e440792b75044a43e838690d13f884aaae888bf5f86f0 +# Test 221 (small r and s) +Signature = 3006020101020103 + +# Test 222 (r is larger than n) +Valid = 0 +Signature = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a020103 + +Px = 0x67dd456b52f82a5d4c4a71b3ea9302f62a852ddc04ad25b62fef1ddf657374fb4e80679ddf42d212f0711db32b626d8593bd70892e93ed0adb273157b6df187938 +Py = 0x14d2c78509f3bd6f7d0fba4a90cb456286e267f5dd9d967842a6086884d66c7b2a932833470c721a4a728cd8486d15314232d801f17e3a6fd7068bdebacdf82c0b4 +# Test 223 (s is larger than n) +Signature = 3047020101024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e914b3a90 + +Px = 0x68d7b518214766ac734a7461d499352444377d50af42a1bbdb7f0032065ee6dc341ccf231af65250e7d13a80733abebff559891d4211d6c28cf952c9222303b53b +Py = 0xa2f3d7e14d9d8fabe1939d664e4615c6e24f5490c815c7651ccf6cc65252f88bcfd3b07fbdbaa0ba00441e590ccbcea00658f388f22c42d8a6d0f781ae5bb4d78b +# Test 224 (small r and s^-1) +Valid = 1 +Signature = 304802020100024201efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7ef87b4de1fc92dd757639408a50bee10764e326fdd2fa308dfde3e5243fdf4ac5ac + +Px = 0x11edc3b22b20f9a188b32b1e827d6e46b2ed61b9be6f4ada0b2c95835bee2738ec4dc5313831cce5f927210a7bc2f13abc02fa90e716fc1bd2f63c429a760ed2363 +Py = 0x118daad88fe9b9d66e66e71ce05d74137d277a9ca81c7d7aef1e74550890564103cc0d95d30f6205c9124829192e15d66fb1f4033032a42ba606e3edca6ec065c50 +# Test 225 (smallish r and s^-1) +Signature = 304d02072d9b4d347952cd02420100508d073413de829275e76509fd81cff49adf4c80ed2ddd4a7937d1d918796878fec24cc46570982c3fb8f5e92ccdcb3e677f07e9bd0db0b84814be1c7949b0de + +Px = 0x12f8b9863a1887eca6827ad4accc2ba607f8592e5be15d9692b697a4061fcc81560c8feb2ae3851d00e06df3e0091f1f1ca5ec64761f4f8bd6d0c2cab2a12102444 +Py = 0x174b4e34aec517a0d2ceb2fd152ed1736bc330efca5e6d530ea170802fb6af031425903fa6a378405be5e47d1e52f62f859f537df9c0f6a4a6479a0aadafe219821 +# Test 226 (100-bit r and small s^-1) +Signature = 3053020d1033e67e37b32b445580bf4eff0242013cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc3393f632affd3eaa3c8fb64507bd5996497bd588fb9e3947c097ced7546b57c8998 + +Px = 0x8aed779a32b9bf56ea7ab46e4b914e55c65301cdbe9ea6e7ed44f7e978c0365989a19a5e48282fb1158f481c556505d66ff414a07003ebf82fca1698c33f2884c6 +Py = 0xa62426993ed5b177b6045e60b5fa1a1f8ce1ad5d70e7bc7b5af811dbf86e651f9ea02ec796ab991e1439bf07ffe2ac6052a8a0b0174d78a9441aaf4d8fc757d80f +# Test 227 (small r and 100 bit s^-1) +Signature = 30480202010002420086ecbf54ab59a4e195f0be1402edd8657bb94618fab50f2fe20fe5ebbc9ff0e491397ed313cc918d438eedb9b5ecb4d9dfa305303505baf25400ed8c20fc3fc47b + +Px = 0x93697b0378312b38c31deae073f24a8163f086ac2116b7c37c99157cfae7970ab4201f5a7e06ec39eedbf7d87f3021ca439e3ff7c5988b84679937bab786dbe12e +Py = 0x1c6987c86077c05423ac281de6d23f6a685870e12855463770eccabc9f3a1d23cb2a0c15479420b5dd40fbdc9886c463b62ee23239df3a8b861c3291d28224f6057 +# Test 228 (100-bit r and s^-1) +Signature = 3053020d062522bbd3ecbe7c39e93e7c2402420086ecbf54ab59a4e195f0be1402edd8657bb94618fab50f2fe20fe5ebbc9ff0e491397ed313cc918d438eedb9b5ecb4d9dfa305303505baf25400ed8c20fc3fc47b + +Px = 0x19a9f1b7b7f574a021fedd8679a4e998b48524854eefbaae4104a3973d693e02104fa119243256e3d986f8b4966c286ab8cb1f5267c0bbd6bc182aeb57493a5d5b6 +Py = 0x158b97eb74862fbca41763e8d3a7beb5fccd05565b75a3a43c2b38b96eb2ccff149c23ef1ac09fc455d808ff28081e985f9e172fc62d0900585172cfbff87383595 +# Test 229 (r and s^-1 are close to n) +Signature = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138638a0242015555555555555555555555555555555555555555555555555555555555555555518baf05027f750ef25532ab85fa066e8ad2793125b112da747cf524bf0b7aed5b + +Px = 0x1aa9f3a894b727d7a01b09c4f051b469d661de1e06915b599e211463319ac1b7ca8a6097f1be401d70a71d0b53655cdf9bef748d886e08ee7de2fa781e93ec41a26 +Py = 0x1ba9ea67385e19894fc9cd4b0173ab215f7b96f23bc420665d46c75447bf200ae3ac7b42bd9b857fd1c85cce8ea9c8d2345e4687dd70df59f5149510735bb9c7b64 +# Test 230 (s == 1) +Signature = 3047024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad020101 + +# Test 231 (s == 0) +Valid = 0 +Signature = 3047024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad020100 + +Px = 0x2a07f13f3e8df382145b7942fe6f91c12ff3064b314b4e3476bf3afbb982070f17f63b2de5fbe8c91a87ae632869facf17d5ce9d139b37ed557581bb9a7e4b8fa3 +Py = 0x24b904c5fc536ae53b323a7fd0b7b8e420302406ade84ea8a10ca7c5c934bad5489db6e3a8cc3064602cc83f309e9d247aae72afca08336bc8919e15f4be5ad77a +# Test 232 (point at infinity during verify) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd28c343c1df97cb35bfe600a47b84d2e81ddae4dc44ce23d75db7db8f489c3204024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad + +Px = 0x60daf59638158ed9d3d7e8428501334764162f9be239e168fae9af348c30a7be1cfa4d9636c3bb621d7e0aa71446f8d4a37f2d43274a4255b226f612382f63152e +Py = 0x16e48300124a636b206fad4d0355862a852623799afee941e864d96dcbf55b801cabd6249b6f567506d5a503e7d03b4764c70fc44c5365f32c3603678476d62b09d +# Test 233 (u1 == 1) +Valid = 1 +Signature = 308186024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc + +Px = 0x51fe6a35a85070c7c29502a87672a38153d799aef734226b64d8fd3398621701117f0af9d9afaf6dbb8ca3007255dc79b0f41ed552512cb29207b15a01cdfdfaae +Py = 0x1a16c61277586356efadcb24764f21f574ef96f2caabc3f47fa66fb8719d7785824061c2d6d7a4bcb851540e62b2f00960b283eac7808d1813ef51b46e1149d3e4d +# Test 234 (u1 == n - 1) +Signature = 308188024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024201ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94fdcdefd78dc0b56a22d16f2eec26ae0c1fb484d059300e80bd6b0472b3d1222ff5d08b03d + +Px = 0xb4ffc0fff087607ad26c4b23d6d31ae5f904cc064e350f47131ce2784fbb359867988a559d4386752e56277bef34e26544dedda88cc20a3411fa98834eeae869ad +Py = 0x9d6e8ca99949b7b34fd06a789744ecac3356247317c4d7aa9296676dd623594f3684bc13064cab8d2db7edbca91f1c8beb542bc97978a3f31f3610a03f46a982d2 +# Test 235 (u2 == 1) +Signature = 308188024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad + +Px = 0x809fba320fe96ded24611b72a2a5428fe46049ff080d6e0813ab7a35897018fe6418613abd860d1eb484959059a01af7d68cba69d1c52ea64ad0f28a18a41fc78a +Py = 0x1108acc5577e9e8962e2a7cea0bb37df1d0ca4050fb6cfeba41a7f868d988dbbcebc962986748fa485183f6b60f453ec8606f8c33d43767dddbbef8c412b2c37939 +# Test 236 (u2 == n - 1) +Signature = 308188024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad0242015555555555555555555555555555555555555555555555555555555555555555518baf05027f750ef25532ab85fa066e8ad2793125b112da747cf524bf0b7aed5c + +Px = 0x145130dca77d9674dfceffa851b4a2672e490e8fba8277622b0020e2fe9101e76933b0c01d248071f854e9bc523733936dc0b9930cbe154b9a402f681ee3c6cef6b +Py = 0xd0c94b2ad28556643aa3d27523048d227a1de82f8a664707e75394d21da181bec82e1afb0e627539531affa849a2409bcac83fb786c351c88bac2fb2e4322e54a +# Test 237 (edge case for u1) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201556bfd55a94e530bd972e52873ef39ac3ec34481aebdc46680dc66723ab66056275d82bff85ad29ac694530bb2f89c36ce600ad1b49761854afc69ab741ce0294a + +Px = 0xed3e09809fe5985818f90592fd06e71d2c493d9a781714c9157cbafa5ba196b987fd49ae24274c76251c70b9f7970f1f713ad274590a702f463c73a0704831ce5d +Py = 0xcac278297093bd9f9ac2d00bef3d67a01b43b28b9f829407264c738117438300c7704772976916ea102a776262ccf4222cc348c34aac683d8f00179a348323babd +# Test 238 (edge case for u1) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200dcf9e7f441448a125b96d72b989d9f4dac7508c7e036f6080d4758e736f5e0636b0ff503f128a98d08e0ae189921065219d2cc3aa83e3c660ca0cb85e7c11a24d0 + +Px = 0xac2c5a4c79309a5132d5d7494befb3905d33fda5f80eeaf63775183aae7af108a3d97f3a441532cf6fac47f6c898329d69182e1fa07ce45997ebec3781c9ad741 +Py = 0x173a5b6b80a8b73d30ac97e1a4aacb773c1ad692c5ea63f68e373842782bd677864ff656cf8d1e6ec1e58e9a83856ef92677555916749fb95e800ae2e011618ca3a +# Test 239 (edge case for u1) +Signature = 308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024166eb57733c19a7003cf8253279fce41907bc4f127153c4576dd4814f8b335a0b51560b4447f0382c69b3fe509522c891f0eec3999ad2526835f33ae22a642843af + +Px = 0x1eb2a353dec6b460fbda49c67f431190fff6f195639c226ef8fefcbf191d72529a12cc5485b282a52704c1fd84529a1aa0ad794f96493e299718d2618a1b83a526c +Py = 0x1f704604d5b2b94a42bfc3ab93317d66a54de15258337433fc96a965d8e2d056fd1134b7989d7b3f709adc28227bdabc11fe2f359c6a6e5111ab43379ca25b66f2f +# Test 240 (edge case for u1) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242017106d1131b3300d7ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc79527ac09f0a3f0a8aa38285585b6afceac5ff6692842232d106d15d4df1b66aa8 + +Px = 0x1e43dfecc7e6caad03d17b407322c878f701c5add6eb2afcd786ff3803622dfbb6baa01246e1ea059f7b78842919b2507daa9e3434efa7e8d3ae6c35499f82d0ac8 +Py = 0x18b0e4d6378222a07ccdb4214001f97b1a503d1aac3ab925ea64faa9c739ba04ee3480b147cb07f93edf40b6856a22f4159c3f5cd6c9e7165452907c8d02fab201e +# Test 241 (edge case for u1) +Signature = 308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02416d1131b3300d7ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6ab94bf496f53ea229e7fe6b456088ea32f6e2b104f5112798bb59d46a0d468f838 + +Px = 0x141a4d714628c192b8ace1a42854da06e0e1ddb82a07618e4efb05d7095cd1eb65425078160594715eaf59fcb41c9e573fe10298c75c9e9135c775ca73f63d13aac +Py = 0x89524b475170d4391cc032a0543ea22dab60ea07538f3a37607f0d4ed516634fde545e2f0a6ba8d0d2fe6aded0a771b4b134a5a280e54799fa476ef0ec87d44e1c +# Test 242 (edge case for u1) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200da226366601afff780ffe082a0db8e74ea10d4864a5f6876c64f5e78d6598fad57297e92dea7d4453cffcd68ac111d465edc56209ea224f3176b3a8d41a8d1f070 + +Px = 0x147fbcc65d4818e029e0a3af13a1f7c90f0605a00cd0781200eb656a591d669a787620e6fc8cc594aa28a0b0f2939ec73472c494e09cecaf5f331dafd32d5ac31c3 +Py = 0x75432bdaeecaa0bec7feddc298c565723fb669ee76e38a4c5ff1701f1b38cda9dc9ac43bff18da2047e4dcd80c05a7bb7e7464829d608b68176b04c87f409f46d6 +# Test 243 (edge case for u1) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242011b3300d7ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94cb85df5e6c1125394fcd34f6521ffdaddd98f88a99fedcedd9384288bb793cf2f + +Px = 0xb5b1c3998589b25c96a700bbd450d04da1f273df8053767a3b03ed1a763ed089c0de99bcf54d49c1520d3a09b845296f0445b3bd5b87918d3752cf651e0ff3007b +Py = 0xe896380876b9419c56096914ff6eec01aee247eefef0741895f14ee280f360e11508c37826af82cd915b9002f046cb51008d9ead21124c591bd8265d1492b35ffb +# Test 244 (edge case for u1) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02420161be37ed5f748e06a89d72c4b7051cae809d9567848b1d8d7ed019221efb06ae81e1264ce49c5d29ee5fe22ccf70899002643aca7b99f57756f2639b6d459ae410 + +Px = 0x1aadb41fadc35cf6d11a7c7d01d049b74b37677f04e1bd3dc08450fabae28adcd2d135f966616d283fb18a5e69eabfe7ec41e1a0edb3682f1d39f2af64a94d602b9 +Py = 0x14ae81ebf5e3d2d0529479d4ae8eb05f4b42e519608466ad69e7662d6e9b236765f9be535c058f00f0866bbb4b172ef47a03cb97c58dde5750344bb293035f8e97e +# Test 245 (edge case for u1) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201e9bbbd64270b9668f7623ef7cbead5483eb07b883cf39fb6884aab67dac7958b0e03144357b9433e69adc696c86c63a23d35724cbd749b7c34f8e34232d21ea420 + +Px = 0x1b706fc3f4aae5b86da261a66fbce47eb3b3e1e91544a40a9989fccf74154bbecac042dbbbf411a39090058b62c46fccd1d5eaba0c4879a688ea5fd0a7b4f9a0b4f +Py = 0x1eda01930c6b22745a97f2d59e182598dfdfbfdb463335293901de7fc9d49cf55ed7fcf5d767d4c22f89f171b4137c8415c3ed438089270c41f88eadef3018140e1 +# Test 246 (edge case for u1) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200924449b6c96f3758e3b085c079714f11f28d039b11699f0e9b3e7c553c8fc6c8f5212fec5eac3068713b8ec72fc6e2a90872b94e161a89822887f4a9bd5c9efd74 + +Px = 0x58a1fa96111bf30be76c3b8ba4435666677b6dd05031b5c4a840e1ea81f6025f70e1d395ef63cb59fa71e3674cb678f7250887f5d734e3ec377dbe3ae637d24f82 +Py = 0x7a4eaf02cc57e658b5b9fa08ee30e0ef5b3429bb5a10438b0e05bacaebc60317010a334d7f896028aef620f5d9c7cabc38306e032b1b91c2376c3fef3e455a10df +# Test 247 (edge case for u1) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201554a01552b58d67a13468d6bc6086329e09e5dbf28a11dccbf91ccc6e2a4cfd4e6a2c5278791c6490835a27b6f7abb8a690bb060de3deb85093d3ae16482c84f64 + +Px = 0x303ba5ef90b05110002fdf74d2b8d4c7ab189c64004859c69d7c4730fcacb5f4d9b761ae987d1f3b63bb3ecb78aeecf4a04ff60f5f367a96ac2da8da27a3687a3e +Py = 0x6673d0d4ccd4c3ce1abc9980fd1885002c3e7b86078214caf7f0962fa51e116363032d7a1b93c92a4d62827549d5a33e4e6b9b6c2ab6ad9c2a15e410c5b1a846b2 +# Test 248 (edge case for u1) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200aa9402aa56b1acf4268d1ad78c10c653c13cbb7e51423b997f23998dc5499fa9d2f403c78b645cfba4eb78f595fe6d6f01dbaaf803f23ac263bf060baa74583abf + +Px = 0xa94eea843a5c49637041598e30c381f7173bf8cd127f3caf5c16cbc728aa4d99173fb38d6a1b1ec21e40336e8d802249272b0ccbf4f8c3636ef66290a81b58fa5b +Py = 0x1116c23464fad61df8d2d5d1250a5a4c427e9c58e2cf1d059cdd88a7c34984fdd22a4cf18411e1b0224d444a5bd39d5fc97fc0b3648600f19d6ab80aa6a7c083a17 +# Test 249 (edge case for u1) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201ffde03ff820a836e39d3a8435219297da1db193d79e359663eb56654a7ee6f7eb996c8ef12f62344ad211b71057928f96ae75b58e23026476cfc40ed0ef7208a23 + +Px = 0x14f71d2ca5bd2051336854657f09a1fab14c7f2f7865d71bd3fa354bf27b69dc8738972140553b525658b6fd203cc05ca0822e0904bad21b632e0de74a2ad3f0e72 +Py = 0x4525f90519f9497425460b31cbb69ab3701a9ea68aaab72c6d65d364d0f0ed4d0524280f113bd69ef1ba9825202b10287a088c4bf30debecb720ac0739ec67434d +# Test 250 (edge case for u1) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242013375abb99e0cd3801e7c12993cfe720c83de278938a9e22bb6ea40a7c599ad05a5d3c8e5e5d7b3e16a99e528ef0ce91be0953cb1a9adf757f257554ca47ab053dc + +Px = 0x1d2ecad921dd100a8dc1a7b824b0ac6c9b654ab179833c2881ce237f1b8497ade851302cf50ea5ea169c2a50c0c09cb6ea539a7290a0f3437044b7a2e9ca8d40500 +Py = 0x3fd5651535dcba1f331981c216a1c7d9842f65c5f38ca43dd71c41e19efcac384617656fd0afdd83c50c5e524e9b672b7aa8a66b289afa688e45ca6edb3477a8b0 +# Test 251 (edge case for u2) +Signature = 308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02415555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555554 + +Px = 0x165d67972a48fddc2f41c03f79ab5e0d42fd0992c013ead135c3394049645e26ad7c7be96510df59ba677dc94f1146e8e8e8fbe56debcb66920639581956b92b4d1 +Py = 0x8aeb66ee0be18abaa909a973c70b5749d688f8e2cd2e6e1613af93d0033492d26a6e82cfb80ac6925ac6bc79b984f73e3ebbff2f223a38676891c1ecd784a8a789 +# Test 252 (edge case for u2) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242009f57708fa97eba94c6d4782cdd4e33bb95c1353bde095232e3e2bab277bb5d2b48f55a53ffe928d034c29970a9e5f384a003907d3d9b82a86817cc61fb17f4c59e + +Px = 0x18cd11252f0a434f446d3af18518c6b84cb0b7bf33758b4d83b97c2a56e0037b54d57d2b0b842e9c17d70504e01896389c066db8f2bfec025259a51dff514668308 +Py = 0x1cca54365156c59e2c73c17664f09fcdcfd5b910f9ab48d0899b6a7064de8b80fc7a992e47ee7f23ec82fd80179a19f4cf89b4c02b7218f435298da5d322a982c1e +# Test 253 (edge case for u2) +Signature = 308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024168d98fa90736eff3e90f8fcfe50838b6fa0bf2cde77bc51e3f41019c8006f4e9cbaeadce7dbb44462da6425be9cfdaecb234c41749ce695be1b5ead2e6b1205f35 + +Px = 0x1d6329a8afdea27cf1028a44d19c3c72927590d64628775f324514c81de301aa9be9c775c53a6349d1cbd5ecfc7bd39b373e613a10c1439441b141430fdadac168c +Py = 0x71342d63dba901b93bdc444a1fe2ec6a15108bdf49eb1dfd218373884520d84bce03c5012f5837051cb8abf6a0be78dfdfeeb3a5872dff75b3f874faa6d2243bf +# Test 254 (edge case for u2) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200e97ae66bcd4cae36fffffffffffffffffffffffffffffffffffffffffffffffffd68bc9726f02dbf8598a98b3e5077eff6f2491eb678ed040fb338c084a9ea8a4c + +Px = 0x1c963b64cdc3ecb1c35cda5ced9419ac146b060adb04c638cf6b66658013cb25e915a6ad0055668342881ed27f438b50ae4bb86ae3c7c02b727a130c77bad698008 +Py = 0x481bfffaead856b4137fd4268ecd74a6c2d4bd6cd13998ce7f0e828b220135d8df23253e681dc90673e0537e7590769a2a441aaaaa3a9901c4fbe44fa9513951ef +# Test 255 (edge case for u2) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201ae66bcd4cae36ffffffffffffffffffffffffffffffffffffffffffffffffffffb3954212f8bea578d93e685e5dba329811b2542bb398233e2944bceb19263325d + +Px = 0x5dfbc867d53c57b2945502b8e56d96ca2d4d485aa33452200a2f4ba16042357976afeecf3e63b2fdcd5cdd76076c1a73e496caf9d6de3e8831d955d138e05884ae +Py = 0x1e04aa0b5360a0d3badd0120fbb8cc42a38bf1c61755d00858e40e4b10da4ea2575830dc92e312c20af2b8b167d7a58d178661d48cd932fe47a4bc7145e620ae22c +# Test 256 (edge case for u2) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242015ccd79a995c6dffffffffffffffffffffffffffffffffffffffffffffffffffffc2121badb58a518afa8010a82c03cad31fa94bbbde96820166d27e644938e00b1 + +Px = 0x78be6c43e366cf63ddc4235e8b969386e95012fbca5cebf1b0a6fe3c03c1257df7cf47b002eb6c4497f310bff6131b5ccb54fd0e8ee7fcf6b49d487e1b54508f68 +Py = 0x9b61a547104c8516e0dc35d3d17659ca098d023b0593908fe979c29e62373738a3c30094ba47105a49edbc6e1d37cce317b49d2701470eeb53d9b24dce9d809166 +# Test 257 (edge case for u2) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201cd4cae36fffffffffffffffffffffffffffffffffffffffffffffffffffffffffae18dcc11dff7526233d923a0b202cb29e713f22de8bb6ab0a12821c5abbe3f23 + +Px = 0x93f68961005f3040dc1a8ff1416c917bdcc77f1dfa85506c3bb62dac47f7be9529b4cbe57dd2c19e860bd2a0db71d47ef1eca8a20bfc3e0bc5e05c8303001c1960 +Py = 0x2b9a3d45f2f5120fee06445f0d34e6138e3ac5b16d2a22f0460cea258c368ca9e478eb7b8253e7c6f2f7250fdc7dcd7243761f8d56f2350ac51e47ee063f41da31 +# Test 258 (edge case for u2) +Signature = 308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024122e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b9c4c3f73cc816143fac3412b62de4c63db08f8c57e4c58c31f1b457ca5e57e20a + +Px = 0x2d2d7d40bf17c4e8b18757e451ddded95e6b1007cd144809d21af31353b03038372c4af204d4414b71060b48b3a8439c632809bd33c4736263044405a1ad766e36 +Py = 0xbb0c5a8848f93fa3e85376b012bf064e303746529a673b852bb5a969c24c0156a8dd26242d0aad4bae43e23631b01fb9d050f9744b59f3b52b1c572217a1d70588 +# Test 259 (edge case for u2) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242010590b21642c8590b21642c8590b21642c8590b21642c8590b21642c8590b2164298eb57e5aff9343597a542d3132f9e734fdc305125e0ec139c5f780ee8e8cb9c2 + +Px = 0x18ac11dfe62d1f2a8202732c79b423d29f43bec4db6080a220796a10f2685f92c71c7f72d9da0a8acb22680cca018eba2e8ba3bfde1db9a4ef3b97da16474364e96 +Py = 0x5aad3b286707bd3ad07a060cabca49c53de4f56c05a0a8de40fd969d7d4f995f7c6701fe5c5321f85318b98be66251fa490088fd727da2454e00b3b94dc6e1241b +# Test 260 (edge case for u2) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201a4924924924924924924924924924924924924924924924924924924924924924445e10670ed0437c9db4125ac4175fbd70e9bd1799a85f44ca0a8e61a3354e808 + +Px = 0x51b2c3e0494564ed48ed3479b596ea4078240550a3c28da33d71d259e8e623e37ab43f396c49363f31c8de8a4644d37e94ed80e0dd4f92c3df2106e2795c2798b8 +Py = 0xa530d5e961f0696bbeb962aca8e71f65956ae04cdc22a4ac65146943e99a4a2fdb477df75aa069c8dd37a5daaea3848079a6a7bc03e0faa3d65d42f8053db2078b +# Test 261 (edge case for u2) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201d5555555555555555555555555555555555555555555555555555555555555554fa6dbdcd91484ebc0d521569e4c5efb25910b1f0ddef19d0410c50c73e68db95f + +Px = 0x1ba31a6f9c2d227da57de00759e2e844d607bc9bd92bcdf282006884dc347c9284f0dc0623af1e9db22117364a7a80a5b067efa19b204dac8faf2230d80b704addc +Py = 0xd88b761cd3a4b0947bfc17e204b4d751f76880a82c9b7c6fd93ded55883c995002d8b8bfff1e021189c08d829d16b088f4fb39ad9456eafbc77c20353bc0f3c038 +# Test 262 (edge case for u2) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4fc31322e69da41162a76abf3a1b4507ae66074633446f259661a61c93be30eb5 + +Px = 0x137bbb48ef281133849ed723f5662a19fff9cc7389a0170d311bd34f4dbdc656246db695ea0712d8aceff9d1d0ef7921ec2e3f8b533e4ca122f9f7f446073889334 +Py = 0x163e4500d998095f60fa3fed4149d2d9b5b018e03eb5344efe8ffcc1c7d276e7401a4df639c4ab108820062495471be7b29398aadbae440a9bdcd55cf0bb5d96f79 +# Test 263 (edge case for u2) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640b + +Px = 0x726dda8b7b6ed25f97f1fc6c3ccf554d60fc71e4fab2a578286d32612e7f3e669faed0b97619aef2d5aff9c8ffd987feddc0d6c38b7eec028191400874803f498b +Py = 0xc0b8870c612e06c13c57ed6f7ef3d53b5e5fa2db62707b034b5ec13fb47018e31da7ecc991d575943468d701e118eca33122cf6d394b8a6ec0f45bc09701603a26 +# Test 264 (edge case for u2) +Signature = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201346cc7d4839b77f9f487c7e7f2841c5b7d05f966f3bde28f1fa080ce40037a74e3001a2b00bd39ee4c93072e9963724941383cf0812c02d1c838ad4502a12c619f + +Px = 0x16fce9f375bbd2968adaaf3575595129ef3e721c3b7c83d5a4a79f4b5dfbbdb1f66da7243e5120c5dbd7be1ca073e04b4cc58ca8ce2f34ff6a3d02a929bf2fc2797 +Py = 0x83f130792d6c45c8f2a67471e51246e2b8781465b8291cbda66d22719cd536bf801e0076030919d5701732ce7678bf472846ed0777937ed77caad74d05664614a2 +# Test 265 (point duplication during verification) +Signature = 30818802420090c8d0d718cb9d8d81094e6d068fb13c16b4df8c77bac676dddfe3e68855bed06b9ba8d0f8a80edce03a9fac7da561e24b1cd22d459239a146695a671f81f73aaf024201150b0fe9f0dff27fa180cc9442c3bfc9e395232898607b110a51bcb1086cb9726e251a07c9557808df32460715950a3dc446ae4229b9ed59fe241b389aee3a6963 + +Px = 0x16fce9f375bbd2968adaaf3575595129ef3e721c3b7c83d5a4a79f4b5dfbbdb1f66da7243e5120c5dbd7be1ca073e04b4cc58ca8ce2f34ff6a3d02a929bf2fc2797 +Py = 0x17c0ecf86d293ba370d598b8e1aedb91d4787eb9a47d6e3425992dd8e632ac9407fe1ff89fcf6e62a8fe8cd31898740b8d7b912f8886c8128835528b2fa99b9eb5d +# Test 266 (duplication bug) +Valid = 0 +Signature = 30818802420090c8d0d718cb9d8d81094e6d068fb13c16b4df8c77bac676dddfe3e68855bed06b9ba8d0f8a80edce03a9fac7da561e24b1cd22d459239a146695a671f81f73aaf024201150b0fe9f0dff27fa180cc9442c3bfc9e395232898607b110a51bcb1086cb9726e251a07c9557808df32460715950a3dc446ae4229b9ed59fe241b389aee3a6963 + +Px = 0x110fb89aff135edb801a1cb5bc49525b81dc74da45090d228122871814f489fdcb02ebee46b703e6b4e6af56c5024422b31fd4252c44d0bfd29d945de782d98543f +Py = 0x1ec425b4c4928e12b619227f1da6d0a9675070d9c5b49ca523050acb718e62643b0e5801543b76dc11f8d694ba09436d8391b477ad2c143ec50c2384c4f688512dc +# Test 267 (point with x-coordinate 0) +Signature = 3047020101024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad + +Px = 0x1c693a3fccbc9f625284239c2725f2a5c90b29b7ce3d07730f7de6031c9e74446d217888ae023aae23df6a4aa153f58c79597d57f42ce5c1354e5dc43a5eb311e13 +Py = 0x15f99658443b2e39c3edcbcda70707fc5a4d39545eabe354816d09284a6265e47ebf0a47355828e818a767f8452a6d18451e0e3817a896ff404cb1611bfc4c4b4a3 +# Test 268 (point with x-coordinate 0) +Signature = 3081870242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024166666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81401 + +Px = 0x17d7bf723678df574ce4366741e1d3787f834af9997b41c8260a074cb1f325d2bae9f8565dc6b51b6cb02dceeb5a1b774ee8dd7057c99e2d94c3c71299a9ce0f1b0 +Py = 0x162c65632fff88bdbb17ce2525ccac8df37c501ab0e6626e273fb6cf99000424344c0ac539c9fd6c4f3d28876b257c010d347a45bb010cc058443843a758328d491 +# Test 269 (comparison with point at infinity ) +Signature = 308187024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024166666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81401 + +Px = 0x1e06db423a902e239b97340ab052534ead37e79412c675bf0eb823999e6b731040bff2b0e4fa64edf3962a328921ea5ae4e8f4079eab439e12f92335dfc4863c07f +Py = 0x7ee9f0ecb409cb133c0cd08b85e840b076f3d615e1ef1393b5222338b227d768003da5f3ba1f72f6654ca54ac11c2ba91a6cb5883d6d1a82304ad2b79de09215f3 +# Test 270 (extreme value for k) +Valid = 1 +Signature = 3081870241433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad + +Px = 0x4c3ec8d7d23ce74be8b9c7c27be869c23bafc6874ebc44f47e107422ab1e75ed09bebd7cb1ec4626e442bcf512a25c5ddde26eb08ba37506461830cf9241cbe9c +Py = 0x50a1bc08f4ba8da1d641ac3891823ab519facd4159768b1c0738f0e23450f374e4d6de55cceed95722be635c5dc0023a1498862f87bfe61d77e20e592cc20bb2ca +# Test 271 (extreme value for k) +Signature = 308188024200c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad + +Px = 0xc6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66 +Py = 0x11839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650 +# Test 272 (testing point duplication) +Valid = 0 +Signature = 308185024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8 + +# Test 273 (testing point duplication) +Signature = 308187024201ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94fdcdefd78dc0b56a22d16f2eec26ae0c1fb484d059300e80bd6b0472b3d1222ff5d08b03d0241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8 + +Px = 0xc6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66 +Py = 0xe7c6d6958765c43ffba375a04bd382e426670abbb6a864bb97e85042e8d8c199d368118d66a10bd9bf3aaf46fec052f89ecac38f795d8d3dbf77416b89602e99af +# Test 274 (testing point duplication) +Signature = 308185024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8 + +# Test 275 (testing point duplication) +Signature = 308187024201ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94fdcdefd78dc0b56a22d16f2eec26ae0c1fb484d059300e80bd6b0472b3d1222ff5d08b03d0241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8 + +Px = 0x12a908bfc5b70e17bdfae74294994808bf2a42dab59af8b0523a026d640a2a3d6d344520b62177e2cfa339ca42fb0883ec425904fbda2833a3b5b0a9a00811365d8 +Py = 0x12333d532f8f8eb1a623c378a3694651192bbda833e3b8d7b8f90b2bfc9b045f8a55e1b6a5fe1512c400c4bc9c86fd7c699d642f5cee9bb827c8b0abc0da01cef1e +# Test 276 (pseudorandom signature) +Msg = +Valid = 1 +Signature = 308188024201625d6115092a8e2ee21b9f8a425aa73814dec8b2335e86150ab4229f5a3421d2e6256d632c7a4365a1ee01dd2a936921bbb4551a512d1d4b5a56c314e4a02534c5024201b792d23f2649862595451055777bda1b02dc6cc8fef23231e44b921b16155cd42257441d75a790371e91819f0a9b1fd0ebd02c90b5b774527746ed9bfe743dbe2f + +# Test 277 (pseudorandom signature) +Signature = 308188024200f3d90294fbca4a4666ecbd5053c16731b742b50a0ae13722f41afe777c106283197376b127ded991e2ad52d84247165da34e91bc231655f959d988c3c7b9a67c080242014ce0570d16ba8dcb31e392cafacb4c0f0798263bf04bd4776d6135fa22cc0d3820b9c8a9a14f8d2913aed876254496209c3830f2bf6131d4240dc326ff5f7b7d71 + +# Test 278 (pseudorandom signature) +Signature = 30818702415cfa3b6e6952dd5886275ab7023e7bd3d06a07d84a5137960b3f636ddefabaf6b9db9d7e9785c51bb66206fc1f6859e86a5609599db33b6d2f240cc8aa1bfe490f0242014a57f403fd1f79f2898d62a61dc66135cc1a00f75954d3ee296ff897f8e98d340b1632468060f829e247a498c753096db19cd4b19bfd777d947ca9f7a50738410b + +# Test 279 (pseudorandom signature) +Signature = 308188024200f5467782293b3daa6b61d24aef3d841e47565cce6f0a7700b31cc70998544ce654add1502efddcb4c67ae0d9e8732e5315d59c37ff7171e68a8f761cd3ea3e61fe024200c79c315958f8013d20a86d10725a8913141d73d1282b163a02f36c9d280ee4d865901d7232871caccfc320c81d43f1e8cdaa7e646bbf9aa04f0eeb639d0ee0bdc6 + +# Test 280 (pseudorandom signature) +Signature = 3081880242015feb9fa8803a5d0296c263127d8ee9ed72a94d1ec38a84f8ce2283876388a6fdaee7e232f14da5fa447d8ff72fae4b3872db787befed48b6413c2a27de4c89dae902420126b94cf89238a0837188ceb04a47c2d9800397d1122ea831de47fe11ef146903a35030d2ce08310f2842ac5c9772597083fa6e8c0fb810e58260d6e20bdd566ef2 + +# Test 281 (pseudorandom signature) +Signature = 30818702417358687f319dab3c22b906cd58dd3556cf982c7c25ef30fefa4abae3f2b9079dc82d5807f32ec8976ac8dc69c1b1b2cbf7103675481f35072726c1d4afd158dcb8024200f6c899c6da4fd6f0b267a96ca927b79e34d250e8af76cc8b0bd71b850bbd23631af36c7269aeb4d837ee7017772cce2ef7567c558f657802df56aec17e576b1155 + +# Test 282 (pseudorandom signature) +Signature = 308188024200bcd2cfaf0ddf3c2414a2ca1af9114afe2d0b89af80ba797c93a05fc9efc69daa33a0812c464eb29be9d7bc5ec5aea698b018102a0e460f580059e5cd0d6e493f2b0242012c5a138af2d3e0e016f6c7ea6dda84ee4132e788949f73a31539c5e117247ccce9f676eb91462787eb71469c22e831811896513e6d35e9645e84f967839ca490e6 + +# Test 283 (pseudorandom signature) +Signature = 30818702414dcb6fd277c0fe1919e1c6f85d78b3ff198035005fe1d497f7c8f4803d584fb4c88db946bf7af32f7b54e8db80a694b81be78d4329b5d8e3da5fd22546ad5a1b9d024200f14c765e92da98273ddd53b50e907b7d313914a6bd23c8484d95a3f6f33971d06c4c340fe2cd567c150a16bfe0873c77993e5ad61855ac4705740e7befb24d2b27 + +# Test 284 (pseudorandom signature) +Signature = 308188024201569a9498513ae97350a86110c1d1960e89e83c26dfec840f6104318b3a84109a60024062a85daf62412c878710d3aefe47f594b68f525ef090497712e0f5caa34e024200e09fbf93ac11ab2b8e3dd0f731218e4ea08b077e4ebc717562f2746d25573dad3532702fbccfbd1bac23fa552d853594590ded4d0977a2efb140e9519d83a7b4a7 + +# Test 285 (pseudorandom signature) +Signature = 308187024200e0380e08d8a302c9829d02f65436c380c10f0dabfcc6336d4831b1dce7c96c3faff388120e8f1b4319daebe9f8642ce765c39dfb5bae243dec70149b754051f5c302411c4944a7e5ec140e91f01c313fa44de41e196a9576a4c201e1fa1dd58a8a7c021d4f20d25d0f7e172e4231f18ac12ff940f2955cd852b7e6b3b3b45720863cbb62 + +# Test 286 (pseudorandom signature) +Msg = 4d7367 +Signature = 30818602415adc833cbc1d6141ced457bab2b01b0814054d7a28fa8bb2925d1e7525b7cf7d5c938a17abfb33426dcc05ce8d44db02f53a75ea04017dca51e1fbb14ce3311b1402415f69b2a6de129147a8437b79c72315d35173d88c2d6119085c90dae8ec05c55e067e7dfa4f681035e3dccab099291c0ecf4428332a9cb0736d16e79111ac76d766 + +# Test 287 (pseudorandom signature) +Signature = 3081880242010217c32045f589b5479feaaf471c68e5a27b6567c19724bec8c580fb50c52f95cd4e8296ac6334844e17dfe21167c7028204d53bd24ae05e79587149d7921ed087024200fb908a87377d788fd65c91a0a935e61a3d8d735b29e2ce2083ffbbf0f0b5dd60bc53877c3155c1a089160ceb6197e39ccd0cd4edaa6449830c4e29f9aae835a9c0 + +# Test 288 (pseudorandom signature) +Signature = 308188024201ce64622f59112dd0e4397e6902a1ba5c258729b577980b54a745e76ce29d83ba48ede7fb63f374535017c3c73a8940022fd7b6a2e701171890ff54db363879caff024201b84c02f06de11b8d6eee94d37c7d7a352e938452ae76639dfd77c00f0d3f14432edcc0bfae410224838b4ac07f0adec294d86ac06bc04066b269ac1b8c0bf5b67a + +# Test 289 (pseudorandom signature) +Signature = 308188024201cfc67612e129ae1f5e60da08b9f4f7ab970e0d1c66be7290cc30d501edc04d7c47781a50e8da32c17f391005231aa2a5401f7456ec13af5a90b972eb1fa133d3ae024200d837a34c9f002ac4d833192d84748471d9bfacf9cf760005f2e4860851309ed9bc7e01b4cb48143c40bad42e9e5fd755b4511b0461bcca84354512dc54b432ff84 + +# Test 290 (pseudorandom signature) +Signature = 308188024200fc0f11de211a3c868949e897a5c9efa3f2de6a716075ba31eaf4ba6776db234a652a88488bac3d492ba1205e15ff694e71a0073211477bac7f07101c8b6fb70f8502420100891497bd19b5f1ae508ab5114d2a3fd3b3fde2216b38dfd540775d2fb3d1dcb13b2a0880144f4f562eef76c3af133002c4326561b3190e76fc39267d2b4cd164 + +# Test 291 (pseudorandom signature) +Signature = 308188024200d3842281c596639bf18a3b32457cba814a4d86ed414d6884169ec8b1f3b7442f328df1d7deeb3db491ecfa4a84b5f334fb077923c4df768489698c6cde8691a13a024201f720d385ec6283f6c7378ab19874dace5a9c3f729e4e87e9e369d2e6ca27824eb6e86bb4bc7e3c5578627763c80b73bea3e0d0e2751afa29fd448a4a326c853b36 + +# Test 292 (pseudorandom signature) +Signature = 308187024165d858f83de40ae1cd9d303e96ac2917ee5c389d5053be0ff05deac9ec902a70c4685305561f3aafcae225b37ef4ba062da3fa70ee2c23549b43d1f824efbcda980242010e77eb4af330ecaf545c3890e369468071f4ea9a104e1e47ed0d1455fbd492688d8e03bfad80a883136cd2fb3910f44a33cac86f515509b0c59a56af27677c6012 + +# Test 293 (pseudorandom signature) +Signature = 308186024175dc6b7aa29fb66b5b77c5cd4b99aaa1aa7dfeba720a9f85f191cb5682851ee12c226b4b98175d058ada3a9887e7a9d3d82b1553aac4553a3beff5d8f465125b11024176561b3c31d7a8a2770f8258058948144c0dec91c23fdff47f3ebeb36e1869fc094738b6f80e90399db1dcfaf25771606c743edf559f77a4ffebbfd697da367bc6 + +# Test 294 (pseudorandom signature) +Signature = 30818702412d9c3f9a79e234a3f3b9e04ee08bce70a65668880ed90f5a2b4e839475daff5226f420dae3417a553215904d5632936c591e945289a5284f61294cc764ac0a954002420177f9c6ea95857ca73c51268c6ad7d7bfe4cfe0e270b3d221ed950e69fcc39e29882ac894122f6dda70d908fa0bf2ac7f73b9755c86cf92e0218fd5c78fc947addb + +# Test 295 (pseudorandom signature) +Signature = 308186024126db1b8d3e0d7523b055ea6e31f8b050095f4187a3ef3db62b7157ad9bc0e8934cb1a65508632930d64b89031d1c8786b879ea46cc85d4a029096089148f2454ed024132c8a0f3f44eacfd0451aab9e4c6163cadc97e323722d1e2c9cc2403aae990dc3b227600c37808ffe7e15c8e015a18b2a23aed38b1b3aed179819ac9160911d650 + +# Test 296 (pseudorandom signature) +Msg = 313233343030 +Signature = 3081880242014141e4d94a58c1e747cbd9ee6670a41eac3c26fb4db3248e45d583179076e6b19a8e2003657a108f91f9a103157edff9b37df2b436a77dc112927d907ac9ba258702420108afa91b34bd904c680471e943af336fb90c5fb2b91401a58c9b1f467bf81af8049965dd8b45f12e152f4f7fd3780e3492f31ed2680d4777fbe655fe779ad897ab + +# Test 297 (pseudorandom signature) +Signature = 308187024178192ba6c31398e095b1a5ba49e34f0a6df60263e8324a9d728e292c8dbe477ad9326f3e915f4006795dbeddc92b01fae052143c961b24e624eb70e0b0e6874653024201b470d58c6ec28c2fb155b2047073bc8bec3c2d9e7f50038964dd4b5b721807a679f7252fe72ca977e2bc4d8831fef14a2bf51c7919dfa7a33acdf9a9fc1ca2dbe6 + +# Test 298 (pseudorandom signature) +Signature = 308187024160bedcd13c22d2353e613cca0f81215c34e51bf0a83faff1da5c8b4c182785358757b35a681e4eaf021af4f43d54ec49d8bfcd8dc5015b42a7a91f263fcb8db661024201050354daf39d5261bd27f36b8c1c38f48707ece9ea9311d13489dcfc5357eda2e57000c10cf0cda7b12f313842fb884a14f902ee9bca5b4da4fbbae0f969691005 + +# Test 299 (pseudorandom signature) +Signature = 3081880242008b51c02f4a5c80c9988646900a6516e7893cd8274013e276e8b0773af1e275030bab64551e2725bf89e06dcde6ae79a126dd01ca850b4896c71eac8b1aee9db0d1024201ce5824d2f5cfd09c3ee239366207391db3f049f67c0885e919b3ce13c52215437b77fc5c5d36465319862cb5fa75e0f54dd63d3754dcca422c99432286be327d43 + +# Test 300 (pseudorandom signature) +Signature = 308186024136a263c96cf448db82ec4ed8bda627b6e4250011c00da3cda6a8d68f9982f8c4cdfa87bbcad35da4918bb1dd6e9b666bb0ef93493e90266a97ae3ef17e6bf05ea90241691dad07a5de565cf4fbb6457aabc1527f317b3577fe712f85a8722ba13639b552f530367f3d0f6c099dd490284b4b22e0f0867d6fe4b0b50cd137b9875c666486 + +# Test 301 (pseudorandom signature) +Signature = 3081880242016737805388c1f33aa5ba70a93d5d3bb8e2cb1c6afffa9c71423663570a64e5f19a658ddb5e5351d2c724574843c6096c7bd0f5ff016304e2bb7c3c8643c0969a6b024201cc16da8f7858e4716eb7420b1f5935178cd47ad61139e0f6b4f1f98959f70ab25454f84079798931391fccdcf4bad14234db9fac4a2b811ce937691e880476ac62 + +# Test 302 (pseudorandom signature) +Signature = 3081880242011cff9efd4637941a840054b27db8747ea2b1a44ea29b9f28e5878acaaa06a280082c9afc33e8eff8f029f1d30be2260cc2b287d5acfecbe49ac362a6b9e883e01a0242015af84a78474acb77a1afdafcc3667bcee6638ad97b5ba39ae781b0d32f7f8d3c03e2d524cb2e4afaddf212c28122f268567aae3859cf019ea0112f0d667b376f5b + +# Test 303 (pseudorandom signature) +Signature = 308187024164915760336c2e2c29fa207e7fc883dc36ae3b18cded722794e916671f009dd4a205c584172f81aab519bbac4cc12e6c2986b5cd4ca84a03c535bbd0c335bd1fb90242011699a6ca58af781f2bb04533c5a1b1e5cce42c58c7b05243f036cf53ac2a56b5b7bf3255dbd0f92a8dba528a5d6a1c6e021815fb4bda11ef27c0e98583b021ab09 + +# Test 304 (pseudorandom signature) +Signature = 308188024200805994ccc821372a695824596995e53973d9423dc685f9caa5b0db9ad53445c9312ea55c5337e15e5f98de83d67ae31e31891674e30c50c64f707ba6f28124126902420182e6f40987e37fc182e095ec7a783879910bae48b4c34fb9d5e82af9548d87ce1525ff8996cc66e7094f804bbc0ee76bbb74c94db324cb0b08d73fa31f33e29781 + +# Test 305 (pseudorandom signature) +Signature = 308188024200b28b75b96eac5a7147ed3eb6db677906776bc58942860f5228c492aef5f5067fcad4df9a84446c8783cdb19d7004b6aa262500c066888a757bbb53675e34ce45ea02420135d86f04d3f8a9b14c214324b6d4eb8f3121d43a8a3641de6f0625a07945ce1b3dd4f42bad6bfb34fda0cbb7ddfdfd229040fa609afec6f7fa3a24f33d239250cb + +# Test 306 (pseudorandom signature) +Msg = 0000000000000000000000000000000000000000 +Signature = 308187024108135d3f1ae9e26fba825643ed8a29d63d7843720e93566aa09db2bdf5aaa69afbcc0c51e5295c298f305ba7b870f0a85bb5699cdf40764aab59418f77c6ffb4520242011d345256887fb351f5700961a7d47572e0d669056cb1d5619345c0c987f3331c2fe2c6df848a5c610422defd6212b64346161aa871ae55b1fe4add5f68836eb181 + +# Test 307 (pseudorandom signature) +Signature = 308188024201813f1dcac3d1da48a1a3b2542df932a465c2af1e4f6edbceee83b24c36e08981061e190863eb4ea8876899d0e5e4d4ac14e7fa2ea509ff946418e1108b8d2e64ed02420180bfc16e1747b75d51df791f06220d5473fc3c76ed0453003b13f16159c3808eec089fe40b945f8773eb72ea05bcf0ef33b6d4d5dc47ae4fae6d93b080053fc1af + +# Test 308 (pseudorandom signature) +Signature = 30818802420108c9a063ab73bfa5e117d58dc5cc331440fc99307c8b9b9e881a7ef8edf9061e996341863b751ef4b9ad91cd8699be5dd4dc9a2593908f9b04428b0fd1da561493024200b925a24de37fccd50bbc662029e3d143bc9dc5700d7cb5f98fb7859eb7439b67edd016e66be4f8d3c0f7ec7b57bc0a42f48e4a388786b22642c036d31ab9f2bab5 + +# Test 309 (pseudorandom signature) +Signature = 3081870242011b8a3f283aeec301682cabc0b19e816afb3b707e0a833e49bfe0da29aa2bce07b7e85241bc1c04bdeff0baac7585facfd6b583cb6a423c40363beaac451255d4cf02412e0e4d93c7efec6e93e5389003c99b2fb1565d6791c81747eb0bb3a754f89af7d26148a0a77f2b79e650fa77f033f8b37cf39984bd7030d11fc75d805120e77f33 + +# Test 310 (pseudorandom signature) +Signature = 308187024160c1d217a2485fce433723e1120271925a10dbb5b4ceb196f734c64587f618d47b4eb85996d0eacf642cfbd1536b346648b61f8188f255d1689a13718349627d76024200a91a0dea067d0f97b44cecdf21a2b1a67364a376fcc1afeded777a3170eb99a100f26f8bdd8ab65cb72a2c95eb5c992f5ee83630e1f2d8ae33fa60a10c9d1c32b2 + +# Test 311 (pseudorandom signature) +Signature = 30818802420090ced19cb14277f90d5bca4825bbeb384f459ad2c375841a5ce4eef5b00e1eb273567e671a48357a7a6d60e389391c5dc54f4e1f8a1b0d4a91aa44d252eb5bb0ef024200f7f5077c3b0485bf5aa1849cb5310886c0599eeda6b33f6d926c2987b373fc9e3d1e16837e8b55a46eb6479e45fafc9c8f94468db385476f472ef0436d1b1527e4 + +# Test 312 (pseudorandom signature) +Signature = 308187024131b4a11c2da6971ab4b65995b4eef6ab1cc4f1a8d4438a570aac441c303937e503b349ec5e109adb457cee916bdf051092a6ba6c89e75bc12fbabe527cacfa873702420199c79c8c5abe9430ae4774ac9c20b38a435f5d2bbc0143eebb6b47a15bbfcd3068faeb3f3c694a40406e39eed2e27acce93ccfacc74063fcd1179dab96844bb694 + +# Test 313 (pseudorandom signature) +Signature = 308188024200d8f352204f4c15f5fdd64dbd7870a65ccc4c9a78616fbd976ca16ff2a35aea8aa2f6db0bade2c4daefefc4e7a347efebb91fdfeb01ef808ec2b044d5e9ecc7084802420120a84665d678e8c01dabc04309bc6f314e6c847f34a6134824087df68ec307009f033cb0a336b50549bf6df4fc037a3a6d633f97e382454506b984d8d725df0660 + +# Test 314 (pseudorandom signature) +Signature = 308187024200ccd1c00546ee2082dfe9438c9348f84f987a56a941296b537509fcfb4bd1e644872eb8fdfce36ef262a2c42d69eb8931ea21be8027ec2fc56a155127e607de096b024134947d4231cff66d0cbf5a568251e06d02eec4120876e48c72a3d840983180938f109df434d26060ff693ede581ff73be04ca961718730a24ed7d24c3863209a42 + +# Test 315 (pseudorandom signature) +Signature = 3081880242008a13921becfa123084e86edb1cfcad8b5a04a2e20301a11c8f2f6b6b768da5f30c24b550f9b76848b6156c9277b61fd29832d7e0b955b871710a6ad16180e440b5024201db9867ad19b825494584a64ae049252d506116ca98324825d9d9d37f6a0927f874b9aff3990b332cca760464e93d3e6ed2fa7bfe51a2131cdfcf3ad45c7afa9d3e + +Px = 0x304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a +Py = 0x9b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625 +# Test 316 (y-coordinate of the public key is small) +Msg = 4d657373616765 +Signature = 3081870242011c9684af6dc52728410473c63053b01c358d67e81f8a1324ad711c60481a4a86dd3e75de20ca55ce7a9a39b1f82fd5da4fadf26a5bb8edd467af8825efe4746218024134c058aba6488d6943e11e0d1348429449ea17ac5edf8bcaf654106b98b2ddf346c537b8a9a3f9b3174b77637d220ef5318dbbc33d0aac0fe2ddeda17b23cb2de6 + +# Test 317 (y-coordinate of the public key is small) +Signature = 30818702417c47a668625648cd8a31ac92174cf3d61041f7ad292588def6ed143b1ff9a288fd20cf36f58d4bfe4b2cd4a381d4da50c8eda5674f020449ae1d3dd77e44ed485e024201058e86b327d284e35bab49fc7c335417573f310afa9e1a53566e0fae516e099007965030f6f46b077116353f26cb466d1cf3f35300d744d2d8f883c8a31b43c20d + +# Test 318 (y-coordinate of the public key is small) +Signature = 308188024201e4e9f3a7b800de63407b8703ac545226541c97a673566711f70e2b9ccb21a145ad4637825b023d1ea9f18e60897413711611a85c1179bff9c107368f1c1b61c24c024201de948ee577c3d4e4122a52ecccac59abb6fa937dfb3e4b988cb243efe98740309452ba013112b225b3b1b1384d5f68796845199a2602a8d4505a331b07d101188e + +Px = 0x304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a +Py = 0x1ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da +# Test 319 (y-coordinate of the public key is large) +Signature = 308187024200b6cf64861a2b16e33976095dbf45a592c7c24228c4a1dd727f303d5eeb87e5388ad05c328f824c40abd3e6ce003fef5cd59dee0069ad6348ea6e57f90f6bdc0a820241228181c180366e5451dfef3593ce664804cb42d5a8d5046b816b3daf6602fafd9ac2dc24b8c93a10024480882558b6ad3d9e905923dcd0fd2a11964754a9b46b8f + +# Test 320 (y-coordinate of the public key is large) +Signature = 30818802420093c8f766827d6dc15c810fa30433153a5e742859205ee8389fbf695c8840dc917440870acc5b160087ffd0cd9a6081029c60a7c26d5e8aa9a0570f4efdeb13dea20242012ec3bbf75a0ad3df40310266648a36db820217ed7fa94e9c8313e03293ef4f6a40e736fb8f208ad8fb883ca509d48046910523645459c27829d54431463b2548c7 + +# Test 321 (y-coordinate of the public key is large) +Signature = 30818802420152388c6da66164b706b41dd4dd48176d6eaf6525f876ef0ff2d147f6966ebfadf1767fa66d04203d3ec9c937a1f0c945aed953e34be444c219fd3b94d3277aa652024201658c1e5b2e563a49d11c883d05c491d628f0a92c3e3dc8db9a4c8d5f0dc846ac22af8b3c5fb5bbe2cfa98614dcffd87de1cee2c5912a5899505a0c5bcaa513e2c6 + +Px = 0x2fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b +Py = 0x1993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5 +# Test 322 (x-coordinate of the public key is small) +Signature = 3081880242010e89470f981d2c7c5c96587121a67323bb96ff2427739d0d885ea277293efa3b25c0bda04d81466198a3cbfc441f1b1b98f6bcdc2589d9d91a17a7899f70d0461e0242017351b0da8c8d0e4aa0974669d190fa2f90aa50227160594dfb55755002365441de17ea42902128a6f81e554177ed509c0cec31fd5053fae03f62ff76579ba92bda + +# Test 323 (x-coordinate of the public key is small) +Signature = 3081880242011094ac23ca46a3e2b4ac3baae6504f1bfb3ddf2db9ab40eda32d8e0a05727998f8552a033bb05241e826a86a1d03014eae3aa5fe1a45caac1db3e8138b9cf5906802420147edb15a5080ee2f929f78b6ac86604aae51b674fa46eaae7fdfd90bf64d6189341155f4eba937eae74c9e480eb4fb7e6aafd4285e7fc503ee6ec20f0b1415be06 + +# Test 324 (x-coordinate of the public key is small) +Signature = 308188024201d876ae174da31e128babff9f1d15507660bdc7958750844dc4f4291f75a882a22f177f704be6067bf7ce8f06b8626d971e6ef5dcb666fa975c1e11126e04fccce2024201abb12630a68b669e6ad2d8d62654d75dfbc6b54a8e3a9c915be663e080ddcc348e57a10e2b1dd9f03e1b897796ad889b075e5919dc5bf37a112d92c693456e6457 + +Px = 0x1fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca63331 +Py = 0x1b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6 +# Test 325 (x-coordinate of the public key is large) +Signature = 30818602414ed692af1ed1b4bd5cea3aa8ddc6f3f15d8a6ee0016fa0e8eb958580e7421832ecc0e387c34aafac6380bac419ea45c42ae6426af503847f22c49c2f456338c1a702417aceadde02ace1668bc1a3360d34e125afde230f536c154d91e6c876bee1d34ae06edcbbca0c7cd17646840913164740b12e2e224fe3ef3dec6fd84a81b581c188 + +# Test 326 (x-coordinate of the public key is large) +Signature = 308188024200e01094048fcf7a1e2ec66faedffc40f48c9c93514325bde6b4958d80f0413efde7eec1dc6de65f96009c069397e51da2eb1729efa287afd5552b25a9e427a6d836024201489e7e124f66942e642de992e60b3a86fcce576767719390c3a312fcdeaa560a7fbb0cabb35e05a6d6f3499160fd2dba12d29b613b16dec7494c950d65fdf11fa3 + +# Test 327 (x-coordinate of the public key is large) +Signature = 308188024201d296292213380de133dc66eceb8bd857a5c468afe855c05da9db937373b51f9020ca11353415da76bb6af997a486d2370e31adcc0a4531952a3b59428678ee59430242015979a3c609c2c2099ae1b290da3d613b248e3a10de7ad770dffc82fb33e74fc3207533f97285cf4557a6407e9a775e59efeaee4264b2634933a6baf8c406f0c4a9 + +Px = 0xc7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd491349 +Py = 0x8bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff +# Test 328 (y-coordinate of the public key has many trailing 1's) +Signature = 308188024201ef8f785c51a25ae2cd93487b5c848d4af133217a91f51359c966e7538e68743578122df5830002f96f6fadb5bc44480e3b3b2c804e4c51cf95d059d5646c5cef21024201ba2276cc003e87bea37c3724e58a0ab885f56d09b8b5718f674f9c70f3b5ecfb4ad1f3417b420ec40810e08826efa7d8ad6ca7c6a7840348097f92b2de8d6e080b + +# Test 329 (y-coordinate of the public key has many trailing 1's) +Signature = 30818802420155978adc4b570d897511f5ecfb65a31947e6e989da17dea716625bb3fa7b92b853623eb0cd9ce2a5e2b4d8c1c2a90ec04fe79d012576ec728a45c5ce47c6d500c0024200f79fa8b94ee282a3d1815892cbf15d7ebdf62cb042c76bb3c710c23e32b75992cc249d84072198e4ed63d72435a07d2ed76f278d7399f61a5b5c997f45692fed22 + +# Test 330 (y-coordinate of the public key has many trailing 1's) +Signature = 308188024201a2af29c58184ca861e7cd931f39cea064b199eee563f241cd5ecf6ebb2ade728f1be23cf007ebe8ef0c42d99f9f5190f6815446afc3043a820d7daf27e86b83b8a024201a2acd1822eb539383defff8769aad8bacd50cd24ca7aa6670671418110177808c3f4fbe6041b9cb898359ee61e04824adedd62b39fe5791907a20586333bd3c76d + diff --git a/src/tests/test_ecdsa.cpp b/src/tests/test_ecdsa.cpp index 6464bc7a0b6..68369fe1e95 100644 --- a/src/tests/test_ecdsa.cpp +++ b/src/tests/test_ecdsa.cpp @@ -53,6 +53,46 @@ class ECDSA_Verification_Tests final : public PK_Signature_Verification_Test } }; +class ECDSA_Wycheproof_Verification_Tests final : public PK_Signature_Verification_Test + { + public: + ECDSA_Wycheproof_Verification_Tests() : PK_Signature_Verification_Test( + "ECDSA", + "pubkey/ecdsa_wycheproof.vec", + "Group,Px,Py,Hash,Msg,Signature", + "Valid") {} + + bool clear_between_callbacks() const override + { + return false; + } + + Botan::Signature_Format sig_format() const override + { + return Botan::DER_SEQUENCE; + } + + bool test_random_invalid_sigs() const override { return false; } + + std::unique_ptr load_public_key(const VarMap& vars) override + { + const std::string group_id = vars.get_req_str("Group"); + const BigInt px = vars.get_req_bn("Px"); + const BigInt py = vars.get_req_bn("Py"); + Botan::EC_Group group(Botan::OIDS::lookup(group_id)); + + const Botan::PointGFp public_point = group.point(px, py); + + std::unique_ptr key(new Botan::ECDSA_PublicKey(group, public_point)); + return key; + } + + std::string default_padding(const VarMap& vars) const override + { + return "EMSA1(" + vars.get_req_str("Hash") + ")"; + } + }; + class ECDSA_Signature_KAT_Tests final : public PK_Signature_Generation_Test { public: @@ -154,6 +194,7 @@ class ECDSA_Invalid_Key_Tests final : public Text_Based_Test }; BOTAN_REGISTER_TEST("ecdsa_verify", ECDSA_Verification_Tests); +BOTAN_REGISTER_TEST("ecdsa_verify_wycheproof", ECDSA_Wycheproof_Verification_Tests); BOTAN_REGISTER_TEST("ecdsa_sign", ECDSA_Signature_KAT_Tests); BOTAN_REGISTER_TEST("ecdsa_keygen", ECDSA_Keygen_Tests); BOTAN_REGISTER_TEST("ecdsa_invalid", ECDSA_Invalid_Key_Tests); diff --git a/src/tests/test_pubkey.cpp b/src/tests/test_pubkey.cpp index 8860aeed263..8340e1d549e 100644 --- a/src/tests/test_pubkey.cpp +++ b/src/tests/test_pubkey.cpp @@ -184,6 +184,12 @@ PK_Signature_Generation_Test::run_one_test(const std::string& pad_hdr, const Var return result; } +Botan::Signature_Format +PK_Signature_Verification_Test::sig_format() const + { + return Botan::IEEE_1363; + } + Test::Result PK_Signature_Verification_Test::run_one_test(const std::string& pad_hdr, const VarMap& vars) { @@ -203,24 +209,35 @@ PK_Signature_Verification_Test::run_one_test(const std::string& pad_hdr, const V try { - verifier.reset(new Botan::PK_Verifier(*pubkey, padding, Botan::IEEE_1363, verify_provider)); + verifier.reset(new Botan::PK_Verifier(*pubkey, padding, sig_format(), verify_provider)); } catch(Botan::Lookup_Error&) { - result.test_note("Skipping verifying with " + verify_provider); + //result.test_note("Skipping verifying with " + verify_provider); } if(verifier) { - const bool verified = verifier->verify_message(message, signature); + try + { + const bool verified = verifier->verify_message(message, signature); + + if(expected_valid) + { + result.test_eq("correct signature valid with " + verify_provider, verified, true); - if(expected_valid) + if(test_random_invalid_sigs()) + { + check_invalid_signatures(result, *verifier, message, signature); + } + } + else + result.test_eq("incorrect signature invalid", verified, false); + } + catch(std::exception& e) { - result.test_eq("correct signature valid", verified, true); - check_invalid_signatures(result, *verifier, message, signature); + result.test_failure("verification threw exception", e.what()); } - else - result.test_eq("incorrect signature invalid", verified, false); } } diff --git a/src/tests/test_pubkey.h b/src/tests/test_pubkey.h index 2fde5de3cc9..f828a813420 100644 --- a/src/tests/test_pubkey.h +++ b/src/tests/test_pubkey.h @@ -76,6 +76,10 @@ class PK_Signature_Verification_Test : public PK_Test const std::string& optional_keys = "") : PK_Test(algo, test_src, required_keys, optional_keys) {} + virtual Botan::Signature_Format sig_format() const; + + virtual bool test_random_invalid_sigs() const { return true; } + virtual std::unique_ptr load_public_key(const VarMap& vars) = 0; private: Test::Result run_one_test(const std::string& header, const VarMap& vars) override final; From 26f31c652fc1c25f3349530c7bf8ee0eb999e469 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 31 May 2018 17:34:47 -0400 Subject: [PATCH 150/174] Handle EC_R_BAD_SIGNATURE from OpenSSL --- src/lib/prov/openssl/openssl.h | 3 +++ src/lib/prov/openssl/openssl_ec.cpp | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/lib/prov/openssl/openssl.h b/src/lib/prov/openssl/openssl.h index 2cb581bb336..3db7b39afbb 100644 --- a/src/lib/prov/openssl/openssl.h +++ b/src/lib/prov/openssl/openssl.h @@ -35,6 +35,9 @@ class BOTAN_PUBLIC_API(2,0) OpenSSL_Error final : public Exception public: OpenSSL_Error(const std::string& what) : Exception(what + " failed: " + ERR_error_string(ERR_get_error(), nullptr)) {} + + OpenSSL_Error(const std::string& what, int err) : + Exception(what + " failed: " + ERR_error_string(err, nullptr)) {} }; /* Block Ciphers */ diff --git a/src/lib/prov/openssl/openssl_ec.cpp b/src/lib/prov/openssl/openssl_ec.cpp index c61f83d024b..ca5be857a57 100644 --- a/src/lib/prov/openssl/openssl_ec.cpp +++ b/src/lib/prov/openssl/openssl_ec.cpp @@ -185,7 +185,18 @@ class OpenSSL_ECDSA_Verification_Operation final : public PK_Ops::Verification_w const int res = ECDSA_do_verify(msg, msg_len, sig.get(), m_ossl_ec.get()); if(res < 0) + { + int err = ERR_get_error(); +#if defined(EC_R_BAD_SIGNATURE) + if(ERR_GET_REASON(err) != EC_R_BAD_SIGNATURE) + throw OpenSSL_Error("ECDSA_do_verify", err); +#elif defined(ECDSA_R_BAD_SIGNATURE) + if(ERR_GET_REASON(err) != ECDSA_R_BAD_SIGNATURE) + throw OpenSSL_Error("ECDSA_do_verify", err); +#else throw OpenSSL_Error("ECDSA_do_verify"); +#endif + } return (res == 1); } From 9553f4a054ebee828ee4313cf505f986b7a2e7e8 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 31 May 2018 19:34:26 -0400 Subject: [PATCH 151/174] Move codec_base.h to internal header in utils --- src/lib/codec/base32/base32.cpp | 2 +- src/lib/codec/base32/base32.h | 4 ++-- src/lib/codec/codec_base/info.txt | 2 -- src/lib/{codec/codec_base => utils}/codec_base.h | 0 src/lib/utils/info.txt | 1 + 5 files changed, 4 insertions(+), 5 deletions(-) delete mode 100644 src/lib/codec/codec_base/info.txt rename src/lib/{codec/codec_base => utils}/codec_base.h (100%) diff --git a/src/lib/codec/base32/base32.cpp b/src/lib/codec/base32/base32.cpp index 392c063ba6c..0550dd3849c 100644 --- a/src/lib/codec/base32/base32.cpp +++ b/src/lib/codec/base32/base32.cpp @@ -6,7 +6,7 @@ */ #include -#include +#include #include #include diff --git a/src/lib/codec/base32/base32.h b/src/lib/codec/base32/base32.h index 15b894c2947..d2bcb3e6abb 100644 --- a/src/lib/codec/base32/base32.h +++ b/src/lib/codec/base32/base32.h @@ -36,7 +36,7 @@ size_t BOTAN_PUBLIC_API(2, 7) base32_encode(char output[], * Perform base32 encoding * @param input some input * @param input_length length of input in bytes -* @return base32adecimal representation of input +* @return base32 representation of input */ std::string BOTAN_PUBLIC_API(2, 7) base32_encode(const uint8_t input[], size_t input_length); @@ -44,7 +44,7 @@ std::string BOTAN_PUBLIC_API(2, 7) base32_encode(const uint8_t input[], /** * Perform base32 encoding * @param input some input -* @return base32adecimal representation of input +* @return base32 representation of input */ template std::string base32_encode(const std::vector& input) diff --git a/src/lib/codec/codec_base/info.txt b/src/lib/codec/codec_base/info.txt deleted file mode 100644 index 0771e5801c4..00000000000 --- a/src/lib/codec/codec_base/info.txt +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/src/lib/codec/codec_base/codec_base.h b/src/lib/utils/codec_base.h similarity index 100% rename from src/lib/codec/codec_base/codec_base.h rename to src/lib/utils/codec_base.h diff --git a/src/lib/utils/info.txt b/src/lib/utils/info.txt index c9b419dcc07..fb9325f9328 100644 --- a/src/lib/utils/info.txt +++ b/src/lib/utils/info.txt @@ -26,6 +26,7 @@ stl_compatibility.h bit_ops.h +codec_base.h ct_utils.h donna128.h filesystem.h From 07386822ffecc6baf5cc5a69fb61d747fd4088b6 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 31 May 2018 19:55:17 -0400 Subject: [PATCH 152/174] Improve error message in tests on invalid hex input --- src/tests/tests.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/tests/tests.cpp b/src/tests/tests.cpp index 076f85f0d5f..6a114847418 100644 --- a/src/tests/tests.cpp +++ b/src/tests/tests.cpp @@ -639,10 +639,11 @@ std::vector VarMap::get_req_bin( { return Botan::hex_decode(i->second); } - catch(std::exception&) + catch(std::exception& e) { - throw Test_Error("Test invalid hex input '" + i->second + "'" + - + " for key " + key); + std::ostringstream oss; + oss << "Bad input '" << i->second << "'" << " for key " << key << " - " << e.what(); + throw Test_Error(oss.str()); } } From 2f08b493b3ad817673a8c49cebb017cff61b6eb3 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 31 May 2018 19:55:01 -0400 Subject: [PATCH 153/174] Add EdDSA and X25519 tests from Wycheproof --- src/tests/data/pubkey/ed25519.vec | 237 +++++++++++++++ src/tests/data/pubkey/ed25519_verify.vec | 194 +++++++++++- src/tests/data/pubkey/x25519.vec | 363 +++++++++++++++++++++++ src/tests/test_c25519.cpp | 28 ++ src/tests/test_ed25519.cpp | 10 + 5 files changed, 831 insertions(+), 1 deletion(-) create mode 100644 src/tests/data/pubkey/x25519.vec diff --git a/src/tests/data/pubkey/ed25519.vec b/src/tests/data/pubkey/ed25519.vec index 87a9c868433..da328259b7b 100644 --- a/src/tests/data/pubkey/ed25519.vec +++ b/src/tests/data/pubkey/ed25519.vec @@ -3305,3 +3305,240 @@ Privkey = 1a8b1ff05ded48e18bf50166c664ab023ea70003d78d9e41f5758a91d850f8d2 Pubkey = 3f098994bdd916ed4053197934e4a87c80733a1280d62f8010992e43ee3b2406 Msg = f6220a3f757814f4c2176ffbb68b00249cd4ccdc059c4b34ad871f30b1740280 Signature = 56f90cca98e2102637bd983fdb16c131dfd27ed82bf4dde5606e0d756aed3366d09c4fa11527f038e0f57f2201d82f2ea2c9033265fa6ceb489e854bae61b404 + +# From Wycheproof + +# Test 1 +Privkey = add4bb8103785baf9ac534258e8aaf65f5f1adb5ef5f3df19bb80ab989c4d64b +Pubkey = 7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa +Msg = +Signature = d4fbdb52bfa726b44d1786a8c0d171c3e62ca83c9e5bbe63de0bb2483f8fd6cc1429ab72cafc41ab56af02ff8fcc43b99bfe4c7ae940f60f38ebaa9d311c4007 + +# Test 2 +Msg = 78 +Signature = d80737358ede548acb173ef7e0399f83392fe8125b2ce877de7975d8b726ef5b1e76632280ee38afad12125ea44b961bf92f1178c9fa819d020869975bcbe109 + +# Test 3 +Msg = 54657374 +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d + +# Test 4 +Msg = 48656c6c6f +Signature = 1c1ad976cbaae3b31dee07971cf92c928ce2091a85f5899f5e11ecec90fc9f8e93df18c5037ec9b29c07195ad284e63d548cd0a6fe358cc775bd6c1608d2c905 + +# Test 5 +Msg = 313233343030 +Signature = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bf0cf5b3a289976458a1be6277a5055545253b45b07dcc1abd96c8b989c00f301 + +# Test 6 +Msg = 000000000000000000000000 +Signature = d46543bfb892f84ec124dcdfc847034c19363bf3fc2fa89b1267833a14856e52e60736918783f950b6f1dd8d40dc343247cd43ce054c2d68ef974f7ed0f3c60f + +# Test 7 +Msg = 6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161 +Signature = 879350045543bc14ed2c08939b68c30d22251d83e018cacbaf0c9d7a48db577e80bdf76ce99e5926762bc13b7b3483260a5ef63d07e34b58eb9c14621ac92f00 + +# Test 8 +Msg = 202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +Signature = 7bdc3f9919a05f1d5db4a3ada896094f6871c1f37afc75db82ec3147d84d6f237b7e5ecc26b59cfea0c7eaf1052dc427b0f724615be9c3d3e01356c65b9b5109 + +# Test 9 +Msg = ffffffffffffffffffffffffffffffff +Signature = 5dbd7360e55aa38e855d6ad48c34bd35b7871628508906861a7c4776765ed7d1e13d910faabd689ec8618b78295c8ab8f0e19c8b4b43eb8685778499e943ae04 + +# Test 69 +Privkey = 0a23a20072891237aa0864b5765139514908787878cd77135a0059881d313f00 +Pubkey = a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c +Msg = +Signature = 5056325d2ab440bf30bbf0f7173199aa8b4e6fbc091cf3eb6bc6cf87cd73d992ffc216c85e4ab5b8a0bbc7e9a6e9f8d33b7f6e5ac0ffdc22d9fcaf784af84302 + +# Test 70 +Msg = 78 +Signature = 481fafbf4364d7b682475282f517a3ac0538c9a6b6a562e99a3d8e5afb4f90a559b056b9f07af023905753b02d95eb329a35c77f154b79abbcd291615ce42f02 + +# Test 71 +Msg = 54657374 +Signature = 8a9bb4c465a3863abc9fd0dd35d80bb28f7d33d37d74679802d63f82b20da114b8d765a1206b3e9ad7cf2b2d8d778bb8651f1fa992db293c0039eacb6161480f + +# Test 72 +Msg = 48656c6c6f +Signature = d839c20abfda1fd429531831c64f813f84b913e9928540310cf060b44c3dbf9457d44a7721fdc0d67724ff81cb450dd39b10cfb65db15dda4b8bf09d26bd3801 + +# Test 73 +Msg = 313233343030 +Signature = 9bbb1052dcfa8ad2715c2eb716ae4f1902dea353d42ee09fd4c0b4fcb8b52b5219e2200016e1199d0061891c263e31b0bc3b55673c19610c4e0fa5408004160b + +# Test 74 +Msg = 000000000000000000000000 +Signature = f63b5c0667c7897fc283296416f7f60e84bbde9cbd832e56be463ed9f568069702b17a2f7c341ebf590706a6388ac76ac613c1675ec0f2c7118f2573422a500b + +# Test 75 +Msg = 6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161 +Signature = 1bc44d7001e6b5b9090fef34b2ca480f9786bbefa7d279353e5881e8dfb91b803ccd46500e270ef0109bfd741037558832120bc2a4f20fbe7b5fb3c3aaf23e08 + +# Test 76 +Msg = 202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +Signature = ea8e22143b02372e76e99aece3ed36aec529768a27e2bb49bdc135d44378061e1f62d1ac518f33ebf37b2ee8cc6dde68a4bd7d4a2f4d6cb77f015f71ca9fc30d + +# Test 77 +Msg = ffffffffffffffffffffffffffffffff +Signature = 8acd679e1a914fc45d5fa83d3021f0509c805c8d271df54e52f43cfbd00cb6222bf81d58fe1de2de378df67ee9f453786626961fe50a9b05f12b6f0899ebdd0a + +# Test 78 (draft-josefsson-eddsa-ed25519-02: Test 1) +Privkey = 9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60 +Pubkey = d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a +Msg = +Signature = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b + +# Test 79 (draft-josefsson-eddsa-ed25519-02: Test 2) +Privkey = 4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb +Pubkey = 3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c +Msg = 72 +Signature = 92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00 + +# Test 80 (draft-josefsson-eddsa-ed25519-02: Test 3) +Privkey = c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7 +Pubkey = fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025 +Msg = af82 +Signature = 6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a + +# Test 81 (draft-josefsson-eddsa-ed25519-02: Test 1024) +Privkey = f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5 +Pubkey = 278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e +Msg = 08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d879de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4feba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbefefd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed185ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f27088d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b0707e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128bab27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51addd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429ec96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb751fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34dff7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e488acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a32ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5fb93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b50d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380db2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0 +Signature = 0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a03 + +# Test 82 (Random test failure 1) +Privkey = d7ad3f1f6bbe0477c3c357a806a19eb41ae3f94025035bc87f281f8ee9fc0e34 +Pubkey = 8fd659b77b558ed93882c1157438450ac86ec62d421d568e98ee236f3810295a +Msg = b0729a713593a92e46b56eaa66b9e435f7a09a8e7de03b078f6f282285276635f301e7aaafe42187c45d6f5b13f9f16b11195cc125c05b90d24dfe4c +Signature = 7db17557ac470c0eda4eedaabce99197ab62565653cf911f632ee8be0e5ffcfc88fb94276b42e0798fd3aa2f0318be7fc6a29fae75f70c3dcdc414a0ad866601 + +# Test 83 (Random test failure 2) +Privkey = ad9b22793336fcdac10e136c4deea599be187a38eef91c1cf7c7a4ec884dda08 +Pubkey = 2a606bf67ac770c607038b004101b325edb569efd3413d2d1f2c3e6b4e6e3082 +Msg = a8546e50ba31cae3234310d32672447be213fad91a227a19669c53d309b959782b0e6b71f8791fdb470043b58122003157d2d96a43a6cbd7d3a8d86bf4c97391883e268d50af80e1e6e12939c2bd50ca746cdadfad4edf1bda875299740724148efb1ebe73fb60088cda890317658627a5f7ab5a0c075d9d8f3f97b6492b35519e50ff6b38377432a7081f9176bb1c29a862deac1336ca20b097a47829cec10a6a7cec178eda2d12f6dc6c87f910454af0123555ba184e68804d9cced60fd5c8c90943e56599c8f0ba59a38491ba5e5a53460682474c07e40ca142983314fd762856bb1093f359da6eb0a756bd93a3160c10dd8feea6b97e7c6a17cb54bd5d7649c05c66d7bdee056671dfdaf689fa3945bb8e29a429f4bd5d355dce9687b06f01d5e33e3999f0e8 +Signature = 67d84d4c3945aaf06e06d524be63acbfb5dbb1988c4aea96a5ee9f7a9b9eecc29df4f66b8aa1d9e8607a58fb1ef0c2ad69aac005b4f58e34103344a9c8871a09 + +# Test 84 (Random test failure 24) +Msg = b477b0480bb84642608b908d29a51cf2fce63f24ee95 +Signature = 28fafbb62b4d688fa79e1ac92851f46e319b161f801d4dc09acc21fdd6780a2c4292b8c1003c61c2bcebe7f3f88ccc4bb26d407387c5f27cb8c94cf6ce810405 + +# Test 85 (Random test failure 3) +Privkey = 04a6553d68a9baef78a2175af375458eaa01cdb77350c61e282ef5f0c7116599 +Pubkey = c9c946cbc5544ac74eef491f07c5881c16faf7ec31ce4aa91bb60ae7b4539051 +Msg = cd2212eddb0706f62c995cef958634f0cb7793444cbf4d30e81c27c41ebea6cb02607510131f9c015692dfd521b148841e9a2d3564d20ac401f6cb8e40f520fe0cafbeaa88840b83013369d879f013463fe52a13267aa0c8c59c45cde9399cd1e6be8cc64cf48315ac2eb31a1c567a4fb7d601746d1f63b5ac020712adbbe07519bded6f +Signature = 24087d47f3e20af51b9668ae0a88ce76586802d0ec75d8c0f28fc30962b5e1d1a1d509571a1624ed125a8df92a6e963728d6b5de99200b8e285f70feb6f05207 + +# Test 86 (Random test failure 20) +Msg = 27d465bc632743522aefa23c +Signature = c2656951e2a0285585a51ff0eda7e9a23c2dfd2ffa273aee7808f4604e8f9a8c8ea49e9fce4eb2d8d75d36b7238fe6fc13b6c5d9427dd58f8c6615d033c0bd0f + +# Test 87 (Random test failure 4) +Privkey = c367c8d2ebeeecd70c1e8985b70c3808b75657f243b21ba4f322792540e92257 +Pubkey = 32ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e +Msg = ec5c7cb078 +Signature = d920d421a5956b69bfe1ba834c025e2babb6c7a6d78c97de1d9bb1116dfdd1185147b2887e34e15578172e150774275ea2aad9e02106f7e8ca1caa669a066f0c + +# Test 88 (Random test failure 5) +Msg = 4668c6a76f0e482190a7175b9f3806a5fe4314a004fa69f988373f7a +Signature = 4f62daf7f7c162038552ad7d306e195baa37ecf6ca7604142679d7d1128e1f8af52e4cb3545748c44ef1ff1c64e877e4f4d248259b7f6eb56e3ef72097dc8e0c + +# Test 89 (Random test failure 8) +Msg = 5dc9bb87eb11621a93f92abe53515697d2611b2eef73 +Signature = deecafb6f2ede73fec91a6f10e45b9c1c61c4b9bfbe6b6147e2de0b1df6938971f7896c3ab83851fb5d9e537037bff0fca0ccb4a3cc38f056f91f7d7a0557e08 + +# Test 90 (Random test failure 10) +Msg = 7dcfe60f881e1285676f35b68a1b2dbcdd7be6f719a288ababc28d36e3a42ac3010a1ca54b32760e74 +Signature = 7f8663cf98cbd39d5ff553f00bcf3d0d520605794f8866ce75714d77cc51e66c91818b657d7b0dae430a68353506edc4a714c345f5ddb5c8b958ba3d035f7a01 + +# Test 91 (Random test failure 12) +Msg = 58e456064dff471109def4ca27fa8310a1df32739655b624f27e6418d34b7f007173f3faa5 +Signature = 6aab49e5c0bc309b783378ee03ffda282f0185cdf94c847701ff307a6ee8d0865411c44e0a8206f6a5f606107451940c2593af790ce1860f4c14ab25b2deae08 + +# Test 92 (Random test failure 15) +Msg = a1 +Signature = 1a74ed2cbdc7d8f3827014e8e6ecf8fd2698ac8f86833acccdd400df710fe0d6b0543c9cfa00d52bf024ab7ce0d91981944097233ec134d5c7abbd44bfd32d0d + +# Test 93 (Random test failure 19) +Msg = 11cb1eafa4c42a8402c4193c4696f7b2e6d4585e4b42dcf1a8b67a80b2da80bc9d4b649fb2f35eaf1f56c426fd0b +Signature = 14ceb2eaf4688d995d482f44852d71ad878cd7c77b41e60b0065fd01a59b054ee74759224187dbde9e59a763a70277c960892ef89fba997aba2576b2c54ba608 + +# Test 94 (Random test failure 25) +Msg = aa365b442d12b7f3c925 +Signature = 83c40ce13d483cc58ff65844875862d93df4bd367af77efa469ec06a8ed9e6d7905a04879535708ddf225567a815c9b941d405c98e918fd0c151165cea7fb101 + +# Test 95 (Random test failure 28) +Msg = 475f +Signature = 71a4a06a34075f2fd47bc3abf4714d46db7e97b08cb6180d3f1539ac50b18ce51f8af8ae95ed21d4fa0daab7235925631ecea1fd9d0d8a2ba7a7583fd04b900c + +# Test 96 (Random test failure 6) +Privkey = 56c1e22d616cbb6dea869288b4b1c02bb98696583c2f6e650013a03e17049c62 +Pubkey = c29ec1894e06d27b4e40486b4fa5063d66a746c7f9c323b12203c03b72b8b78a +Msg = 0f325ffd87e58131ffa23c05ea4579513b287fdba87b44 +Signature = 6669acf94667c5b541afe5307bde9476b13ae7e0e6058a772101ac8eb0a94331428eb4db0a2c68a9b6c1763b8624dab259b0876cdcfaeacc17b21a18e3fc010a + +# Test 97 (Random test failure 21) +Msg = 5ffa +Signature = 931e5152fcef078c22cc5d6a3a65f06e396289f6f5f2d1efa6340254a53526ef5dc6874eeddf35c3f50991c53cd02bf06313e37d93ee1f7022128ffa3b8f300b + +# Test 98 (Random test failure 7) +Privkey = b7d2f64276df417fed27d8e15b4e90f6fd93dace707294c338bd32bc4bbd8fdb +Pubkey = cfda5b899e35764c5229e59295fe1222b7ddce176643697c29e46ecbba10cf10 +Msg = ec5c7cb078 +Signature = 30490c28f806298225df62103521dcee047153912c33ab8ab8bbdd1ffabd70fd4fdb360f05be535b067d1cf4e78c2cb432206bf280aab3bd21aaa1cb894c5b06 + +# Test 99 (Random test failure 9) +Msg = 67484059b2490b1a0a4f8dee77979e26 +Signature = 4cd4f77ed473a6647387f3163541c67a1708a3c3bd1673247cb87f0cb68b3c56f04bfa72970c8a483efe659c87009ab4020b590b6641316b3deddb5450544e02 + +# Test 100 (Random test failure 11) +Msg = a020a4381dc9141f47ee508871ab7a8b5a3648727c4281ae9932376f23a8e1bcda0626b7129197d864178631ec89c4332dbb18 +Signature = 1e41a24fe732bd7cab14c2a2f5134ee8c87fcbd2e987e60957ed9239e5c32404d56977e1b4282871896cb10625a1937468e4dc266e16a9c1b8e9891177eca802 + +# Test 101 (Random test failure 14) +Msg = a25176b3afea318b2ec11ddacb10caf7179c0b3f8eabbfa2895581138d3c1e0e +Signature = 2a833aadecd9f28235cb5896bf3781521dc71f28af2e91dbe1735a61dce3e31ac15ca24b3fc47817a59d386bbbb2ce60a6adc0a2703bb2bdea8f70f91051f706 + +# Test 102 (Random test failure 18) +Msg = a9e6d94870a67a9fe1cf13b1e6f9150cdd407bf6480ec841ea586ae3935e9787163cf419c1 +Signature = c97e3190f83bae7729ba473ad46b420b8aad735f0808ea42c0f898ccfe6addd4fd9d9fa3355d5e67ee21ab7e1f805cd07f1fce980e307f4d7ad36cc924eef00c + +# Test 103 (Random test failure 13) +Privkey = 7d597c3b7283929d07ed8f01f31d2596823e5e46ab226c7be4234d1a9dcaef37 +Pubkey = 529919c9c780985a841c42ba6c180ff2d67a276ccfbe281080e47ab71a758f56 +Msg = e1cbf2d86827825613fb7a85811d +Signature = 01abfa4d6bbc726b196928ec84fd03f0c953a4fa2b228249562ff1442a4f63a7150b064f3712b51c2af768d2c2711a71aabf8d186833e941a0301b82f0502905 + +# Test 104 (Random test failure 22) +Msg = 25 +Signature = e4ae21f7a8f4b3b325c161a8c6e53e2edd7005b9c2f8a2e3b0ac4ba94aa80be6f2ee22ac8d4a96b9a3eb73a825e7bb5aff4a3393bf5b4a38119e9c9b1b041106 + +# Test 105 (Random test failure 16) +Privkey = f401cee4bfb1732f0e9b8d8ba79469565c3115296141dbdf7e9c311a0ac1823b +Pubkey = 2252b3d57c74cbf8bc460dc2e082847926bc022f09ab6ae95756362bfd1167c1 +Msg = 975ef941710071a9e1e6325a0c860becd7c695b5117c3107b686e330e5 +Signature = af0fd9dda7e03e12313410d8d8844ebb6fe6b7f65141f22d7bcba5695a25414a9e54326fb44d59fb14707899a8aae70857b23d4080d7ab2c396ef3a36d45ce02 + +# Test 106 (Random test failure 23) +Msg = 80fdd6218f29c8c8f6bd820945f9b0854e3a8824 +Signature = e097e0bd0370bff5bde359175a11b728ee9639095d5df8eda496395565616edfe079977f7d4dc8c75d6113a83d6a55e6e1676408c0967a2906339b43337dcb01 + +# Test 107 (Random test failure 17) +Privkey = 3d658956410377d0644676d2599542412a4f3b0e4eadfb7f3f836615f42b18bc +Pubkey = c0a773110f975de3732355bb7ec7f0c41c091c0252966070205516693b992a4a +Msg = +Signature = 0280427e713378f49d478df6373c6cac847b622b567daa2376c839e7ac10e22c380ab0fa8617c9dcfe76c4d9db5459b21dc1413726e46cc8f387d359e344f407 + +# Test 108 (Random test failure 26) +Privkey = bccb61323840c2a96fc36f7e54ea6c8e55f9d221f7f05791ed60025e06064439 +Pubkey = 54cda623245759ad6d43e620a606908befc633d60792bc7798447a0ef38e7311 +Msg = 27e792b28b2f1702 +Signature = 14d9b497c19b91d43481c55bb6f5056de252d9ecb637575c807e58e9b4c5eac8b284089d97e2192dc242014363208e2c9a3435edf8928fb1d893553e9be4c703 + +# Test 109 (Random test failure 27) +Privkey = f2d3023b9c19e241748bc4039a7a43c595701f23675505015213a8a2a0274c1b +Pubkey = 2362bac514d5fad33802642e979a1e82de6eb6f1bcbf6a5b304f2bb02b9e57fe +Msg = eef3bb0f617c17d0420c115c21c28e3762edc7b7fb048529b84a9c2bc6 +Signature = 242ddb3a5d938d07af690b1b0ef0fa75842c5f9549bf39c8750f75614c712e7cbaf2e37cc0799db38b858d41aec5b9dd2fca6a3c8e082c10408e2cf3932b9d08 + diff --git a/src/tests/data/pubkey/ed25519_verify.vec b/src/tests/data/pubkey/ed25519_verify.vec index ad918969cf9..326a92ad3b6 100644 --- a/src/tests/data/pubkey/ed25519_verify.vec +++ b/src/tests/data/pubkey/ed25519_verify.vec @@ -1,7 +1,199 @@ [Pure] +Valid = 0 + # OSS-Fuzz #7156 Pubkey = 29A5670182010000000000002007643AE1720EF35AA223252F021A68F707511A Msg = 30820143A0030201020209009C28A1A9B4502044300506032B65703045310B30090603550406130241553113301106035504080C0A536F6D652D53746174653121301F060355040A0C18496E7465726E6574205769646769747320507479204C7464301E170D3134303432333233323135375A170D3134303532333233323135375A3045310B30090603550406130241553113301106035504080C0A536F6D652D53746174653121301F060355040A0C18496E7465726E6574205769646769747320507479204C7464302A300506032B657003210029A5670182010000000000002007643AE1720EF35AA223252F021A68F707511AA350304E301D060362E3E704160414A29B7B795F9F24ADAFDDA87A40F526963D7FFBB5301F0603555F2304183016821421EC7B795F9F1F000000A87AC0F53D7FB5963FFB300C0603551DAA040530030101FF -Valid = 0 Signature = 6EFA4FC58BA3BCF7C51598710C8D7182857E28C06D8C310BB5090603550406132020202020202020202020202020202020202020202020202020202020202016 + +# Wycheproof invalid tests +# (Valid tests are test in both sign and verify direction) + +# Test 10 (special values for r and s) +Pubkey = 7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa +Msg = 3f +Valid = 0 +Signature = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +# Test 11 (special values for r and s) +Signature = 00000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000 + +# Test 12 (special values for r and s) +Signature = 0000000000000000000000000000000000000000000000000000000000000000ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010 + +# Test 13 (special values for r and s) +Signature = 0000000000000000000000000000000000000000000000000000000000000000edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010 + +# Test 14 (special values for r and s) +Signature = 0000000000000000000000000000000000000000000000000000000000000000edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f + +# Test 15 (special values for r and s) +Signature = 01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +# Test 16 (special values for r and s) +Signature = 01000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000 + +# Test 17 (special values for r and s) +Signature = 0100000000000000000000000000000000000000000000000000000000000000ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010 + +# Test 18 (special values for r and s) +Signature = 0100000000000000000000000000000000000000000000000000000000000000edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010 + +# Test 19 (special values for r and s) +Signature = 0100000000000000000000000000000000000000000000000000000000000000edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f + +# Test 20 (special values for r and s) +Signature = edd3f55c1a631258d69cf7a2def9de14000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000 + +# Test 21 (special values for r and s) +Signature = edd3f55c1a631258d69cf7a2def9de14000000000000000000000000000000100100000000000000000000000000000000000000000000000000000000000000 + +# Test 22 (special values for r and s) +Signature = edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010 + +# Test 23 (special values for r and s) +Signature = edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010 + +# Test 24 (special values for r and s) +Signature = edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f + +# Test 25 (special values for r and s) +Signature = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000 + +# Test 26 (special values for r and s) +Signature = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0100000000000000000000000000000000000000000000000000000000000000 + +# Test 27 (special values for r and s) +Signature = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010 + +# Test 28 (special values for r and s) +Signature = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fedd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010 + +# Test 29 (special values for r and s) +Signature = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fedffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f + +# Test 30 (empty signature) +Msg = 54657374 +Signature = + +# Test 31 (s missing) +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0 + +# Test 32 (signature too short) +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946 + +# Test 33 (signature too long) +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d2020 + +# Test 34 (include pk in signature) +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa + +# Test 35 (prepending 0 byte to signature) +Signature = 007c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d + +# Test 36 (prepending 0 byte to s) +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0007a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d + +# Test 37 (appending 0 byte to signature) +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d00 + +# Test 38 (removing 0 byte from signature) +Msg = 54657374313236 +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab09155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d + +# Test 39 (removing 0 byte from signature) +Msg = 546573743137 +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b3 + +# Test 40 (modified bit 0 in R) +Msg = 313233343030 +Signature = 647c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b1d125e5538f38afbcc1c84e489521083041d24bc6240767029da063271a1ff0c + +# Test 41 (modified bit 1 in R) +Signature = 677c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bc108ca4b87a49c9ed2cf383aecad8f54a962b2899da891e12004d7993a627e01 + +# Test 42 (modified bit 2 in R) +Signature = 617c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b9ce23fc6213ed5b87912e9bbf92f5e2c780eae26d15c50a112d1e97d2ea33c06 + +# Test 43 (modified bit 7 in R) +Signature = e57c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bbb3eb51cd98dddb235a5f46f2bded6af184a58d09cce928bda43f41d69118a03 + +# Test 44 (modified bit 8 in R) +Signature = 657d1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bcd237dda9a116501f67a5705a854b9adc304f34720803a91b324f2c13e0f5a09 + +# Test 45 (modified bit 16 in R) +Signature = 657c1592402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b6b167bbdc0d881cc04d28905552c1876f3709851abc5007376940cc8a435c300 + +# Test 46 (modified bit 31 in R) +Signature = 657c1412402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b7fd2ac7da14afffcceeb13f2a0d6b887941cb1a5eb57a52f3cb131a16cce7b0e + +# Test 47 (modified bit 32 in R) +Signature = 657c1492412ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b7373ba13ebbef99cd2a8ead55ce735c987d85a35320925a8e871702dc7c5c40d + +# Test 48 (modified bit 63 in R) +Signature = 657c1492402ab54e03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bd35bd331c03f0855504ca1cab87b83c36a028425a3cf007ede4f4254c261cb00 + +# Test 49 (modified bit 64 in R) +Signature = 657c1492402ab5ce02e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bcb35101f73cf467deac8c1a03b6c3dc35af544132734b7e57ab20c89b2e4750d + +# Test 50 (modified bit 97 in R) +Signature = 657c1492402ab5ce03e2c3a7f2384d051b9cf3570f1207fc78c1bcc98c281c2bb58d2e8878290bff8d3355fdd4ea381924ee578752354eb6dee678ab4011c301 + +# Test 51 (modified bit 127 in R) +Signature = 657c1492402ab5ce03e2c3a7f0384d851b9cf3570f1207fc78c1bcc98c281c2bb978c866187ffb1cc7b29a0b4045aefc08768df65717194ff0c6e63f4dea0d02 + +# Test 52 (modified bit 240 in R) +Signature = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281d2b0576ecf8eaf675f00f3dfbe19f75b83b7607a6c96414f6821af920a2498d0305 + +# Test 53 (modified bit 247 in R) +Signature = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c289c2be5241a345c7b5428054c74b7c382fa10d4a5f1e8f8b79a71d3fdea2254f1ff0e + +# Test 54 (modified bit 248 in R) +Signature = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2a63950c85cd6dc96364e768de50ff7732b538f8a0b1615d799190ab600849230e + +# Test 55 (modified bit 253 in R) +Signature = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c0b543bd3da0a56a8c9c152f59c9fec12f31fa66434d48b817b30d90cb4efa8b501 + +# Test 56 (modified bit 254 in R) +Signature = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c6b8da07efd07a6dafb015ed6a32fe136319a972ffbc341f3a0beae97ccf8136505 + +# Test 57 (modified bit 255 in R) +Signature = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281cab227aedf259f910f0f3a759a335062665217925d019173b88917eae294f75d40f + +# Test 58 (R==0) +Signature = 0000000000000000000000000000000000000000000000000000000000000000e0b8e7770d51c7a36375d006c5bffd6af43ff54aaf47e4330dc118c71d61ec02 + +# Test 59 (invalid R) +Signature = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff463a1908382e7eb7693acef9884f7cf931a215e0791876be22c631a59881fd0e + +# Test 60 (all bits flipped in R) +Signature = 9a83eb6dbfd54a31fc1d3c580fc7b2fae4630ca8f0edf803873e433673d7e3d40e94254586cb6188c5386c3febed477cb9a6cb29e3979adc4cb27cf5278fb70a + +# Test 61 (checking malleability ) +Msg = 54657374 + +# This signature verifies, but shouldn't: why? +#Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab067654bce3832c2d76f8f6f5dafc08d9339d4eef676573336a5c51eb6f946b31d + +# Test 62 (checking malleability ) +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab05439412b5395d42f462c67008eba6ca839d4eef676573336a5c51eb6f946b32d + +# Test 63 (checking malleability ) +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab02ee12ce5875bf9dff26556464bae2ad239d4eef676573336a5c51eb6f946b34d + +# Test 64 (checking malleability ) +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0e2300459f1e742404cd934d2c595a6253ad4eef676573336a5c51eb6f946b38d + +# Test 65 (checking malleability ) +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b32d + +# Test 66 (checking malleability ) +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b34d + +# Test 67 (checking malleability ) +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b38d + +# Test 68 (checking malleability ) +Signature = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0679155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b38d + diff --git a/src/tests/data/pubkey/x25519.vec b/src/tests/data/pubkey/x25519.vec new file mode 100644 index 00000000000..3148f7be27d --- /dev/null +++ b/src/tests/data/pubkey/x25519.vec @@ -0,0 +1,363 @@ + +# Wycheproof tests + +# Test 1 (normal case) +Secret = 4852834d9d6b77dadeabaaf2e11dca66d19fe74993a7bec36c6e16a0983feaba +CounterKey = 9c647d9ae589b9f58fdc3ca4947efbc915c4b2e08e744a0edf469dac59c8f85a +K = 87b7f212b627f7a54ca5e0bcdaddd5389d9de6156cdbcf8ebe14ffbcfb436551 + +# Test 2 (public key on twist) +Secret = 588c061a50804ac488ad774ac716c3f5ba714b2712e048491379a500211998a8 +CounterKey = 63aa40c6e38346c5caf23a6df0a5e6c80889a08647e551b3563449befcfc9733 +K = b1a707519495ffffb298ff941716b06dfab87cf8d91123fe2be9a233dda22212 + +# Test 3 (public key on twist) +Secret = b05bfd32e55325d9fd648cb302848039000b390e44d521e58aab3b29a6960ba8 +CounterKey = 0f83c36fded9d32fadf4efa3ae93a90bb5cfa66893bc412c43fa7287dbb99779 +K = 67dd4a6e165533534c0e3f172e4ab8576bca923a5f07b2c069b4c310ff2e935b + +# Test 4 (public key on twist) +Secret = 70e34bcbe1f47fbc0fddfd7c1e1aa53d57bfe0f66d243067b424bb6210bed19c +CounterKey = 0b8211a2b6049097f6871c6c052d3c5fc1ba17da9e32ae458403b05bb283092a +K = 4a0638cfaa9ef1933b47f8939296a6b25be541ef7f70e844c0bcc00b134de64a + +# Test 5 (public key on twist) +Secret = 68c1f3a653a4cdb1d37bba94738f8b957a57beb24d646e994dc29a276aad458d +CounterKey = 343ac20a3b9c6a27b1008176509ad30735856ec1c8d8fcae13912d08d152f46c +K = 399491fce8dfab73b4f9f611de8ea0b27b28f85994250b0f475d585d042ac207 + +# Test 6 (public key on twist) +Secret = d877b26d06dff9d9f7fd4c5b3769f8cdd5b30516a5ab806be324ff3eb69ea0b2 +CounterKey = fa695fc7be8d1be5bf704898f388c452bafdd3b8eae805f8681a8d15c2d4e142 +K = 2c4fe11d490a53861776b13b4354abd4cf5a97699db6e6c68c1626d07662f758 + +# Test 7 (public key = 0) +Secret = 207494038f2bb811d47805bcdf04a2ac585ada7f2f23389bfd4658f9ddd4debc +CounterKey = 0000000000000000000000000000000000000000000000000000000000000000 +K = 0000000000000000000000000000000000000000000000000000000000000000 + +# Test 8 (public key = 1) +Secret = 202e8972b61c7e61930eb9450b5070eae1c670475685541f0476217e4818cfab +CounterKey = 0100000000000000000000000000000000000000000000000000000000000000 +K = 0000000000000000000000000000000000000000000000000000000000000000 + +# Test 9 (edge case on twist) +Secret = 38dde9f3e7b799045f9ac3793d4a9277dadeadc41bec0290f81f744f73775f84 +CounterKey = 0200000000000000000000000000000000000000000000000000000000000000 +K = 9a2cfe84ff9c4a9739625cae4a3b82a906877a441946f8d7b3d795fe8f5d1639 + +# Test 10 (edge case on twist) +Secret = 9857a914e3c29036fd9a442ba526b5cdcdf28216153e636c10677acab6bd6aa5 +CounterKey = 0300000000000000000000000000000000000000000000000000000000000000 +K = 4da4e0aa072c232ee2f0fa4e519ae50b52c1edd08a534d4ef346c2e106d21d60 + +# Test 11 (edge case on twist) +Secret = 48e2130d723305ed05e6e5894d398a5e33367a8c6aac8fcdf0a88e4b42820db7 +CounterKey = ffffff030000f8ffff1f0000c0ffffff000000feffff070000f0ffff3f000000 +K = 9ed10c53747f647f82f45125d3de15a1e6b824496ab40410ffcc3cfe95760f3b + +# Test 12 (edge case on twist) +Secret = 28f41011691851b3a62b641553b30d0dfddcb8fffcf53700a7be2f6a872e9fb0 +CounterKey = 000000fcffff070000e0ffff3f000000ffffff010000f8ffff0f0000c0ffff7f +K = cf72b4aa6aa1c9f894f4165b86109aa468517648e1f0cc70e1ab08460176506b + +# Test 13 (edge case on twist) +Secret = 18a93b6499b9f6b3225ca02fef410e0adec23532321d2d8ef1a6d602a8c65b83 +CounterKey = 00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffff7f +K = 5d50b62836bb69579410386cf7bb811c14bf85b1c7b17e5924c7ffea91ef9e12 + +# Test 14 (edge case on twist) +Secret = c01d1305a1338a1fcac2ba7e2e032b427e0b04903165aca957d8d0553d8717b0 +CounterKey = eaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f +K = 19230eb148d5d67c3c22ab1daeff80a57eae4265ce2872657b2c8099fc698e50 + +# Test 15 (edge case for public key) +Secret = 386f7f16c50731d64f82e6a170b142a4e34f31fd7768fcb8902925e7d1e21abe +CounterKey = 0400000000000000000000000000000000000000000000000000000000000000 +K = 0fcab5d842a078d7a71fc59b57bfb4ca0be6873b49dcdb9f44e14ae8fbdfa542 + +# Test 16 (edge case for public key) +Secret = e023a289bd5e90fa2804ddc019a05ef3e79d434bb6ea2f522ecb643a75296e95 +CounterKey = ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000 +K = 54ce8f2275c077e3b1306a3939c5e03eef6bbb88060544758d9fef59b0bc3e4f + +# Test 17 (edge case for public key) +Secret = 68f010d62ee8d926053a361c3a75c6ea4ebdc8606ab285003a6f8f4076b01e83 +CounterKey = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03 +K = f136775c5beb0af8110af10b20372332043cab752419678775a223df57c9d30d + +# Test 18 (edge case for public key) +Secret = 58ebcb35b0f8845caf1ec630f96576b62c4b7b6c36b29deb2cb0084651755c96 +CounterKey = fffffffbfffffbffffdfffffdffffffffefffffefffff7fffff7ffffbfffff3f +K = bf9affd06b844085586460962ef2146ff3d4533d9444aab006eb88cc3054407d + +# Test 19 (edge case for public key) +Secret = 188c4bc5b9c44b38bb658b9b2ae82d5b01015e093184b17cb7863503a783e1bb +CounterKey = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f +K = d480de04f699cb3be0684a9cc2e31281ea0bc5a9dcc157d3d20158d46ca5246d + +# Test 20 (edge case for public key) +Secret = e06c11bb2e13ce3dc7673f67f5482242909423a9ae95ee986a988d98faee23a2 +CounterKey = fffffffffeffff7ffffffffffeffff7ffffffffffeffff7ffffffffffeffff7f +K = 4c4401cce6b51e4cb18f2790246c9bf914db667750a1cb89069092af07292276 + +# Test 21 (edge case for public key) +Secret = c0658c46dde18129293877535b1162b6f9f5414a23cf4d2cbc140a4d99da2b8f +CounterKey = ebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f +K = 578ba8cc2dbdc575afcf9df2b3ee6189f5337d6854c79b4ce165ea12293b3a0f + +# Test 22 (public key with low order) +Secret = 10255c9230a97a30a458ca284a629669293a31890cda9d147febc7d1e22d6bb1 +CounterKey = e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800 +K = 0000000000000000000000000000000000000000000000000000000000000000 + +# Test 23 (public key with low order) +Secret = 78f1e8edf14481b389448dac8f59c70b038e7cf92ef2c7eff57a72466e115296 +CounterKey = 5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f1157 +K = 0000000000000000000000000000000000000000000000000000000000000000 + +# Test 24 (public key with low order) +Secret = a0a05a3e8f9f44204d5f8059a94ac7dfc39a49ac016dd743dbfa43c5d671fd88 +CounterKey = ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f +K = 0000000000000000000000000000000000000000000000000000000000000000 + +# Test 25 (public key with low order) +Secret = d0dbb3ed1906663f15420af31f4eaf6509d9a9949723500605ad7c1c6e7450a9 +CounterKey = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f +K = 0000000000000000000000000000000000000000000000000000000000000000 + +# Test 26 (public key with low order) +Secret = c0b1d0eb22b244fe3291140072cdd9d989b5f0ecd96c100feb5bca241c1d9f8f +CounterKey = eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f +K = 0000000000000000000000000000000000000000000000000000000000000000 + +# Test 27 (public key with low order) +Secret = 480bf45f594942a8bc0f3353c6e8b8853d77f351f1c2ca6c2d1abf8a00b4229c +CounterKey = 0000000000000000000000000000000000000000000000000000000000000080 +K = 0000000000000000000000000000000000000000000000000000000000000000 + +# Test 28 (public key with low order) +Secret = 30f993fcf8514fc89bd8db14cd43ba0d4b2530e73c4276a05e1b145d420cedb4 +CounterKey = 0100000000000000000000000000000000000000000000000000000000000080 +K = 0000000000000000000000000000000000000000000000000000000000000000 + +# Test 29 (public key with low order) +Secret = c04974b758380e2a5b5df6eb09bb2f6b3434f982722a8e676d3da251d1b3de83 +CounterKey = e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b880 +K = 0000000000000000000000000000000000000000000000000000000000000000 + +# Test 30 (public key with low order) +Secret = 502a31373db32446842fe5add3e024022ea54f274182afc3d9f1bb3d39534eb5 +CounterKey = 5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f11d7 +K = 0000000000000000000000000000000000000000000000000000000000000000 + +# Test 31 (public key with low order) +Secret = 90fa6417b0e37030fd6e43eff2abaef14c6793117a039cf621318ba90f4e98be +CounterKey = ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +K = 0000000000000000000000000000000000000000000000000000000000000000 + +# Test 32 (public key with low order) +Secret = 78ad3f26027f1c9fdd975a1613b947779bad2cf2b741ade01840885a30bb979c +CounterKey = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +K = 0000000000000000000000000000000000000000000000000000000000000000 + +# Test 33 (public key with low order) +Secret = 98e23de7b1e0926ed9c87e7b14baf55f497a1d7096f93977680e44dc1c7b7b8b +CounterKey = eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +K = 0000000000000000000000000000000000000000000000000000000000000000 + +# Test 34 (public key >= p) +Secret = f01e48dafac9d7bcf589cbc382c878d18bda3550589ffb5d50b523bebe329dae +CounterKey = efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f +K = bd36a0790eb883098c988b21786773de0b3a4df162282cf110de18dd484ce74b + +# Test 35 (public key >= p) +Secret = 288796bc5aff4b81a37501757bc0753a3c21964790d38699308debc17a6eaf8d +CounterKey = f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f +K = b4e0dd76da7b071728b61f856771aa356e57eda78a5b1655cc3820fb5f854c5c + +# Test 36 (public key >= p) +Secret = 98df845f6651bf1138221f119041f72b6dbc3c4ace7143d99fd55ad867480da8 +CounterKey = f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f +K = 6fdf6c37611dbd5304dc0f2eb7c9517eb3c50e12fd050ac6dec27071d4bfc034 + +# Test 37 (public key >= p) +Secret = f09498e46f02f878829e78b803d316a2ed695d0498a08abdf8276930e24edcb0 +CounterKey = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f +K = 4c8fc4b1c6ab88fb21f18f6d4c810240d4e94651ba44f7a2c863cec7dc56602d + +# Test 38 (public key >= p) +Secret = 1813c10a5c7f21f96e17f288c0cc37607c04c5f5aea2db134f9e2ffc66bd9db8 +CounterKey = 0200000000000000000000000000000000000000000000000000000000000080 +K = 1cd0b28267dc541c642d6d7dca44a8b38a63736eef5c4e6501ffbbb1780c033c + +# Test 39 (public key >= p) +Secret = 7857fb808653645a0beb138a64f5f4d733a45ea84c3cda11a9c06f7e7139149e +CounterKey = 0300000000000000000000000000000000000000000000000000000000000080 +K = 8755be01c60a7e825cff3e0e78cb3aa4333861516aa59b1c51a8b2a543dfa822 + +# Test 40 (public key >= p) +Secret = e03aa842e2abc56e81e87b8b9f417b2a1e5913c723eed28d752f8d47a59f498f +CounterKey = 0400000000000000000000000000000000000000000000000000000000000080 +K = 54c9a1ed95e546d27822a360931dda60a1df049da6f904253c0612bbdc087476 + +# Test 41 (public key >= p) +Secret = f8f707b7999b18cb0d6b96124f2045972ca274bfc154ad0c87038c24c6d0d4b2 +CounterKey = daffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +K = cc1f40d743cdc2230e1043daba8b75e810f1fbab7f255269bd9ebb29e6bf494f + +# Test 42 (public key >= p) +Secret = a034f684fa631e1a348118c1ce4c98231f2d9eec9ba5365b4a05d69a785b0796 +CounterKey = dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +K = 54998ee43a5b007bf499f078e736524400a8b5c7e9b9b43771748c7cdf880412 + +# Test 43 (public key >= p) +Secret = 30b6c6a0f2ffa680768f992ba89e152d5bc9893d38c9119be4f767bfab6e0ca5 +CounterKey = dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +K = ead9b38efdd723637934e55ab717a7ae09eb86a21dc36a3feeb88b759e391e09 + +# Test 44 (public key >= p) +Secret = 901b9dcf881e01e027575035d40b43bdc1c5242e030847495b0c7286469b6591 +CounterKey = eaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +K = 602ff40789b54b41805915fe2a6221f07a50ffc2c3fc94cf61f13d7904e88e0e + +# Test 45 (public key >= p) +Secret = 8046677c28fd82c9a1bdb71a1a1a34faba1225e2507fe3f54d10bd5b0d865f8e +CounterKey = ebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +K = e00ae8b143471247ba24f12c885536c3cb981b58e1e56b2baf35c12ae1f79c26 + +# Test 46 (public key >= p) +Secret = 602f7e2f68a846b82cc269b1d48e939886ae54fd636c1fe074d710127d472491 +CounterKey = efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +K = 98cb9b50dd3fc2b0d4f2d2bf7c5cfdd10c8fcd31fc40af1ad44f47c131376362 + +# Test 47 (public key >= p) +Secret = 60887b3dc72443026ebedbbbb70665f42b87add1440e7768fbd7e8e2ce5f639d +CounterKey = f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +K = 38d6304c4a7e6d9f7959334fb5245bd2c754525d4c91db950206926234c1f633 + +# Test 48 (public key >= p) +Secret = 78d31dfa854497d72d8def8a1b7fb006cec2d8c4924647c93814ae56faeda495 +CounterKey = f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +K = 786cd54996f014a5a031ec14db812ed08355061fdb5de680a800ac521f318e23 + +# Test 49 (public key >= p) +Secret = c04c5baefa8302ddded6a4bb957761b4eb97aefa4fc3b8043085f96a5659b3a5 +CounterKey = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +K = 29ae8bc73e9b10a08b4f681c43c3e0ac1a171d31b38f1a48efba29ae639ea134 + +# Test 50 (RFC 7748) +Secret = a046e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449a44 +CounterKey = e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c +K = c3da55379de9c6908e94ea4df28d084f32eccf03491c71f754b4075577a28552 + +# Test 51 (RFC 7748) +Secret = 4866e9d4d1b4673c5ad22691957d6af5c11b6421e0ea01d42ca4169e7918ba4d +CounterKey = e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a413 +K = 95cbde9476e8907d7aade45cb4b873f88b595a68799fa152e6f8f7647aac7957 + +# Test 52 (edge case for shared secret) +Secret = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63 +CounterKey = 0ab4e76380d84dde4f6833c58f2a9fb8f83bb0169b172be4b6e0592887741a36 +K = 0200000000000000000000000000000000000000000000000000000000000000 + +# Test 53 (edge case for shared secret) +Secret = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63 +CounterKey = 89e10d5701b4337d2d032181538b1064bd4084401ceca1fd12663a1959388000 +K = 0900000000000000000000000000000000000000000000000000000000000000 + +# Test 54 (edge case for shared secret) +Secret = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63 +CounterKey = 2b55d3aa4a8f80c8c0b2ae5f933e85af49beac36c2fa7394bab76c8933f8f81d +K = 1000000000000000000000000000000000000000000000000000000000000000 + +# Test 55 (edge case for shared secret) +Secret = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63 +CounterKey = 63e5b1fe9601fe84385d8866b0421262f78fbfa5aff9585e626679b18547d959 +K = feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f + +# Test 56 (edge case for shared secret) +Secret = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63 +CounterKey = e428f3dac17809f827a522ce32355058d07369364aa78902ee10139b9f9dd653 +K = fcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f + +# Test 57 (edge case for shared secret) +Secret = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63 +CounterKey = b3b50e3ed3a407b95de942ef74575b5ab8a10c09ee103544d60bdfed8138ab2b +K = f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f + +# Test 58 (edge case for shared secret) +Secret = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63 +CounterKey = 213fffe93d5ea8cd242e462844029922c43c77c9e3e42f562f485d24c501a20b +K = f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f + +# Test 59 (edge case for shared secret) +Secret = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63 +CounterKey = 91b232a178b3cd530932441e6139418f72172292f1da4c1834fc5ebfefb51e3f +K = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03 + +# Test 60 (edge case for shared secret) +Secret = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63 +CounterKey = 045c6e11c5d332556c7822fe94ebf89b56a3878dc27ca079103058849fabcb4f +K = e5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f + +# Test 61 (edge case for shared secret) +Secret = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63 +CounterKey = 1ca2190b71163539063c35773bda0c9c928e9136f0620aeb093f099197b7f74e +K = e3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f + +# Test 62 (edge case for shared secret) +Secret = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63 +CounterKey = f76e9010ac33c5043b2d3b76a842171000c4916222e9e85897a0aec7f6350b3c +K = ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f + +# Test 63 (edge case for shared secret) +Secret = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63 +CounterKey = bb72688d8f8aa7a39cd6060cd5c8093cdec6fe341937c3886a99346cd07faa55 +K = dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f + +# Test 64 (edge case for shared secret) +Secret = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63 +CounterKey = 88fddea193391c6a5933ef9b71901549447205aae9da928a6b91a352ba10f41f +K = 0000000000000000000000000000000000000000000000000000000000000002 + +# Test 65 (edge case for shared secret) +Secret = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63 +CounterKey = 303b392f153116cad9cc682a00ccc44c95ff0d3bbe568beb6c4e739bafdc2c68 +K = 0000000000000000000000000000000000000000000000000000000000008000 + +# Test 66 (checking for overflow) +Secret = c81724704000b26d31703cc97e3a378d56fad8219361c88cca8bd7c5719b12b2 +CounterKey = fd300aeb40e1fa582518412b49b208a7842b1e1f056a040178ea4141534f652d +K = b734105dc257585d73b566ccb76f062795ccbec89128e52b02f3e59639f13c46 + +# Test 67 (checking for overflow) +Secret = c81724704000b26d31703cc97e3a378d56fad8219361c88cca8bd7c5719b12b2 +CounterKey = c8ef79b514d7682677bc7931e06ee5c27c9b392b4ae9484473f554e6678ecc2e +K = 647a46b6fc3f40d62141ee3cee706b4d7a9271593a7b143e8e2e2279883e4550 + +# Test 68 (checking for overflow) +Secret = c81724704000b26d31703cc97e3a378d56fad8219361c88cca8bd7c5719b12b2 +CounterKey = 64aeac2504144861532b7bbcb6c87d67dd4c1f07ebc2e06effb95aecc6170b2c +K = 4ff03d5fb43cd8657a3cf37c138cadcecce509e4eba089d0ef40b4e4fb946155 + +# Test 69 (checking for overflow) +Secret = c81724704000b26d31703cc97e3a378d56fad8219361c88cca8bd7c5719b12b2 +CounterKey = bf68e35e9bdb7eee1b50570221860f5dcdad8acbab031b14974cc49013c49831 +K = 21cee52efdbc812e1d021a4af1e1d8bc4db3c400e4d2a2c56a3926db4d99c65b + +# Test 70 (checking for overflow) +Secret = c81724704000b26d31703cc97e3a378d56fad8219361c88cca8bd7c5719b12b2 +CounterKey = 5347c491331a64b43ddc683034e677f53dc32b52a52a577c15a83bf298e99f19 +K = 18cb89e4e20c0c2bd324305245266c9327690bbe79acb88f5b8fb3f74eca3e52 + +# Test 71 (private key == -1 (mod order)) +Secret = a023cdd083ef5bb82f10d62e59e15a6800000000000000000000000000000050 +CounterKey = 258e04523b8d253ee65719fc6906c657192d80717edc828fa0af21686e2faa75 +K = 258e04523b8d253ee65719fc6906c657192d80717edc828fa0af21686e2faa75 + +# Test 72 (private key == 1 (mod order) on twist) +Secret = 58083dd261ad91eff952322ec824c682ffffffffffffffffffffffffffffff5f +CounterKey = 2eae5ec3dd494e9f2d37d258f873a8e6e9d0dbd1e383ef64d98bb91b3e0be035 +K = 2eae5ec3dd494e9f2d37d258f873a8e6e9d0dbd1e383ef64d98bb91b3e0be035 + diff --git a/src/tests/test_c25519.cpp b/src/tests/test_c25519.cpp index 9fa1a955b00..88352f7ceb0 100644 --- a/src/tests/test_c25519.cpp +++ b/src/tests/test_c25519.cpp @@ -41,6 +41,34 @@ class Curve25519_Sclarmult_Tests final : public Text_Based_Test }; BOTAN_REGISTER_TEST("curve25519_scalar", Curve25519_Sclarmult_Tests); +class Curve25519_Agreement_Tests final : public PK_Key_Agreement_Test + { + public: + Curve25519_Agreement_Tests() : PK_Key_Agreement_Test( + "X25519", + "pubkey/x25519.vec", + "Secret,CounterKey,K") {} + + std::string default_kdf(const VarMap&) const override + { + return "Raw"; + } + + std::unique_ptr load_our_key(const std::string&, + const VarMap& vars) override + { + const std::vector secret_vec = vars.get_req_bin("Secret"); + Botan::secure_vector secret(secret_vec.begin(), secret_vec.end()); + return std::unique_ptr(new Botan::Curve25519_PrivateKey(secret)); + } + + std::vector load_their_key(const std::string&, const VarMap& vars) override + { + return vars.get_req_bin("CounterKey"); + } + }; +BOTAN_REGISTER_TEST("curve25519_agreement", Curve25519_Agreement_Tests); + class Curve25519_Roundtrip_Test final : public Test { public: diff --git a/src/tests/test_ed25519.cpp b/src/tests/test_ed25519.cpp index 05a5ce30c3e..2aaed1c463b 100644 --- a/src/tests/test_ed25519.cpp +++ b/src/tests/test_ed25519.cpp @@ -28,6 +28,11 @@ class Ed25519_Verification_Tests : public PK_Signature_Verification_Test "pubkey/ed25519_verify.vec", "Pubkey,Msg,Signature", "Valid") {} + bool clear_between_callbacks() const override + { + return false; + } + std::unique_ptr load_public_key(const VarMap& vars) override { const std::vector pubkey = vars.get_req_bin("Pubkey"); @@ -47,6 +52,11 @@ class Ed25519_Signature_Tests final : public PK_Signature_Generation_Test "pubkey/ed25519.vec", "Privkey,Pubkey,Msg,Signature") {} + bool clear_between_callbacks() const override + { + return false; + } + std::unique_ptr load_private_key(const VarMap& vars) override { const std::vector privkey = vars.get_req_bin("Privkey"); From 607b0315446f6af175ba68cd6a90a1090f90feda Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Fri, 1 Jun 2018 13:10:36 -0400 Subject: [PATCH 154/174] Remove stray header in vector file [ci skip] --- src/tests/data/keywrap/nist_key_wrap.vec | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/tests/data/keywrap/nist_key_wrap.vec b/src/tests/data/keywrap/nist_key_wrap.vec index 5846ce0e9d1..20d837dae7c 100644 --- a/src/tests/data/keywrap/nist_key_wrap.vec +++ b/src/tests/data/keywrap/nist_key_wrap.vec @@ -546,5 +546,3 @@ Output = 0321201DA921361D45A6F9BF613CE15316945C2C3D52D9DDB2D6FA33549CFC4C0837FEB Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E Output = AF2187578A2495DB2A746058D04E2902C83134D727E750C37681015921A852D1E796D2B6D352C86A1F31B891C7EF5A7BB03CF2D61C941D6DC51F5DEDA91C512921E631C8287175EF9D49365F86B4D27160B0CDCC7755E1C60E52C60579014BD705BFEA6323CED9F4072A06CA00BD8A57F69BB87966CC34811DADAA52CC92823AC5DB2AFBA20369D8 - -[KWP.INVALID] From da70cf93ee0cc5971fc0cb2fba1ef58d105f9e98 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 4 Jun 2018 20:50:39 -0400 Subject: [PATCH 155/174] Correct exception message [ci skip] The previous message was both incorrect and very misleading. --- src/lib/pubkey/pubkey.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/pubkey/pubkey.cpp b/src/lib/pubkey/pubkey.cpp index 632514020cb..048fd3130c1 100644 --- a/src/lib/pubkey/pubkey.cpp +++ b/src/lib/pubkey/pubkey.cpp @@ -334,7 +334,7 @@ bool PK_Verifier::check_signature(const uint8_t sig[], size_t length) if(reencoded.size() != length || same_mem(reencoded.data(), sig, reencoded.size()) == false) { - throw Decoding_Error("PK_Verifier: signature is not valid BER"); + throw Decoding_Error("PK_Verifier: signature is not the canonical DER encoding"); } return m_op->is_valid_signature(real_sig.data(), real_sig.size()); From b4cb7786a2d2d9f20686cb270921569751bd1980 Mon Sep 17 00:00:00 2001 From: Daniel Wyatt Date: Mon, 4 Jun 2018 22:55:24 -0400 Subject: [PATCH 156/174] Conditionally use concurrency with sphinx-build. --- src/scripts/build_docs.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/scripts/build_docs.py b/src/scripts/build_docs.py index 3cc59c07c60..9b0e37960d0 100755 --- a/src/scripts/build_docs.py +++ b/src/scripts/build_docs.py @@ -120,6 +120,22 @@ def log_level(): return options +def sphinx_supports_concurrency(): + import re + from distutils.version import StrictVersion + + proc = subprocess.Popen(['sphinx-build', '--version'], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + output, _ = proc.communicate() + if isinstance(output, bytes): + output = output.decode('ascii') + # Sphinx v1.1.3 + # sphinx-build 1.7.4 + match = re.match(r'^(?:[a-zA-Z_-]+) v?(([0-9]+)\.([0-9]+))', output) + # default to using concurrency when uncertain + version = StrictVersion(match.group(1)) if match else StrictVersion('1.2') + return version >= StrictVersion('1.2') def main(args=None): # pylint: disable=too-many-branches,too-many-locals @@ -160,8 +176,9 @@ def main(args=None): if with_sphinx: sphinx_build = ['sphinx-build', - '-c', cfg['sphinx_config_dir'], - '-j', str(get_concurrency())] + '-c', cfg['sphinx_config_dir']] + if sphinx_supports_concurrency(): + sphinx_build += ['-j', str(get_concurrency())] cmds.append(sphinx_build + ['-b', 'html', manual_src, manual_output]) From c0cdcb3164d379851a995cd2b3d51944888d90df Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 5 Jun 2018 17:55:03 -0400 Subject: [PATCH 157/174] Fix a bug in Barrett reduction -x*n % n would reduce to n instead of zero. Also some small optimizations and cleanups. --- src/fuzzer/barrett.cpp | 12 ++++--- src/lib/math/bigint/bigint.h | 7 ++-- src/lib/math/numbertheory/reducer.cpp | 52 +++++++++++++++------------ src/tests/test_bigint.cpp | 4 +++ 4 files changed, 45 insertions(+), 30 deletions(-) diff --git a/src/fuzzer/barrett.cpp b/src/fuzzer/barrett.cpp index 1c5d88f87d0..09aed517e0c 100644 --- a/src/fuzzer/barrett.cpp +++ b/src/fuzzer/barrett.cpp @@ -12,20 +12,24 @@ void fuzz(const uint8_t in[], size_t len) { static const size_t max_bits = 2048; - if(len % 2 != 0) + if(len <= 1 || len % 3 != 1) return; - const size_t part_size = len / 2; + const size_t part_size = len / 3; if(part_size * 8 > max_bits) return; - const Botan::BigInt x = Botan::BigInt::decode(in, part_size); - const Botan::BigInt p = Botan::BigInt::decode(in + part_size, part_size); + uint8_t flags = in[0]; + Botan::BigInt x = Botan::BigInt::decode(in + 1, part_size * 2); + const Botan::BigInt p = Botan::BigInt::decode(in + 1 + part_size * 2, part_size); if(p.is_zero()) return; + if(flags & 1) + x.flip_sign(); + const Botan::BigInt ref = x % p; const Botan::Modular_Reducer mod_p(p); diff --git a/src/lib/math/bigint/bigint.h b/src/lib/math/bigint/bigint.h index 64ab24e7d6a..0b826c8f507 100644 --- a/src/lib/math/bigint/bigint.h +++ b/src/lib/math/bigint/bigint.h @@ -256,6 +256,9 @@ class BOTAN_PUBLIC_API(2,0) BigInt final */ bool operator !() const { return (!is_nonzero()); } + BigInt& add(const word y[], size_t y_words, Sign sign); + BigInt& sub(const word y[], size_t y_words, Sign sign); + /** * Multiply this with y * @param y the BigInt to multiply with this @@ -724,10 +727,6 @@ class BOTAN_PUBLIC_API(2,0) BigInt final size_t idx); private: - - BigInt& add(const word y[], size_t y_words, Sign sign); - BigInt& sub(const word y[], size_t y_words, Sign sign); - secure_vector m_reg; Sign m_signedness = Positive; }; diff --git a/src/lib/math/numbertheory/reducer.cpp b/src/lib/math/numbertheory/reducer.cpp index 9dbcfb9a348..b59a8d989c6 100644 --- a/src/lib/math/numbertheory/reducer.cpp +++ b/src/lib/math/numbertheory/reducer.cpp @@ -1,6 +1,6 @@ /* * Modular Reducer -* (C) 1999-2011 Jack Lloyd +* (C) 1999-2011,2018 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -35,43 +35,51 @@ BigInt Modular_Reducer::reduce(const BigInt& x) const const size_t x_sw = x.sig_words(); - if(x_sw < m_mod_words || x.cmp(m_modulus, false) < 0) + if(x_sw >= (2*m_mod_words - 1) && x.cmp(m_modulus_2, false) >= 0) + { + // too big, fall back to normal division + return (x % m_modulus); + } + + if(x_sw < m_mod_words - 1) { if(x.is_negative()) return x + m_modulus; // make positive return x; } - else if(x.cmp(m_modulus_2, false) < 0) - { - secure_vector ws; - BigInt t1(x.data() + m_mod_words - 1, x_sw - (m_mod_words - 1)); + secure_vector ws; - t1.mul(m_mu, ws); - t1 >>= (BOTAN_MP_WORD_BITS * (m_mod_words + 1)); + BigInt t1(x.data() + (m_mod_words - 1), x_sw - (m_mod_words - 1)); - t1.mul(m_modulus, ws); - t1.mask_bits(BOTAN_MP_WORD_BITS * (m_mod_words + 1)); + t1.mul(m_mu, ws); + t1 >>= (BOTAN_MP_WORD_BITS * (m_mod_words + 1)); - t1.rev_sub(x.data(), std::min(x_sw, m_mod_words + 1), ws); + // TODO add masked mul to avoid computing high bits + t1.mul(m_modulus, ws); + t1.mask_bits(BOTAN_MP_WORD_BITS * (m_mod_words + 1)); - if(t1.is_negative()) - { - t1 += BigInt::power_of_2(BOTAN_MP_WORD_BITS * (m_mod_words + 1)); - } + t1.rev_sub(x.data(), std::min(x_sw, m_mod_words + 1), ws); - t1.reduce_below(m_modulus, ws); + if(t1.is_negative()) + { + if(ws.size() < m_mod_words + 2) + ws.resize(m_mod_words + 2); + clear_mem(ws.data(), ws.size()); - if(x.is_negative()) - t1.rev_sub(m_modulus.data(), m_modulus.size(), ws); + ws[m_mod_words + 1] = 1; - return t1; + t1.add(ws.data(), m_mod_words + 2, BigInt::Positive); } - else + + t1.reduce_below(m_modulus, ws); + + if(x.is_negative() && t1.is_nonzero()) { - // too big, fall back to normal division - return (x % m_modulus); + t1.rev_sub(m_modulus.data(), m_modulus.size(), ws); } + + return t1; } } diff --git a/src/tests/test_bigint.cpp b/src/tests/test_bigint.cpp index b62fa307d9c..8074a4f3b79 100644 --- a/src/tests/test_bigint.cpp +++ b/src/tests/test_bigint.cpp @@ -9,6 +9,7 @@ #if defined(BOTAN_HAS_NUMBERTHEORY) #include #include + #include #include #include #include "test_rng.h" @@ -398,6 +399,9 @@ class BigInt_Mod_Test final : public Text_Based_Test e %= b; result.test_eq("a %= b", e, c); + const Botan::Modular_Reducer mod_b(b); + result.test_eq("Barrett", mod_b.reduce(a), c); + // if b fits into a Botan::word test %= operator for words if(b.bytes() <= sizeof(Botan::word)) { From 9e1af2f012d3cc4bb5bbe965465fbb03be1d7393 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Thu, 7 Jun 2018 17:33:40 -0400 Subject: [PATCH 158/174] Add "info" and "codec" groups for cli commands [ci skip] --- src/cli/asn1.cpp | 2 +- src/cli/utils.cpp | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/cli/asn1.cpp b/src/cli/asn1.cpp index 65f38c06008..45185950c74 100644 --- a/src/cli/asn1.cpp +++ b/src/cli/asn1.cpp @@ -24,7 +24,7 @@ class ASN1_Printer final : public Command std::string group() const override { - return "misc"; + return "codec"; } std::string description() const override diff --git a/src/cli/utils.cpp b/src/cli/utils.cpp index fadeac188c6..f5c914fedfd 100644 --- a/src/cli/utils.cpp +++ b/src/cli/utils.cpp @@ -58,11 +58,13 @@ class Print_Help final : public Command } } - const std::map groups_description - { { "encryption", "Encryption" }, + const std::map groups_description { + { "encryption", "Encryption" }, { "compression", "Compression" }, + { "codec", "Encoders/Decoders" }, { "hash", "Hash Functions" }, { "hmac", "HMAC" }, + { "info", "Informational" }, { "numtheory", "Number Theory" }, { "passhash", "Password Hashing" }, { "psk", "PSK Database" }, @@ -132,7 +134,7 @@ class Config_Info final : public Command std::string group() const override { - return "misc"; + return "info"; } std::string description() const override @@ -178,7 +180,7 @@ class Version_Info final : public Command std::string group() const override { - return "misc"; + return "info"; } std::string description() const override @@ -208,7 +210,7 @@ class Print_Cpuid final : public Command std::string group() const override { - return "misc"; + return "info"; } std::string description() const override @@ -362,7 +364,7 @@ class Hex_Encode final : public Command std::string group() const override { - return "misc"; + return "codec"; } std::string description() const override @@ -386,7 +388,7 @@ class Hex_Decode final : public Command std::string group() const override { - return "misc"; + return "codec"; } std::string description() const override @@ -419,7 +421,7 @@ class Base64_Encode final : public Command std::string group() const override { - return "misc"; + return "codec"; } std::string description() const override @@ -446,7 +448,7 @@ class Base64_Decode final : public Command std::string group() const override { - return "misc"; + return "codec"; } std::string description() const override From e9f5de44dc0cb8045fef8c3f9bf89162b684aa97 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Fri, 8 Jun 2018 04:10:04 -0400 Subject: [PATCH 159/174] Doc tweaks [ci skip] --- doc/manual/cipher_modes.rst | 2 ++ doc/manual/hash.rst | 3 ++- readme.rst | 22 ++-------------------- 3 files changed, 6 insertions(+), 21 deletions(-) diff --git a/doc/manual/cipher_modes.rst b/doc/manual/cipher_modes.rst index ca53a6ab52c..e7a147d2538 100644 --- a/doc/manual/cipher_modes.rst +++ b/doc/manual/cipher_modes.rst @@ -250,6 +250,8 @@ will be returned by :cpp:func:`get_cipher` if the named cipher is an AEAD mode). Available AEAD Modes ------------------------- +If in doubt about what to use, pick ChaCha20Poly1305, AES-256/GCM, or AES-256/SIV. + ChaCha20Poly1305 ~~~~~~~~~~~~~~~~~~ diff --git a/doc/manual/hash.rst b/doc/manual/hash.rst index 7b317f4987f..d8463cc2ecf 100644 --- a/doc/manual/hash.rst +++ b/doc/manual/hash.rst @@ -98,7 +98,8 @@ Assume we want to calculate the SHA-1, Whirlpool and SHA-3 hash digests of the S Available Hash Functions ------------------------------ -The following cryptographic hash functions are implemented. +The following cryptographic hash functions are implemented. If in doubt, +any of Blake2b, SHA-384, or SHA-3 are good choices. BLAKE2b ^^^^^^^^^ diff --git a/readme.rst b/readme.rst index 394f06c525b..084da5cd389 100644 --- a/readme.rst +++ b/readme.rst @@ -37,14 +37,10 @@ https://keybase.io/jacklloyd, and some public PGP key servers. For all the details on building the library, read the `users manual `_, but basically:: - $ ./configure.py --help - $ ./configure.py [probably some options] + $ ./configure.py $ make $ ./botan-test - # lots of output... - Tests all ok - $ ./botan - # shows available commands + ... $ make install Botan can also be built into a single-file amalgamation for easy inclusion into @@ -185,17 +181,3 @@ Other Useful Things * Format preserving encryption scheme FE1 * Threshold secret sharing * NIST key wrapping - -Recommended Algorithms ----------------------------------------- - -* For encryption of network traffic use TLS v1.2 -* Packet encryption: AES-256/GCM, AES-256/OCB, Serpent/OCB, or ChaCha20Poly1305 -* General hash function: BLAKE2b, SHA-2, SHA-3, or Skein-512 -* Message authentication or PRF: HMAC with SHA-256 -* Key derivation function: KDF2 or HKDF -* Public Key Encryption: RSA, 2048+ bit keys, with OAEP/SHA-256 -* Public Key Signatures: RSA, 2048+ bit keys with PSS/SHA-512, - or ECDSA using P-256/SHA-256 or P-521/SHA-512 -* Key Agreement: ECDH using P-256 or X25519. If you are concerned - about quantum computers, combine ECC with NewHope. From 4407dabb4e95488851323d134d60f893729795c3 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Fri, 8 Jun 2018 05:28:02 -0400 Subject: [PATCH 160/174] Improve error reporting on unexpected EOF when decoding ASN --- src/lib/asn1/asn1_obj.cpp | 21 +++++++++++++++++---- src/tests/data/x509/bsi/expected.txt | 2 +- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/lib/asn1/asn1_obj.cpp b/src/lib/asn1/asn1_obj.cpp index 987c89d964b..815bc4ef830 100644 --- a/src/lib/asn1/asn1_obj.cpp +++ b/src/lib/asn1/asn1_obj.cpp @@ -33,16 +33,24 @@ void BER_Object::assert_is_a(ASN1_Tag type_tag_, ASN1_Tag class_tag_, msg << "Tag mismatch when decoding " << descr << " got "; - if(class_tag == UNIVERSAL || class_tag == CONSTRUCTED) + if(class_tag == NO_OBJECT && type_tag == NO_OBJECT) { - msg << asn1_tag_to_string(type_tag); + msg << "EOF"; } else { - msg << std::to_string(type_tag); + if(class_tag == UNIVERSAL || class_tag == CONSTRUCTED) + { + msg << asn1_tag_to_string(type_tag); + } + else + { + msg << std::to_string(type_tag); + } + + msg << "/" << asn1_class_to_string(class_tag); } - msg << "/" << asn1_class_to_string(class_tag); msg << " expected "; if(class_tag_ == UNIVERSAL || class_tag_ == CONSTRUCTED) @@ -90,6 +98,8 @@ std::string asn1_class_to_string(ASN1_Tag type) return "APPLICATION"; case CONSTRUCTED | CONTEXT_SPECIFIC: return "PRIVATE"; + case Botan::NO_OBJECT: + return "NO_OBJECT"; default: return "CLASS(" + std::to_string(static_cast(type)) + ")"; } @@ -153,6 +163,9 @@ std::string asn1_tag_to_string(ASN1_Tag type) case Botan::BOOLEAN: return "BOOLEAN"; + case Botan::NO_OBJECT: + return "NO_OBJECT"; + default: return "TAG(" + std::to_string(static_cast(type)) + ")"; } diff --git a/src/tests/data/x509/bsi/expected.txt b/src/tests/data/x509/bsi/expected.txt index 7abee2dd772..e47f978b127 100644 --- a/src/tests/data/x509/bsi/expected.txt +++ b/src/tests/data/x509/bsi/expected.txt @@ -28,7 +28,7 @@ cert_path_CRL_10$Certificate is revoked cert_path_CRL_11$Certificate is revoked cert_path_CRL_12$No revocation data cert_path_CRL_13$No CRL with matching distribution point for certificate -cert_path_CRL_14$Invalid argument Decoding error: X509 CRL decoding failed: Invalid argument Decoding error: BER: Tag mismatch when decoding object got 65280/CLASS(65280) expected BIT STRING/UNIVERSAL +cert_path_CRL_14$Invalid argument Decoding error: X509 CRL decoding failed: Invalid argument Decoding error: BER: Tag mismatch when decoding object got EOF expected BIT STRING/UNIVERSAL cert_path_CRL_15$No CRL with matching distribution point for certificate cert_path_CRL_16$Certificate is revoked cert_path_crypt_01$Signature error From 4c3eb886c69041922aeaabcb57e3ff0602d5bbc5 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Fri, 8 Jun 2018 05:28:32 -0400 Subject: [PATCH 161/174] Constify some local variables --- src/lib/utils/data_src.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/utils/data_src.cpp b/src/lib/utils/data_src.cpp index d99f9c97f74..c5689534ffb 100644 --- a/src/lib/utils/data_src.cpp +++ b/src/lib/utils/data_src.cpp @@ -59,7 +59,7 @@ size_t DataSource::discard_next(size_t n) */ size_t DataSource_Memory::read(uint8_t out[], size_t length) { - size_t got = std::min(m_source.size() - m_offset, length); + const size_t got = std::min(m_source.size() - m_offset, length); copy_mem(out, m_source.data() + m_offset, got); m_offset += got; return got; @@ -79,7 +79,7 @@ size_t DataSource_Memory::peek(uint8_t out[], size_t length, const size_t bytes_left = m_source.size() - m_offset; if(peek_offset >= bytes_left) return 0; - size_t got = std::min(bytes_left - peek_offset, length); + const size_t got = std::min(bytes_left - peek_offset, length); copy_mem(out, &m_source[m_offset + peek_offset], got); return got; } From e57a7a00a172cadce319714c1a5110c3360a8abc Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Fri, 8 Jun 2018 05:28:53 -0400 Subject: [PATCH 162/174] Declare copy and move constructors on BER_Object --- src/lib/asn1/asn1_obj.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lib/asn1/asn1_obj.h b/src/lib/asn1/asn1_obj.h index 7ae694977ae..f69c624add2 100644 --- a/src/lib/asn1/asn1_obj.h +++ b/src/lib/asn1/asn1_obj.h @@ -98,6 +98,14 @@ class BOTAN_PUBLIC_API(2,0) BER_Object final public: BER_Object() : type_tag(NO_OBJECT), class_tag(UNIVERSAL) {} + BER_Object(const BER_Object& other) = default; + + BER_Object(BER_Object&& other) = default; + + BER_Object& operator=(const BER_Object& other) = default; + + BER_Object& operator=(BER_Object&& other) = default; + bool is_set() const { return type_tag != NO_OBJECT; } ASN1_Tag tagging() const { return ASN1_Tag(type() | get_class()); } From d507c1fa99f881ff7f21a289f4efa2b64f4f9c4b Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Fri, 8 Jun 2018 05:29:23 -0400 Subject: [PATCH 163/174] Allow passing a writer function callback to DER_Encoder --- src/lib/asn1/der_enc.cpp | 18 +++++++++--------- src/lib/asn1/der_enc.h | 10 +++++++++- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/lib/asn1/der_enc.cpp b/src/lib/asn1/der_enc.cpp index c1ec010a04e..99b833d27d6 100644 --- a/src/lib/asn1/der_enc.cpp +++ b/src/lib/asn1/der_enc.cpp @@ -68,7 +68,7 @@ void encode_length(std::vector& encoded_length, size_t length) DER_Encoder::DER_Encoder(secure_vector& vec) { - m_append_output_fn = [&vec](const uint8_t b[], size_t l) + m_append_output = [&vec](const uint8_t b[], size_t l) { vec.insert(vec.end(), b, b + l); }; @@ -76,7 +76,7 @@ DER_Encoder::DER_Encoder(secure_vector& vec) DER_Encoder::DER_Encoder(std::vector& vec) { - m_append_output_fn = [&vec](const uint8_t b[], size_t l) + m_append_output = [&vec](const uint8_t b[], size_t l) { vec.insert(vec.end(), b, b + l); }; @@ -154,7 +154,7 @@ secure_vector DER_Encoder::get_contents() if(m_subsequences.size() != 0) throw Invalid_State("DER_Encoder: Sequence hasn't been marked done"); - if(m_append_output_fn) + if(m_append_output) throw Invalid_State("DER_Encoder Cannot get contents when using output vector"); secure_vector output; @@ -167,7 +167,7 @@ std::vector DER_Encoder::get_contents_unlocked() if(m_subsequences.size() != 0) throw Invalid_State("DER_Encoder: Sequence hasn't been marked done"); - if(m_append_output_fn) + if(m_append_output) throw Invalid_State("DER_Encoder Cannot get contents when using output vector"); std::vector output(m_default_outbuf.begin(), m_default_outbuf.end()); @@ -231,9 +231,9 @@ DER_Encoder& DER_Encoder::raw_bytes(const uint8_t bytes[], size_t length) { m_subsequences[m_subsequences.size()-1].add_bytes(bytes, length); } - else if(m_append_output_fn) + else if(m_append_output) { - m_append_output_fn(bytes, length); + m_append_output(bytes, length); } else { @@ -257,10 +257,10 @@ DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, { m_subsequences[m_subsequences.size()-1].add_bytes(hdr.data(), hdr.size(), rep, length); } - else if(m_append_output_fn) + else if(m_append_output) { - m_append_output_fn(hdr.data(), hdr.size()); - m_append_output_fn(rep, length); + m_append_output(hdr.data(), hdr.size()); + m_append_output(rep, length); } else { diff --git a/src/lib/asn1/der_enc.h b/src/lib/asn1/der_enc.h index f351817f91e..135a70d074f 100644 --- a/src/lib/asn1/der_enc.h +++ b/src/lib/asn1/der_enc.h @@ -23,6 +23,8 @@ class ASN1_Object; class BOTAN_PUBLIC_API(2,0) DER_Encoder final { public: + typedef std::function append_fn; + /** * DER encode, writing to an internal buffer * Use get_contents or get_contents_unlocked to read the results @@ -42,6 +44,12 @@ class BOTAN_PUBLIC_API(2,0) DER_Encoder final */ DER_Encoder(std::vector& vec); + /** + * DER encode, calling append to write output + * If this constructor is used, get_contents* may not be called. + */ + DER_Encoder(append_fn append) : m_append_output(append) {} + secure_vector get_contents(); std::vector get_contents_unlocked(); @@ -203,7 +211,7 @@ class BOTAN_PUBLIC_API(2,0) DER_Encoder final std::vector< secure_vector > m_set_contents; }; - std::function m_append_output_fn; + append_fn m_append_output; secure_vector m_default_outbuf; std::vector m_subsequences; }; From 2559c80b098cec1bfcb30be1ca976f595aaf1fd6 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Fri, 8 Jun 2018 05:47:56 -0400 Subject: [PATCH 164/174] Reduce copying/allocations when BER decoding We are constrained in how far we can go because BER_Object must mandatorily copy its value (due to the public member variable exposting the bytes). But this reduces the number of allocations when parsing a sample X.509 certificate by about 15% --- src/lib/asn1/ber_dec.cpp | 111 ++++++++++++++------------ src/lib/asn1/ber_dec.h | 164 +++++++++++++++++++++++++++++++-------- 2 files changed, 194 insertions(+), 81 deletions(-) diff --git a/src/lib/asn1/ber_dec.cpp b/src/lib/asn1/ber_dec.cpp index 35f1a53b5bd..313e7fd150c 100644 --- a/src/lib/asn1/ber_dec.cpp +++ b/src/lib/asn1/ber_dec.cpp @@ -1,6 +1,6 @@ /* * BER Decoder -* (C) 1999-2008,2015,2017 Jack Lloyd +* (C) 1999-2008,2015,2017,2018 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -145,6 +145,51 @@ size_t find_eoc(DataSource* ber, size_t allow_indef) return length; } +class DataSource_BERObject final : public DataSource + { + public: + size_t read(uint8_t out[], size_t length) override + { + BOTAN_ASSERT_NOMSG(m_offset <= m_obj.length()); + const size_t got = std::min(m_obj.length() - m_offset, length); + copy_mem(out, m_obj.bits() + m_offset, got); + m_offset += got; + return got; + } + + size_t peek(uint8_t out[], size_t length, size_t peek_offset) const override + { + BOTAN_ASSERT_NOMSG(m_offset <= m_obj.length()); + const size_t bytes_left = m_obj.length() - m_offset; + + if(peek_offset >= bytes_left) + return 0; + + const size_t got = std::min(bytes_left - peek_offset, length); + copy_mem(out, m_obj.bits() + peek_offset, got); + return got; + } + + bool check_available(size_t n) override + { + BOTAN_ASSERT_NOMSG(m_offset <= m_obj.length()); + return (n <= (m_obj.length() - m_offset)); + } + + bool end_of_data() const override + { + return get_bytes_read() == m_obj.length(); + } + + size_t get_bytes_read() const override { return m_offset; } + + explicit DataSource_BERObject(BER_Object&& obj) : m_obj(std::move(obj)), m_offset(0) {} + + private: + BER_Object m_obj; + size_t m_offset; + }; + } /* @@ -225,12 +270,6 @@ BER_Object BER_Decoder::get_next_object() return next; } -BER_Decoder& BER_Decoder::get_next(BER_Object& ber) - { - ber = get_next_object(); - return (*this); - } - /* * Push a object back into the stream */ @@ -241,18 +280,18 @@ void BER_Decoder::push_back(const BER_Object& obj) m_pushed = obj; } -/* -* Begin decoding a CONSTRUCTED type -*/ -BER_Decoder BER_Decoder::start_cons(ASN1_Tag type_tag, - ASN1_Tag class_tag) +void BER_Decoder::push_back(BER_Object&& obj) + { + if(m_pushed.is_set()) + throw Invalid_State("BER_Decoder: Only one push back is allowed"); + m_pushed = std::move(obj); + } + +BER_Decoder BER_Decoder::start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag) { BER_Object obj = get_next_object(); obj.assert_is_a(type_tag, ASN1_Tag(class_tag | CONSTRUCTED)); - - BER_Decoder result(obj.bits(), obj.length()); - result.m_parent = this; - return result; + return BER_Decoder(std::move(obj), this); } /* @@ -261,14 +300,17 @@ BER_Decoder BER_Decoder::start_cons(ASN1_Tag type_tag, BER_Decoder& BER_Decoder::end_cons() { if(!m_parent) - throw Invalid_State("BER_Decoder::end_cons called with NULL parent"); + throw Invalid_State("BER_Decoder::end_cons called with null parent"); if(!m_source->end_of_data()) throw Decoding_Error("BER_Decoder::end_cons called with data left"); return (*m_parent); } -BER_Decoder::BER_Decoder(const BER_Object& obj) : BER_Decoder(obj.bits(), obj.length()) +BER_Decoder::BER_Decoder(BER_Object&& obj, BER_Decoder* parent) { + m_data_src.reset(new DataSource_BERObject(std::move(obj))); + m_source = m_data_src.get(); + m_parent = parent; } /* @@ -340,30 +382,6 @@ BER_Decoder& BER_Decoder::decode_null() return (*this); } -/* -* Decode a BER encoded BOOLEAN -*/ -BER_Decoder& BER_Decoder::decode(bool& out) - { - return decode(out, BOOLEAN, UNIVERSAL); - } - -/* -* Decode a small BER encoded INTEGER -*/ -BER_Decoder& BER_Decoder::decode(size_t& out) - { - return decode(out, INTEGER, UNIVERSAL); - } - -/* -* Decode a BER encoded INTEGER -*/ -BER_Decoder& BER_Decoder::decode(BigInt& out) - { - return decode(out, INTEGER, UNIVERSAL); - } - BER_Decoder& BER_Decoder::decode_octet_string_bigint(BigInt& out) { secure_vector out_vec; @@ -372,13 +390,6 @@ BER_Decoder& BER_Decoder::decode_octet_string_bigint(BigInt& out) return (*this); } -std::vector BER_Decoder::get_next_octet_string() - { - std::vector out_vec; - decode(out_vec, OCTET_STRING); - return out_vec; - } - /* * Decode a BER encoded BOOLEAN */ @@ -405,6 +416,8 @@ BER_Decoder& BER_Decoder::decode(size_t& out, BigInt integer; decode(integer, type_tag, class_tag); + if(integer.is_negative()) + if(integer.bits() > 32) throw BER_Decoding_Error("Decoded integer value larger than expected"); diff --git a/src/lib/asn1/ber_dec.h b/src/lib/asn1/ber_dec.h index d454c45d65b..2086eacd386 100644 --- a/src/lib/asn1/ber_dec.h +++ b/src/lib/asn1/ber_dec.h @@ -1,6 +1,6 @@ /* * BER Decoder -* (C) 1999-2010 Jack Lloyd +* (C) 1999-2010,2018 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -13,28 +13,103 @@ namespace Botan { +class BigInt; + /** * BER Decoding Object */ class BOTAN_PUBLIC_API(2,0) BER_Decoder final { public: + /** + * Set up to BER decode the data in buf of length len + */ + BER_Decoder(const uint8_t buf[], size_t len); + + /** + * Set up to BER decode the data in vec + */ + explicit BER_Decoder(const secure_vector& vec); + + /** + * Set up to BER decode the data in vec + */ + explicit BER_Decoder(const std::vector& vec); + + /** + * Set up to BER decode the data in src + */ + explicit BER_Decoder(DataSource& src); + + /** + * Set up to BER decode the data in obj + */ + BER_Decoder(const BER_Object& obj) : + BER_Decoder(obj.bits(), obj.length()) {} + + BER_Decoder(const BER_Decoder& other); + + BER_Decoder& operator=(const BER_Decoder&) = delete; + + /** + * Get the next object in the data stream. + * If EOF, returns an object with type NO_OBJECT. + */ BER_Object get_next_object(); - std::vector get_next_octet_string(); + BER_Decoder& get_next(BER_Object& ber) + { + ber = get_next_object(); + return (*this); + } + /** + * Push an object back onto the stream. Throws if another + * object was previously pushed and has not been subsequently + * read out. + */ void push_back(const BER_Object& obj); + /** + * Push an object back onto the stream. Throws if another + * object was previously pushed and has not been subsequently + * read out. + */ + void push_back(BER_Object&& obj); + + /** + * Return true if there is at least one more item remaining + */ bool more_items() const; + + /** + * Verify the stream is concluded, throws otherwise. + * Returns (*this) + */ BER_Decoder& verify_end(); + + /** + * Verify the stream is concluded, throws otherwise. + * Returns (*this) + */ BER_Decoder& verify_end(const std::string& err_msg); + /** + * Discard any data that remains unread + * Returns (*this) + */ BER_Decoder& discard_remaining(); - BER_Decoder start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag = UNIVERSAL); - BER_Decoder& end_cons(); + /** + * Start decoding a constructed data (sequence or set) + */ + BER_Decoder start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag = UNIVERSAL); - BER_Decoder& get_next(BER_Object& ber); + /** + * Finish decoding a constructed data, throws if any data remains. + * Returns the parent of *this (ie the object on which start_cons was called). + */ + BER_Decoder& end_cons(); /** * Get next object and copy value to POD type @@ -82,9 +157,37 @@ class BOTAN_PUBLIC_API(2,0) BER_Decoder final } BER_Decoder& decode_null(); - BER_Decoder& decode(bool& v); - BER_Decoder& decode(size_t& v); - BER_Decoder& decode(class BigInt& v); + + /** + * Decode a BER encoded BOOLEAN + */ + BER_Decoder& decode(bool& out) + { + return decode(out, BOOLEAN, UNIVERSAL); + } + + /* + * Decode a small BER encoded INTEGER + */ + BER_Decoder& decode(size_t& out) + { + return decode(out, INTEGER, UNIVERSAL); + } + + /* + * Decode a BER encoded INTEGER + */ + BER_Decoder& decode(BigInt& out) + { + return decode(out, INTEGER, UNIVERSAL); + } + + std::vector get_next_octet_string() + { + std::vector out_vec; + decode(out_vec, OCTET_STRING); + return out_vec; + } /* * BER decode a BIT STRING or OCTET STRING @@ -103,7 +206,7 @@ class BOTAN_PUBLIC_API(2,0) BER_Decoder final ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); - BER_Decoder& decode(class BigInt& v, + BER_Decoder& decode(BigInt& v, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); @@ -121,11 +224,14 @@ class BOTAN_PUBLIC_API(2,0) BER_Decoder final ASN1_Tag type_tag = NO_OBJECT, ASN1_Tag class_tag = NO_OBJECT); - BER_Decoder& decode_octet_string_bigint(class BigInt& b); + /** + * Decode an integer value which is typed as an octet string + */ + BER_Decoder& decode_octet_string_bigint(BigInt& b); uint64_t decode_constrained_integer(ASN1_Tag type_tag, - ASN1_Tag class_tag, - size_t T_bytes); + ASN1_Tag class_tag, + size_t T_bytes); template BER_Decoder& decode_integer_type(T& out) { @@ -190,36 +296,27 @@ class BOTAN_PUBLIC_API(2,0) BER_Decoder final if(obj.is_a(type_tag, class_tag)) { if((class_tag & CONSTRUCTED) && (class_tag & CONTEXT_SPECIFIC)) + { BER_Decoder(obj).decode(out, real_type).verify_end(); + } else { - push_back(obj); + push_back(std::move(obj)); decode(out, real_type, type_tag, class_tag); } } else { out.clear(); - push_back(obj); + push_back(std::move(obj)); } return (*this); } - BER_Decoder& operator=(const BER_Decoder&) = delete; - - explicit BER_Decoder(DataSource&); - - BER_Decoder(const uint8_t[], size_t); - - explicit BER_Decoder(const BER_Object& obj); - - explicit BER_Decoder(const secure_vector&); - - explicit BER_Decoder(const std::vector& vec); - - BER_Decoder(const BER_Decoder&); private: + BER_Decoder(BER_Object&& obj, BER_Decoder* parent); + BER_Decoder* m_parent = nullptr; BER_Object m_pushed; // either m_data_src.get() or an unowned pointer @@ -241,17 +338,19 @@ BER_Decoder& BER_Decoder::decode_optional(T& out, if(obj.is_a(type_tag, class_tag)) { if((class_tag & CONSTRUCTED) && (class_tag & CONTEXT_SPECIFIC)) + { BER_Decoder(obj).decode(out).verify_end(); + } else { - push_back(obj); + push_back(std::move(obj)); decode(out, type_tag, class_tag); } } else { out = default_value; - push_back(obj); + push_back(std::move(obj)); } return (*this); @@ -274,13 +373,14 @@ BER_Decoder& BER_Decoder::decode_optional_implicit( if(obj.is_a(type_tag, class_tag)) { obj.set_tagging(real_type, real_class); - push_back(obj); + push_back(std::move(obj)); decode(out, real_type, real_class); } else { + // Not what we wanted, push it back on the stream out = default_value; - push_back(obj); + push_back(std::move(obj)); } return (*this); @@ -299,7 +399,7 @@ BER_Decoder& BER_Decoder::decode_list(std::vector& vec, { T value; list.decode(value); - vec.push_back(value); + vec.push_back(std::move(value)); } list.end_cons(); From 1d474f74977ed7ba0609307316f11a708fd13159 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Fri, 8 Jun 2018 06:30:01 -0400 Subject: [PATCH 165/174] Expose BER_Decoder constructor taking BER_Object&& --- src/lib/asn1/ber_dec.h | 10 ++++++++-- src/lib/x509/x509_crl.cpp | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/lib/asn1/ber_dec.h b/src/lib/asn1/ber_dec.h index 2086eacd386..0f2fb46074c 100644 --- a/src/lib/asn1/ber_dec.h +++ b/src/lib/asn1/ber_dec.h @@ -47,6 +47,12 @@ class BOTAN_PUBLIC_API(2,0) BER_Decoder final BER_Decoder(const BER_Object& obj) : BER_Decoder(obj.bits(), obj.length()) {} + /** + * Set up to BER decode the data in obj + */ + BER_Decoder(BER_Object&& obj) : + BER_Decoder(std::move(obj), nullptr) {} + BER_Decoder(const BER_Decoder& other); BER_Decoder& operator=(const BER_Decoder&) = delete; @@ -297,7 +303,7 @@ class BOTAN_PUBLIC_API(2,0) BER_Decoder final { if((class_tag & CONSTRUCTED) && (class_tag & CONTEXT_SPECIFIC)) { - BER_Decoder(obj).decode(out, real_type).verify_end(); + BER_Decoder(std::move(obj)).decode(out, real_type).verify_end(); } else { @@ -339,7 +345,7 @@ BER_Decoder& BER_Decoder::decode_optional(T& out, { if((class_tag & CONSTRUCTED) && (class_tag & CONTEXT_SPECIFIC)) { - BER_Decoder(obj).decode(out).verify_end(); + BER_Decoder(std::move(obj)).decode(out).verify_end(); } else { diff --git a/src/lib/x509/x509_crl.cpp b/src/lib/x509/x509_crl.cpp index da075e009bd..47742c1dad6 100644 --- a/src/lib/x509/x509_crl.cpp +++ b/src/lib/x509/x509_crl.cpp @@ -143,7 +143,7 @@ std::unique_ptr decode_crl_body(const std::vector& body, if(next.is_a(SEQUENCE, CONSTRUCTED)) { - BER_Decoder cert_list(next); + BER_Decoder cert_list(std::move(next)); while(cert_list.more_items()) { @@ -156,7 +156,7 @@ std::unique_ptr decode_crl_body(const std::vector& body, if(next.is_a(0, ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC))) { - BER_Decoder crl_options(next); + BER_Decoder crl_options(std::move(next)); crl_options.decode(data->m_extensions).verify_end(); next = tbs_crl.get_next_object(); } From d5efc99480a5683444ee3c1b2c8c1c0f8b913be2 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Fri, 8 Jun 2018 07:18:17 -0400 Subject: [PATCH 166/174] Attempt at MSVC 2013 workaround --- src/lib/asn1/asn1_obj.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lib/asn1/asn1_obj.h b/src/lib/asn1/asn1_obj.h index f69c624add2..572453b21aa 100644 --- a/src/lib/asn1/asn1_obj.h +++ b/src/lib/asn1/asn1_obj.h @@ -100,11 +100,13 @@ class BOTAN_PUBLIC_API(2,0) BER_Object final BER_Object(const BER_Object& other) = default; - BER_Object(BER_Object&& other) = default; - BER_Object& operator=(const BER_Object& other) = default; +#if !defined(BOTAN_BUILD_COMPILER_IS_MSVC_2013) + BER_Object(BER_Object&& other) = default; + BER_Object& operator=(BER_Object&& other) = default; +#endif bool is_set() const { return type_tag != NO_OBJECT; } From 34f3e5537f6e9820314bd8fbd1b20d4adf7e9a0b Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Fri, 8 Jun 2018 12:11:55 -0400 Subject: [PATCH 167/174] Add missing statement --- src/lib/asn1/ber_dec.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/asn1/ber_dec.cpp b/src/lib/asn1/ber_dec.cpp index 313e7fd150c..c5af2f93387 100644 --- a/src/lib/asn1/ber_dec.cpp +++ b/src/lib/asn1/ber_dec.cpp @@ -417,6 +417,7 @@ BER_Decoder& BER_Decoder::decode(size_t& out, decode(integer, type_tag, class_tag); if(integer.is_negative()) + throw BER_Decoding_Error("Decoded small integer value was negative"); if(integer.bits() > 32) throw BER_Decoding_Error("Decoded integer value larger than expected"); From 4107fc0956e6d51692e888b35c126ea8f87433dd Mon Sep 17 00:00:00 2001 From: Felix Yan Date: Sat, 9 Jun 2018 02:56:14 +0800 Subject: [PATCH 168/174] Fix some typos in configure.py --- configure.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.py b/configure.py index d2286f0814a..ab50793ecba 100755 --- a/configure.py +++ b/configure.py @@ -683,7 +683,7 @@ def py_var(group): for (key, val) in name_val_pairs.items(): out.__dict__[key] = val - def lexed_tokens(): # Convert to an interator + def lexed_tokens(): # Convert to an iterator while True: token = lexer.get_token() if token != lexer.eof: @@ -2164,7 +2164,7 @@ def _resolve_dependencies_for_all_modules(self): successfully_loaded = set() for modname in self._to_load: - # This will try to recusively load all dependencies of modname + # This will try to recursively load all dependencies of modname ok, modules = self.resolve_dependencies(available_modules, dependency_table, modname) if ok: successfully_loaded.add(modname) From 4252279cbbf63e1c722a1fa9b1e096e188989791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Heged=C3=BCs=20M=C3=A1rton=20Csaba?= Date: Fri, 8 Jun 2018 22:31:55 +0200 Subject: [PATCH 169/174] Add support for GCC's --sysroot option to configure.py --- configure.py | 6 ++++++ src/build-data/makefile.in | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/configure.py b/configure.py index ab50793ecba..77743d4174a 100755 --- a/configure.py +++ b/configure.py @@ -411,6 +411,9 @@ def process_command_line(args): # pylint: disable=too-many-locals build_group.add_option('--with-external-libdir', metavar='DIR', default='', help='use DIR for external libs') + build_group.add_option('--with-sysroot-dir', metavar='DIR', default='', + help='use DIR for system root while cross-compiling') + build_group.add_option('--with-openmp', default=False, action='store_true', help='enable use of OpenMP') @@ -1061,6 +1064,7 @@ def __init__(self, infofile): 'output_to_exe': '-o ', 'add_include_dir_option': '-I', 'add_lib_dir_option': '-L', + 'add_sysroot_option': '--sysroot=', 'add_lib_option': '-l', 'add_framework_option': '-framework ', 'preproc_flags': '-E', @@ -1086,6 +1090,7 @@ def __init__(self, infofile): self.add_include_dir_option = lex.add_include_dir_option self.add_lib_dir_option = lex.add_lib_dir_option self.add_lib_option = lex.add_lib_option + self.add_sysroot_option = lex.add_sysroot_option self.ar_command = lex.ar_command self.ar_options = lex.ar_options self.ar_output_to = lex.ar_output_to @@ -1910,6 +1915,7 @@ def shared_lib_uses_symlinks(): 'dash_c': cc.compile_flags, 'cc_lang_flags': cc.cc_lang_flags(), + 'cc_sysroot': cc.add_sysroot_option + options.with_sysroot_dir, 'cc_compile_flags': options.cxxflags or cc.cc_compile_flags(options), 'ldflags': options.ldflags or '', 'cc_warning_flags': cc.cc_warning_flags(options), diff --git a/src/build-data/makefile.in b/src/build-data/makefile.in index 6dc438d0cd7..04aa9f461b6 100644 --- a/src/build-data/makefile.in +++ b/src/build-data/makefile.in @@ -9,10 +9,10 @@ PYTHON_EXE = %{python_exe} ABI_FLAGS = %{cxx_abi_flags} LANG_FLAGS = %{cc_lang_flags} -CXXFLAGS = %{cc_compile_flags} +CXXFLAGS = %{cc_sysroot} %{cc_compile_flags} WARN_FLAGS = %{cc_warning_flags} SO_OBJ_FLAGS = %{shared_flags} -LDFLAGS = %{ldflags} +LDFLAGS = %{cc_sysroot} %{ldflags} EXE_LINK_CMD = %{exe_link_cmd} POST_LINK_CMD = %{post_link_cmd} From 5c905339f858e0658cc2057d95beb01114b5972b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Heged=C3=BCs=20M=C3=A1rton=20Csaba?= Date: Fri, 8 Jun 2018 23:42:05 +0200 Subject: [PATCH 170/174] Updated news.rst --- news.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/news.rst b/news.rst index 2ffd7b098b9..18df007c991 100644 --- a/news.rst +++ b/news.rst @@ -61,6 +61,8 @@ Version 2.7.0, Not Yet Released * Implement Base32 encoding with template function to prepare refactoring of Base64. (GH #1541) +* Added support for GCC's --sysroot option to configure.py for cross-compiling. + Version 2.6.0, 2018-04-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 3cd24636f2ab1bf3da3d05d275eec8f0ae99c8ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Heged=C3=BCs=20M=C3=A1rton=20Csaba?= Date: Mon, 11 Jun 2018 17:43:14 +0200 Subject: [PATCH 171/174] Required changes according to the code review --- configure.py | 11 +++++++++-- src/build-data/cc/clang.txt | 2 ++ src/build-data/cc/gcc.txt | 2 ++ src/build-data/makefile.in | 6 +++--- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/configure.py b/configure.py index 77743d4174a..cb2b158f286 100755 --- a/configure.py +++ b/configure.py @@ -1064,7 +1064,7 @@ def __init__(self, infofile): 'output_to_exe': '-o ', 'add_include_dir_option': '-I', 'add_lib_dir_option': '-L', - 'add_sysroot_option': '--sysroot=', + 'add_sysroot_option': '', 'add_lib_option': '-l', 'add_framework_option': '-framework ', 'preproc_flags': '-E', @@ -1767,6 +1767,13 @@ def configure_command_line(): def cmake_escape(s): return s.replace('(', '\\(').replace(')', '\\)') + def sysroot_option(): + if options.with_sysroot_dir == '': + return '' + if cc.add_sysroot_option == '': + logging.error('This compiler doesn''t support --sysroot option') + return cc.add_sysroot_option + options.with_sysroot_dir + def ar_command(): if options.ar_command: return options.ar_command @@ -1915,7 +1922,7 @@ def shared_lib_uses_symlinks(): 'dash_c': cc.compile_flags, 'cc_lang_flags': cc.cc_lang_flags(), - 'cc_sysroot': cc.add_sysroot_option + options.with_sysroot_dir, + 'cc_sysroot': sysroot_option(), 'cc_compile_flags': options.cxxflags or cc.cc_compile_flags(options), 'ldflags': options.ldflags or '', 'cc_warning_flags': cc.cc_warning_flags(options), diff --git a/src/build-data/cc/clang.txt b/src/build-data/cc/clang.txt index 65586088bc2..d46c264465c 100644 --- a/src/build-data/cc/clang.txt +++ b/src/build-data/cc/clang.txt @@ -11,6 +11,8 @@ optimization_flags "-O3" sanitizer_optimization_flags "-O1 -fno-optimize-sibling-calls -fno-omit-frame-pointer" size_optimization_flags "-Os" +add_sysroot_option "--sysroot=" + default -> address,undefined diff --git a/src/build-data/cc/gcc.txt b/src/build-data/cc/gcc.txt index a1e45b42810..98f1a216745 100644 --- a/src/build-data/cc/gcc.txt +++ b/src/build-data/cc/gcc.txt @@ -17,6 +17,8 @@ shared_flags "-fPIC" coverage_flags "--coverage" stack_protector_flags "-fstack-protector" +add_sysroot_option "--sysroot=" + default -> iterator,address diff --git a/src/build-data/makefile.in b/src/build-data/makefile.in index 04aa9f461b6..7cd04360f1b 100644 --- a/src/build-data/makefile.in +++ b/src/build-data/makefile.in @@ -7,12 +7,12 @@ PYTHON_EXE = %{python_exe} # Compiler Flags -ABI_FLAGS = %{cxx_abi_flags} +ABI_FLAGS = %{cc_sysroot} %{cxx_abi_flags} LANG_FLAGS = %{cc_lang_flags} -CXXFLAGS = %{cc_sysroot} %{cc_compile_flags} +CXXFLAGS = %{cc_compile_flags} WARN_FLAGS = %{cc_warning_flags} SO_OBJ_FLAGS = %{shared_flags} -LDFLAGS = %{cc_sysroot} %{ldflags} +LDFLAGS = %{ldflags} EXE_LINK_CMD = %{exe_link_cmd} POST_LINK_CMD = %{post_link_cmd} From 95e2dd470a32b28e71a4c1c0b6dd0cfbeea4dff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Heged=C3=BCs=20M=C3=A1rton=20Csaba?= Date: Mon, 11 Jun 2018 17:51:33 +0200 Subject: [PATCH 172/174] Corrected error message --- configure.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.py b/configure.py index cb2b158f286..b09f07bb5e4 100755 --- a/configure.py +++ b/configure.py @@ -1771,7 +1771,7 @@ def sysroot_option(): if options.with_sysroot_dir == '': return '' if cc.add_sysroot_option == '': - logging.error('This compiler doesn''t support --sysroot option') + logging.error("This compiler doesn't support --sysroot option") return cc.add_sysroot_option + options.with_sysroot_dir def ar_command(): From 2887819c4c66be71d0d8c079655642f71c2338ff Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Mon, 11 Jun 2018 16:59:55 -0400 Subject: [PATCH 173/174] Unroll bigint_monty_redc for various sizes Speedup of 10 to 30% depending on algo --- src/build-data/buildh.in | 2 +- src/lib/math/mp/info.txt | 1 + src/lib/math/mp/mp_monty.cpp | 69 +- src/lib/math/mp/mp_monty.h | 31 + src/lib/math/mp/mp_monty_n.cpp | 2614 ++++++++++++++++++++++++++++++++ src/scripts/monty.py | 91 ++ src/tests/test_rsa.cpp | 2 +- 7 files changed, 2784 insertions(+), 26 deletions(-) create mode 100644 src/lib/math/mp/mp_monty.h create mode 100644 src/lib/math/mp/mp_monty_n.cpp create mode 100755 src/scripts/monty.py diff --git a/src/build-data/buildh.in b/src/build-data/buildh.in index bb7d1419bee..ef58078b5ca 100644 --- a/src/build-data/buildh.in +++ b/src/build-data/buildh.in @@ -153,7 +153,7 @@ * periodically reinitializes the sequence. This value specifies how often * a new sequence should be started. */ -#define BOTAN_BLINDING_REINIT_INTERVAL 32 +#define BOTAN_BLINDING_REINIT_INTERVAL 64 /* * Userspace RNGs like HMAC_DRBG will reseed after a specified number diff --git a/src/lib/math/mp/info.txt b/src/lib/math/mp/info.txt index e93ff79b007..cee4325ed88 100644 --- a/src/lib/math/mp/info.txt +++ b/src/lib/math/mp/info.txt @@ -6,4 +6,5 @@ BIGINT_MP -> 20151225 mp_core.h mp_madd.h mp_asmi.h +mp_monty.h diff --git a/src/lib/math/mp/mp_monty.cpp b/src/lib/math/mp/mp_monty.cpp index 3231c610bff..cae113df02a 100644 --- a/src/lib/math/mp/mp_monty.cpp +++ b/src/lib/math/mp/mp_monty.cpp @@ -8,6 +8,7 @@ */ #include +#include #include #include #include @@ -16,29 +17,19 @@ namespace Botan { +namespace { + /* -* Montgomery Reduction Algorithm +* Montgomery reduction - product scanning form +* +* https://www.iacr.org/archive/ches2005/006.pdf +* https://eprint.iacr.org/2013/882.pdf +* https://www.microsoft.com/en-us/research/wp-content/uploads/1996/01/j37acmon.pdf */ -void bigint_monty_redc(word z[], - const word p[], size_t p_size, word p_dash, - word ws[], size_t ws_size) +void bigint_monty_redc_generic(word z[], size_t z_size, + const word p[], size_t p_size, word p_dash, + word ws[]) { - const size_t z_size = 2*(p_size+1); - - BOTAN_ARG_CHECK(ws_size >= z_size, "workspace too small"); - - CT::poison(z, z_size); - CT::poison(p, p_size); - CT::poison(ws, 2*(p_size+1)); - - /* - Montgomery reduction - product scanning form - - https://www.iacr.org/archive/ches2005/006.pdf - https://eprint.iacr.org/2013/882.pdf - https://www.microsoft.com/en-us/research/wp-content/uploads/1996/01/j37acmon.pdf - */ - word w2 = 0, w1 = 0, w0 = 0; w0 = z[0]; @@ -110,13 +101,43 @@ void bigint_monty_redc(word z[], CT::conditional_copy_mem(borrow, z, ws, ws + (p_size + 1), (p_size + 1)); clear_mem(z + p_size, z_size - p_size - 2); - CT::unpoison(z, z_size); - CT::unpoison(p, p_size); - CT::unpoison(ws, 2*(p_size+1)); - // This check comes after we've used it but that's ok here CT::unpoison(&borrow, 1); BOTAN_ASSERT(borrow == 0 || borrow == 1, "Expected borrow"); } } + +void bigint_monty_redc(word z[], + const word p[], size_t p_size, word p_dash, + word ws[], size_t ws_size) + { + const size_t z_size = 2*(p_size+1); + + BOTAN_ARG_CHECK(ws_size >= z_size, "workspace too small"); + + CT::poison(z, z_size); + CT::poison(p, p_size); + CT::poison(ws, 2*(p_size+1)); + + if(p_size == 4) + bigint_monty_redc_4(z, p, p_dash, ws); + else if(p_size == 6) + bigint_monty_redc_6(z, p, p_dash, ws); + else if(p_size == 8) + bigint_monty_redc_8(z, p, p_dash, ws); + else if(p_size == 16) + bigint_monty_redc_16(z, p, p_dash, ws); + else if(p_size == 24) + bigint_monty_redc_24(z, p, p_dash, ws); + else if(p_size == 32) + bigint_monty_redc_32(z, p, p_dash, ws); + else + bigint_monty_redc_generic(z, z_size, p, p_size, p_dash, ws); + + CT::unpoison(z, z_size); + CT::unpoison(p, p_size); + CT::unpoison(ws, 2*(p_size+1)); + } + +} diff --git a/src/lib/math/mp/mp_monty.h b/src/lib/math/mp/mp_monty.h new file mode 100644 index 00000000000..7462272d5c5 --- /dev/null +++ b/src/lib/math/mp/mp_monty.h @@ -0,0 +1,31 @@ +/* +* (C) 2018 Jack Lloyd +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#ifndef BOTAN_MP_MONTY_H_ +#define BOTAN_MP_MONTY_H_ + +#include + +namespace Botan { + +/* +* Each of these functions makes the following assumptions: +* +* z_size >= 2*(p_size + 1) +* ws_size >= z_size +*/ + +void bigint_monty_redc_4(word z[], const word p[], word p_dash, word ws[]); +void bigint_monty_redc_6(word z[], const word p[], word p_dash, word ws[]); +void bigint_monty_redc_8(word z[], const word p[], word p_dash, word ws[]); +void bigint_monty_redc_16(word z[], const word p[], word p_dash, word ws[]); +void bigint_monty_redc_24(word z[], const word p[], word p_dash, word ws[]); +void bigint_monty_redc_32(word z[], const word p[], word p_dash, word ws[]); + + +} + +#endif diff --git a/src/lib/math/mp/mp_monty_n.cpp b/src/lib/math/mp/mp_monty_n.cpp new file mode 100644 index 00000000000..0331d4a0731 --- /dev/null +++ b/src/lib/math/mp/mp_monty_n.cpp @@ -0,0 +1,2614 @@ +/* +* This file was automatically generated by ./src/scripts/monty.py on 2018-06-11 +* All manual changes will be lost. Edit the script instead. +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include +#include +#include +#include + +namespace Botan { + +void bigint_monty_redc_4(word z[], const word p[4], word p_dash, word ws[]) + { + word w2 = 0, w1 = 0, w0 = 0; + w0 = z[0]; + ws[0] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[0], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[1]); + word3_add(&w2, &w1, &w0, z[1]); + ws[1] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[1], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[2]); + word3_muladd(&w2, &w1, &w0, ws[1], p[1]); + word3_add(&w2, &w1, &w0, z[2]); + ws[2] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[2], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[3]); + word3_muladd(&w2, &w1, &w0, ws[1], p[2]); + word3_muladd(&w2, &w1, &w0, ws[2], p[1]); + word3_add(&w2, &w1, &w0, z[3]); + ws[3] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[3], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[1], p[3]); + word3_muladd(&w2, &w1, &w0, ws[2], p[2]); + word3_muladd(&w2, &w1, &w0, ws[3], p[1]); + word3_add(&w2, &w1, &w0, z[4]); + ws[0] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[2], p[3]); + word3_muladd(&w2, &w1, &w0, ws[3], p[2]); + word3_add(&w2, &w1, &w0, z[5]); + ws[1] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[3], p[3]); + word3_add(&w2, &w1, &w0, z[6]); + ws[2] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_add(&w2, &w1, &w0, z[7]); + ws[3] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_add(&w2, &w1, &w0, z[9]); + ws[4] = w0; + ws[5] = w1; + word borrow = 0; + ws[5] = word_sub(ws[0], p[0], &borrow); + ws[6] = word_sub(ws[1], p[1], &borrow); + ws[7] = word_sub(ws[2], p[2], &borrow); + ws[8] = word_sub(ws[3], p[3], &borrow); + ws[9] = word_sub(ws[4], 0, &borrow); + CT::conditional_copy_mem(borrow, z, ws, ws + 5, 5); + clear_mem(z + 4, 2*(4+1) - 4); + } + +void bigint_monty_redc_6(word z[], const word p[6], word p_dash, word ws[]) + { + word w2 = 0, w1 = 0, w0 = 0; + w0 = z[0]; + ws[0] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[0], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[1]); + word3_add(&w2, &w1, &w0, z[1]); + ws[1] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[1], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[2]); + word3_muladd(&w2, &w1, &w0, ws[1], p[1]); + word3_add(&w2, &w1, &w0, z[2]); + ws[2] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[2], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[3]); + word3_muladd(&w2, &w1, &w0, ws[1], p[2]); + word3_muladd(&w2, &w1, &w0, ws[2], p[1]); + word3_add(&w2, &w1, &w0, z[3]); + ws[3] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[3], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[4]); + word3_muladd(&w2, &w1, &w0, ws[1], p[3]); + word3_muladd(&w2, &w1, &w0, ws[2], p[2]); + word3_muladd(&w2, &w1, &w0, ws[3], p[1]); + word3_add(&w2, &w1, &w0, z[4]); + ws[4] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[4], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[5]); + word3_muladd(&w2, &w1, &w0, ws[1], p[4]); + word3_muladd(&w2, &w1, &w0, ws[2], p[3]); + word3_muladd(&w2, &w1, &w0, ws[3], p[2]); + word3_muladd(&w2, &w1, &w0, ws[4], p[1]); + word3_add(&w2, &w1, &w0, z[5]); + ws[5] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[5], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[1], p[5]); + word3_muladd(&w2, &w1, &w0, ws[2], p[4]); + word3_muladd(&w2, &w1, &w0, ws[3], p[3]); + word3_muladd(&w2, &w1, &w0, ws[4], p[2]); + word3_muladd(&w2, &w1, &w0, ws[5], p[1]); + word3_add(&w2, &w1, &w0, z[6]); + ws[0] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[2], p[5]); + word3_muladd(&w2, &w1, &w0, ws[3], p[4]); + word3_muladd(&w2, &w1, &w0, ws[4], p[3]); + word3_muladd(&w2, &w1, &w0, ws[5], p[2]); + word3_add(&w2, &w1, &w0, z[7]); + ws[1] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[3], p[5]); + word3_muladd(&w2, &w1, &w0, ws[4], p[4]); + word3_muladd(&w2, &w1, &w0, ws[5], p[3]); + word3_add(&w2, &w1, &w0, z[8]); + ws[2] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[4], p[5]); + word3_muladd(&w2, &w1, &w0, ws[5], p[4]); + word3_add(&w2, &w1, &w0, z[9]); + ws[3] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[5], p[5]); + word3_add(&w2, &w1, &w0, z[10]); + ws[4] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_add(&w2, &w1, &w0, z[11]); + ws[5] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_add(&w2, &w1, &w0, z[13]); + ws[6] = w0; + ws[7] = w1; + word borrow = 0; + ws[7] = word_sub(ws[0], p[0], &borrow); + ws[8] = word_sub(ws[1], p[1], &borrow); + ws[9] = word_sub(ws[2], p[2], &borrow); + ws[10] = word_sub(ws[3], p[3], &borrow); + ws[11] = word_sub(ws[4], p[4], &borrow); + ws[12] = word_sub(ws[5], p[5], &borrow); + ws[13] = word_sub(ws[6], 0, &borrow); + CT::conditional_copy_mem(borrow, z, ws, ws + 7, 7); + clear_mem(z + 6, 2*(6+1) - 6); + } + +void bigint_monty_redc_8(word z[], const word p[8], word p_dash, word ws[]) + { + word w2 = 0, w1 = 0, w0 = 0; + w0 = z[0]; + ws[0] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[0], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[1]); + word3_add(&w2, &w1, &w0, z[1]); + ws[1] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[1], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[2]); + word3_muladd(&w2, &w1, &w0, ws[1], p[1]); + word3_add(&w2, &w1, &w0, z[2]); + ws[2] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[2], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[3]); + word3_muladd(&w2, &w1, &w0, ws[1], p[2]); + word3_muladd(&w2, &w1, &w0, ws[2], p[1]); + word3_add(&w2, &w1, &w0, z[3]); + ws[3] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[3], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[4]); + word3_muladd(&w2, &w1, &w0, ws[1], p[3]); + word3_muladd(&w2, &w1, &w0, ws[2], p[2]); + word3_muladd(&w2, &w1, &w0, ws[3], p[1]); + word3_add(&w2, &w1, &w0, z[4]); + ws[4] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[4], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[5]); + word3_muladd(&w2, &w1, &w0, ws[1], p[4]); + word3_muladd(&w2, &w1, &w0, ws[2], p[3]); + word3_muladd(&w2, &w1, &w0, ws[3], p[2]); + word3_muladd(&w2, &w1, &w0, ws[4], p[1]); + word3_add(&w2, &w1, &w0, z[5]); + ws[5] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[5], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[6]); + word3_muladd(&w2, &w1, &w0, ws[1], p[5]); + word3_muladd(&w2, &w1, &w0, ws[2], p[4]); + word3_muladd(&w2, &w1, &w0, ws[3], p[3]); + word3_muladd(&w2, &w1, &w0, ws[4], p[2]); + word3_muladd(&w2, &w1, &w0, ws[5], p[1]); + word3_add(&w2, &w1, &w0, z[6]); + ws[6] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[6], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[7]); + word3_muladd(&w2, &w1, &w0, ws[1], p[6]); + word3_muladd(&w2, &w1, &w0, ws[2], p[5]); + word3_muladd(&w2, &w1, &w0, ws[3], p[4]); + word3_muladd(&w2, &w1, &w0, ws[4], p[3]); + word3_muladd(&w2, &w1, &w0, ws[5], p[2]); + word3_muladd(&w2, &w1, &w0, ws[6], p[1]); + word3_add(&w2, &w1, &w0, z[7]); + ws[7] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[7], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[1], p[7]); + word3_muladd(&w2, &w1, &w0, ws[2], p[6]); + word3_muladd(&w2, &w1, &w0, ws[3], p[5]); + word3_muladd(&w2, &w1, &w0, ws[4], p[4]); + word3_muladd(&w2, &w1, &w0, ws[5], p[3]); + word3_muladd(&w2, &w1, &w0, ws[6], p[2]); + word3_muladd(&w2, &w1, &w0, ws[7], p[1]); + word3_add(&w2, &w1, &w0, z[8]); + ws[0] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[2], p[7]); + word3_muladd(&w2, &w1, &w0, ws[3], p[6]); + word3_muladd(&w2, &w1, &w0, ws[4], p[5]); + word3_muladd(&w2, &w1, &w0, ws[5], p[4]); + word3_muladd(&w2, &w1, &w0, ws[6], p[3]); + word3_muladd(&w2, &w1, &w0, ws[7], p[2]); + word3_add(&w2, &w1, &w0, z[9]); + ws[1] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[3], p[7]); + word3_muladd(&w2, &w1, &w0, ws[4], p[6]); + word3_muladd(&w2, &w1, &w0, ws[5], p[5]); + word3_muladd(&w2, &w1, &w0, ws[6], p[4]); + word3_muladd(&w2, &w1, &w0, ws[7], p[3]); + word3_add(&w2, &w1, &w0, z[10]); + ws[2] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[4], p[7]); + word3_muladd(&w2, &w1, &w0, ws[5], p[6]); + word3_muladd(&w2, &w1, &w0, ws[6], p[5]); + word3_muladd(&w2, &w1, &w0, ws[7], p[4]); + word3_add(&w2, &w1, &w0, z[11]); + ws[3] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[5], p[7]); + word3_muladd(&w2, &w1, &w0, ws[6], p[6]); + word3_muladd(&w2, &w1, &w0, ws[7], p[5]); + word3_add(&w2, &w1, &w0, z[12]); + ws[4] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[6], p[7]); + word3_muladd(&w2, &w1, &w0, ws[7], p[6]); + word3_add(&w2, &w1, &w0, z[13]); + ws[5] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[7], p[7]); + word3_add(&w2, &w1, &w0, z[14]); + ws[6] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_add(&w2, &w1, &w0, z[15]); + ws[7] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_add(&w2, &w1, &w0, z[17]); + ws[8] = w0; + ws[9] = w1; + word borrow = 0; + ws[9] = word_sub(ws[0], p[0], &borrow); + ws[10] = word_sub(ws[1], p[1], &borrow); + ws[11] = word_sub(ws[2], p[2], &borrow); + ws[12] = word_sub(ws[3], p[3], &borrow); + ws[13] = word_sub(ws[4], p[4], &borrow); + ws[14] = word_sub(ws[5], p[5], &borrow); + ws[15] = word_sub(ws[6], p[6], &borrow); + ws[16] = word_sub(ws[7], p[7], &borrow); + ws[17] = word_sub(ws[8], 0, &borrow); + CT::conditional_copy_mem(borrow, z, ws, ws + 9, 9); + clear_mem(z + 8, 2*(8+1) - 8); + } + +void bigint_monty_redc_16(word z[], const word p[16], word p_dash, word ws[]) + { + word w2 = 0, w1 = 0, w0 = 0; + w0 = z[0]; + ws[0] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[0], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[1]); + word3_add(&w2, &w1, &w0, z[1]); + ws[1] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[1], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[2]); + word3_muladd(&w2, &w1, &w0, ws[1], p[1]); + word3_add(&w2, &w1, &w0, z[2]); + ws[2] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[2], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[3]); + word3_muladd(&w2, &w1, &w0, ws[1], p[2]); + word3_muladd(&w2, &w1, &w0, ws[2], p[1]); + word3_add(&w2, &w1, &w0, z[3]); + ws[3] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[3], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[4]); + word3_muladd(&w2, &w1, &w0, ws[1], p[3]); + word3_muladd(&w2, &w1, &w0, ws[2], p[2]); + word3_muladd(&w2, &w1, &w0, ws[3], p[1]); + word3_add(&w2, &w1, &w0, z[4]); + ws[4] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[4], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[5]); + word3_muladd(&w2, &w1, &w0, ws[1], p[4]); + word3_muladd(&w2, &w1, &w0, ws[2], p[3]); + word3_muladd(&w2, &w1, &w0, ws[3], p[2]); + word3_muladd(&w2, &w1, &w0, ws[4], p[1]); + word3_add(&w2, &w1, &w0, z[5]); + ws[5] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[5], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[6]); + word3_muladd(&w2, &w1, &w0, ws[1], p[5]); + word3_muladd(&w2, &w1, &w0, ws[2], p[4]); + word3_muladd(&w2, &w1, &w0, ws[3], p[3]); + word3_muladd(&w2, &w1, &w0, ws[4], p[2]); + word3_muladd(&w2, &w1, &w0, ws[5], p[1]); + word3_add(&w2, &w1, &w0, z[6]); + ws[6] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[6], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[7]); + word3_muladd(&w2, &w1, &w0, ws[1], p[6]); + word3_muladd(&w2, &w1, &w0, ws[2], p[5]); + word3_muladd(&w2, &w1, &w0, ws[3], p[4]); + word3_muladd(&w2, &w1, &w0, ws[4], p[3]); + word3_muladd(&w2, &w1, &w0, ws[5], p[2]); + word3_muladd(&w2, &w1, &w0, ws[6], p[1]); + word3_add(&w2, &w1, &w0, z[7]); + ws[7] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[7], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[8]); + word3_muladd(&w2, &w1, &w0, ws[1], p[7]); + word3_muladd(&w2, &w1, &w0, ws[2], p[6]); + word3_muladd(&w2, &w1, &w0, ws[3], p[5]); + word3_muladd(&w2, &w1, &w0, ws[4], p[4]); + word3_muladd(&w2, &w1, &w0, ws[5], p[3]); + word3_muladd(&w2, &w1, &w0, ws[6], p[2]); + word3_muladd(&w2, &w1, &w0, ws[7], p[1]); + word3_add(&w2, &w1, &w0, z[8]); + ws[8] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[8], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[9]); + word3_muladd(&w2, &w1, &w0, ws[1], p[8]); + word3_muladd(&w2, &w1, &w0, ws[2], p[7]); + word3_muladd(&w2, &w1, &w0, ws[3], p[6]); + word3_muladd(&w2, &w1, &w0, ws[4], p[5]); + word3_muladd(&w2, &w1, &w0, ws[5], p[4]); + word3_muladd(&w2, &w1, &w0, ws[6], p[3]); + word3_muladd(&w2, &w1, &w0, ws[7], p[2]); + word3_muladd(&w2, &w1, &w0, ws[8], p[1]); + word3_add(&w2, &w1, &w0, z[9]); + ws[9] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[9], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[10]); + word3_muladd(&w2, &w1, &w0, ws[1], p[9]); + word3_muladd(&w2, &w1, &w0, ws[2], p[8]); + word3_muladd(&w2, &w1, &w0, ws[3], p[7]); + word3_muladd(&w2, &w1, &w0, ws[4], p[6]); + word3_muladd(&w2, &w1, &w0, ws[5], p[5]); + word3_muladd(&w2, &w1, &w0, ws[6], p[4]); + word3_muladd(&w2, &w1, &w0, ws[7], p[3]); + word3_muladd(&w2, &w1, &w0, ws[8], p[2]); + word3_muladd(&w2, &w1, &w0, ws[9], p[1]); + word3_add(&w2, &w1, &w0, z[10]); + ws[10] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[10], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[11]); + word3_muladd(&w2, &w1, &w0, ws[1], p[10]); + word3_muladd(&w2, &w1, &w0, ws[2], p[9]); + word3_muladd(&w2, &w1, &w0, ws[3], p[8]); + word3_muladd(&w2, &w1, &w0, ws[4], p[7]); + word3_muladd(&w2, &w1, &w0, ws[5], p[6]); + word3_muladd(&w2, &w1, &w0, ws[6], p[5]); + word3_muladd(&w2, &w1, &w0, ws[7], p[4]); + word3_muladd(&w2, &w1, &w0, ws[8], p[3]); + word3_muladd(&w2, &w1, &w0, ws[9], p[2]); + word3_muladd(&w2, &w1, &w0, ws[10], p[1]); + word3_add(&w2, &w1, &w0, z[11]); + ws[11] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[11], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[12]); + word3_muladd(&w2, &w1, &w0, ws[1], p[11]); + word3_muladd(&w2, &w1, &w0, ws[2], p[10]); + word3_muladd(&w2, &w1, &w0, ws[3], p[9]); + word3_muladd(&w2, &w1, &w0, ws[4], p[8]); + word3_muladd(&w2, &w1, &w0, ws[5], p[7]); + word3_muladd(&w2, &w1, &w0, ws[6], p[6]); + word3_muladd(&w2, &w1, &w0, ws[7], p[5]); + word3_muladd(&w2, &w1, &w0, ws[8], p[4]); + word3_muladd(&w2, &w1, &w0, ws[9], p[3]); + word3_muladd(&w2, &w1, &w0, ws[10], p[2]); + word3_muladd(&w2, &w1, &w0, ws[11], p[1]); + word3_add(&w2, &w1, &w0, z[12]); + ws[12] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[12], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[13]); + word3_muladd(&w2, &w1, &w0, ws[1], p[12]); + word3_muladd(&w2, &w1, &w0, ws[2], p[11]); + word3_muladd(&w2, &w1, &w0, ws[3], p[10]); + word3_muladd(&w2, &w1, &w0, ws[4], p[9]); + word3_muladd(&w2, &w1, &w0, ws[5], p[8]); + word3_muladd(&w2, &w1, &w0, ws[6], p[7]); + word3_muladd(&w2, &w1, &w0, ws[7], p[6]); + word3_muladd(&w2, &w1, &w0, ws[8], p[5]); + word3_muladd(&w2, &w1, &w0, ws[9], p[4]); + word3_muladd(&w2, &w1, &w0, ws[10], p[3]); + word3_muladd(&w2, &w1, &w0, ws[11], p[2]); + word3_muladd(&w2, &w1, &w0, ws[12], p[1]); + word3_add(&w2, &w1, &w0, z[13]); + ws[13] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[13], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[14]); + word3_muladd(&w2, &w1, &w0, ws[1], p[13]); + word3_muladd(&w2, &w1, &w0, ws[2], p[12]); + word3_muladd(&w2, &w1, &w0, ws[3], p[11]); + word3_muladd(&w2, &w1, &w0, ws[4], p[10]); + word3_muladd(&w2, &w1, &w0, ws[5], p[9]); + word3_muladd(&w2, &w1, &w0, ws[6], p[8]); + word3_muladd(&w2, &w1, &w0, ws[7], p[7]); + word3_muladd(&w2, &w1, &w0, ws[8], p[6]); + word3_muladd(&w2, &w1, &w0, ws[9], p[5]); + word3_muladd(&w2, &w1, &w0, ws[10], p[4]); + word3_muladd(&w2, &w1, &w0, ws[11], p[3]); + word3_muladd(&w2, &w1, &w0, ws[12], p[2]); + word3_muladd(&w2, &w1, &w0, ws[13], p[1]); + word3_add(&w2, &w1, &w0, z[14]); + ws[14] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[14], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[15]); + word3_muladd(&w2, &w1, &w0, ws[1], p[14]); + word3_muladd(&w2, &w1, &w0, ws[2], p[13]); + word3_muladd(&w2, &w1, &w0, ws[3], p[12]); + word3_muladd(&w2, &w1, &w0, ws[4], p[11]); + word3_muladd(&w2, &w1, &w0, ws[5], p[10]); + word3_muladd(&w2, &w1, &w0, ws[6], p[9]); + word3_muladd(&w2, &w1, &w0, ws[7], p[8]); + word3_muladd(&w2, &w1, &w0, ws[8], p[7]); + word3_muladd(&w2, &w1, &w0, ws[9], p[6]); + word3_muladd(&w2, &w1, &w0, ws[10], p[5]); + word3_muladd(&w2, &w1, &w0, ws[11], p[4]); + word3_muladd(&w2, &w1, &w0, ws[12], p[3]); + word3_muladd(&w2, &w1, &w0, ws[13], p[2]); + word3_muladd(&w2, &w1, &w0, ws[14], p[1]); + word3_add(&w2, &w1, &w0, z[15]); + ws[15] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[15], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[1], p[15]); + word3_muladd(&w2, &w1, &w0, ws[2], p[14]); + word3_muladd(&w2, &w1, &w0, ws[3], p[13]); + word3_muladd(&w2, &w1, &w0, ws[4], p[12]); + word3_muladd(&w2, &w1, &w0, ws[5], p[11]); + word3_muladd(&w2, &w1, &w0, ws[6], p[10]); + word3_muladd(&w2, &w1, &w0, ws[7], p[9]); + word3_muladd(&w2, &w1, &w0, ws[8], p[8]); + word3_muladd(&w2, &w1, &w0, ws[9], p[7]); + word3_muladd(&w2, &w1, &w0, ws[10], p[6]); + word3_muladd(&w2, &w1, &w0, ws[11], p[5]); + word3_muladd(&w2, &w1, &w0, ws[12], p[4]); + word3_muladd(&w2, &w1, &w0, ws[13], p[3]); + word3_muladd(&w2, &w1, &w0, ws[14], p[2]); + word3_muladd(&w2, &w1, &w0, ws[15], p[1]); + word3_add(&w2, &w1, &w0, z[16]); + ws[0] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[2], p[15]); + word3_muladd(&w2, &w1, &w0, ws[3], p[14]); + word3_muladd(&w2, &w1, &w0, ws[4], p[13]); + word3_muladd(&w2, &w1, &w0, ws[5], p[12]); + word3_muladd(&w2, &w1, &w0, ws[6], p[11]); + word3_muladd(&w2, &w1, &w0, ws[7], p[10]); + word3_muladd(&w2, &w1, &w0, ws[8], p[9]); + word3_muladd(&w2, &w1, &w0, ws[9], p[8]); + word3_muladd(&w2, &w1, &w0, ws[10], p[7]); + word3_muladd(&w2, &w1, &w0, ws[11], p[6]); + word3_muladd(&w2, &w1, &w0, ws[12], p[5]); + word3_muladd(&w2, &w1, &w0, ws[13], p[4]); + word3_muladd(&w2, &w1, &w0, ws[14], p[3]); + word3_muladd(&w2, &w1, &w0, ws[15], p[2]); + word3_add(&w2, &w1, &w0, z[17]); + ws[1] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[3], p[15]); + word3_muladd(&w2, &w1, &w0, ws[4], p[14]); + word3_muladd(&w2, &w1, &w0, ws[5], p[13]); + word3_muladd(&w2, &w1, &w0, ws[6], p[12]); + word3_muladd(&w2, &w1, &w0, ws[7], p[11]); + word3_muladd(&w2, &w1, &w0, ws[8], p[10]); + word3_muladd(&w2, &w1, &w0, ws[9], p[9]); + word3_muladd(&w2, &w1, &w0, ws[10], p[8]); + word3_muladd(&w2, &w1, &w0, ws[11], p[7]); + word3_muladd(&w2, &w1, &w0, ws[12], p[6]); + word3_muladd(&w2, &w1, &w0, ws[13], p[5]); + word3_muladd(&w2, &w1, &w0, ws[14], p[4]); + word3_muladd(&w2, &w1, &w0, ws[15], p[3]); + word3_add(&w2, &w1, &w0, z[18]); + ws[2] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[4], p[15]); + word3_muladd(&w2, &w1, &w0, ws[5], p[14]); + word3_muladd(&w2, &w1, &w0, ws[6], p[13]); + word3_muladd(&w2, &w1, &w0, ws[7], p[12]); + word3_muladd(&w2, &w1, &w0, ws[8], p[11]); + word3_muladd(&w2, &w1, &w0, ws[9], p[10]); + word3_muladd(&w2, &w1, &w0, ws[10], p[9]); + word3_muladd(&w2, &w1, &w0, ws[11], p[8]); + word3_muladd(&w2, &w1, &w0, ws[12], p[7]); + word3_muladd(&w2, &w1, &w0, ws[13], p[6]); + word3_muladd(&w2, &w1, &w0, ws[14], p[5]); + word3_muladd(&w2, &w1, &w0, ws[15], p[4]); + word3_add(&w2, &w1, &w0, z[19]); + ws[3] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[5], p[15]); + word3_muladd(&w2, &w1, &w0, ws[6], p[14]); + word3_muladd(&w2, &w1, &w0, ws[7], p[13]); + word3_muladd(&w2, &w1, &w0, ws[8], p[12]); + word3_muladd(&w2, &w1, &w0, ws[9], p[11]); + word3_muladd(&w2, &w1, &w0, ws[10], p[10]); + word3_muladd(&w2, &w1, &w0, ws[11], p[9]); + word3_muladd(&w2, &w1, &w0, ws[12], p[8]); + word3_muladd(&w2, &w1, &w0, ws[13], p[7]); + word3_muladd(&w2, &w1, &w0, ws[14], p[6]); + word3_muladd(&w2, &w1, &w0, ws[15], p[5]); + word3_add(&w2, &w1, &w0, z[20]); + ws[4] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[6], p[15]); + word3_muladd(&w2, &w1, &w0, ws[7], p[14]); + word3_muladd(&w2, &w1, &w0, ws[8], p[13]); + word3_muladd(&w2, &w1, &w0, ws[9], p[12]); + word3_muladd(&w2, &w1, &w0, ws[10], p[11]); + word3_muladd(&w2, &w1, &w0, ws[11], p[10]); + word3_muladd(&w2, &w1, &w0, ws[12], p[9]); + word3_muladd(&w2, &w1, &w0, ws[13], p[8]); + word3_muladd(&w2, &w1, &w0, ws[14], p[7]); + word3_muladd(&w2, &w1, &w0, ws[15], p[6]); + word3_add(&w2, &w1, &w0, z[21]); + ws[5] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[7], p[15]); + word3_muladd(&w2, &w1, &w0, ws[8], p[14]); + word3_muladd(&w2, &w1, &w0, ws[9], p[13]); + word3_muladd(&w2, &w1, &w0, ws[10], p[12]); + word3_muladd(&w2, &w1, &w0, ws[11], p[11]); + word3_muladd(&w2, &w1, &w0, ws[12], p[10]); + word3_muladd(&w2, &w1, &w0, ws[13], p[9]); + word3_muladd(&w2, &w1, &w0, ws[14], p[8]); + word3_muladd(&w2, &w1, &w0, ws[15], p[7]); + word3_add(&w2, &w1, &w0, z[22]); + ws[6] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[8], p[15]); + word3_muladd(&w2, &w1, &w0, ws[9], p[14]); + word3_muladd(&w2, &w1, &w0, ws[10], p[13]); + word3_muladd(&w2, &w1, &w0, ws[11], p[12]); + word3_muladd(&w2, &w1, &w0, ws[12], p[11]); + word3_muladd(&w2, &w1, &w0, ws[13], p[10]); + word3_muladd(&w2, &w1, &w0, ws[14], p[9]); + word3_muladd(&w2, &w1, &w0, ws[15], p[8]); + word3_add(&w2, &w1, &w0, z[23]); + ws[7] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[9], p[15]); + word3_muladd(&w2, &w1, &w0, ws[10], p[14]); + word3_muladd(&w2, &w1, &w0, ws[11], p[13]); + word3_muladd(&w2, &w1, &w0, ws[12], p[12]); + word3_muladd(&w2, &w1, &w0, ws[13], p[11]); + word3_muladd(&w2, &w1, &w0, ws[14], p[10]); + word3_muladd(&w2, &w1, &w0, ws[15], p[9]); + word3_add(&w2, &w1, &w0, z[24]); + ws[8] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[10], p[15]); + word3_muladd(&w2, &w1, &w0, ws[11], p[14]); + word3_muladd(&w2, &w1, &w0, ws[12], p[13]); + word3_muladd(&w2, &w1, &w0, ws[13], p[12]); + word3_muladd(&w2, &w1, &w0, ws[14], p[11]); + word3_muladd(&w2, &w1, &w0, ws[15], p[10]); + word3_add(&w2, &w1, &w0, z[25]); + ws[9] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[11], p[15]); + word3_muladd(&w2, &w1, &w0, ws[12], p[14]); + word3_muladd(&w2, &w1, &w0, ws[13], p[13]); + word3_muladd(&w2, &w1, &w0, ws[14], p[12]); + word3_muladd(&w2, &w1, &w0, ws[15], p[11]); + word3_add(&w2, &w1, &w0, z[26]); + ws[10] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[12], p[15]); + word3_muladd(&w2, &w1, &w0, ws[13], p[14]); + word3_muladd(&w2, &w1, &w0, ws[14], p[13]); + word3_muladd(&w2, &w1, &w0, ws[15], p[12]); + word3_add(&w2, &w1, &w0, z[27]); + ws[11] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[13], p[15]); + word3_muladd(&w2, &w1, &w0, ws[14], p[14]); + word3_muladd(&w2, &w1, &w0, ws[15], p[13]); + word3_add(&w2, &w1, &w0, z[28]); + ws[12] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[14], p[15]); + word3_muladd(&w2, &w1, &w0, ws[15], p[14]); + word3_add(&w2, &w1, &w0, z[29]); + ws[13] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[15], p[15]); + word3_add(&w2, &w1, &w0, z[30]); + ws[14] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_add(&w2, &w1, &w0, z[31]); + ws[15] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_add(&w2, &w1, &w0, z[33]); + ws[16] = w0; + ws[17] = w1; + word borrow = bigint_sub3(ws + 16 + 1, ws, 16 + 1, p, 16); + CT::conditional_copy_mem(borrow, z, ws, ws + 17, 17); + clear_mem(z + 16, 2*(16+1) - 16); + } + +void bigint_monty_redc_24(word z[], const word p[24], word p_dash, word ws[]) + { + word w2 = 0, w1 = 0, w0 = 0; + w0 = z[0]; + ws[0] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[0], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[1]); + word3_add(&w2, &w1, &w0, z[1]); + ws[1] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[1], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[2]); + word3_muladd(&w2, &w1, &w0, ws[1], p[1]); + word3_add(&w2, &w1, &w0, z[2]); + ws[2] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[2], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[3]); + word3_muladd(&w2, &w1, &w0, ws[1], p[2]); + word3_muladd(&w2, &w1, &w0, ws[2], p[1]); + word3_add(&w2, &w1, &w0, z[3]); + ws[3] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[3], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[4]); + word3_muladd(&w2, &w1, &w0, ws[1], p[3]); + word3_muladd(&w2, &w1, &w0, ws[2], p[2]); + word3_muladd(&w2, &w1, &w0, ws[3], p[1]); + word3_add(&w2, &w1, &w0, z[4]); + ws[4] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[4], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[5]); + word3_muladd(&w2, &w1, &w0, ws[1], p[4]); + word3_muladd(&w2, &w1, &w0, ws[2], p[3]); + word3_muladd(&w2, &w1, &w0, ws[3], p[2]); + word3_muladd(&w2, &w1, &w0, ws[4], p[1]); + word3_add(&w2, &w1, &w0, z[5]); + ws[5] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[5], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[6]); + word3_muladd(&w2, &w1, &w0, ws[1], p[5]); + word3_muladd(&w2, &w1, &w0, ws[2], p[4]); + word3_muladd(&w2, &w1, &w0, ws[3], p[3]); + word3_muladd(&w2, &w1, &w0, ws[4], p[2]); + word3_muladd(&w2, &w1, &w0, ws[5], p[1]); + word3_add(&w2, &w1, &w0, z[6]); + ws[6] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[6], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[7]); + word3_muladd(&w2, &w1, &w0, ws[1], p[6]); + word3_muladd(&w2, &w1, &w0, ws[2], p[5]); + word3_muladd(&w2, &w1, &w0, ws[3], p[4]); + word3_muladd(&w2, &w1, &w0, ws[4], p[3]); + word3_muladd(&w2, &w1, &w0, ws[5], p[2]); + word3_muladd(&w2, &w1, &w0, ws[6], p[1]); + word3_add(&w2, &w1, &w0, z[7]); + ws[7] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[7], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[8]); + word3_muladd(&w2, &w1, &w0, ws[1], p[7]); + word3_muladd(&w2, &w1, &w0, ws[2], p[6]); + word3_muladd(&w2, &w1, &w0, ws[3], p[5]); + word3_muladd(&w2, &w1, &w0, ws[4], p[4]); + word3_muladd(&w2, &w1, &w0, ws[5], p[3]); + word3_muladd(&w2, &w1, &w0, ws[6], p[2]); + word3_muladd(&w2, &w1, &w0, ws[7], p[1]); + word3_add(&w2, &w1, &w0, z[8]); + ws[8] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[8], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[9]); + word3_muladd(&w2, &w1, &w0, ws[1], p[8]); + word3_muladd(&w2, &w1, &w0, ws[2], p[7]); + word3_muladd(&w2, &w1, &w0, ws[3], p[6]); + word3_muladd(&w2, &w1, &w0, ws[4], p[5]); + word3_muladd(&w2, &w1, &w0, ws[5], p[4]); + word3_muladd(&w2, &w1, &w0, ws[6], p[3]); + word3_muladd(&w2, &w1, &w0, ws[7], p[2]); + word3_muladd(&w2, &w1, &w0, ws[8], p[1]); + word3_add(&w2, &w1, &w0, z[9]); + ws[9] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[9], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[10]); + word3_muladd(&w2, &w1, &w0, ws[1], p[9]); + word3_muladd(&w2, &w1, &w0, ws[2], p[8]); + word3_muladd(&w2, &w1, &w0, ws[3], p[7]); + word3_muladd(&w2, &w1, &w0, ws[4], p[6]); + word3_muladd(&w2, &w1, &w0, ws[5], p[5]); + word3_muladd(&w2, &w1, &w0, ws[6], p[4]); + word3_muladd(&w2, &w1, &w0, ws[7], p[3]); + word3_muladd(&w2, &w1, &w0, ws[8], p[2]); + word3_muladd(&w2, &w1, &w0, ws[9], p[1]); + word3_add(&w2, &w1, &w0, z[10]); + ws[10] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[10], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[11]); + word3_muladd(&w2, &w1, &w0, ws[1], p[10]); + word3_muladd(&w2, &w1, &w0, ws[2], p[9]); + word3_muladd(&w2, &w1, &w0, ws[3], p[8]); + word3_muladd(&w2, &w1, &w0, ws[4], p[7]); + word3_muladd(&w2, &w1, &w0, ws[5], p[6]); + word3_muladd(&w2, &w1, &w0, ws[6], p[5]); + word3_muladd(&w2, &w1, &w0, ws[7], p[4]); + word3_muladd(&w2, &w1, &w0, ws[8], p[3]); + word3_muladd(&w2, &w1, &w0, ws[9], p[2]); + word3_muladd(&w2, &w1, &w0, ws[10], p[1]); + word3_add(&w2, &w1, &w0, z[11]); + ws[11] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[11], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[12]); + word3_muladd(&w2, &w1, &w0, ws[1], p[11]); + word3_muladd(&w2, &w1, &w0, ws[2], p[10]); + word3_muladd(&w2, &w1, &w0, ws[3], p[9]); + word3_muladd(&w2, &w1, &w0, ws[4], p[8]); + word3_muladd(&w2, &w1, &w0, ws[5], p[7]); + word3_muladd(&w2, &w1, &w0, ws[6], p[6]); + word3_muladd(&w2, &w1, &w0, ws[7], p[5]); + word3_muladd(&w2, &w1, &w0, ws[8], p[4]); + word3_muladd(&w2, &w1, &w0, ws[9], p[3]); + word3_muladd(&w2, &w1, &w0, ws[10], p[2]); + word3_muladd(&w2, &w1, &w0, ws[11], p[1]); + word3_add(&w2, &w1, &w0, z[12]); + ws[12] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[12], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[13]); + word3_muladd(&w2, &w1, &w0, ws[1], p[12]); + word3_muladd(&w2, &w1, &w0, ws[2], p[11]); + word3_muladd(&w2, &w1, &w0, ws[3], p[10]); + word3_muladd(&w2, &w1, &w0, ws[4], p[9]); + word3_muladd(&w2, &w1, &w0, ws[5], p[8]); + word3_muladd(&w2, &w1, &w0, ws[6], p[7]); + word3_muladd(&w2, &w1, &w0, ws[7], p[6]); + word3_muladd(&w2, &w1, &w0, ws[8], p[5]); + word3_muladd(&w2, &w1, &w0, ws[9], p[4]); + word3_muladd(&w2, &w1, &w0, ws[10], p[3]); + word3_muladd(&w2, &w1, &w0, ws[11], p[2]); + word3_muladd(&w2, &w1, &w0, ws[12], p[1]); + word3_add(&w2, &w1, &w0, z[13]); + ws[13] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[13], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[14]); + word3_muladd(&w2, &w1, &w0, ws[1], p[13]); + word3_muladd(&w2, &w1, &w0, ws[2], p[12]); + word3_muladd(&w2, &w1, &w0, ws[3], p[11]); + word3_muladd(&w2, &w1, &w0, ws[4], p[10]); + word3_muladd(&w2, &w1, &w0, ws[5], p[9]); + word3_muladd(&w2, &w1, &w0, ws[6], p[8]); + word3_muladd(&w2, &w1, &w0, ws[7], p[7]); + word3_muladd(&w2, &w1, &w0, ws[8], p[6]); + word3_muladd(&w2, &w1, &w0, ws[9], p[5]); + word3_muladd(&w2, &w1, &w0, ws[10], p[4]); + word3_muladd(&w2, &w1, &w0, ws[11], p[3]); + word3_muladd(&w2, &w1, &w0, ws[12], p[2]); + word3_muladd(&w2, &w1, &w0, ws[13], p[1]); + word3_add(&w2, &w1, &w0, z[14]); + ws[14] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[14], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[15]); + word3_muladd(&w2, &w1, &w0, ws[1], p[14]); + word3_muladd(&w2, &w1, &w0, ws[2], p[13]); + word3_muladd(&w2, &w1, &w0, ws[3], p[12]); + word3_muladd(&w2, &w1, &w0, ws[4], p[11]); + word3_muladd(&w2, &w1, &w0, ws[5], p[10]); + word3_muladd(&w2, &w1, &w0, ws[6], p[9]); + word3_muladd(&w2, &w1, &w0, ws[7], p[8]); + word3_muladd(&w2, &w1, &w0, ws[8], p[7]); + word3_muladd(&w2, &w1, &w0, ws[9], p[6]); + word3_muladd(&w2, &w1, &w0, ws[10], p[5]); + word3_muladd(&w2, &w1, &w0, ws[11], p[4]); + word3_muladd(&w2, &w1, &w0, ws[12], p[3]); + word3_muladd(&w2, &w1, &w0, ws[13], p[2]); + word3_muladd(&w2, &w1, &w0, ws[14], p[1]); + word3_add(&w2, &w1, &w0, z[15]); + ws[15] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[15], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[16]); + word3_muladd(&w2, &w1, &w0, ws[1], p[15]); + word3_muladd(&w2, &w1, &w0, ws[2], p[14]); + word3_muladd(&w2, &w1, &w0, ws[3], p[13]); + word3_muladd(&w2, &w1, &w0, ws[4], p[12]); + word3_muladd(&w2, &w1, &w0, ws[5], p[11]); + word3_muladd(&w2, &w1, &w0, ws[6], p[10]); + word3_muladd(&w2, &w1, &w0, ws[7], p[9]); + word3_muladd(&w2, &w1, &w0, ws[8], p[8]); + word3_muladd(&w2, &w1, &w0, ws[9], p[7]); + word3_muladd(&w2, &w1, &w0, ws[10], p[6]); + word3_muladd(&w2, &w1, &w0, ws[11], p[5]); + word3_muladd(&w2, &w1, &w0, ws[12], p[4]); + word3_muladd(&w2, &w1, &w0, ws[13], p[3]); + word3_muladd(&w2, &w1, &w0, ws[14], p[2]); + word3_muladd(&w2, &w1, &w0, ws[15], p[1]); + word3_add(&w2, &w1, &w0, z[16]); + ws[16] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[16], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[17]); + word3_muladd(&w2, &w1, &w0, ws[1], p[16]); + word3_muladd(&w2, &w1, &w0, ws[2], p[15]); + word3_muladd(&w2, &w1, &w0, ws[3], p[14]); + word3_muladd(&w2, &w1, &w0, ws[4], p[13]); + word3_muladd(&w2, &w1, &w0, ws[5], p[12]); + word3_muladd(&w2, &w1, &w0, ws[6], p[11]); + word3_muladd(&w2, &w1, &w0, ws[7], p[10]); + word3_muladd(&w2, &w1, &w0, ws[8], p[9]); + word3_muladd(&w2, &w1, &w0, ws[9], p[8]); + word3_muladd(&w2, &w1, &w0, ws[10], p[7]); + word3_muladd(&w2, &w1, &w0, ws[11], p[6]); + word3_muladd(&w2, &w1, &w0, ws[12], p[5]); + word3_muladd(&w2, &w1, &w0, ws[13], p[4]); + word3_muladd(&w2, &w1, &w0, ws[14], p[3]); + word3_muladd(&w2, &w1, &w0, ws[15], p[2]); + word3_muladd(&w2, &w1, &w0, ws[16], p[1]); + word3_add(&w2, &w1, &w0, z[17]); + ws[17] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[17], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[18]); + word3_muladd(&w2, &w1, &w0, ws[1], p[17]); + word3_muladd(&w2, &w1, &w0, ws[2], p[16]); + word3_muladd(&w2, &w1, &w0, ws[3], p[15]); + word3_muladd(&w2, &w1, &w0, ws[4], p[14]); + word3_muladd(&w2, &w1, &w0, ws[5], p[13]); + word3_muladd(&w2, &w1, &w0, ws[6], p[12]); + word3_muladd(&w2, &w1, &w0, ws[7], p[11]); + word3_muladd(&w2, &w1, &w0, ws[8], p[10]); + word3_muladd(&w2, &w1, &w0, ws[9], p[9]); + word3_muladd(&w2, &w1, &w0, ws[10], p[8]); + word3_muladd(&w2, &w1, &w0, ws[11], p[7]); + word3_muladd(&w2, &w1, &w0, ws[12], p[6]); + word3_muladd(&w2, &w1, &w0, ws[13], p[5]); + word3_muladd(&w2, &w1, &w0, ws[14], p[4]); + word3_muladd(&w2, &w1, &w0, ws[15], p[3]); + word3_muladd(&w2, &w1, &w0, ws[16], p[2]); + word3_muladd(&w2, &w1, &w0, ws[17], p[1]); + word3_add(&w2, &w1, &w0, z[18]); + ws[18] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[18], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[19]); + word3_muladd(&w2, &w1, &w0, ws[1], p[18]); + word3_muladd(&w2, &w1, &w0, ws[2], p[17]); + word3_muladd(&w2, &w1, &w0, ws[3], p[16]); + word3_muladd(&w2, &w1, &w0, ws[4], p[15]); + word3_muladd(&w2, &w1, &w0, ws[5], p[14]); + word3_muladd(&w2, &w1, &w0, ws[6], p[13]); + word3_muladd(&w2, &w1, &w0, ws[7], p[12]); + word3_muladd(&w2, &w1, &w0, ws[8], p[11]); + word3_muladd(&w2, &w1, &w0, ws[9], p[10]); + word3_muladd(&w2, &w1, &w0, ws[10], p[9]); + word3_muladd(&w2, &w1, &w0, ws[11], p[8]); + word3_muladd(&w2, &w1, &w0, ws[12], p[7]); + word3_muladd(&w2, &w1, &w0, ws[13], p[6]); + word3_muladd(&w2, &w1, &w0, ws[14], p[5]); + word3_muladd(&w2, &w1, &w0, ws[15], p[4]); + word3_muladd(&w2, &w1, &w0, ws[16], p[3]); + word3_muladd(&w2, &w1, &w0, ws[17], p[2]); + word3_muladd(&w2, &w1, &w0, ws[18], p[1]); + word3_add(&w2, &w1, &w0, z[19]); + ws[19] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[19], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[20]); + word3_muladd(&w2, &w1, &w0, ws[1], p[19]); + word3_muladd(&w2, &w1, &w0, ws[2], p[18]); + word3_muladd(&w2, &w1, &w0, ws[3], p[17]); + word3_muladd(&w2, &w1, &w0, ws[4], p[16]); + word3_muladd(&w2, &w1, &w0, ws[5], p[15]); + word3_muladd(&w2, &w1, &w0, ws[6], p[14]); + word3_muladd(&w2, &w1, &w0, ws[7], p[13]); + word3_muladd(&w2, &w1, &w0, ws[8], p[12]); + word3_muladd(&w2, &w1, &w0, ws[9], p[11]); + word3_muladd(&w2, &w1, &w0, ws[10], p[10]); + word3_muladd(&w2, &w1, &w0, ws[11], p[9]); + word3_muladd(&w2, &w1, &w0, ws[12], p[8]); + word3_muladd(&w2, &w1, &w0, ws[13], p[7]); + word3_muladd(&w2, &w1, &w0, ws[14], p[6]); + word3_muladd(&w2, &w1, &w0, ws[15], p[5]); + word3_muladd(&w2, &w1, &w0, ws[16], p[4]); + word3_muladd(&w2, &w1, &w0, ws[17], p[3]); + word3_muladd(&w2, &w1, &w0, ws[18], p[2]); + word3_muladd(&w2, &w1, &w0, ws[19], p[1]); + word3_add(&w2, &w1, &w0, z[20]); + ws[20] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[20], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[21]); + word3_muladd(&w2, &w1, &w0, ws[1], p[20]); + word3_muladd(&w2, &w1, &w0, ws[2], p[19]); + word3_muladd(&w2, &w1, &w0, ws[3], p[18]); + word3_muladd(&w2, &w1, &w0, ws[4], p[17]); + word3_muladd(&w2, &w1, &w0, ws[5], p[16]); + word3_muladd(&w2, &w1, &w0, ws[6], p[15]); + word3_muladd(&w2, &w1, &w0, ws[7], p[14]); + word3_muladd(&w2, &w1, &w0, ws[8], p[13]); + word3_muladd(&w2, &w1, &w0, ws[9], p[12]); + word3_muladd(&w2, &w1, &w0, ws[10], p[11]); + word3_muladd(&w2, &w1, &w0, ws[11], p[10]); + word3_muladd(&w2, &w1, &w0, ws[12], p[9]); + word3_muladd(&w2, &w1, &w0, ws[13], p[8]); + word3_muladd(&w2, &w1, &w0, ws[14], p[7]); + word3_muladd(&w2, &w1, &w0, ws[15], p[6]); + word3_muladd(&w2, &w1, &w0, ws[16], p[5]); + word3_muladd(&w2, &w1, &w0, ws[17], p[4]); + word3_muladd(&w2, &w1, &w0, ws[18], p[3]); + word3_muladd(&w2, &w1, &w0, ws[19], p[2]); + word3_muladd(&w2, &w1, &w0, ws[20], p[1]); + word3_add(&w2, &w1, &w0, z[21]); + ws[21] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[21], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[22]); + word3_muladd(&w2, &w1, &w0, ws[1], p[21]); + word3_muladd(&w2, &w1, &w0, ws[2], p[20]); + word3_muladd(&w2, &w1, &w0, ws[3], p[19]); + word3_muladd(&w2, &w1, &w0, ws[4], p[18]); + word3_muladd(&w2, &w1, &w0, ws[5], p[17]); + word3_muladd(&w2, &w1, &w0, ws[6], p[16]); + word3_muladd(&w2, &w1, &w0, ws[7], p[15]); + word3_muladd(&w2, &w1, &w0, ws[8], p[14]); + word3_muladd(&w2, &w1, &w0, ws[9], p[13]); + word3_muladd(&w2, &w1, &w0, ws[10], p[12]); + word3_muladd(&w2, &w1, &w0, ws[11], p[11]); + word3_muladd(&w2, &w1, &w0, ws[12], p[10]); + word3_muladd(&w2, &w1, &w0, ws[13], p[9]); + word3_muladd(&w2, &w1, &w0, ws[14], p[8]); + word3_muladd(&w2, &w1, &w0, ws[15], p[7]); + word3_muladd(&w2, &w1, &w0, ws[16], p[6]); + word3_muladd(&w2, &w1, &w0, ws[17], p[5]); + word3_muladd(&w2, &w1, &w0, ws[18], p[4]); + word3_muladd(&w2, &w1, &w0, ws[19], p[3]); + word3_muladd(&w2, &w1, &w0, ws[20], p[2]); + word3_muladd(&w2, &w1, &w0, ws[21], p[1]); + word3_add(&w2, &w1, &w0, z[22]); + ws[22] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[22], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[23]); + word3_muladd(&w2, &w1, &w0, ws[1], p[22]); + word3_muladd(&w2, &w1, &w0, ws[2], p[21]); + word3_muladd(&w2, &w1, &w0, ws[3], p[20]); + word3_muladd(&w2, &w1, &w0, ws[4], p[19]); + word3_muladd(&w2, &w1, &w0, ws[5], p[18]); + word3_muladd(&w2, &w1, &w0, ws[6], p[17]); + word3_muladd(&w2, &w1, &w0, ws[7], p[16]); + word3_muladd(&w2, &w1, &w0, ws[8], p[15]); + word3_muladd(&w2, &w1, &w0, ws[9], p[14]); + word3_muladd(&w2, &w1, &w0, ws[10], p[13]); + word3_muladd(&w2, &w1, &w0, ws[11], p[12]); + word3_muladd(&w2, &w1, &w0, ws[12], p[11]); + word3_muladd(&w2, &w1, &w0, ws[13], p[10]); + word3_muladd(&w2, &w1, &w0, ws[14], p[9]); + word3_muladd(&w2, &w1, &w0, ws[15], p[8]); + word3_muladd(&w2, &w1, &w0, ws[16], p[7]); + word3_muladd(&w2, &w1, &w0, ws[17], p[6]); + word3_muladd(&w2, &w1, &w0, ws[18], p[5]); + word3_muladd(&w2, &w1, &w0, ws[19], p[4]); + word3_muladd(&w2, &w1, &w0, ws[20], p[3]); + word3_muladd(&w2, &w1, &w0, ws[21], p[2]); + word3_muladd(&w2, &w1, &w0, ws[22], p[1]); + word3_add(&w2, &w1, &w0, z[23]); + ws[23] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[23], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[1], p[23]); + word3_muladd(&w2, &w1, &w0, ws[2], p[22]); + word3_muladd(&w2, &w1, &w0, ws[3], p[21]); + word3_muladd(&w2, &w1, &w0, ws[4], p[20]); + word3_muladd(&w2, &w1, &w0, ws[5], p[19]); + word3_muladd(&w2, &w1, &w0, ws[6], p[18]); + word3_muladd(&w2, &w1, &w0, ws[7], p[17]); + word3_muladd(&w2, &w1, &w0, ws[8], p[16]); + word3_muladd(&w2, &w1, &w0, ws[9], p[15]); + word3_muladd(&w2, &w1, &w0, ws[10], p[14]); + word3_muladd(&w2, &w1, &w0, ws[11], p[13]); + word3_muladd(&w2, &w1, &w0, ws[12], p[12]); + word3_muladd(&w2, &w1, &w0, ws[13], p[11]); + word3_muladd(&w2, &w1, &w0, ws[14], p[10]); + word3_muladd(&w2, &w1, &w0, ws[15], p[9]); + word3_muladd(&w2, &w1, &w0, ws[16], p[8]); + word3_muladd(&w2, &w1, &w0, ws[17], p[7]); + word3_muladd(&w2, &w1, &w0, ws[18], p[6]); + word3_muladd(&w2, &w1, &w0, ws[19], p[5]); + word3_muladd(&w2, &w1, &w0, ws[20], p[4]); + word3_muladd(&w2, &w1, &w0, ws[21], p[3]); + word3_muladd(&w2, &w1, &w0, ws[22], p[2]); + word3_muladd(&w2, &w1, &w0, ws[23], p[1]); + word3_add(&w2, &w1, &w0, z[24]); + ws[0] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[2], p[23]); + word3_muladd(&w2, &w1, &w0, ws[3], p[22]); + word3_muladd(&w2, &w1, &w0, ws[4], p[21]); + word3_muladd(&w2, &w1, &w0, ws[5], p[20]); + word3_muladd(&w2, &w1, &w0, ws[6], p[19]); + word3_muladd(&w2, &w1, &w0, ws[7], p[18]); + word3_muladd(&w2, &w1, &w0, ws[8], p[17]); + word3_muladd(&w2, &w1, &w0, ws[9], p[16]); + word3_muladd(&w2, &w1, &w0, ws[10], p[15]); + word3_muladd(&w2, &w1, &w0, ws[11], p[14]); + word3_muladd(&w2, &w1, &w0, ws[12], p[13]); + word3_muladd(&w2, &w1, &w0, ws[13], p[12]); + word3_muladd(&w2, &w1, &w0, ws[14], p[11]); + word3_muladd(&w2, &w1, &w0, ws[15], p[10]); + word3_muladd(&w2, &w1, &w0, ws[16], p[9]); + word3_muladd(&w2, &w1, &w0, ws[17], p[8]); + word3_muladd(&w2, &w1, &w0, ws[18], p[7]); + word3_muladd(&w2, &w1, &w0, ws[19], p[6]); + word3_muladd(&w2, &w1, &w0, ws[20], p[5]); + word3_muladd(&w2, &w1, &w0, ws[21], p[4]); + word3_muladd(&w2, &w1, &w0, ws[22], p[3]); + word3_muladd(&w2, &w1, &w0, ws[23], p[2]); + word3_add(&w2, &w1, &w0, z[25]); + ws[1] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[3], p[23]); + word3_muladd(&w2, &w1, &w0, ws[4], p[22]); + word3_muladd(&w2, &w1, &w0, ws[5], p[21]); + word3_muladd(&w2, &w1, &w0, ws[6], p[20]); + word3_muladd(&w2, &w1, &w0, ws[7], p[19]); + word3_muladd(&w2, &w1, &w0, ws[8], p[18]); + word3_muladd(&w2, &w1, &w0, ws[9], p[17]); + word3_muladd(&w2, &w1, &w0, ws[10], p[16]); + word3_muladd(&w2, &w1, &w0, ws[11], p[15]); + word3_muladd(&w2, &w1, &w0, ws[12], p[14]); + word3_muladd(&w2, &w1, &w0, ws[13], p[13]); + word3_muladd(&w2, &w1, &w0, ws[14], p[12]); + word3_muladd(&w2, &w1, &w0, ws[15], p[11]); + word3_muladd(&w2, &w1, &w0, ws[16], p[10]); + word3_muladd(&w2, &w1, &w0, ws[17], p[9]); + word3_muladd(&w2, &w1, &w0, ws[18], p[8]); + word3_muladd(&w2, &w1, &w0, ws[19], p[7]); + word3_muladd(&w2, &w1, &w0, ws[20], p[6]); + word3_muladd(&w2, &w1, &w0, ws[21], p[5]); + word3_muladd(&w2, &w1, &w0, ws[22], p[4]); + word3_muladd(&w2, &w1, &w0, ws[23], p[3]); + word3_add(&w2, &w1, &w0, z[26]); + ws[2] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[4], p[23]); + word3_muladd(&w2, &w1, &w0, ws[5], p[22]); + word3_muladd(&w2, &w1, &w0, ws[6], p[21]); + word3_muladd(&w2, &w1, &w0, ws[7], p[20]); + word3_muladd(&w2, &w1, &w0, ws[8], p[19]); + word3_muladd(&w2, &w1, &w0, ws[9], p[18]); + word3_muladd(&w2, &w1, &w0, ws[10], p[17]); + word3_muladd(&w2, &w1, &w0, ws[11], p[16]); + word3_muladd(&w2, &w1, &w0, ws[12], p[15]); + word3_muladd(&w2, &w1, &w0, ws[13], p[14]); + word3_muladd(&w2, &w1, &w0, ws[14], p[13]); + word3_muladd(&w2, &w1, &w0, ws[15], p[12]); + word3_muladd(&w2, &w1, &w0, ws[16], p[11]); + word3_muladd(&w2, &w1, &w0, ws[17], p[10]); + word3_muladd(&w2, &w1, &w0, ws[18], p[9]); + word3_muladd(&w2, &w1, &w0, ws[19], p[8]); + word3_muladd(&w2, &w1, &w0, ws[20], p[7]); + word3_muladd(&w2, &w1, &w0, ws[21], p[6]); + word3_muladd(&w2, &w1, &w0, ws[22], p[5]); + word3_muladd(&w2, &w1, &w0, ws[23], p[4]); + word3_add(&w2, &w1, &w0, z[27]); + ws[3] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[5], p[23]); + word3_muladd(&w2, &w1, &w0, ws[6], p[22]); + word3_muladd(&w2, &w1, &w0, ws[7], p[21]); + word3_muladd(&w2, &w1, &w0, ws[8], p[20]); + word3_muladd(&w2, &w1, &w0, ws[9], p[19]); + word3_muladd(&w2, &w1, &w0, ws[10], p[18]); + word3_muladd(&w2, &w1, &w0, ws[11], p[17]); + word3_muladd(&w2, &w1, &w0, ws[12], p[16]); + word3_muladd(&w2, &w1, &w0, ws[13], p[15]); + word3_muladd(&w2, &w1, &w0, ws[14], p[14]); + word3_muladd(&w2, &w1, &w0, ws[15], p[13]); + word3_muladd(&w2, &w1, &w0, ws[16], p[12]); + word3_muladd(&w2, &w1, &w0, ws[17], p[11]); + word3_muladd(&w2, &w1, &w0, ws[18], p[10]); + word3_muladd(&w2, &w1, &w0, ws[19], p[9]); + word3_muladd(&w2, &w1, &w0, ws[20], p[8]); + word3_muladd(&w2, &w1, &w0, ws[21], p[7]); + word3_muladd(&w2, &w1, &w0, ws[22], p[6]); + word3_muladd(&w2, &w1, &w0, ws[23], p[5]); + word3_add(&w2, &w1, &w0, z[28]); + ws[4] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[6], p[23]); + word3_muladd(&w2, &w1, &w0, ws[7], p[22]); + word3_muladd(&w2, &w1, &w0, ws[8], p[21]); + word3_muladd(&w2, &w1, &w0, ws[9], p[20]); + word3_muladd(&w2, &w1, &w0, ws[10], p[19]); + word3_muladd(&w2, &w1, &w0, ws[11], p[18]); + word3_muladd(&w2, &w1, &w0, ws[12], p[17]); + word3_muladd(&w2, &w1, &w0, ws[13], p[16]); + word3_muladd(&w2, &w1, &w0, ws[14], p[15]); + word3_muladd(&w2, &w1, &w0, ws[15], p[14]); + word3_muladd(&w2, &w1, &w0, ws[16], p[13]); + word3_muladd(&w2, &w1, &w0, ws[17], p[12]); + word3_muladd(&w2, &w1, &w0, ws[18], p[11]); + word3_muladd(&w2, &w1, &w0, ws[19], p[10]); + word3_muladd(&w2, &w1, &w0, ws[20], p[9]); + word3_muladd(&w2, &w1, &w0, ws[21], p[8]); + word3_muladd(&w2, &w1, &w0, ws[22], p[7]); + word3_muladd(&w2, &w1, &w0, ws[23], p[6]); + word3_add(&w2, &w1, &w0, z[29]); + ws[5] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[7], p[23]); + word3_muladd(&w2, &w1, &w0, ws[8], p[22]); + word3_muladd(&w2, &w1, &w0, ws[9], p[21]); + word3_muladd(&w2, &w1, &w0, ws[10], p[20]); + word3_muladd(&w2, &w1, &w0, ws[11], p[19]); + word3_muladd(&w2, &w1, &w0, ws[12], p[18]); + word3_muladd(&w2, &w1, &w0, ws[13], p[17]); + word3_muladd(&w2, &w1, &w0, ws[14], p[16]); + word3_muladd(&w2, &w1, &w0, ws[15], p[15]); + word3_muladd(&w2, &w1, &w0, ws[16], p[14]); + word3_muladd(&w2, &w1, &w0, ws[17], p[13]); + word3_muladd(&w2, &w1, &w0, ws[18], p[12]); + word3_muladd(&w2, &w1, &w0, ws[19], p[11]); + word3_muladd(&w2, &w1, &w0, ws[20], p[10]); + word3_muladd(&w2, &w1, &w0, ws[21], p[9]); + word3_muladd(&w2, &w1, &w0, ws[22], p[8]); + word3_muladd(&w2, &w1, &w0, ws[23], p[7]); + word3_add(&w2, &w1, &w0, z[30]); + ws[6] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[8], p[23]); + word3_muladd(&w2, &w1, &w0, ws[9], p[22]); + word3_muladd(&w2, &w1, &w0, ws[10], p[21]); + word3_muladd(&w2, &w1, &w0, ws[11], p[20]); + word3_muladd(&w2, &w1, &w0, ws[12], p[19]); + word3_muladd(&w2, &w1, &w0, ws[13], p[18]); + word3_muladd(&w2, &w1, &w0, ws[14], p[17]); + word3_muladd(&w2, &w1, &w0, ws[15], p[16]); + word3_muladd(&w2, &w1, &w0, ws[16], p[15]); + word3_muladd(&w2, &w1, &w0, ws[17], p[14]); + word3_muladd(&w2, &w1, &w0, ws[18], p[13]); + word3_muladd(&w2, &w1, &w0, ws[19], p[12]); + word3_muladd(&w2, &w1, &w0, ws[20], p[11]); + word3_muladd(&w2, &w1, &w0, ws[21], p[10]); + word3_muladd(&w2, &w1, &w0, ws[22], p[9]); + word3_muladd(&w2, &w1, &w0, ws[23], p[8]); + word3_add(&w2, &w1, &w0, z[31]); + ws[7] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[9], p[23]); + word3_muladd(&w2, &w1, &w0, ws[10], p[22]); + word3_muladd(&w2, &w1, &w0, ws[11], p[21]); + word3_muladd(&w2, &w1, &w0, ws[12], p[20]); + word3_muladd(&w2, &w1, &w0, ws[13], p[19]); + word3_muladd(&w2, &w1, &w0, ws[14], p[18]); + word3_muladd(&w2, &w1, &w0, ws[15], p[17]); + word3_muladd(&w2, &w1, &w0, ws[16], p[16]); + word3_muladd(&w2, &w1, &w0, ws[17], p[15]); + word3_muladd(&w2, &w1, &w0, ws[18], p[14]); + word3_muladd(&w2, &w1, &w0, ws[19], p[13]); + word3_muladd(&w2, &w1, &w0, ws[20], p[12]); + word3_muladd(&w2, &w1, &w0, ws[21], p[11]); + word3_muladd(&w2, &w1, &w0, ws[22], p[10]); + word3_muladd(&w2, &w1, &w0, ws[23], p[9]); + word3_add(&w2, &w1, &w0, z[32]); + ws[8] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[10], p[23]); + word3_muladd(&w2, &w1, &w0, ws[11], p[22]); + word3_muladd(&w2, &w1, &w0, ws[12], p[21]); + word3_muladd(&w2, &w1, &w0, ws[13], p[20]); + word3_muladd(&w2, &w1, &w0, ws[14], p[19]); + word3_muladd(&w2, &w1, &w0, ws[15], p[18]); + word3_muladd(&w2, &w1, &w0, ws[16], p[17]); + word3_muladd(&w2, &w1, &w0, ws[17], p[16]); + word3_muladd(&w2, &w1, &w0, ws[18], p[15]); + word3_muladd(&w2, &w1, &w0, ws[19], p[14]); + word3_muladd(&w2, &w1, &w0, ws[20], p[13]); + word3_muladd(&w2, &w1, &w0, ws[21], p[12]); + word3_muladd(&w2, &w1, &w0, ws[22], p[11]); + word3_muladd(&w2, &w1, &w0, ws[23], p[10]); + word3_add(&w2, &w1, &w0, z[33]); + ws[9] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[11], p[23]); + word3_muladd(&w2, &w1, &w0, ws[12], p[22]); + word3_muladd(&w2, &w1, &w0, ws[13], p[21]); + word3_muladd(&w2, &w1, &w0, ws[14], p[20]); + word3_muladd(&w2, &w1, &w0, ws[15], p[19]); + word3_muladd(&w2, &w1, &w0, ws[16], p[18]); + word3_muladd(&w2, &w1, &w0, ws[17], p[17]); + word3_muladd(&w2, &w1, &w0, ws[18], p[16]); + word3_muladd(&w2, &w1, &w0, ws[19], p[15]); + word3_muladd(&w2, &w1, &w0, ws[20], p[14]); + word3_muladd(&w2, &w1, &w0, ws[21], p[13]); + word3_muladd(&w2, &w1, &w0, ws[22], p[12]); + word3_muladd(&w2, &w1, &w0, ws[23], p[11]); + word3_add(&w2, &w1, &w0, z[34]); + ws[10] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[12], p[23]); + word3_muladd(&w2, &w1, &w0, ws[13], p[22]); + word3_muladd(&w2, &w1, &w0, ws[14], p[21]); + word3_muladd(&w2, &w1, &w0, ws[15], p[20]); + word3_muladd(&w2, &w1, &w0, ws[16], p[19]); + word3_muladd(&w2, &w1, &w0, ws[17], p[18]); + word3_muladd(&w2, &w1, &w0, ws[18], p[17]); + word3_muladd(&w2, &w1, &w0, ws[19], p[16]); + word3_muladd(&w2, &w1, &w0, ws[20], p[15]); + word3_muladd(&w2, &w1, &w0, ws[21], p[14]); + word3_muladd(&w2, &w1, &w0, ws[22], p[13]); + word3_muladd(&w2, &w1, &w0, ws[23], p[12]); + word3_add(&w2, &w1, &w0, z[35]); + ws[11] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[13], p[23]); + word3_muladd(&w2, &w1, &w0, ws[14], p[22]); + word3_muladd(&w2, &w1, &w0, ws[15], p[21]); + word3_muladd(&w2, &w1, &w0, ws[16], p[20]); + word3_muladd(&w2, &w1, &w0, ws[17], p[19]); + word3_muladd(&w2, &w1, &w0, ws[18], p[18]); + word3_muladd(&w2, &w1, &w0, ws[19], p[17]); + word3_muladd(&w2, &w1, &w0, ws[20], p[16]); + word3_muladd(&w2, &w1, &w0, ws[21], p[15]); + word3_muladd(&w2, &w1, &w0, ws[22], p[14]); + word3_muladd(&w2, &w1, &w0, ws[23], p[13]); + word3_add(&w2, &w1, &w0, z[36]); + ws[12] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[14], p[23]); + word3_muladd(&w2, &w1, &w0, ws[15], p[22]); + word3_muladd(&w2, &w1, &w0, ws[16], p[21]); + word3_muladd(&w2, &w1, &w0, ws[17], p[20]); + word3_muladd(&w2, &w1, &w0, ws[18], p[19]); + word3_muladd(&w2, &w1, &w0, ws[19], p[18]); + word3_muladd(&w2, &w1, &w0, ws[20], p[17]); + word3_muladd(&w2, &w1, &w0, ws[21], p[16]); + word3_muladd(&w2, &w1, &w0, ws[22], p[15]); + word3_muladd(&w2, &w1, &w0, ws[23], p[14]); + word3_add(&w2, &w1, &w0, z[37]); + ws[13] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[15], p[23]); + word3_muladd(&w2, &w1, &w0, ws[16], p[22]); + word3_muladd(&w2, &w1, &w0, ws[17], p[21]); + word3_muladd(&w2, &w1, &w0, ws[18], p[20]); + word3_muladd(&w2, &w1, &w0, ws[19], p[19]); + word3_muladd(&w2, &w1, &w0, ws[20], p[18]); + word3_muladd(&w2, &w1, &w0, ws[21], p[17]); + word3_muladd(&w2, &w1, &w0, ws[22], p[16]); + word3_muladd(&w2, &w1, &w0, ws[23], p[15]); + word3_add(&w2, &w1, &w0, z[38]); + ws[14] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[16], p[23]); + word3_muladd(&w2, &w1, &w0, ws[17], p[22]); + word3_muladd(&w2, &w1, &w0, ws[18], p[21]); + word3_muladd(&w2, &w1, &w0, ws[19], p[20]); + word3_muladd(&w2, &w1, &w0, ws[20], p[19]); + word3_muladd(&w2, &w1, &w0, ws[21], p[18]); + word3_muladd(&w2, &w1, &w0, ws[22], p[17]); + word3_muladd(&w2, &w1, &w0, ws[23], p[16]); + word3_add(&w2, &w1, &w0, z[39]); + ws[15] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[17], p[23]); + word3_muladd(&w2, &w1, &w0, ws[18], p[22]); + word3_muladd(&w2, &w1, &w0, ws[19], p[21]); + word3_muladd(&w2, &w1, &w0, ws[20], p[20]); + word3_muladd(&w2, &w1, &w0, ws[21], p[19]); + word3_muladd(&w2, &w1, &w0, ws[22], p[18]); + word3_muladd(&w2, &w1, &w0, ws[23], p[17]); + word3_add(&w2, &w1, &w0, z[40]); + ws[16] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[18], p[23]); + word3_muladd(&w2, &w1, &w0, ws[19], p[22]); + word3_muladd(&w2, &w1, &w0, ws[20], p[21]); + word3_muladd(&w2, &w1, &w0, ws[21], p[20]); + word3_muladd(&w2, &w1, &w0, ws[22], p[19]); + word3_muladd(&w2, &w1, &w0, ws[23], p[18]); + word3_add(&w2, &w1, &w0, z[41]); + ws[17] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[19], p[23]); + word3_muladd(&w2, &w1, &w0, ws[20], p[22]); + word3_muladd(&w2, &w1, &w0, ws[21], p[21]); + word3_muladd(&w2, &w1, &w0, ws[22], p[20]); + word3_muladd(&w2, &w1, &w0, ws[23], p[19]); + word3_add(&w2, &w1, &w0, z[42]); + ws[18] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[20], p[23]); + word3_muladd(&w2, &w1, &w0, ws[21], p[22]); + word3_muladd(&w2, &w1, &w0, ws[22], p[21]); + word3_muladd(&w2, &w1, &w0, ws[23], p[20]); + word3_add(&w2, &w1, &w0, z[43]); + ws[19] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[21], p[23]); + word3_muladd(&w2, &w1, &w0, ws[22], p[22]); + word3_muladd(&w2, &w1, &w0, ws[23], p[21]); + word3_add(&w2, &w1, &w0, z[44]); + ws[20] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[22], p[23]); + word3_muladd(&w2, &w1, &w0, ws[23], p[22]); + word3_add(&w2, &w1, &w0, z[45]); + ws[21] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[23], p[23]); + word3_add(&w2, &w1, &w0, z[46]); + ws[22] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_add(&w2, &w1, &w0, z[47]); + ws[23] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_add(&w2, &w1, &w0, z[49]); + ws[24] = w0; + ws[25] = w1; + word borrow = bigint_sub3(ws + 24 + 1, ws, 24 + 1, p, 24); + CT::conditional_copy_mem(borrow, z, ws, ws + 25, 25); + clear_mem(z + 24, 2*(24+1) - 24); + } + +void bigint_monty_redc_32(word z[], const word p[32], word p_dash, word ws[]) + { + word w2 = 0, w1 = 0, w0 = 0; + w0 = z[0]; + ws[0] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[0], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[1]); + word3_add(&w2, &w1, &w0, z[1]); + ws[1] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[1], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[2]); + word3_muladd(&w2, &w1, &w0, ws[1], p[1]); + word3_add(&w2, &w1, &w0, z[2]); + ws[2] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[2], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[3]); + word3_muladd(&w2, &w1, &w0, ws[1], p[2]); + word3_muladd(&w2, &w1, &w0, ws[2], p[1]); + word3_add(&w2, &w1, &w0, z[3]); + ws[3] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[3], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[4]); + word3_muladd(&w2, &w1, &w0, ws[1], p[3]); + word3_muladd(&w2, &w1, &w0, ws[2], p[2]); + word3_muladd(&w2, &w1, &w0, ws[3], p[1]); + word3_add(&w2, &w1, &w0, z[4]); + ws[4] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[4], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[5]); + word3_muladd(&w2, &w1, &w0, ws[1], p[4]); + word3_muladd(&w2, &w1, &w0, ws[2], p[3]); + word3_muladd(&w2, &w1, &w0, ws[3], p[2]); + word3_muladd(&w2, &w1, &w0, ws[4], p[1]); + word3_add(&w2, &w1, &w0, z[5]); + ws[5] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[5], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[6]); + word3_muladd(&w2, &w1, &w0, ws[1], p[5]); + word3_muladd(&w2, &w1, &w0, ws[2], p[4]); + word3_muladd(&w2, &w1, &w0, ws[3], p[3]); + word3_muladd(&w2, &w1, &w0, ws[4], p[2]); + word3_muladd(&w2, &w1, &w0, ws[5], p[1]); + word3_add(&w2, &w1, &w0, z[6]); + ws[6] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[6], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[7]); + word3_muladd(&w2, &w1, &w0, ws[1], p[6]); + word3_muladd(&w2, &w1, &w0, ws[2], p[5]); + word3_muladd(&w2, &w1, &w0, ws[3], p[4]); + word3_muladd(&w2, &w1, &w0, ws[4], p[3]); + word3_muladd(&w2, &w1, &w0, ws[5], p[2]); + word3_muladd(&w2, &w1, &w0, ws[6], p[1]); + word3_add(&w2, &w1, &w0, z[7]); + ws[7] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[7], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[8]); + word3_muladd(&w2, &w1, &w0, ws[1], p[7]); + word3_muladd(&w2, &w1, &w0, ws[2], p[6]); + word3_muladd(&w2, &w1, &w0, ws[3], p[5]); + word3_muladd(&w2, &w1, &w0, ws[4], p[4]); + word3_muladd(&w2, &w1, &w0, ws[5], p[3]); + word3_muladd(&w2, &w1, &w0, ws[6], p[2]); + word3_muladd(&w2, &w1, &w0, ws[7], p[1]); + word3_add(&w2, &w1, &w0, z[8]); + ws[8] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[8], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[9]); + word3_muladd(&w2, &w1, &w0, ws[1], p[8]); + word3_muladd(&w2, &w1, &w0, ws[2], p[7]); + word3_muladd(&w2, &w1, &w0, ws[3], p[6]); + word3_muladd(&w2, &w1, &w0, ws[4], p[5]); + word3_muladd(&w2, &w1, &w0, ws[5], p[4]); + word3_muladd(&w2, &w1, &w0, ws[6], p[3]); + word3_muladd(&w2, &w1, &w0, ws[7], p[2]); + word3_muladd(&w2, &w1, &w0, ws[8], p[1]); + word3_add(&w2, &w1, &w0, z[9]); + ws[9] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[9], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[10]); + word3_muladd(&w2, &w1, &w0, ws[1], p[9]); + word3_muladd(&w2, &w1, &w0, ws[2], p[8]); + word3_muladd(&w2, &w1, &w0, ws[3], p[7]); + word3_muladd(&w2, &w1, &w0, ws[4], p[6]); + word3_muladd(&w2, &w1, &w0, ws[5], p[5]); + word3_muladd(&w2, &w1, &w0, ws[6], p[4]); + word3_muladd(&w2, &w1, &w0, ws[7], p[3]); + word3_muladd(&w2, &w1, &w0, ws[8], p[2]); + word3_muladd(&w2, &w1, &w0, ws[9], p[1]); + word3_add(&w2, &w1, &w0, z[10]); + ws[10] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[10], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[11]); + word3_muladd(&w2, &w1, &w0, ws[1], p[10]); + word3_muladd(&w2, &w1, &w0, ws[2], p[9]); + word3_muladd(&w2, &w1, &w0, ws[3], p[8]); + word3_muladd(&w2, &w1, &w0, ws[4], p[7]); + word3_muladd(&w2, &w1, &w0, ws[5], p[6]); + word3_muladd(&w2, &w1, &w0, ws[6], p[5]); + word3_muladd(&w2, &w1, &w0, ws[7], p[4]); + word3_muladd(&w2, &w1, &w0, ws[8], p[3]); + word3_muladd(&w2, &w1, &w0, ws[9], p[2]); + word3_muladd(&w2, &w1, &w0, ws[10], p[1]); + word3_add(&w2, &w1, &w0, z[11]); + ws[11] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[11], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[12]); + word3_muladd(&w2, &w1, &w0, ws[1], p[11]); + word3_muladd(&w2, &w1, &w0, ws[2], p[10]); + word3_muladd(&w2, &w1, &w0, ws[3], p[9]); + word3_muladd(&w2, &w1, &w0, ws[4], p[8]); + word3_muladd(&w2, &w1, &w0, ws[5], p[7]); + word3_muladd(&w2, &w1, &w0, ws[6], p[6]); + word3_muladd(&w2, &w1, &w0, ws[7], p[5]); + word3_muladd(&w2, &w1, &w0, ws[8], p[4]); + word3_muladd(&w2, &w1, &w0, ws[9], p[3]); + word3_muladd(&w2, &w1, &w0, ws[10], p[2]); + word3_muladd(&w2, &w1, &w0, ws[11], p[1]); + word3_add(&w2, &w1, &w0, z[12]); + ws[12] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[12], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[13]); + word3_muladd(&w2, &w1, &w0, ws[1], p[12]); + word3_muladd(&w2, &w1, &w0, ws[2], p[11]); + word3_muladd(&w2, &w1, &w0, ws[3], p[10]); + word3_muladd(&w2, &w1, &w0, ws[4], p[9]); + word3_muladd(&w2, &w1, &w0, ws[5], p[8]); + word3_muladd(&w2, &w1, &w0, ws[6], p[7]); + word3_muladd(&w2, &w1, &w0, ws[7], p[6]); + word3_muladd(&w2, &w1, &w0, ws[8], p[5]); + word3_muladd(&w2, &w1, &w0, ws[9], p[4]); + word3_muladd(&w2, &w1, &w0, ws[10], p[3]); + word3_muladd(&w2, &w1, &w0, ws[11], p[2]); + word3_muladd(&w2, &w1, &w0, ws[12], p[1]); + word3_add(&w2, &w1, &w0, z[13]); + ws[13] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[13], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[14]); + word3_muladd(&w2, &w1, &w0, ws[1], p[13]); + word3_muladd(&w2, &w1, &w0, ws[2], p[12]); + word3_muladd(&w2, &w1, &w0, ws[3], p[11]); + word3_muladd(&w2, &w1, &w0, ws[4], p[10]); + word3_muladd(&w2, &w1, &w0, ws[5], p[9]); + word3_muladd(&w2, &w1, &w0, ws[6], p[8]); + word3_muladd(&w2, &w1, &w0, ws[7], p[7]); + word3_muladd(&w2, &w1, &w0, ws[8], p[6]); + word3_muladd(&w2, &w1, &w0, ws[9], p[5]); + word3_muladd(&w2, &w1, &w0, ws[10], p[4]); + word3_muladd(&w2, &w1, &w0, ws[11], p[3]); + word3_muladd(&w2, &w1, &w0, ws[12], p[2]); + word3_muladd(&w2, &w1, &w0, ws[13], p[1]); + word3_add(&w2, &w1, &w0, z[14]); + ws[14] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[14], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[15]); + word3_muladd(&w2, &w1, &w0, ws[1], p[14]); + word3_muladd(&w2, &w1, &w0, ws[2], p[13]); + word3_muladd(&w2, &w1, &w0, ws[3], p[12]); + word3_muladd(&w2, &w1, &w0, ws[4], p[11]); + word3_muladd(&w2, &w1, &w0, ws[5], p[10]); + word3_muladd(&w2, &w1, &w0, ws[6], p[9]); + word3_muladd(&w2, &w1, &w0, ws[7], p[8]); + word3_muladd(&w2, &w1, &w0, ws[8], p[7]); + word3_muladd(&w2, &w1, &w0, ws[9], p[6]); + word3_muladd(&w2, &w1, &w0, ws[10], p[5]); + word3_muladd(&w2, &w1, &w0, ws[11], p[4]); + word3_muladd(&w2, &w1, &w0, ws[12], p[3]); + word3_muladd(&w2, &w1, &w0, ws[13], p[2]); + word3_muladd(&w2, &w1, &w0, ws[14], p[1]); + word3_add(&w2, &w1, &w0, z[15]); + ws[15] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[15], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[16]); + word3_muladd(&w2, &w1, &w0, ws[1], p[15]); + word3_muladd(&w2, &w1, &w0, ws[2], p[14]); + word3_muladd(&w2, &w1, &w0, ws[3], p[13]); + word3_muladd(&w2, &w1, &w0, ws[4], p[12]); + word3_muladd(&w2, &w1, &w0, ws[5], p[11]); + word3_muladd(&w2, &w1, &w0, ws[6], p[10]); + word3_muladd(&w2, &w1, &w0, ws[7], p[9]); + word3_muladd(&w2, &w1, &w0, ws[8], p[8]); + word3_muladd(&w2, &w1, &w0, ws[9], p[7]); + word3_muladd(&w2, &w1, &w0, ws[10], p[6]); + word3_muladd(&w2, &w1, &w0, ws[11], p[5]); + word3_muladd(&w2, &w1, &w0, ws[12], p[4]); + word3_muladd(&w2, &w1, &w0, ws[13], p[3]); + word3_muladd(&w2, &w1, &w0, ws[14], p[2]); + word3_muladd(&w2, &w1, &w0, ws[15], p[1]); + word3_add(&w2, &w1, &w0, z[16]); + ws[16] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[16], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[17]); + word3_muladd(&w2, &w1, &w0, ws[1], p[16]); + word3_muladd(&w2, &w1, &w0, ws[2], p[15]); + word3_muladd(&w2, &w1, &w0, ws[3], p[14]); + word3_muladd(&w2, &w1, &w0, ws[4], p[13]); + word3_muladd(&w2, &w1, &w0, ws[5], p[12]); + word3_muladd(&w2, &w1, &w0, ws[6], p[11]); + word3_muladd(&w2, &w1, &w0, ws[7], p[10]); + word3_muladd(&w2, &w1, &w0, ws[8], p[9]); + word3_muladd(&w2, &w1, &w0, ws[9], p[8]); + word3_muladd(&w2, &w1, &w0, ws[10], p[7]); + word3_muladd(&w2, &w1, &w0, ws[11], p[6]); + word3_muladd(&w2, &w1, &w0, ws[12], p[5]); + word3_muladd(&w2, &w1, &w0, ws[13], p[4]); + word3_muladd(&w2, &w1, &w0, ws[14], p[3]); + word3_muladd(&w2, &w1, &w0, ws[15], p[2]); + word3_muladd(&w2, &w1, &w0, ws[16], p[1]); + word3_add(&w2, &w1, &w0, z[17]); + ws[17] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[17], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[18]); + word3_muladd(&w2, &w1, &w0, ws[1], p[17]); + word3_muladd(&w2, &w1, &w0, ws[2], p[16]); + word3_muladd(&w2, &w1, &w0, ws[3], p[15]); + word3_muladd(&w2, &w1, &w0, ws[4], p[14]); + word3_muladd(&w2, &w1, &w0, ws[5], p[13]); + word3_muladd(&w2, &w1, &w0, ws[6], p[12]); + word3_muladd(&w2, &w1, &w0, ws[7], p[11]); + word3_muladd(&w2, &w1, &w0, ws[8], p[10]); + word3_muladd(&w2, &w1, &w0, ws[9], p[9]); + word3_muladd(&w2, &w1, &w0, ws[10], p[8]); + word3_muladd(&w2, &w1, &w0, ws[11], p[7]); + word3_muladd(&w2, &w1, &w0, ws[12], p[6]); + word3_muladd(&w2, &w1, &w0, ws[13], p[5]); + word3_muladd(&w2, &w1, &w0, ws[14], p[4]); + word3_muladd(&w2, &w1, &w0, ws[15], p[3]); + word3_muladd(&w2, &w1, &w0, ws[16], p[2]); + word3_muladd(&w2, &w1, &w0, ws[17], p[1]); + word3_add(&w2, &w1, &w0, z[18]); + ws[18] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[18], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[19]); + word3_muladd(&w2, &w1, &w0, ws[1], p[18]); + word3_muladd(&w2, &w1, &w0, ws[2], p[17]); + word3_muladd(&w2, &w1, &w0, ws[3], p[16]); + word3_muladd(&w2, &w1, &w0, ws[4], p[15]); + word3_muladd(&w2, &w1, &w0, ws[5], p[14]); + word3_muladd(&w2, &w1, &w0, ws[6], p[13]); + word3_muladd(&w2, &w1, &w0, ws[7], p[12]); + word3_muladd(&w2, &w1, &w0, ws[8], p[11]); + word3_muladd(&w2, &w1, &w0, ws[9], p[10]); + word3_muladd(&w2, &w1, &w0, ws[10], p[9]); + word3_muladd(&w2, &w1, &w0, ws[11], p[8]); + word3_muladd(&w2, &w1, &w0, ws[12], p[7]); + word3_muladd(&w2, &w1, &w0, ws[13], p[6]); + word3_muladd(&w2, &w1, &w0, ws[14], p[5]); + word3_muladd(&w2, &w1, &w0, ws[15], p[4]); + word3_muladd(&w2, &w1, &w0, ws[16], p[3]); + word3_muladd(&w2, &w1, &w0, ws[17], p[2]); + word3_muladd(&w2, &w1, &w0, ws[18], p[1]); + word3_add(&w2, &w1, &w0, z[19]); + ws[19] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[19], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[20]); + word3_muladd(&w2, &w1, &w0, ws[1], p[19]); + word3_muladd(&w2, &w1, &w0, ws[2], p[18]); + word3_muladd(&w2, &w1, &w0, ws[3], p[17]); + word3_muladd(&w2, &w1, &w0, ws[4], p[16]); + word3_muladd(&w2, &w1, &w0, ws[5], p[15]); + word3_muladd(&w2, &w1, &w0, ws[6], p[14]); + word3_muladd(&w2, &w1, &w0, ws[7], p[13]); + word3_muladd(&w2, &w1, &w0, ws[8], p[12]); + word3_muladd(&w2, &w1, &w0, ws[9], p[11]); + word3_muladd(&w2, &w1, &w0, ws[10], p[10]); + word3_muladd(&w2, &w1, &w0, ws[11], p[9]); + word3_muladd(&w2, &w1, &w0, ws[12], p[8]); + word3_muladd(&w2, &w1, &w0, ws[13], p[7]); + word3_muladd(&w2, &w1, &w0, ws[14], p[6]); + word3_muladd(&w2, &w1, &w0, ws[15], p[5]); + word3_muladd(&w2, &w1, &w0, ws[16], p[4]); + word3_muladd(&w2, &w1, &w0, ws[17], p[3]); + word3_muladd(&w2, &w1, &w0, ws[18], p[2]); + word3_muladd(&w2, &w1, &w0, ws[19], p[1]); + word3_add(&w2, &w1, &w0, z[20]); + ws[20] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[20], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[21]); + word3_muladd(&w2, &w1, &w0, ws[1], p[20]); + word3_muladd(&w2, &w1, &w0, ws[2], p[19]); + word3_muladd(&w2, &w1, &w0, ws[3], p[18]); + word3_muladd(&w2, &w1, &w0, ws[4], p[17]); + word3_muladd(&w2, &w1, &w0, ws[5], p[16]); + word3_muladd(&w2, &w1, &w0, ws[6], p[15]); + word3_muladd(&w2, &w1, &w0, ws[7], p[14]); + word3_muladd(&w2, &w1, &w0, ws[8], p[13]); + word3_muladd(&w2, &w1, &w0, ws[9], p[12]); + word3_muladd(&w2, &w1, &w0, ws[10], p[11]); + word3_muladd(&w2, &w1, &w0, ws[11], p[10]); + word3_muladd(&w2, &w1, &w0, ws[12], p[9]); + word3_muladd(&w2, &w1, &w0, ws[13], p[8]); + word3_muladd(&w2, &w1, &w0, ws[14], p[7]); + word3_muladd(&w2, &w1, &w0, ws[15], p[6]); + word3_muladd(&w2, &w1, &w0, ws[16], p[5]); + word3_muladd(&w2, &w1, &w0, ws[17], p[4]); + word3_muladd(&w2, &w1, &w0, ws[18], p[3]); + word3_muladd(&w2, &w1, &w0, ws[19], p[2]); + word3_muladd(&w2, &w1, &w0, ws[20], p[1]); + word3_add(&w2, &w1, &w0, z[21]); + ws[21] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[21], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[22]); + word3_muladd(&w2, &w1, &w0, ws[1], p[21]); + word3_muladd(&w2, &w1, &w0, ws[2], p[20]); + word3_muladd(&w2, &w1, &w0, ws[3], p[19]); + word3_muladd(&w2, &w1, &w0, ws[4], p[18]); + word3_muladd(&w2, &w1, &w0, ws[5], p[17]); + word3_muladd(&w2, &w1, &w0, ws[6], p[16]); + word3_muladd(&w2, &w1, &w0, ws[7], p[15]); + word3_muladd(&w2, &w1, &w0, ws[8], p[14]); + word3_muladd(&w2, &w1, &w0, ws[9], p[13]); + word3_muladd(&w2, &w1, &w0, ws[10], p[12]); + word3_muladd(&w2, &w1, &w0, ws[11], p[11]); + word3_muladd(&w2, &w1, &w0, ws[12], p[10]); + word3_muladd(&w2, &w1, &w0, ws[13], p[9]); + word3_muladd(&w2, &w1, &w0, ws[14], p[8]); + word3_muladd(&w2, &w1, &w0, ws[15], p[7]); + word3_muladd(&w2, &w1, &w0, ws[16], p[6]); + word3_muladd(&w2, &w1, &w0, ws[17], p[5]); + word3_muladd(&w2, &w1, &w0, ws[18], p[4]); + word3_muladd(&w2, &w1, &w0, ws[19], p[3]); + word3_muladd(&w2, &w1, &w0, ws[20], p[2]); + word3_muladd(&w2, &w1, &w0, ws[21], p[1]); + word3_add(&w2, &w1, &w0, z[22]); + ws[22] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[22], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[23]); + word3_muladd(&w2, &w1, &w0, ws[1], p[22]); + word3_muladd(&w2, &w1, &w0, ws[2], p[21]); + word3_muladd(&w2, &w1, &w0, ws[3], p[20]); + word3_muladd(&w2, &w1, &w0, ws[4], p[19]); + word3_muladd(&w2, &w1, &w0, ws[5], p[18]); + word3_muladd(&w2, &w1, &w0, ws[6], p[17]); + word3_muladd(&w2, &w1, &w0, ws[7], p[16]); + word3_muladd(&w2, &w1, &w0, ws[8], p[15]); + word3_muladd(&w2, &w1, &w0, ws[9], p[14]); + word3_muladd(&w2, &w1, &w0, ws[10], p[13]); + word3_muladd(&w2, &w1, &w0, ws[11], p[12]); + word3_muladd(&w2, &w1, &w0, ws[12], p[11]); + word3_muladd(&w2, &w1, &w0, ws[13], p[10]); + word3_muladd(&w2, &w1, &w0, ws[14], p[9]); + word3_muladd(&w2, &w1, &w0, ws[15], p[8]); + word3_muladd(&w2, &w1, &w0, ws[16], p[7]); + word3_muladd(&w2, &w1, &w0, ws[17], p[6]); + word3_muladd(&w2, &w1, &w0, ws[18], p[5]); + word3_muladd(&w2, &w1, &w0, ws[19], p[4]); + word3_muladd(&w2, &w1, &w0, ws[20], p[3]); + word3_muladd(&w2, &w1, &w0, ws[21], p[2]); + word3_muladd(&w2, &w1, &w0, ws[22], p[1]); + word3_add(&w2, &w1, &w0, z[23]); + ws[23] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[23], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[24]); + word3_muladd(&w2, &w1, &w0, ws[1], p[23]); + word3_muladd(&w2, &w1, &w0, ws[2], p[22]); + word3_muladd(&w2, &w1, &w0, ws[3], p[21]); + word3_muladd(&w2, &w1, &w0, ws[4], p[20]); + word3_muladd(&w2, &w1, &w0, ws[5], p[19]); + word3_muladd(&w2, &w1, &w0, ws[6], p[18]); + word3_muladd(&w2, &w1, &w0, ws[7], p[17]); + word3_muladd(&w2, &w1, &w0, ws[8], p[16]); + word3_muladd(&w2, &w1, &w0, ws[9], p[15]); + word3_muladd(&w2, &w1, &w0, ws[10], p[14]); + word3_muladd(&w2, &w1, &w0, ws[11], p[13]); + word3_muladd(&w2, &w1, &w0, ws[12], p[12]); + word3_muladd(&w2, &w1, &w0, ws[13], p[11]); + word3_muladd(&w2, &w1, &w0, ws[14], p[10]); + word3_muladd(&w2, &w1, &w0, ws[15], p[9]); + word3_muladd(&w2, &w1, &w0, ws[16], p[8]); + word3_muladd(&w2, &w1, &w0, ws[17], p[7]); + word3_muladd(&w2, &w1, &w0, ws[18], p[6]); + word3_muladd(&w2, &w1, &w0, ws[19], p[5]); + word3_muladd(&w2, &w1, &w0, ws[20], p[4]); + word3_muladd(&w2, &w1, &w0, ws[21], p[3]); + word3_muladd(&w2, &w1, &w0, ws[22], p[2]); + word3_muladd(&w2, &w1, &w0, ws[23], p[1]); + word3_add(&w2, &w1, &w0, z[24]); + ws[24] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[24], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[25]); + word3_muladd(&w2, &w1, &w0, ws[1], p[24]); + word3_muladd(&w2, &w1, &w0, ws[2], p[23]); + word3_muladd(&w2, &w1, &w0, ws[3], p[22]); + word3_muladd(&w2, &w1, &w0, ws[4], p[21]); + word3_muladd(&w2, &w1, &w0, ws[5], p[20]); + word3_muladd(&w2, &w1, &w0, ws[6], p[19]); + word3_muladd(&w2, &w1, &w0, ws[7], p[18]); + word3_muladd(&w2, &w1, &w0, ws[8], p[17]); + word3_muladd(&w2, &w1, &w0, ws[9], p[16]); + word3_muladd(&w2, &w1, &w0, ws[10], p[15]); + word3_muladd(&w2, &w1, &w0, ws[11], p[14]); + word3_muladd(&w2, &w1, &w0, ws[12], p[13]); + word3_muladd(&w2, &w1, &w0, ws[13], p[12]); + word3_muladd(&w2, &w1, &w0, ws[14], p[11]); + word3_muladd(&w2, &w1, &w0, ws[15], p[10]); + word3_muladd(&w2, &w1, &w0, ws[16], p[9]); + word3_muladd(&w2, &w1, &w0, ws[17], p[8]); + word3_muladd(&w2, &w1, &w0, ws[18], p[7]); + word3_muladd(&w2, &w1, &w0, ws[19], p[6]); + word3_muladd(&w2, &w1, &w0, ws[20], p[5]); + word3_muladd(&w2, &w1, &w0, ws[21], p[4]); + word3_muladd(&w2, &w1, &w0, ws[22], p[3]); + word3_muladd(&w2, &w1, &w0, ws[23], p[2]); + word3_muladd(&w2, &w1, &w0, ws[24], p[1]); + word3_add(&w2, &w1, &w0, z[25]); + ws[25] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[25], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[26]); + word3_muladd(&w2, &w1, &w0, ws[1], p[25]); + word3_muladd(&w2, &w1, &w0, ws[2], p[24]); + word3_muladd(&w2, &w1, &w0, ws[3], p[23]); + word3_muladd(&w2, &w1, &w0, ws[4], p[22]); + word3_muladd(&w2, &w1, &w0, ws[5], p[21]); + word3_muladd(&w2, &w1, &w0, ws[6], p[20]); + word3_muladd(&w2, &w1, &w0, ws[7], p[19]); + word3_muladd(&w2, &w1, &w0, ws[8], p[18]); + word3_muladd(&w2, &w1, &w0, ws[9], p[17]); + word3_muladd(&w2, &w1, &w0, ws[10], p[16]); + word3_muladd(&w2, &w1, &w0, ws[11], p[15]); + word3_muladd(&w2, &w1, &w0, ws[12], p[14]); + word3_muladd(&w2, &w1, &w0, ws[13], p[13]); + word3_muladd(&w2, &w1, &w0, ws[14], p[12]); + word3_muladd(&w2, &w1, &w0, ws[15], p[11]); + word3_muladd(&w2, &w1, &w0, ws[16], p[10]); + word3_muladd(&w2, &w1, &w0, ws[17], p[9]); + word3_muladd(&w2, &w1, &w0, ws[18], p[8]); + word3_muladd(&w2, &w1, &w0, ws[19], p[7]); + word3_muladd(&w2, &w1, &w0, ws[20], p[6]); + word3_muladd(&w2, &w1, &w0, ws[21], p[5]); + word3_muladd(&w2, &w1, &w0, ws[22], p[4]); + word3_muladd(&w2, &w1, &w0, ws[23], p[3]); + word3_muladd(&w2, &w1, &w0, ws[24], p[2]); + word3_muladd(&w2, &w1, &w0, ws[25], p[1]); + word3_add(&w2, &w1, &w0, z[26]); + ws[26] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[26], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[27]); + word3_muladd(&w2, &w1, &w0, ws[1], p[26]); + word3_muladd(&w2, &w1, &w0, ws[2], p[25]); + word3_muladd(&w2, &w1, &w0, ws[3], p[24]); + word3_muladd(&w2, &w1, &w0, ws[4], p[23]); + word3_muladd(&w2, &w1, &w0, ws[5], p[22]); + word3_muladd(&w2, &w1, &w0, ws[6], p[21]); + word3_muladd(&w2, &w1, &w0, ws[7], p[20]); + word3_muladd(&w2, &w1, &w0, ws[8], p[19]); + word3_muladd(&w2, &w1, &w0, ws[9], p[18]); + word3_muladd(&w2, &w1, &w0, ws[10], p[17]); + word3_muladd(&w2, &w1, &w0, ws[11], p[16]); + word3_muladd(&w2, &w1, &w0, ws[12], p[15]); + word3_muladd(&w2, &w1, &w0, ws[13], p[14]); + word3_muladd(&w2, &w1, &w0, ws[14], p[13]); + word3_muladd(&w2, &w1, &w0, ws[15], p[12]); + word3_muladd(&w2, &w1, &w0, ws[16], p[11]); + word3_muladd(&w2, &w1, &w0, ws[17], p[10]); + word3_muladd(&w2, &w1, &w0, ws[18], p[9]); + word3_muladd(&w2, &w1, &w0, ws[19], p[8]); + word3_muladd(&w2, &w1, &w0, ws[20], p[7]); + word3_muladd(&w2, &w1, &w0, ws[21], p[6]); + word3_muladd(&w2, &w1, &w0, ws[22], p[5]); + word3_muladd(&w2, &w1, &w0, ws[23], p[4]); + word3_muladd(&w2, &w1, &w0, ws[24], p[3]); + word3_muladd(&w2, &w1, &w0, ws[25], p[2]); + word3_muladd(&w2, &w1, &w0, ws[26], p[1]); + word3_add(&w2, &w1, &w0, z[27]); + ws[27] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[27], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[28]); + word3_muladd(&w2, &w1, &w0, ws[1], p[27]); + word3_muladd(&w2, &w1, &w0, ws[2], p[26]); + word3_muladd(&w2, &w1, &w0, ws[3], p[25]); + word3_muladd(&w2, &w1, &w0, ws[4], p[24]); + word3_muladd(&w2, &w1, &w0, ws[5], p[23]); + word3_muladd(&w2, &w1, &w0, ws[6], p[22]); + word3_muladd(&w2, &w1, &w0, ws[7], p[21]); + word3_muladd(&w2, &w1, &w0, ws[8], p[20]); + word3_muladd(&w2, &w1, &w0, ws[9], p[19]); + word3_muladd(&w2, &w1, &w0, ws[10], p[18]); + word3_muladd(&w2, &w1, &w0, ws[11], p[17]); + word3_muladd(&w2, &w1, &w0, ws[12], p[16]); + word3_muladd(&w2, &w1, &w0, ws[13], p[15]); + word3_muladd(&w2, &w1, &w0, ws[14], p[14]); + word3_muladd(&w2, &w1, &w0, ws[15], p[13]); + word3_muladd(&w2, &w1, &w0, ws[16], p[12]); + word3_muladd(&w2, &w1, &w0, ws[17], p[11]); + word3_muladd(&w2, &w1, &w0, ws[18], p[10]); + word3_muladd(&w2, &w1, &w0, ws[19], p[9]); + word3_muladd(&w2, &w1, &w0, ws[20], p[8]); + word3_muladd(&w2, &w1, &w0, ws[21], p[7]); + word3_muladd(&w2, &w1, &w0, ws[22], p[6]); + word3_muladd(&w2, &w1, &w0, ws[23], p[5]); + word3_muladd(&w2, &w1, &w0, ws[24], p[4]); + word3_muladd(&w2, &w1, &w0, ws[25], p[3]); + word3_muladd(&w2, &w1, &w0, ws[26], p[2]); + word3_muladd(&w2, &w1, &w0, ws[27], p[1]); + word3_add(&w2, &w1, &w0, z[28]); + ws[28] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[28], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[29]); + word3_muladd(&w2, &w1, &w0, ws[1], p[28]); + word3_muladd(&w2, &w1, &w0, ws[2], p[27]); + word3_muladd(&w2, &w1, &w0, ws[3], p[26]); + word3_muladd(&w2, &w1, &w0, ws[4], p[25]); + word3_muladd(&w2, &w1, &w0, ws[5], p[24]); + word3_muladd(&w2, &w1, &w0, ws[6], p[23]); + word3_muladd(&w2, &w1, &w0, ws[7], p[22]); + word3_muladd(&w2, &w1, &w0, ws[8], p[21]); + word3_muladd(&w2, &w1, &w0, ws[9], p[20]); + word3_muladd(&w2, &w1, &w0, ws[10], p[19]); + word3_muladd(&w2, &w1, &w0, ws[11], p[18]); + word3_muladd(&w2, &w1, &w0, ws[12], p[17]); + word3_muladd(&w2, &w1, &w0, ws[13], p[16]); + word3_muladd(&w2, &w1, &w0, ws[14], p[15]); + word3_muladd(&w2, &w1, &w0, ws[15], p[14]); + word3_muladd(&w2, &w1, &w0, ws[16], p[13]); + word3_muladd(&w2, &w1, &w0, ws[17], p[12]); + word3_muladd(&w2, &w1, &w0, ws[18], p[11]); + word3_muladd(&w2, &w1, &w0, ws[19], p[10]); + word3_muladd(&w2, &w1, &w0, ws[20], p[9]); + word3_muladd(&w2, &w1, &w0, ws[21], p[8]); + word3_muladd(&w2, &w1, &w0, ws[22], p[7]); + word3_muladd(&w2, &w1, &w0, ws[23], p[6]); + word3_muladd(&w2, &w1, &w0, ws[24], p[5]); + word3_muladd(&w2, &w1, &w0, ws[25], p[4]); + word3_muladd(&w2, &w1, &w0, ws[26], p[3]); + word3_muladd(&w2, &w1, &w0, ws[27], p[2]); + word3_muladd(&w2, &w1, &w0, ws[28], p[1]); + word3_add(&w2, &w1, &w0, z[29]); + ws[29] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[29], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[30]); + word3_muladd(&w2, &w1, &w0, ws[1], p[29]); + word3_muladd(&w2, &w1, &w0, ws[2], p[28]); + word3_muladd(&w2, &w1, &w0, ws[3], p[27]); + word3_muladd(&w2, &w1, &w0, ws[4], p[26]); + word3_muladd(&w2, &w1, &w0, ws[5], p[25]); + word3_muladd(&w2, &w1, &w0, ws[6], p[24]); + word3_muladd(&w2, &w1, &w0, ws[7], p[23]); + word3_muladd(&w2, &w1, &w0, ws[8], p[22]); + word3_muladd(&w2, &w1, &w0, ws[9], p[21]); + word3_muladd(&w2, &w1, &w0, ws[10], p[20]); + word3_muladd(&w2, &w1, &w0, ws[11], p[19]); + word3_muladd(&w2, &w1, &w0, ws[12], p[18]); + word3_muladd(&w2, &w1, &w0, ws[13], p[17]); + word3_muladd(&w2, &w1, &w0, ws[14], p[16]); + word3_muladd(&w2, &w1, &w0, ws[15], p[15]); + word3_muladd(&w2, &w1, &w0, ws[16], p[14]); + word3_muladd(&w2, &w1, &w0, ws[17], p[13]); + word3_muladd(&w2, &w1, &w0, ws[18], p[12]); + word3_muladd(&w2, &w1, &w0, ws[19], p[11]); + word3_muladd(&w2, &w1, &w0, ws[20], p[10]); + word3_muladd(&w2, &w1, &w0, ws[21], p[9]); + word3_muladd(&w2, &w1, &w0, ws[22], p[8]); + word3_muladd(&w2, &w1, &w0, ws[23], p[7]); + word3_muladd(&w2, &w1, &w0, ws[24], p[6]); + word3_muladd(&w2, &w1, &w0, ws[25], p[5]); + word3_muladd(&w2, &w1, &w0, ws[26], p[4]); + word3_muladd(&w2, &w1, &w0, ws[27], p[3]); + word3_muladd(&w2, &w1, &w0, ws[28], p[2]); + word3_muladd(&w2, &w1, &w0, ws[29], p[1]); + word3_add(&w2, &w1, &w0, z[30]); + ws[30] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[30], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[0], p[31]); + word3_muladd(&w2, &w1, &w0, ws[1], p[30]); + word3_muladd(&w2, &w1, &w0, ws[2], p[29]); + word3_muladd(&w2, &w1, &w0, ws[3], p[28]); + word3_muladd(&w2, &w1, &w0, ws[4], p[27]); + word3_muladd(&w2, &w1, &w0, ws[5], p[26]); + word3_muladd(&w2, &w1, &w0, ws[6], p[25]); + word3_muladd(&w2, &w1, &w0, ws[7], p[24]); + word3_muladd(&w2, &w1, &w0, ws[8], p[23]); + word3_muladd(&w2, &w1, &w0, ws[9], p[22]); + word3_muladd(&w2, &w1, &w0, ws[10], p[21]); + word3_muladd(&w2, &w1, &w0, ws[11], p[20]); + word3_muladd(&w2, &w1, &w0, ws[12], p[19]); + word3_muladd(&w2, &w1, &w0, ws[13], p[18]); + word3_muladd(&w2, &w1, &w0, ws[14], p[17]); + word3_muladd(&w2, &w1, &w0, ws[15], p[16]); + word3_muladd(&w2, &w1, &w0, ws[16], p[15]); + word3_muladd(&w2, &w1, &w0, ws[17], p[14]); + word3_muladd(&w2, &w1, &w0, ws[18], p[13]); + word3_muladd(&w2, &w1, &w0, ws[19], p[12]); + word3_muladd(&w2, &w1, &w0, ws[20], p[11]); + word3_muladd(&w2, &w1, &w0, ws[21], p[10]); + word3_muladd(&w2, &w1, &w0, ws[22], p[9]); + word3_muladd(&w2, &w1, &w0, ws[23], p[8]); + word3_muladd(&w2, &w1, &w0, ws[24], p[7]); + word3_muladd(&w2, &w1, &w0, ws[25], p[6]); + word3_muladd(&w2, &w1, &w0, ws[26], p[5]); + word3_muladd(&w2, &w1, &w0, ws[27], p[4]); + word3_muladd(&w2, &w1, &w0, ws[28], p[3]); + word3_muladd(&w2, &w1, &w0, ws[29], p[2]); + word3_muladd(&w2, &w1, &w0, ws[30], p[1]); + word3_add(&w2, &w1, &w0, z[31]); + ws[31] = w0 * p_dash; + word3_muladd(&w2, &w1, &w0, ws[31], p[0]); + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[1], p[31]); + word3_muladd(&w2, &w1, &w0, ws[2], p[30]); + word3_muladd(&w2, &w1, &w0, ws[3], p[29]); + word3_muladd(&w2, &w1, &w0, ws[4], p[28]); + word3_muladd(&w2, &w1, &w0, ws[5], p[27]); + word3_muladd(&w2, &w1, &w0, ws[6], p[26]); + word3_muladd(&w2, &w1, &w0, ws[7], p[25]); + word3_muladd(&w2, &w1, &w0, ws[8], p[24]); + word3_muladd(&w2, &w1, &w0, ws[9], p[23]); + word3_muladd(&w2, &w1, &w0, ws[10], p[22]); + word3_muladd(&w2, &w1, &w0, ws[11], p[21]); + word3_muladd(&w2, &w1, &w0, ws[12], p[20]); + word3_muladd(&w2, &w1, &w0, ws[13], p[19]); + word3_muladd(&w2, &w1, &w0, ws[14], p[18]); + word3_muladd(&w2, &w1, &w0, ws[15], p[17]); + word3_muladd(&w2, &w1, &w0, ws[16], p[16]); + word3_muladd(&w2, &w1, &w0, ws[17], p[15]); + word3_muladd(&w2, &w1, &w0, ws[18], p[14]); + word3_muladd(&w2, &w1, &w0, ws[19], p[13]); + word3_muladd(&w2, &w1, &w0, ws[20], p[12]); + word3_muladd(&w2, &w1, &w0, ws[21], p[11]); + word3_muladd(&w2, &w1, &w0, ws[22], p[10]); + word3_muladd(&w2, &w1, &w0, ws[23], p[9]); + word3_muladd(&w2, &w1, &w0, ws[24], p[8]); + word3_muladd(&w2, &w1, &w0, ws[25], p[7]); + word3_muladd(&w2, &w1, &w0, ws[26], p[6]); + word3_muladd(&w2, &w1, &w0, ws[27], p[5]); + word3_muladd(&w2, &w1, &w0, ws[28], p[4]); + word3_muladd(&w2, &w1, &w0, ws[29], p[3]); + word3_muladd(&w2, &w1, &w0, ws[30], p[2]); + word3_muladd(&w2, &w1, &w0, ws[31], p[1]); + word3_add(&w2, &w1, &w0, z[32]); + ws[0] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[2], p[31]); + word3_muladd(&w2, &w1, &w0, ws[3], p[30]); + word3_muladd(&w2, &w1, &w0, ws[4], p[29]); + word3_muladd(&w2, &w1, &w0, ws[5], p[28]); + word3_muladd(&w2, &w1, &w0, ws[6], p[27]); + word3_muladd(&w2, &w1, &w0, ws[7], p[26]); + word3_muladd(&w2, &w1, &w0, ws[8], p[25]); + word3_muladd(&w2, &w1, &w0, ws[9], p[24]); + word3_muladd(&w2, &w1, &w0, ws[10], p[23]); + word3_muladd(&w2, &w1, &w0, ws[11], p[22]); + word3_muladd(&w2, &w1, &w0, ws[12], p[21]); + word3_muladd(&w2, &w1, &w0, ws[13], p[20]); + word3_muladd(&w2, &w1, &w0, ws[14], p[19]); + word3_muladd(&w2, &w1, &w0, ws[15], p[18]); + word3_muladd(&w2, &w1, &w0, ws[16], p[17]); + word3_muladd(&w2, &w1, &w0, ws[17], p[16]); + word3_muladd(&w2, &w1, &w0, ws[18], p[15]); + word3_muladd(&w2, &w1, &w0, ws[19], p[14]); + word3_muladd(&w2, &w1, &w0, ws[20], p[13]); + word3_muladd(&w2, &w1, &w0, ws[21], p[12]); + word3_muladd(&w2, &w1, &w0, ws[22], p[11]); + word3_muladd(&w2, &w1, &w0, ws[23], p[10]); + word3_muladd(&w2, &w1, &w0, ws[24], p[9]); + word3_muladd(&w2, &w1, &w0, ws[25], p[8]); + word3_muladd(&w2, &w1, &w0, ws[26], p[7]); + word3_muladd(&w2, &w1, &w0, ws[27], p[6]); + word3_muladd(&w2, &w1, &w0, ws[28], p[5]); + word3_muladd(&w2, &w1, &w0, ws[29], p[4]); + word3_muladd(&w2, &w1, &w0, ws[30], p[3]); + word3_muladd(&w2, &w1, &w0, ws[31], p[2]); + word3_add(&w2, &w1, &w0, z[33]); + ws[1] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[3], p[31]); + word3_muladd(&w2, &w1, &w0, ws[4], p[30]); + word3_muladd(&w2, &w1, &w0, ws[5], p[29]); + word3_muladd(&w2, &w1, &w0, ws[6], p[28]); + word3_muladd(&w2, &w1, &w0, ws[7], p[27]); + word3_muladd(&w2, &w1, &w0, ws[8], p[26]); + word3_muladd(&w2, &w1, &w0, ws[9], p[25]); + word3_muladd(&w2, &w1, &w0, ws[10], p[24]); + word3_muladd(&w2, &w1, &w0, ws[11], p[23]); + word3_muladd(&w2, &w1, &w0, ws[12], p[22]); + word3_muladd(&w2, &w1, &w0, ws[13], p[21]); + word3_muladd(&w2, &w1, &w0, ws[14], p[20]); + word3_muladd(&w2, &w1, &w0, ws[15], p[19]); + word3_muladd(&w2, &w1, &w0, ws[16], p[18]); + word3_muladd(&w2, &w1, &w0, ws[17], p[17]); + word3_muladd(&w2, &w1, &w0, ws[18], p[16]); + word3_muladd(&w2, &w1, &w0, ws[19], p[15]); + word3_muladd(&w2, &w1, &w0, ws[20], p[14]); + word3_muladd(&w2, &w1, &w0, ws[21], p[13]); + word3_muladd(&w2, &w1, &w0, ws[22], p[12]); + word3_muladd(&w2, &w1, &w0, ws[23], p[11]); + word3_muladd(&w2, &w1, &w0, ws[24], p[10]); + word3_muladd(&w2, &w1, &w0, ws[25], p[9]); + word3_muladd(&w2, &w1, &w0, ws[26], p[8]); + word3_muladd(&w2, &w1, &w0, ws[27], p[7]); + word3_muladd(&w2, &w1, &w0, ws[28], p[6]); + word3_muladd(&w2, &w1, &w0, ws[29], p[5]); + word3_muladd(&w2, &w1, &w0, ws[30], p[4]); + word3_muladd(&w2, &w1, &w0, ws[31], p[3]); + word3_add(&w2, &w1, &w0, z[34]); + ws[2] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[4], p[31]); + word3_muladd(&w2, &w1, &w0, ws[5], p[30]); + word3_muladd(&w2, &w1, &w0, ws[6], p[29]); + word3_muladd(&w2, &w1, &w0, ws[7], p[28]); + word3_muladd(&w2, &w1, &w0, ws[8], p[27]); + word3_muladd(&w2, &w1, &w0, ws[9], p[26]); + word3_muladd(&w2, &w1, &w0, ws[10], p[25]); + word3_muladd(&w2, &w1, &w0, ws[11], p[24]); + word3_muladd(&w2, &w1, &w0, ws[12], p[23]); + word3_muladd(&w2, &w1, &w0, ws[13], p[22]); + word3_muladd(&w2, &w1, &w0, ws[14], p[21]); + word3_muladd(&w2, &w1, &w0, ws[15], p[20]); + word3_muladd(&w2, &w1, &w0, ws[16], p[19]); + word3_muladd(&w2, &w1, &w0, ws[17], p[18]); + word3_muladd(&w2, &w1, &w0, ws[18], p[17]); + word3_muladd(&w2, &w1, &w0, ws[19], p[16]); + word3_muladd(&w2, &w1, &w0, ws[20], p[15]); + word3_muladd(&w2, &w1, &w0, ws[21], p[14]); + word3_muladd(&w2, &w1, &w0, ws[22], p[13]); + word3_muladd(&w2, &w1, &w0, ws[23], p[12]); + word3_muladd(&w2, &w1, &w0, ws[24], p[11]); + word3_muladd(&w2, &w1, &w0, ws[25], p[10]); + word3_muladd(&w2, &w1, &w0, ws[26], p[9]); + word3_muladd(&w2, &w1, &w0, ws[27], p[8]); + word3_muladd(&w2, &w1, &w0, ws[28], p[7]); + word3_muladd(&w2, &w1, &w0, ws[29], p[6]); + word3_muladd(&w2, &w1, &w0, ws[30], p[5]); + word3_muladd(&w2, &w1, &w0, ws[31], p[4]); + word3_add(&w2, &w1, &w0, z[35]); + ws[3] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[5], p[31]); + word3_muladd(&w2, &w1, &w0, ws[6], p[30]); + word3_muladd(&w2, &w1, &w0, ws[7], p[29]); + word3_muladd(&w2, &w1, &w0, ws[8], p[28]); + word3_muladd(&w2, &w1, &w0, ws[9], p[27]); + word3_muladd(&w2, &w1, &w0, ws[10], p[26]); + word3_muladd(&w2, &w1, &w0, ws[11], p[25]); + word3_muladd(&w2, &w1, &w0, ws[12], p[24]); + word3_muladd(&w2, &w1, &w0, ws[13], p[23]); + word3_muladd(&w2, &w1, &w0, ws[14], p[22]); + word3_muladd(&w2, &w1, &w0, ws[15], p[21]); + word3_muladd(&w2, &w1, &w0, ws[16], p[20]); + word3_muladd(&w2, &w1, &w0, ws[17], p[19]); + word3_muladd(&w2, &w1, &w0, ws[18], p[18]); + word3_muladd(&w2, &w1, &w0, ws[19], p[17]); + word3_muladd(&w2, &w1, &w0, ws[20], p[16]); + word3_muladd(&w2, &w1, &w0, ws[21], p[15]); + word3_muladd(&w2, &w1, &w0, ws[22], p[14]); + word3_muladd(&w2, &w1, &w0, ws[23], p[13]); + word3_muladd(&w2, &w1, &w0, ws[24], p[12]); + word3_muladd(&w2, &w1, &w0, ws[25], p[11]); + word3_muladd(&w2, &w1, &w0, ws[26], p[10]); + word3_muladd(&w2, &w1, &w0, ws[27], p[9]); + word3_muladd(&w2, &w1, &w0, ws[28], p[8]); + word3_muladd(&w2, &w1, &w0, ws[29], p[7]); + word3_muladd(&w2, &w1, &w0, ws[30], p[6]); + word3_muladd(&w2, &w1, &w0, ws[31], p[5]); + word3_add(&w2, &w1, &w0, z[36]); + ws[4] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[6], p[31]); + word3_muladd(&w2, &w1, &w0, ws[7], p[30]); + word3_muladd(&w2, &w1, &w0, ws[8], p[29]); + word3_muladd(&w2, &w1, &w0, ws[9], p[28]); + word3_muladd(&w2, &w1, &w0, ws[10], p[27]); + word3_muladd(&w2, &w1, &w0, ws[11], p[26]); + word3_muladd(&w2, &w1, &w0, ws[12], p[25]); + word3_muladd(&w2, &w1, &w0, ws[13], p[24]); + word3_muladd(&w2, &w1, &w0, ws[14], p[23]); + word3_muladd(&w2, &w1, &w0, ws[15], p[22]); + word3_muladd(&w2, &w1, &w0, ws[16], p[21]); + word3_muladd(&w2, &w1, &w0, ws[17], p[20]); + word3_muladd(&w2, &w1, &w0, ws[18], p[19]); + word3_muladd(&w2, &w1, &w0, ws[19], p[18]); + word3_muladd(&w2, &w1, &w0, ws[20], p[17]); + word3_muladd(&w2, &w1, &w0, ws[21], p[16]); + word3_muladd(&w2, &w1, &w0, ws[22], p[15]); + word3_muladd(&w2, &w1, &w0, ws[23], p[14]); + word3_muladd(&w2, &w1, &w0, ws[24], p[13]); + word3_muladd(&w2, &w1, &w0, ws[25], p[12]); + word3_muladd(&w2, &w1, &w0, ws[26], p[11]); + word3_muladd(&w2, &w1, &w0, ws[27], p[10]); + word3_muladd(&w2, &w1, &w0, ws[28], p[9]); + word3_muladd(&w2, &w1, &w0, ws[29], p[8]); + word3_muladd(&w2, &w1, &w0, ws[30], p[7]); + word3_muladd(&w2, &w1, &w0, ws[31], p[6]); + word3_add(&w2, &w1, &w0, z[37]); + ws[5] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[7], p[31]); + word3_muladd(&w2, &w1, &w0, ws[8], p[30]); + word3_muladd(&w2, &w1, &w0, ws[9], p[29]); + word3_muladd(&w2, &w1, &w0, ws[10], p[28]); + word3_muladd(&w2, &w1, &w0, ws[11], p[27]); + word3_muladd(&w2, &w1, &w0, ws[12], p[26]); + word3_muladd(&w2, &w1, &w0, ws[13], p[25]); + word3_muladd(&w2, &w1, &w0, ws[14], p[24]); + word3_muladd(&w2, &w1, &w0, ws[15], p[23]); + word3_muladd(&w2, &w1, &w0, ws[16], p[22]); + word3_muladd(&w2, &w1, &w0, ws[17], p[21]); + word3_muladd(&w2, &w1, &w0, ws[18], p[20]); + word3_muladd(&w2, &w1, &w0, ws[19], p[19]); + word3_muladd(&w2, &w1, &w0, ws[20], p[18]); + word3_muladd(&w2, &w1, &w0, ws[21], p[17]); + word3_muladd(&w2, &w1, &w0, ws[22], p[16]); + word3_muladd(&w2, &w1, &w0, ws[23], p[15]); + word3_muladd(&w2, &w1, &w0, ws[24], p[14]); + word3_muladd(&w2, &w1, &w0, ws[25], p[13]); + word3_muladd(&w2, &w1, &w0, ws[26], p[12]); + word3_muladd(&w2, &w1, &w0, ws[27], p[11]); + word3_muladd(&w2, &w1, &w0, ws[28], p[10]); + word3_muladd(&w2, &w1, &w0, ws[29], p[9]); + word3_muladd(&w2, &w1, &w0, ws[30], p[8]); + word3_muladd(&w2, &w1, &w0, ws[31], p[7]); + word3_add(&w2, &w1, &w0, z[38]); + ws[6] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[8], p[31]); + word3_muladd(&w2, &w1, &w0, ws[9], p[30]); + word3_muladd(&w2, &w1, &w0, ws[10], p[29]); + word3_muladd(&w2, &w1, &w0, ws[11], p[28]); + word3_muladd(&w2, &w1, &w0, ws[12], p[27]); + word3_muladd(&w2, &w1, &w0, ws[13], p[26]); + word3_muladd(&w2, &w1, &w0, ws[14], p[25]); + word3_muladd(&w2, &w1, &w0, ws[15], p[24]); + word3_muladd(&w2, &w1, &w0, ws[16], p[23]); + word3_muladd(&w2, &w1, &w0, ws[17], p[22]); + word3_muladd(&w2, &w1, &w0, ws[18], p[21]); + word3_muladd(&w2, &w1, &w0, ws[19], p[20]); + word3_muladd(&w2, &w1, &w0, ws[20], p[19]); + word3_muladd(&w2, &w1, &w0, ws[21], p[18]); + word3_muladd(&w2, &w1, &w0, ws[22], p[17]); + word3_muladd(&w2, &w1, &w0, ws[23], p[16]); + word3_muladd(&w2, &w1, &w0, ws[24], p[15]); + word3_muladd(&w2, &w1, &w0, ws[25], p[14]); + word3_muladd(&w2, &w1, &w0, ws[26], p[13]); + word3_muladd(&w2, &w1, &w0, ws[27], p[12]); + word3_muladd(&w2, &w1, &w0, ws[28], p[11]); + word3_muladd(&w2, &w1, &w0, ws[29], p[10]); + word3_muladd(&w2, &w1, &w0, ws[30], p[9]); + word3_muladd(&w2, &w1, &w0, ws[31], p[8]); + word3_add(&w2, &w1, &w0, z[39]); + ws[7] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[9], p[31]); + word3_muladd(&w2, &w1, &w0, ws[10], p[30]); + word3_muladd(&w2, &w1, &w0, ws[11], p[29]); + word3_muladd(&w2, &w1, &w0, ws[12], p[28]); + word3_muladd(&w2, &w1, &w0, ws[13], p[27]); + word3_muladd(&w2, &w1, &w0, ws[14], p[26]); + word3_muladd(&w2, &w1, &w0, ws[15], p[25]); + word3_muladd(&w2, &w1, &w0, ws[16], p[24]); + word3_muladd(&w2, &w1, &w0, ws[17], p[23]); + word3_muladd(&w2, &w1, &w0, ws[18], p[22]); + word3_muladd(&w2, &w1, &w0, ws[19], p[21]); + word3_muladd(&w2, &w1, &w0, ws[20], p[20]); + word3_muladd(&w2, &w1, &w0, ws[21], p[19]); + word3_muladd(&w2, &w1, &w0, ws[22], p[18]); + word3_muladd(&w2, &w1, &w0, ws[23], p[17]); + word3_muladd(&w2, &w1, &w0, ws[24], p[16]); + word3_muladd(&w2, &w1, &w0, ws[25], p[15]); + word3_muladd(&w2, &w1, &w0, ws[26], p[14]); + word3_muladd(&w2, &w1, &w0, ws[27], p[13]); + word3_muladd(&w2, &w1, &w0, ws[28], p[12]); + word3_muladd(&w2, &w1, &w0, ws[29], p[11]); + word3_muladd(&w2, &w1, &w0, ws[30], p[10]); + word3_muladd(&w2, &w1, &w0, ws[31], p[9]); + word3_add(&w2, &w1, &w0, z[40]); + ws[8] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[10], p[31]); + word3_muladd(&w2, &w1, &w0, ws[11], p[30]); + word3_muladd(&w2, &w1, &w0, ws[12], p[29]); + word3_muladd(&w2, &w1, &w0, ws[13], p[28]); + word3_muladd(&w2, &w1, &w0, ws[14], p[27]); + word3_muladd(&w2, &w1, &w0, ws[15], p[26]); + word3_muladd(&w2, &w1, &w0, ws[16], p[25]); + word3_muladd(&w2, &w1, &w0, ws[17], p[24]); + word3_muladd(&w2, &w1, &w0, ws[18], p[23]); + word3_muladd(&w2, &w1, &w0, ws[19], p[22]); + word3_muladd(&w2, &w1, &w0, ws[20], p[21]); + word3_muladd(&w2, &w1, &w0, ws[21], p[20]); + word3_muladd(&w2, &w1, &w0, ws[22], p[19]); + word3_muladd(&w2, &w1, &w0, ws[23], p[18]); + word3_muladd(&w2, &w1, &w0, ws[24], p[17]); + word3_muladd(&w2, &w1, &w0, ws[25], p[16]); + word3_muladd(&w2, &w1, &w0, ws[26], p[15]); + word3_muladd(&w2, &w1, &w0, ws[27], p[14]); + word3_muladd(&w2, &w1, &w0, ws[28], p[13]); + word3_muladd(&w2, &w1, &w0, ws[29], p[12]); + word3_muladd(&w2, &w1, &w0, ws[30], p[11]); + word3_muladd(&w2, &w1, &w0, ws[31], p[10]); + word3_add(&w2, &w1, &w0, z[41]); + ws[9] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[11], p[31]); + word3_muladd(&w2, &w1, &w0, ws[12], p[30]); + word3_muladd(&w2, &w1, &w0, ws[13], p[29]); + word3_muladd(&w2, &w1, &w0, ws[14], p[28]); + word3_muladd(&w2, &w1, &w0, ws[15], p[27]); + word3_muladd(&w2, &w1, &w0, ws[16], p[26]); + word3_muladd(&w2, &w1, &w0, ws[17], p[25]); + word3_muladd(&w2, &w1, &w0, ws[18], p[24]); + word3_muladd(&w2, &w1, &w0, ws[19], p[23]); + word3_muladd(&w2, &w1, &w0, ws[20], p[22]); + word3_muladd(&w2, &w1, &w0, ws[21], p[21]); + word3_muladd(&w2, &w1, &w0, ws[22], p[20]); + word3_muladd(&w2, &w1, &w0, ws[23], p[19]); + word3_muladd(&w2, &w1, &w0, ws[24], p[18]); + word3_muladd(&w2, &w1, &w0, ws[25], p[17]); + word3_muladd(&w2, &w1, &w0, ws[26], p[16]); + word3_muladd(&w2, &w1, &w0, ws[27], p[15]); + word3_muladd(&w2, &w1, &w0, ws[28], p[14]); + word3_muladd(&w2, &w1, &w0, ws[29], p[13]); + word3_muladd(&w2, &w1, &w0, ws[30], p[12]); + word3_muladd(&w2, &w1, &w0, ws[31], p[11]); + word3_add(&w2, &w1, &w0, z[42]); + ws[10] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[12], p[31]); + word3_muladd(&w2, &w1, &w0, ws[13], p[30]); + word3_muladd(&w2, &w1, &w0, ws[14], p[29]); + word3_muladd(&w2, &w1, &w0, ws[15], p[28]); + word3_muladd(&w2, &w1, &w0, ws[16], p[27]); + word3_muladd(&w2, &w1, &w0, ws[17], p[26]); + word3_muladd(&w2, &w1, &w0, ws[18], p[25]); + word3_muladd(&w2, &w1, &w0, ws[19], p[24]); + word3_muladd(&w2, &w1, &w0, ws[20], p[23]); + word3_muladd(&w2, &w1, &w0, ws[21], p[22]); + word3_muladd(&w2, &w1, &w0, ws[22], p[21]); + word3_muladd(&w2, &w1, &w0, ws[23], p[20]); + word3_muladd(&w2, &w1, &w0, ws[24], p[19]); + word3_muladd(&w2, &w1, &w0, ws[25], p[18]); + word3_muladd(&w2, &w1, &w0, ws[26], p[17]); + word3_muladd(&w2, &w1, &w0, ws[27], p[16]); + word3_muladd(&w2, &w1, &w0, ws[28], p[15]); + word3_muladd(&w2, &w1, &w0, ws[29], p[14]); + word3_muladd(&w2, &w1, &w0, ws[30], p[13]); + word3_muladd(&w2, &w1, &w0, ws[31], p[12]); + word3_add(&w2, &w1, &w0, z[43]); + ws[11] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[13], p[31]); + word3_muladd(&w2, &w1, &w0, ws[14], p[30]); + word3_muladd(&w2, &w1, &w0, ws[15], p[29]); + word3_muladd(&w2, &w1, &w0, ws[16], p[28]); + word3_muladd(&w2, &w1, &w0, ws[17], p[27]); + word3_muladd(&w2, &w1, &w0, ws[18], p[26]); + word3_muladd(&w2, &w1, &w0, ws[19], p[25]); + word3_muladd(&w2, &w1, &w0, ws[20], p[24]); + word3_muladd(&w2, &w1, &w0, ws[21], p[23]); + word3_muladd(&w2, &w1, &w0, ws[22], p[22]); + word3_muladd(&w2, &w1, &w0, ws[23], p[21]); + word3_muladd(&w2, &w1, &w0, ws[24], p[20]); + word3_muladd(&w2, &w1, &w0, ws[25], p[19]); + word3_muladd(&w2, &w1, &w0, ws[26], p[18]); + word3_muladd(&w2, &w1, &w0, ws[27], p[17]); + word3_muladd(&w2, &w1, &w0, ws[28], p[16]); + word3_muladd(&w2, &w1, &w0, ws[29], p[15]); + word3_muladd(&w2, &w1, &w0, ws[30], p[14]); + word3_muladd(&w2, &w1, &w0, ws[31], p[13]); + word3_add(&w2, &w1, &w0, z[44]); + ws[12] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[14], p[31]); + word3_muladd(&w2, &w1, &w0, ws[15], p[30]); + word3_muladd(&w2, &w1, &w0, ws[16], p[29]); + word3_muladd(&w2, &w1, &w0, ws[17], p[28]); + word3_muladd(&w2, &w1, &w0, ws[18], p[27]); + word3_muladd(&w2, &w1, &w0, ws[19], p[26]); + word3_muladd(&w2, &w1, &w0, ws[20], p[25]); + word3_muladd(&w2, &w1, &w0, ws[21], p[24]); + word3_muladd(&w2, &w1, &w0, ws[22], p[23]); + word3_muladd(&w2, &w1, &w0, ws[23], p[22]); + word3_muladd(&w2, &w1, &w0, ws[24], p[21]); + word3_muladd(&w2, &w1, &w0, ws[25], p[20]); + word3_muladd(&w2, &w1, &w0, ws[26], p[19]); + word3_muladd(&w2, &w1, &w0, ws[27], p[18]); + word3_muladd(&w2, &w1, &w0, ws[28], p[17]); + word3_muladd(&w2, &w1, &w0, ws[29], p[16]); + word3_muladd(&w2, &w1, &w0, ws[30], p[15]); + word3_muladd(&w2, &w1, &w0, ws[31], p[14]); + word3_add(&w2, &w1, &w0, z[45]); + ws[13] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[15], p[31]); + word3_muladd(&w2, &w1, &w0, ws[16], p[30]); + word3_muladd(&w2, &w1, &w0, ws[17], p[29]); + word3_muladd(&w2, &w1, &w0, ws[18], p[28]); + word3_muladd(&w2, &w1, &w0, ws[19], p[27]); + word3_muladd(&w2, &w1, &w0, ws[20], p[26]); + word3_muladd(&w2, &w1, &w0, ws[21], p[25]); + word3_muladd(&w2, &w1, &w0, ws[22], p[24]); + word3_muladd(&w2, &w1, &w0, ws[23], p[23]); + word3_muladd(&w2, &w1, &w0, ws[24], p[22]); + word3_muladd(&w2, &w1, &w0, ws[25], p[21]); + word3_muladd(&w2, &w1, &w0, ws[26], p[20]); + word3_muladd(&w2, &w1, &w0, ws[27], p[19]); + word3_muladd(&w2, &w1, &w0, ws[28], p[18]); + word3_muladd(&w2, &w1, &w0, ws[29], p[17]); + word3_muladd(&w2, &w1, &w0, ws[30], p[16]); + word3_muladd(&w2, &w1, &w0, ws[31], p[15]); + word3_add(&w2, &w1, &w0, z[46]); + ws[14] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[16], p[31]); + word3_muladd(&w2, &w1, &w0, ws[17], p[30]); + word3_muladd(&w2, &w1, &w0, ws[18], p[29]); + word3_muladd(&w2, &w1, &w0, ws[19], p[28]); + word3_muladd(&w2, &w1, &w0, ws[20], p[27]); + word3_muladd(&w2, &w1, &w0, ws[21], p[26]); + word3_muladd(&w2, &w1, &w0, ws[22], p[25]); + word3_muladd(&w2, &w1, &w0, ws[23], p[24]); + word3_muladd(&w2, &w1, &w0, ws[24], p[23]); + word3_muladd(&w2, &w1, &w0, ws[25], p[22]); + word3_muladd(&w2, &w1, &w0, ws[26], p[21]); + word3_muladd(&w2, &w1, &w0, ws[27], p[20]); + word3_muladd(&w2, &w1, &w0, ws[28], p[19]); + word3_muladd(&w2, &w1, &w0, ws[29], p[18]); + word3_muladd(&w2, &w1, &w0, ws[30], p[17]); + word3_muladd(&w2, &w1, &w0, ws[31], p[16]); + word3_add(&w2, &w1, &w0, z[47]); + ws[15] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[17], p[31]); + word3_muladd(&w2, &w1, &w0, ws[18], p[30]); + word3_muladd(&w2, &w1, &w0, ws[19], p[29]); + word3_muladd(&w2, &w1, &w0, ws[20], p[28]); + word3_muladd(&w2, &w1, &w0, ws[21], p[27]); + word3_muladd(&w2, &w1, &w0, ws[22], p[26]); + word3_muladd(&w2, &w1, &w0, ws[23], p[25]); + word3_muladd(&w2, &w1, &w0, ws[24], p[24]); + word3_muladd(&w2, &w1, &w0, ws[25], p[23]); + word3_muladd(&w2, &w1, &w0, ws[26], p[22]); + word3_muladd(&w2, &w1, &w0, ws[27], p[21]); + word3_muladd(&w2, &w1, &w0, ws[28], p[20]); + word3_muladd(&w2, &w1, &w0, ws[29], p[19]); + word3_muladd(&w2, &w1, &w0, ws[30], p[18]); + word3_muladd(&w2, &w1, &w0, ws[31], p[17]); + word3_add(&w2, &w1, &w0, z[48]); + ws[16] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[18], p[31]); + word3_muladd(&w2, &w1, &w0, ws[19], p[30]); + word3_muladd(&w2, &w1, &w0, ws[20], p[29]); + word3_muladd(&w2, &w1, &w0, ws[21], p[28]); + word3_muladd(&w2, &w1, &w0, ws[22], p[27]); + word3_muladd(&w2, &w1, &w0, ws[23], p[26]); + word3_muladd(&w2, &w1, &w0, ws[24], p[25]); + word3_muladd(&w2, &w1, &w0, ws[25], p[24]); + word3_muladd(&w2, &w1, &w0, ws[26], p[23]); + word3_muladd(&w2, &w1, &w0, ws[27], p[22]); + word3_muladd(&w2, &w1, &w0, ws[28], p[21]); + word3_muladd(&w2, &w1, &w0, ws[29], p[20]); + word3_muladd(&w2, &w1, &w0, ws[30], p[19]); + word3_muladd(&w2, &w1, &w0, ws[31], p[18]); + word3_add(&w2, &w1, &w0, z[49]); + ws[17] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[19], p[31]); + word3_muladd(&w2, &w1, &w0, ws[20], p[30]); + word3_muladd(&w2, &w1, &w0, ws[21], p[29]); + word3_muladd(&w2, &w1, &w0, ws[22], p[28]); + word3_muladd(&w2, &w1, &w0, ws[23], p[27]); + word3_muladd(&w2, &w1, &w0, ws[24], p[26]); + word3_muladd(&w2, &w1, &w0, ws[25], p[25]); + word3_muladd(&w2, &w1, &w0, ws[26], p[24]); + word3_muladd(&w2, &w1, &w0, ws[27], p[23]); + word3_muladd(&w2, &w1, &w0, ws[28], p[22]); + word3_muladd(&w2, &w1, &w0, ws[29], p[21]); + word3_muladd(&w2, &w1, &w0, ws[30], p[20]); + word3_muladd(&w2, &w1, &w0, ws[31], p[19]); + word3_add(&w2, &w1, &w0, z[50]); + ws[18] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[20], p[31]); + word3_muladd(&w2, &w1, &w0, ws[21], p[30]); + word3_muladd(&w2, &w1, &w0, ws[22], p[29]); + word3_muladd(&w2, &w1, &w0, ws[23], p[28]); + word3_muladd(&w2, &w1, &w0, ws[24], p[27]); + word3_muladd(&w2, &w1, &w0, ws[25], p[26]); + word3_muladd(&w2, &w1, &w0, ws[26], p[25]); + word3_muladd(&w2, &w1, &w0, ws[27], p[24]); + word3_muladd(&w2, &w1, &w0, ws[28], p[23]); + word3_muladd(&w2, &w1, &w0, ws[29], p[22]); + word3_muladd(&w2, &w1, &w0, ws[30], p[21]); + word3_muladd(&w2, &w1, &w0, ws[31], p[20]); + word3_add(&w2, &w1, &w0, z[51]); + ws[19] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[21], p[31]); + word3_muladd(&w2, &w1, &w0, ws[22], p[30]); + word3_muladd(&w2, &w1, &w0, ws[23], p[29]); + word3_muladd(&w2, &w1, &w0, ws[24], p[28]); + word3_muladd(&w2, &w1, &w0, ws[25], p[27]); + word3_muladd(&w2, &w1, &w0, ws[26], p[26]); + word3_muladd(&w2, &w1, &w0, ws[27], p[25]); + word3_muladd(&w2, &w1, &w0, ws[28], p[24]); + word3_muladd(&w2, &w1, &w0, ws[29], p[23]); + word3_muladd(&w2, &w1, &w0, ws[30], p[22]); + word3_muladd(&w2, &w1, &w0, ws[31], p[21]); + word3_add(&w2, &w1, &w0, z[52]); + ws[20] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[22], p[31]); + word3_muladd(&w2, &w1, &w0, ws[23], p[30]); + word3_muladd(&w2, &w1, &w0, ws[24], p[29]); + word3_muladd(&w2, &w1, &w0, ws[25], p[28]); + word3_muladd(&w2, &w1, &w0, ws[26], p[27]); + word3_muladd(&w2, &w1, &w0, ws[27], p[26]); + word3_muladd(&w2, &w1, &w0, ws[28], p[25]); + word3_muladd(&w2, &w1, &w0, ws[29], p[24]); + word3_muladd(&w2, &w1, &w0, ws[30], p[23]); + word3_muladd(&w2, &w1, &w0, ws[31], p[22]); + word3_add(&w2, &w1, &w0, z[53]); + ws[21] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[23], p[31]); + word3_muladd(&w2, &w1, &w0, ws[24], p[30]); + word3_muladd(&w2, &w1, &w0, ws[25], p[29]); + word3_muladd(&w2, &w1, &w0, ws[26], p[28]); + word3_muladd(&w2, &w1, &w0, ws[27], p[27]); + word3_muladd(&w2, &w1, &w0, ws[28], p[26]); + word3_muladd(&w2, &w1, &w0, ws[29], p[25]); + word3_muladd(&w2, &w1, &w0, ws[30], p[24]); + word3_muladd(&w2, &w1, &w0, ws[31], p[23]); + word3_add(&w2, &w1, &w0, z[54]); + ws[22] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[24], p[31]); + word3_muladd(&w2, &w1, &w0, ws[25], p[30]); + word3_muladd(&w2, &w1, &w0, ws[26], p[29]); + word3_muladd(&w2, &w1, &w0, ws[27], p[28]); + word3_muladd(&w2, &w1, &w0, ws[28], p[27]); + word3_muladd(&w2, &w1, &w0, ws[29], p[26]); + word3_muladd(&w2, &w1, &w0, ws[30], p[25]); + word3_muladd(&w2, &w1, &w0, ws[31], p[24]); + word3_add(&w2, &w1, &w0, z[55]); + ws[23] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[25], p[31]); + word3_muladd(&w2, &w1, &w0, ws[26], p[30]); + word3_muladd(&w2, &w1, &w0, ws[27], p[29]); + word3_muladd(&w2, &w1, &w0, ws[28], p[28]); + word3_muladd(&w2, &w1, &w0, ws[29], p[27]); + word3_muladd(&w2, &w1, &w0, ws[30], p[26]); + word3_muladd(&w2, &w1, &w0, ws[31], p[25]); + word3_add(&w2, &w1, &w0, z[56]); + ws[24] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[26], p[31]); + word3_muladd(&w2, &w1, &w0, ws[27], p[30]); + word3_muladd(&w2, &w1, &w0, ws[28], p[29]); + word3_muladd(&w2, &w1, &w0, ws[29], p[28]); + word3_muladd(&w2, &w1, &w0, ws[30], p[27]); + word3_muladd(&w2, &w1, &w0, ws[31], p[26]); + word3_add(&w2, &w1, &w0, z[57]); + ws[25] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[27], p[31]); + word3_muladd(&w2, &w1, &w0, ws[28], p[30]); + word3_muladd(&w2, &w1, &w0, ws[29], p[29]); + word3_muladd(&w2, &w1, &w0, ws[30], p[28]); + word3_muladd(&w2, &w1, &w0, ws[31], p[27]); + word3_add(&w2, &w1, &w0, z[58]); + ws[26] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[28], p[31]); + word3_muladd(&w2, &w1, &w0, ws[29], p[30]); + word3_muladd(&w2, &w1, &w0, ws[30], p[29]); + word3_muladd(&w2, &w1, &w0, ws[31], p[28]); + word3_add(&w2, &w1, &w0, z[59]); + ws[27] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[29], p[31]); + word3_muladd(&w2, &w1, &w0, ws[30], p[30]); + word3_muladd(&w2, &w1, &w0, ws[31], p[29]); + word3_add(&w2, &w1, &w0, z[60]); + ws[28] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[30], p[31]); + word3_muladd(&w2, &w1, &w0, ws[31], p[30]); + word3_add(&w2, &w1, &w0, z[61]); + ws[29] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_muladd(&w2, &w1, &w0, ws[31], p[31]); + word3_add(&w2, &w1, &w0, z[62]); + ws[30] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_add(&w2, &w1, &w0, z[63]); + ws[31] = w0; + w0 = w1; w1 = w2; w2 = 0; + word3_add(&w2, &w1, &w0, z[65]); + ws[32] = w0; + ws[33] = w1; + word borrow = bigint_sub3(ws + 32 + 1, ws, 32 + 1, p, 32); + CT::conditional_copy_mem(borrow, z, ws, ws + 33, 33); + clear_mem(z + 32, 2*(32+1) - 32); + } + +} diff --git a/src/scripts/monty.py b/src/scripts/monty.py new file mode 100755 index 00000000000..e6344282494 --- /dev/null +++ b/src/scripts/monty.py @@ -0,0 +1,91 @@ +#!/usr/bin/python3 + +import sys +import datetime + +# (C) 2018 Jack Lloyd +# Botan is released under the Simplified BSD License (see license.txt) + +# Used to generate src/lib/math/mp/mp_monty_n.cpp + +def monty_redc_code(n): + + lines = [] + + lines.append("word w2 = 0, w1 = 0, w0 = 0;") + lines.append("w0 = z[0];") + lines.append("ws[0] = w0 * p_dash;") + + lines.append("word3_muladd(&w2, &w1, &w0, ws[0], p[0]);") + lines.append("w0 = w1; w1 = w2; w2 = 0;") + + for i in range(1, n): + for j in range(0, i): + lines.append("word3_muladd(&w2, &w1, &w0, ws[%d], p[%d]);" % (j, i-j)) + + lines.append("word3_add(&w2, &w1, &w0, z[%d]);" % (i)) + lines.append("ws[%d] = w0 * p_dash;" % (i)) + + lines.append("word3_muladd(&w2, &w1, &w0, ws[%d], p[0]);" % (i)) + lines.append("w0 = w1; w1 = w2; w2 = 0;") + + for i in range(0, n): + for j in range(i + 1, n): + lines.append("word3_muladd(&w2, &w1, &w0, ws[%d], p[%d]);" % (j, n + i-j)) + + lines.append("word3_add(&w2, &w1, &w0, z[%d]);" % (n+i)) + lines.append("ws[%d] = w0;" % (i)) + lines.append("w0 = w1; w1 = w2; w2 = 0;") + + lines.append("word3_add(&w2, &w1, &w0, z[%d]);" % (2*(n+1) - 1)) + + lines.append("ws[%d] = w0;" % (n)) + lines.append("ws[%d] = w1;" % (n+1)) + + if n < 16: + lines.append("word borrow = 0;") + for i in range(n): + lines.append("ws[%d] = word_sub(ws[%d], p[%d], &borrow);" % (n + 1 + i, i, i)) + lines.append("ws[%d] = word_sub(ws[%d], 0, &borrow);" % (2*n+1, n)) + else: + lines.append("word borrow = bigint_sub3(ws + %d + 1, ws, %d + 1, p, %d);" % (n, n, n)) + + lines.append("CT::conditional_copy_mem(borrow, z, ws, ws + %d, %d);" % (n + 1, n + 1)) + lines.append("clear_mem(z + %d, 2*(%d+1) - %d);" % (n, n, n)) + + for line in lines: + print(" %s" % (line)) + +def main(args = None): + if args is None: + args = sys.argv + + print("""/* +* This file was automatically generated by %s on %s +* All manual changes will be lost. Edit the script instead. +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include +#include +#include +#include + +namespace Botan { +""" % (sys.argv[0], datetime.date.today().strftime("%Y-%m-%d"))) + + for n in [4, 6, 8, 16, 24, 32]: + print("void bigint_monty_redc_%d(word z[], const word p[%d], word p_dash, word ws[])" % (n, n)) + print(" {") + + monty_redc_code(n) + + print(" }\n") + + print("}") + +if __name__ == '__main__': + sys.exit(main()) + + diff --git a/src/tests/test_rsa.cpp b/src/tests/test_rsa.cpp index 32e4ab9e6b1..3688367d27e 100644 --- a/src/tests/test_rsa.cpp +++ b/src/tests/test_rsa.cpp @@ -244,7 +244,7 @@ class RSA_Blinding_Tests final : public Test for(size_t i = 1; i <= BOTAN_BLINDING_REINIT_INTERVAL * 6; ++i) { std::vector input(16); - input[input.size() - 1] = static_cast(i); + input[input.size() - 1] = static_cast(i | 1); signer.update(input); From 48fc8df51d99f9d8ba251219367b3d629cc848e3 Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Tue, 5 Jun 2018 18:40:14 -0400 Subject: [PATCH 174/174] Address DSA/ECDSA side channel --- doc/security.rst | 8 ++++++ src/lib/pubkey/dsa/dsa.cpp | 38 ++++++++++++++++++++-------- src/lib/pubkey/ec_group/ec_group.cpp | 20 +++++++++++++++ src/lib/pubkey/ec_group/ec_group.h | 10 ++++++++ src/lib/pubkey/ecdsa/ecdsa.cpp | 29 ++++++++++++++++----- 5 files changed, 88 insertions(+), 17 deletions(-) diff --git a/doc/security.rst b/doc/security.rst index 8e661c0ad75..cd84997ccc9 100644 --- a/doc/security.rst +++ b/doc/security.rst @@ -18,6 +18,14 @@ https://keybase.io/jacklloyd and on most PGP keyservers. 2018 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* 2018-06-13 (CVE-2018-0495): ECDSA side channel + + A side channel in the ECDSA signature operation could allow a local attacker + to recover the secret key. Found by Keegan Ryan of NCC Group. + + Fixed in 2.7.0. Due to a slight difference in code structure, versions before + 2.5.0 are not affected by this issue. + * 2018-04-10 (CVE-2018-9860): Memory overread in TLS CBC decryption An off by one error in TLS CBC decryption meant that for a particular diff --git a/src/lib/pubkey/dsa/dsa.cpp b/src/lib/pubkey/dsa/dsa.cpp index 1728049727f..7142e478805 100644 --- a/src/lib/pubkey/dsa/dsa.cpp +++ b/src/lib/pubkey/dsa/dsa.cpp @@ -74,7 +74,9 @@ namespace { class DSA_Signature_Operation final : public PK_Ops::Signature_with_EMSA { public: - DSA_Signature_Operation(const DSA_PrivateKey& dsa, const std::string& emsa) : + DSA_Signature_Operation(const DSA_PrivateKey& dsa, + const std::string& emsa, + RandomNumberGenerator& rng) : PK_Ops::Signature_with_EMSA(emsa), m_group(dsa.get_group()), m_x(dsa.get_x()), @@ -83,6 +85,9 @@ class DSA_Signature_Operation final : public PK_Ops::Signature_with_EMSA #if defined(BOTAN_HAS_RFC6979_GENERATOR) m_rfc6979_hash = hash_for_emsa(emsa); #endif + + m_b = BigInt::random_integer(rng, 2, dsa.group_q()); + m_b_inv = inverse_mod(m_b, dsa.group_q()); } size_t max_input_bits() const override { return m_group.get_q().bits(); } @@ -96,6 +101,8 @@ class DSA_Signature_Operation final : public PK_Ops::Signature_with_EMSA #if defined(BOTAN_HAS_RFC6979_GENERATOR) std::string m_rfc6979_hash; #endif + + BigInt m_b, m_b_inv; }; secure_vector @@ -104,22 +111,32 @@ DSA_Signature_Operation::raw_sign(const uint8_t msg[], size_t msg_len, { const BigInt& q = m_group.get_q(); - BigInt i(msg, msg_len, q.bits()); + BigInt m(msg, msg_len, q.bits()); - while(i >= q) - i -= q; + while(m >= q) + m -= q; #if defined(BOTAN_HAS_RFC6979_GENERATOR) BOTAN_UNUSED(rng); - const BigInt k = generate_rfc6979_nonce(m_x, q, i, m_rfc6979_hash); + const BigInt k = generate_rfc6979_nonce(m_x, q, m, m_rfc6979_hash); #else const BigInt k = BigInt::random_integer(rng, 1, q); #endif - BigInt s = inverse_mod(k, q); + const BigInt k_inv = inverse_mod(k, q); + const BigInt r = m_mod_q.reduce(m_group.power_g_p(k)); - s = m_mod_q.multiply(s, mul_add(m_x, r, i)); + /* + * Blind the input message and compute x*r+m as (x*r*b + m*b)/b + */ + m_b = m_mod_q.square(m_b); + m_b_inv = m_mod_q.square(m_b_inv); + + m = m_mod_q.multiply(m_b, m); + const BigInt xr = m_mod_q.multiply(m_mod_q.multiply(m_x, m_b), r); + + const BigInt s = m_mod_q.multiply(m_b_inv, m_mod_q.multiply(k_inv, xr + m)); // With overwhelming probability, a bug rather than actual zero r/s if(r.is_zero() || s.is_zero()) @@ -140,7 +157,8 @@ class DSA_Verification_Operation final : public PK_Ops::Verification_with_EMSA m_group(dsa.get_group()), m_y(dsa.get_y()), m_mod_q(dsa.group_q()) - {} + { + } size_t max_input_bits() const override { return m_group.get_q().bits(); } @@ -193,12 +211,12 @@ DSA_PublicKey::create_verification_op(const std::string& params, } std::unique_ptr -DSA_PrivateKey::create_signature_op(RandomNumberGenerator& /*rng*/, +DSA_PrivateKey::create_signature_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) - return std::unique_ptr(new DSA_Signature_Operation(*this, params)); + return std::unique_ptr(new DSA_Signature_Operation(*this, params, rng)); throw Provider_Not_Found(algo_name(), provider); } diff --git a/src/lib/pubkey/ec_group/ec_group.cpp b/src/lib/pubkey/ec_group/ec_group.cpp index 004708c7cc0..2dfcdc0d948 100644 --- a/src/lib/pubkey/ec_group/ec_group.cpp +++ b/src/lib/pubkey/ec_group/ec_group.cpp @@ -84,11 +84,21 @@ class EC_Group_Data final BigInt mod_order(const BigInt& x) const { return m_mod_order.reduce(x); } + BigInt square_mod_order(const BigInt& x) const + { + return m_mod_order.square(x); + } + BigInt multiply_mod_order(const BigInt& x, const BigInt& y) const { return m_mod_order.multiply(x, y); } + BigInt multiply_mod_order(const BigInt& x, const BigInt& y, const BigInt& z) const + { + return m_mod_order.multiply(m_mod_order.multiply(x, y), z); + } + BigInt inverse_mod_order(const BigInt& x) const { return inverse_mod(x, m_order); @@ -477,11 +487,21 @@ BigInt EC_Group::mod_order(const BigInt& k) const return data().mod_order(k); } +BigInt EC_Group::square_mod_order(const BigInt& x) const + { + return data().square_mod_order(x); + } + BigInt EC_Group::multiply_mod_order(const BigInt& x, const BigInt& y) const { return data().multiply_mod_order(x, y); } +BigInt EC_Group::multiply_mod_order(const BigInt& x, const BigInt& y, const BigInt& z) const + { + return data().multiply_mod_order(x, y, z); + } + BigInt EC_Group::inverse_mod_order(const BigInt& x) const { return data().inverse_mod_order(x); diff --git a/src/lib/pubkey/ec_group/ec_group.h b/src/lib/pubkey/ec_group/ec_group.h index f273108d2b6..f8c1c1a1232 100644 --- a/src/lib/pubkey/ec_group/ec_group.h +++ b/src/lib/pubkey/ec_group/ec_group.h @@ -203,11 +203,21 @@ class BOTAN_PUBLIC_API(2,0) EC_Group final */ BigInt inverse_mod_order(const BigInt& x) const; + /* + * Reduce (x*x) modulo the order + */ + BigInt square_mod_order(const BigInt& x) const; + /* * Reduce (x*y) modulo the order */ BigInt multiply_mod_order(const BigInt& x, const BigInt& y) const; + /* + * Reduce (x*y*z) modulo the order + */ + BigInt multiply_mod_order(const BigInt& x, const BigInt& y, const BigInt& z) const; + /** * Return the cofactor * @result the cofactor diff --git a/src/lib/pubkey/ecdsa/ecdsa.cpp b/src/lib/pubkey/ecdsa/ecdsa.cpp index 6e104f16414..2409d8f0d2e 100644 --- a/src/lib/pubkey/ecdsa/ecdsa.cpp +++ b/src/lib/pubkey/ecdsa/ecdsa.cpp @@ -51,7 +51,8 @@ class ECDSA_Signature_Operation final : public PK_Ops::Signature_with_EMSA public: ECDSA_Signature_Operation(const ECDSA_PrivateKey& ecdsa, - const std::string& emsa) : + const std::string& emsa, + RandomNumberGenerator& rng) : PK_Ops::Signature_with_EMSA(emsa), m_group(ecdsa.domain()), m_x(ecdsa.private_value()) @@ -59,6 +60,9 @@ class ECDSA_Signature_Operation final : public PK_Ops::Signature_with_EMSA #if defined(BOTAN_HAS_RFC6979_GENERATOR) m_rfc6979_hash = hash_for_emsa(emsa); #endif + + m_b = m_group.random_scalar(rng); + m_b_inv = m_group.inverse_mod_order(m_b); } size_t max_input_bits() const override { return m_group.get_order_bits(); } @@ -75,6 +79,8 @@ class ECDSA_Signature_Operation final : public PK_Ops::Signature_with_EMSA #endif std::vector m_ws; + + BigInt m_b, m_b_inv; }; secure_vector @@ -89,12 +95,21 @@ ECDSA_Signature_Operation::raw_sign(const uint8_t msg[], size_t msg_len, const BigInt k = m_group.random_scalar(rng); #endif - const BigInt k_inv = m_group.inverse_mod_order(k); const BigInt r = m_group.mod_order( m_group.blinded_base_point_multiply_x(k, rng, m_ws)); - const BigInt xrm = m_group.mod_order(m_group.multiply_mod_order(m_x, r) + m); - const BigInt s = m_group.multiply_mod_order(k_inv, xrm); + const BigInt k_inv = m_group.inverse_mod_order(k); + + /* + * Blind the input message and compute x*r+m as (x*r*b + m*b)/b + */ + m_b = m_group.square_mod_order(m_b); + m_b_inv = m_group.square_mod_order(m_b_inv); + + m = m_group.multiply_mod_order(m_b, m); + const BigInt xr = m_group.multiply_mod_order(m_x, m_b, r); + + const BigInt s = m_group.multiply_mod_order(k_inv, xr + m, m_b_inv); // With overwhelming probability, a bug rather than actual zero r/s if(r.is_zero() || s.is_zero()) @@ -144,7 +159,7 @@ bool ECDSA_Verification_Operation::verify(const uint8_t msg[], size_t msg_len, const BigInt w = m_group.inverse_mod_order(s); - const BigInt u1 = m_group.multiply_mod_order(e, w); + const BigInt u1 = m_group.multiply_mod_order(m_group.mod_order(e), w); const BigInt u2 = m_group.multiply_mod_order(r, w); const PointGFp R = m_gy_mul.multi_exp(u1, u2); @@ -198,7 +213,7 @@ ECDSA_PublicKey::create_verification_op(const std::string& params, } std::unique_ptr -ECDSA_PrivateKey::create_signature_op(RandomNumberGenerator& /*rng*/, +ECDSA_PrivateKey::create_signature_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const { @@ -233,7 +248,7 @@ ECDSA_PrivateKey::create_signature_op(RandomNumberGenerator& /*rng*/, #endif if(provider == "base" || provider.empty()) - return std::unique_ptr(new ECDSA_Signature_Operation(*this, params)); + return std::unique_ptr(new ECDSA_Signature_Operation(*this, params, rng)); throw Provider_Not_Found(algo_name(), provider); }