From 37bf0aff1bbb6a38897e8e5ba3381cd66b440c74 Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Sun, 17 Dec 2023 23:08:24 +0100 Subject: [PATCH 01/18] [Action] Update cdt version --- .github/workflows/build.yml | 4 ++-- .github/workflows/tests.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2fab59d..49241bc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,8 +25,8 @@ jobs: # Install cdt run: | sudo apt install ninja-build - wget https://github.com/AntelopeIO/cdt/releases/download/v3.1.0/cdt_3.1.0_amd64.deb - sudo apt install ./cdt_3.1.0_amd64.deb + wget https://github.com/AntelopeIO/cdt/releases/download/v4.0.1/cdt_4.0.1_amd64.deb + sudo apt install ./cdt_4.0.1_amd64.deb - name: Configure CMake # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f0a8eae..be0c109 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -25,8 +25,8 @@ jobs: # Install cdt run: | sudo apt install ninja-build - wget https://github.com/AntelopeIO/cdt/releases/download/v3.1.0/cdt_3.1.0_amd64.deb - sudo apt install ./cdt_3.1.0_amd64.deb + wget https://github.com/AntelopeIO/cdt/releases/download/v4.0.1/cdt_4.0.1_amd64.deb + sudo apt install ./cdt_4.0.1_amd64.deb - name: Configure CMake # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. From 2233e720309d0a1a43c733c411560ff3db664e62 Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Sun, 17 Dec 2023 23:28:37 +0100 Subject: [PATCH 02/18] Refactor `bigint::jacobi` && Add tests --- include/ack/bigint.hpp | 113 ++++++++++++++++-------- tests/include/ack/tests/bigint_test.hpp | 21 +++++ tests/include/ack/tests/utils.hpp | 1 + 3 files changed, 96 insertions(+), 39 deletions(-) diff --git a/include/ack/bigint.hpp b/include/ack/bigint.hpp index d937c58..b81a9d4 100644 --- a/include/ack/bigint.hpp +++ b/include/ack/bigint.hpp @@ -1010,7 +1010,7 @@ namespace ack { static constexpr uint32_t count_trailing_zero(bigint& x) { uint32_t s = 0; - while (x.is_even()) { + while ( x.is_even() ) { x >>= 1; s++; } @@ -2286,7 +2286,7 @@ namespace ack { } // TODO: make constexpr when gcd is constexpr - bigint gcd(const bigint& y) + bigint gcd(const bigint& y) const { bigint z; gcd(z, *this, y); @@ -2303,71 +2303,106 @@ namespace ack { } // TODO: make constexpr when lcm is constexpr - bigint lcm(const bigint& y) + bigint lcm(const bigint& y) const { bigint z; lcm(z, *this, y); return z; } - /* - 1 if m is quadratic residue modulo n (i.e., there exists an x s.t. x^2 = m mod n) - 0 if m = 0 mod n - -1 otherwise - @note return legendre_symbol(m, p) for m and odd prime p + /** + * Calculates the Legendre symbol (m/n) using the Jacobi symbol, + * where 'm' is an integer and 'n' is an odd prime. + * + * The Jacobi symbol is a generalization of the Legendre symbol and is used in number theory to + * determine whether a given integer 'm' is a quadratic residue modulo an odd positive integer 'n'. + * The result of the Legendre symbol is: + * + * 1 if 'm' is a quadratic residue modulo 'n' (i.e. there exists such x that m = x^2 mod n). + * 0 if 'm' is 0 or divisible by 'n'. + * -1 if 'm' is a non-quadratic residue modulo 'n'. + * + * This function assumes 'n' is an odd positive integer and 'a' is an integer. + * + * @param m The integer for which the Jacobi symbol is calculated. + * @param n The odd positive integer modulo which the Jacobi symbol is computed. + * @return The Legendre symbol (m/n) as described above. */ // TODO: make constexpr when quot_rem is constexpr static int jacobi(bigint m, bigint n) { - assert(n.is_odd()); + assert( n.is_odd() ); if ( n.is_one() ) return 1; - if (m < 0 || m > n) { - quot_rem(0, m, m, n); // m = m mod n + if ( m < 0 || m > n ) { + quot_rem( 0, m, m, n) ; // m = m mod n } if ( m.is_zero() ) return 0; if ( m.is_one() ) return 1; - if ( gcd(m, n) != 1 ) return 0; + if ( gcd( m, n ) != 1 ) return 0; int j = 1; bigint t; - goto START; - while (m != 1) { - if ((m.get_low32bit() % 4) == 3 && (n.get_low32bit() % 4) == 3) { - j = -j; + bool start = true; + do { + if ( !start ) { + if (( m.get_low32bit() % 4 ) == 3 && ( n.get_low32bit() % 4 ) == 3 ) { + j = -j; + } + mod( t, n, m ); + n = m; + m = t; } - mod(t, n, m); - n = m; - m = t; - START: - int s = count_trailing_zero(m); - uint32_t nmod8 = n.get_low32bit() % 8; - if ((s % 2) && (nmod8 == 3 || nmod8 == 5)) { + + const int s = count_trailing_zero( m ); + const uint32_t nmod8 = n.get_low32bit() % 8; + if (( s % 2 ) && ( nmod8 == 3 || nmod8 == 5 )) { j = -j; } - } - // TODO: transform loop to this code - // bool start = true; - // do { - // if (!start) { - // if ((m.get_low32bit() % 4) == 3 && (n.get_low32bit() % 4) == 3) { - // j = -j; - // } - // mod(t, n, m); - // n = m; - // m = t; - // } + start = false; - // int s = count_trailing_zero(m); + } while ( m != 1 ); + + // goto START; + // while (m != 1) { + // if (( m.get_low32bit() % 4 ) == 3 && ( n.get_low32bit() % 4 ) == 3) { + // j = -j; + // } + // mod( t, n, m ); + // n = m; + // m = t; + // START: + // int s = count_trailing_zero( m ); // uint32_t nmod8 = n.get_low32bit() % 8; - // if ((s % 2) && (nmod8 == 3 || nmod8 == 5)) { + // if (( s % 2 ) && ( nmod8 == 3 || nmod8 == 5 )) { // j = -j; // } - // start = false; - // } while (m != 1) + // } return j; } + /** + * Calculates the Legendre symbol (this/n) using the Jacobi symbol, + * where 'this' is an integer and 'n' is an odd prime. + * + * The Jacobi symbol is a generalization of the Legendre symbol and is used in number theory to + * determine whether a given integer 'm' is a quadratic residue modulo an odd positive integer 'n'. + * The result of the Legendre symbol is: + * + * 1 if 'this' is a quadratic residue modulo 'n' (i.e. there exists such x that m = x^2 mod n). + * 0 if 'this' is 0 or divisible by 'n'. + * -1 if 'this' is a non-quadratic residue modulo 'n'. + * + * This function assumes 'n' is an odd positive integer. + * + * @param n The odd positive integer modulo which the Jacobi symbol is computed. + * @return The Legendre symbol (this/n) as described above. + */ + inline int jacobi(bigint n) const + { + return jacobi( *this, n ); + } + constexpr bigint& operator++() { adds1(*this, *this, 1); return *this; } constexpr bigint& operator--() { subs1(*this, *this, 1); return *this; } constexpr bigint operator++(int) { bigint c = *this; adds1(*this, *this, 1); return c; } diff --git a/tests/include/ack/tests/bigint_test.hpp b/tests/include/ack/tests/bigint_test.hpp index 6b7befe..8d73a20 100644 --- a/tests/include/ack/tests/bigint_test.hpp +++ b/tests/include/ack/tests/bigint_test.hpp @@ -6312,6 +6312,27 @@ namespace ack::tests { REQUIRE_EQUAL( y, z ) } } + + // Jacobi symbol + { + using bn_t = fixed_bigint<512>; + const auto tvs = std::vector>{ + { 0U, 3U, 0 }, // m == 0 + { 0U, 1U, 1 }, + { 1U, 1U, 1 }, + { 3U, 21U, 0 }, // gcd == 3 + { 123U, 1U, 1 }, + { 45U, 77U, -1 }, + { 60U, 121U, 1 }, + { "029d429f012f5808f71c", "0cd0a8b60a81ee3b", 1 }, + { "029d429f012f5808f71c", "0753412f6ff3f8f8463b", -1 }, + }; + + for ( const auto& [m, n, r] : tvs ) { + REQUIRE_EQUAL( bn_t::jacobi( m, n ), r ) + REQUIRE_EQUAL( m.jacobi( n ) , r ) + } + } EOSIO_TEST_END EOSIO_TEST_BEGIN( bigint_test ) diff --git a/tests/include/ack/tests/utils.hpp b/tests/include/ack/tests/utils.hpp index 2d1aa0a..ae9f73d 100644 --- a/tests/include/ack/tests/utils.hpp +++ b/tests/include/ack/tests/utils.hpp @@ -2,6 +2,7 @@ // Author: Crt Vavros #pragma once #include +#include #include #include From 330f8a87501649b41817049ed60f13b953af80e3 Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Tue, 19 Dec 2023 21:52:33 +0100 Subject: [PATCH 03/18] Add `bigint::modexp` & `bigint::pow` overloads && Add additional tests --- include/ack/bigint.hpp | 67 +++++-- tests/include/ack/tests/bigint_test.hpp | 225 ++++++++++++++++++++++-- tests/include/ack/tests/sha2.hpp | 4 +- tests/include/ack/tests/utils.hpp | 1 + 4 files changed, 269 insertions(+), 28 deletions(-) diff --git a/include/ack/bigint.hpp b/include/ack/bigint.hpp index b81a9d4..b1f55a8 100644 --- a/include/ack/bigint.hpp +++ b/include/ack/bigint.hpp @@ -1021,8 +1021,8 @@ namespace ack { const bigint* pm; constexpr bool operator()(bigint& z, const bigint& x, const bigint& y) const { - bool success = mul(z, x, y); - return success && mod(z, z, *pm); + bool success = bigint::mul(z, x, y); + return success && bigint::mod(z, z, *pm); } }; @@ -1071,9 +1071,9 @@ namespace ack { } } - const size_t w = 4; // don't change - const size_t m = word_bit_size / w; - const size_t tblSize = (1 << w) - 1; + constexpr size_t w = 4; // don't change + constexpr size_t m = word_bit_size / w; + constexpr size_t tblSize = (1 << w) - 1; bigint tbl[tblSize]; tbl[0] = x; for (size_t i = 1; i < tblSize; i++) { @@ -1100,7 +1100,7 @@ namespace ack { } } - word_t idx = (v >> ((m - 1 - j) * w)) & tblSize; + const word_t idx = (v >> ((m - 1 - j) * w)) & tblSize; if (idx) { if (!mul(z, z, tbl[idx - 1])) { return false; @@ -1489,9 +1489,9 @@ namespace ack { *this = 0; } - /* - return bit_size(abs(*this)) - @note return 1 if zero + /** + * Returns number of bits to represent this. + * @return Number of bits. */ constexpr std::size_t bit_length() const { @@ -1510,7 +1510,7 @@ namespace ack { { size_t q = i / word_bit_size; size_t r = i % word_bit_size; - if (q >= size()) { + if ( q >= size() ) { return false; } @@ -1639,7 +1639,7 @@ namespace ack { constexpr uint32_t get_low32bit() const { - return (uint32_t)buf_[0]; + return static_cast( buf_[0] ); } constexpr bool is_odd() const @@ -1870,6 +1870,14 @@ namespace ack { return div_mod(0, r, x, y); } + [[maybe_unused]] inline bigint mod(const bigint& m) const + { + bigint r; + const bool ret = mod(r, *this, m); + check( ret, "mod failed" ); + return r; + } + static constexpr void divs1(bigint& q, const bigint& x, int y) { div_mods1(&q, x, y); @@ -2070,7 +2078,6 @@ namespace ack { // TODO: make constexpr when _pow is constexpr static bool pow(bigint& z, const bigint& x, const bigint& y) { - assert(!y.is_neg_); if (y.is_neg_) { return false; } @@ -2086,8 +2093,7 @@ namespace ack { // TODO: make constexpr when _pow is constexpr static bool pow(bigint& z, const bigint& x, int64_t y) { - assert(y >= 0); - if (y < 0) { + if ( y < 0 ) { return false; } @@ -2100,6 +2106,22 @@ namespace ack { return _pow(z, x, u, un, Mul, Sqr); } + [[maybe_unused]] inline bigint pow(const bigint& e) const + { + bigint r; + const bool ret = pow(r, *this, e); + check( ret, "pow failed" ); + return r; + } + + [[maybe_unused]] inline bigint pow(int64_t e) const + { + bigint r; + const bool ret = pow(r, *this, e); + check( ret, "pow failed" ); + return r; + } + /* z = x ^ y mod m REMARK y >= 0; @@ -2109,7 +2131,6 @@ namespace ack { template static bool modexp(bigint& z, const bigint& x, const bigint& y, const bigint& m) { - assert(!y.is_neg_); if (y.is_neg_) { return false; } @@ -2136,6 +2157,22 @@ namespace ack { return _pow(z, x, &y, 1, mm, sm); } + [[maybe_unused]] inline bigint modexp(const bigint& e, const bigint& m) const + { + bigint r; + const bool ret = modexp(r, *this, e, m); + check( ret, "modexp failed" ); + return r; + } + + [[maybe_unused]] inline bigint modexp(const word_t e, const bigint& m) const + { + bigint r; + const bool ret = modexp(r, *this, e, m); + check( ret, "modexp failed" ); + return r; + } + /* inverse mod y = 1/x mod m diff --git a/tests/include/ack/tests/bigint_test.hpp b/tests/include/ack/tests/bigint_test.hpp index 8d73a20..7d830e6 100644 --- a/tests/include/ack/tests/bigint_test.hpp +++ b/tests/include/ack/tests/bigint_test.hpp @@ -5690,6 +5690,7 @@ namespace ack::tests { using bn_t = fixed_bigint<384>; int64_t tv = 85; // b01010101 auto t = bn_t(85); + bn_t r; REQUIRE_EQUAL( t * 0, 0 ) REQUIRE_EQUAL( t * bn_t(0), 0 ) @@ -5709,9 +5710,19 @@ namespace ack::tests { REQUIRE_ASSERT( "division by zero", [&]() { t / bn_t(0); }) + + REQUIRE_ASSERT( "mod by zero", [&]() { + bn_t::mod( t, t, 0 ); + }) + REQUIRE_ASSERT( "mod by zero", [&]() { + t.mod( 0 ); + }) REQUIRE_ASSERT( "mod by zero", [&]() { t % 0; }) + REQUIRE_ASSERT( "mod by zero", [&]() { + t.mod( bn_t(0) ); + }) REQUIRE_ASSERT( "mod by zero", [&]() { t % bn_t(0); }) @@ -5740,6 +5751,9 @@ namespace ack::tests { REQUIRE_EQUAL( 0 % t, 0 % tv ) REQUIRE_EQUAL( bn_t(0) % t, 0 % tv ) + bn_t::mod( r, t, 1 ); + REQUIRE_EQUAL( r, 0 ) + REQUIRE_EQUAL( t.mod( 1 ), 0 ) REQUIRE_EQUAL( t % 1, 0 ) REQUIRE_EQUAL( t % bn_t(1), 0 ) REQUIRE_EQUAL( t % bn_t(1), 0 ) @@ -5772,6 +5786,39 @@ namespace ack::tests { REQUIRE_EQUAL( t , tv ) REQUIRE_EQUAL( t , 1219657095 ) + // Test squqre + REQUIRE_EQUAL( bn_t::sqr( r, 0 ), true ) + REQUIRE_EQUAL( r, 0 ); + REQUIRE_EQUAL( bn_t(0).sqr(), 0 ) + + REQUIRE_EQUAL( bn_t::sqr( r, 1 ), true ) + REQUIRE_EQUAL( r, 1 ); + REQUIRE_EQUAL( bn_t(1).sqr(), 1 ) + + REQUIRE_EQUAL( bn_t::sqr( r, 2 ), true ) + REQUIRE_EQUAL( r, 4 ); + REQUIRE_EQUAL( bn_t(2).sqr(), 4 ) + + REQUIRE_EQUAL( bn_t::sqr( r, 3 ), true ) + REQUIRE_EQUAL( r, 9 ); + REQUIRE_EQUAL( bn_t(3).sqr(), 9 ) + + REQUIRE_EQUAL( bn_t::sqr( r, 4 ), true ) + REQUIRE_EQUAL( r, 16 ); + REQUIRE_EQUAL( bn_t(4).sqr(), 16 ) + + REQUIRE_EQUAL( bn_t::sqr( r, 5 ), true ) + REQUIRE_EQUAL( r, 25 ); + REQUIRE_EQUAL( bn_t(5).sqr(), 25 ) + + REQUIRE_EQUAL( bn_t::sqr( r, 5 ), true ) + REQUIRE_EQUAL( r, 25 ); + REQUIRE_EQUAL( bn_t(5).sqr(), 25 ) + + REQUIRE_EQUAL( bn_t::sqr( r, bn_t("fefefefefefefefefefefefefefefefefefefefe") ), true ) + REQUIRE_EQUAL( r, "fdff000102030405060708090a0b0c0d0e0f100f161514131211100f0e0d0c0b0a09080706050404" ); + REQUIRE_EQUAL( bn_t("fefefefefefefefefefefefefefefefefefefefe").sqr(), "fdff000102030405060708090a0b0c0d0e0f100f161514131211100f0e0d0c0b0a09080706050404" ) + // Test division to final sum -405140023 (0xe7da0dc9) for ( uint32_t i = 1; i < 256; i *= 2 ) { // at 256 t & tv are 0 auto neg_i = -int32_t(i); @@ -5793,56 +5840,99 @@ namespace ack::tests { // Test modulo // Modulus of a positive number - REQUIRE_EQUAL( bn_t(10) % bn_t(3), 10 % 3 ) + bn_t::mod( r, bn_t(10) , bn_t(3) ); + REQUIRE_EQUAL( r, 10 % 3 ) + REQUIRE_EQUAL( bn_t(10).mod( 3 ) , bn_t(1) ) + REQUIRE_EQUAL( bn_t(10) % bn_t(3), bn_t(1) ) REQUIRE_EQUAL( bn_t(10) % bn_t(3), bn_t(1) ) // Modulus of a negative number - REQUIRE_EQUAL( bn_t(-10) % bn_t(3), -10 % 3 ) + bn_t::mod( r, bn_t(-10) , bn_t(3) ); + REQUIRE_EQUAL( r, -10 % 3 ) + REQUIRE_EQUAL( bn_t(-10).mod( 3 ) , bn_t(-1) ) + REQUIRE_EQUAL( bn_t(-10) % bn_t(3), bn_t(-1) ) REQUIRE_EQUAL( bn_t(-10) % bn_t(3), bn_t(-1) ) // Modulus of a number with a larger divisor - REQUIRE_EQUAL( bn_t(10) % bn_t(20), 10 % 20 ) + bn_t::mod( r, bn_t(10) , bn_t(20) ); + REQUIRE_EQUAL( r, 10 % 20 ) + REQUIRE_EQUAL( bn_t(10).mod( 20 ) , bn_t(10) ) + REQUIRE_EQUAL( bn_t(10) % bn_t(20), bn_t(10) ) REQUIRE_EQUAL( bn_t(10) % bn_t(20), bn_t(10) ) // Modulus of a number with a smaller number - REQUIRE_EQUAL( bn_t(10) % bn_t(5), 10 % 5 ) + bn_t::mod( r, bn_t(10) , bn_t(5) ); + REQUIRE_EQUAL( r, 10 % 5 ) + REQUIRE_EQUAL( bn_t(10).mod( 5 ) , bn_t(0) ) + REQUIRE_EQUAL( bn_t(10) % bn_t(5), bn_t(0) ) REQUIRE_EQUAL( bn_t(10) % bn_t(5), bn_t(0) ) // Modulus of a number with a negative divisor - REQUIRE_EQUAL( bn_t(10) % bn_t(-3), 10 % -3 ) + bn_t::mod( r, bn_t(10) , bn_t(-3) ); + REQUIRE_EQUAL( r, 10 % -3 ) + REQUIRE_EQUAL( bn_t(10).mod( -3 ) , bn_t(1) ) + REQUIRE_EQUAL( bn_t(10) % bn_t(-3), bn_t(1) ) REQUIRE_EQUAL( bn_t(10) % bn_t(-3), bn_t(1) ) // Modulus of a negative number with a negative divisor - REQUIRE_EQUAL( bn_t(-10) % bn_t(-3), -10 % -3 ) + bn_t::mod( r, bn_t(-10) , bn_t(-3) ); + REQUIRE_EQUAL( r, -10 % -3 ) + REQUIRE_EQUAL( bn_t(-10).mod( -3 ) , bn_t(-1) ) + REQUIRE_EQUAL( bn_t(-10) % bn_t(-3), bn_t(-1) ) REQUIRE_EQUAL( bn_t(-10) % bn_t(-3), bn_t(-1) ) // Modulus of a number with a larger negative divisor - REQUIRE_EQUAL( bn_t(10) % bn_t(-20), 10 % -20 ) + bn_t::mod( r, bn_t(10) , bn_t(-20) ); + REQUIRE_EQUAL( r, 10 % -20 ) + REQUIRE_EQUAL( bn_t(10).mod( -20 ) , bn_t(10) ) + REQUIRE_EQUAL( bn_t(10) % bn_t(-20), bn_t(10) ) REQUIRE_EQUAL( bn_t(10) % bn_t(-20), bn_t(10) ) // Modulus of a number with a smaller negative divisor - REQUIRE_EQUAL( bn_t(10) % bn_t(-5), 10 % -5 ) + bn_t::mod( r, bn_t(10) , bn_t(-5) ); + REQUIRE_EQUAL( r, 10 % -5 ) + REQUIRE_EQUAL( bn_t(10).mod( -5 ) , bn_t(0) ) + REQUIRE_EQUAL( bn_t(10) % bn_t(-5), bn_t(0) ) REQUIRE_EQUAL( bn_t(10) % bn_t(-5), bn_t(0) ) // Modulus of a negative number with a positive divisor - REQUIRE_EQUAL( bn_t(-10) % bn_t(3), -10 % 3 ) + bn_t::mod( r, bn_t(-10) , bn_t(3) ); + REQUIRE_EQUAL( r, -10 % 3 ) + REQUIRE_EQUAL( bn_t(-10).mod( 3 ) , bn_t(-1) ) + REQUIRE_EQUAL( bn_t(-10) % bn_t(3), bn_t(-1) ) REQUIRE_EQUAL( bn_t(-10) % bn_t(3), bn_t(-1) ) // Modulus of a number with a larger positive divisor - REQUIRE_EQUAL( bn_t(-10) % bn_t(20), -10 % 20 ) + bn_t::mod( r, bn_t(-10) , bn_t(20) ); + REQUIRE_EQUAL( r, -10 % 20 ) + REQUIRE_EQUAL( bn_t(-10).mod( 20 ) , bn_t(-10) ) + REQUIRE_EQUAL( bn_t(-10) % bn_t(20), bn_t(-10) ) REQUIRE_EQUAL( bn_t(-10) % bn_t(20), bn_t(-10) ) // Modulus of a number with a smaller positive divisor - REQUIRE_EQUAL( bn_t(-10) % bn_t(5), -10 % 5 ) + bn_t::mod( r, bn_t(-10) , bn_t(5) ); + REQUIRE_EQUAL( r, -10 % 5 ) + REQUIRE_EQUAL( bn_t(-10).mod( 5 ) , bn_t(0) ) + REQUIRE_EQUAL( bn_t(-10) % bn_t(5), bn_t(0) ) REQUIRE_EQUAL( bn_t(-10) % bn_t(5), bn_t(0) ) // Modulo with a 128-bit number + bn_t::mod( r, bn_t("FEDCBA9876543210") , bn_t("7FFFFFFFFFFFFFFF") ); + REQUIRE_EQUAL( r, bn_t("7EDCBA9876543211") ) + REQUIRE_EQUAL( bn_t("FEDCBA9876543210").mod( "7FFFFFFFFFFFFFFF" ) , bn_t("7EDCBA9876543211") ) REQUIRE_EQUAL( bn_t("FEDCBA9876543210") % bn_t("7FFFFFFFFFFFFFFF"), bn_t("7EDCBA9876543211") ) // Modulo with a 256-bit number + bn_t::mod( r, bn_t("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF") , bn_t("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE") ); + REQUIRE_EQUAL( r, 1 ) + REQUIRE_EQUAL( bn_t("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF").mod( "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE" ) , 1 ) REQUIRE_EQUAL( bn_t("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF") % bn_t("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE"), 1 ) // Modulo with a 384-bit number + bn_t::mod( r, bn_t("0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF") , bn_t("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF") ); + REQUIRE_EQUAL( r, bn_t("0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF") ) + REQUIRE_EQUAL( bn_t("0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF").mod( "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF" ) , + bn_t("0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF") ) REQUIRE_EQUAL( bn_t("0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF") % bn_t("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF"), bn_t("0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF") ) @@ -5912,13 +6002,96 @@ namespace ack::tests { bn_t("F6546F0BA42282D01A41C096543F0AB1")) // Modulo + bn_t r; + bn_t::mod( r, bn_t("7890ABCDEF1234567890ABCDEF") , bn_t("1234567890ABCDEF7890ABCDEF") ); + REQUIRE_EQUAL( r, bn_t("0B56A4FA8B0B60B9A52CA4FA55") ) + REQUIRE_EQUAL( bn_t("7890ABCDEF1234567890ABCDEF").mod( "1234567890ABCDEF7890ABCDEF" ) , bn_t("0B56A4FA8B0B60B9A52CA4FA55")) REQUIRE_EQUAL( bn_t("7890ABCDEF1234567890ABCDEF") % bn_t("1234567890ABCDEF7890ABCDEF"), bn_t("0B56A4FA8B0B60B9A52CA4FA55")) + + bn_t::mod( r, bn_t("FEDCBA9876543210FEDCBA9876543210") , bn_t("123456789ABCDEF0") ); + REQUIRE_EQUAL( r, bn_t("E2E0") ) + REQUIRE_EQUAL( bn_t("FEDCBA9876543210FEDCBA9876543210").mod( "123456789ABCDEF0" ) , bn_t("E2E0") ) REQUIRE_EQUAL( bn_t("FEDCBA9876543210FEDCBA9876543210") % bn_t("123456789ABCDEF0"), bn_t("E2E0")) + + bn_t::mod( r, bn_t("12F234E5C06B7D81B054ACFA69A654C90DB25E070") , bn_t("123456789ABCDEF0") ); + REQUIRE_EQUAL( r, bn_t("09EA91C4E18F9580") ) + REQUIRE_EQUAL( bn_t("12F234E5C06B7D81B054ACFA69A654C90DB25E070").mod( "123456789ABCDEF0" ) , bn_t("09EA91C4E18F9580")) REQUIRE_EQUAL( bn_t("12F234E5C06B7D81B054ACFA69A654C90DB25E070") % bn_t("123456789ABCDEF0"), bn_t("09EA91C4E18F9580")) + + bn_t::mod( r, bn_t("38FE76F2495078F063E1070B7D6F41EA43FA450D6CDD9C76C23E40898C41C86D") , bn_t("3B3B3E3EF08C1D15C9B2A71ABEF78C01") ); + REQUIRE_EQUAL( r, bn_t("7AA1C6CE8C187F138A5AA240F62F1BC") ) + REQUIRE_EQUAL( bn_t("38FE76F2495078F063E1070B7D6F41EA43FA450D6CDD9C76C23E40898C41C86D").mod( "3B3B3E3EF08C1D15C9B2A71ABEF78C01" ) , bn_t("7AA1C6CE8C187F138A5AA240F62F1BC")) REQUIRE_EQUAL(bn_t("38FE76F2495078F063E1070B7D6F41EA43FA450D6CDD9C76C23E40898C41C86D") % bn_t("3B3B3E3EF08C1D15C9B2A71ABEF78C01"), bn_t("7AA1C6CE8C187F138A5AA240F62F1BC")) } + // test exponentiation + { + using bn_t = fixed_bigint<256*2>; + + // Test cases taken from mcl library + bn_t x = 2; + bn_t y; + REQUIRE_EQUAL( bn_t::pow( y, x, 3 ), true ) + REQUIRE_EQUAL( y, 8 ) + REQUIRE_EQUAL( bn_t::pow( y, x, bn_t( 3 ) ), true ) + REQUIRE_EQUAL( y, 8 ) + REQUIRE_EQUAL( x.pow( 3 ), 8 ) + REQUIRE_EQUAL( x.pow( bn_t( 3 )), 8 ) + + x = -2; + REQUIRE_EQUAL( bn_t::pow( y, x, 3 ), true ) + REQUIRE_EQUAL( y, -8 ) + REQUIRE_EQUAL( bn_t::pow( y, x, bn_t( 3 ) ), true ) + REQUIRE_EQUAL( y, -8 ) + REQUIRE_EQUAL( x.pow( 3 ), -8 ) + REQUIRE_EQUAL( x.pow( bn_t( 3 ) ), -8 ) + + REQUIRE_EQUAL( bn_t::pow( y, x, -2 ), false ); + REQUIRE_EQUAL( bn_t::pow( y, x, bn_t( -2 ) ), false ); + REQUIRE_ASSERT( "pow failed", [&]() { + x.pow( -2 ); + }) + REQUIRE_ASSERT( "pow failed", [&]() { + x.pow( bn_t( -2 ) ); + }) + } + + // test modular exponentiation + { + using bn_t = fixed_bigint<256*2>; + + // Test cases taken from mcl library + bn_t x = 7; + bn_t m = 65537; + bn_t y; + + REQUIRE_EQUAL( bn_t::modexp( y, x, 20U, m ), true ) + REQUIRE_EQUAL( y, 55277 ) + REQUIRE_EQUAL( x.modexp( 20, m ), 55277U ) + + REQUIRE_EQUAL( bn_t::modexp( y, x, m - 1, m ), true ) + REQUIRE_EQUAL( y, 1 ) + REQUIRE_EQUAL( x.modexp( m - 1, m ), 1U ) + + x = "2ac00f2c9af814438db241461ec7825ed88d00b0951049aa1b5116e6dca345ec"; + y = "3fffffffffffffffffffffffffffffffaeabb739abd2280eeff497a3340d905"; + m = "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"; + + bn_t z; + REQUIRE_EQUAL( bn_t::modexp( z, x, y - 1, m ), true ) + REQUIRE_EQUAL( z, "6af700db33cdba6c5710093d7f9109c83ebad54f09ebe71a057de152b336cc8e" ) + REQUIRE_EQUAL( x.modexp( y - 1, m ), "6af700db33cdba6c5710093d7f9109c83ebad54f09ebe71a057de152b336cc8e" ) + + REQUIRE_EQUAL( bn_t::modexp( z, x, y, m ), true ) + REQUIRE_EQUAL( z, 1 ); + REQUIRE_EQUAL( x.modexp( y, m ), 1 ); + + REQUIRE_EQUAL( bn_t::modexp( z, x, x, m ), true ) + REQUIRE_EQUAL( z, "46f4a4a79b4937c14e782cda991fcba63cfb9f51821571e6ce08b7a29b33583d" ) + REQUIRE_EQUAL( x.modexp( x, m ), "46f4a4a79b4937c14e782cda991fcba63cfb9f51821571e6ce08b7a29b33583d" ) + } + // Test multiplicative inverse { using bn_t = fixed_bigint<1024>; @@ -6022,6 +6195,11 @@ namespace ack::tests { REQUIRE_EQUAL( r, "1545D9535378BE5B27D1096E3F179B336" ) REQUIRE_EQUAL( bn_t("1FFFFFFFFFFFFFFFFFFFFFFFFFFC00000000000000000000000000").modinv( "1F01A01B01C01E01D01010101010101001" ), r ) + // Test vector from Crypto++ library + REQUIRE_EQUAL( bn_t::modinv( r, "2F0500010000018000000000001C1C000000000000000A000B0000000000000000000000000000FDFFFFFF00000000", "3D2F050001" ), true ) + REQUIRE_EQUAL( r, "3529E4FEBC" ) + REQUIRE_EQUAL( bn_t("2F0500010000018000000000001C1C000000000000000A000B0000000000000000000000000000FDFFFFFF00000000").modinv( "3D2F050001" ), r ) + // 256-bit numbers REQUIRE_EQUAL( bn_t("AE7FD295C6DF1F6F882D9A0D65D621A58AA1E0A44C0EE24A504F1C192A8E07E0") .modinv(bn_t("E8CCF2A301AB5C4470D1745D5A5A5D127F9A4BB3C4E31F45F37DCE98606233C5")), @@ -6313,6 +6491,31 @@ namespace ack::tests { } } + // GCD, LCM tests + { + using bn_t = fixed_bigint<64>; + + // Test cases taken from mcl library + bn_t x = 12; + bn_t y = 18; + bn_t z; + bn_t::gcd( z, x, y ); + REQUIRE_EQUAL( z, 6 ) + REQUIRE_EQUAL( bn_t::gcd( x, y ), 6 ) + REQUIRE_EQUAL( x.gcd( y ), 6 ) + + bn_t::lcm( z, x, y ); + REQUIRE_EQUAL( z, 36 ) + REQUIRE_EQUAL( x.lcm( y ), 36 ) + + bn_t::lcm( x, x, y ); + REQUIRE_EQUAL( x, 36 ) + + REQUIRE_EQUAL( x.lcm( x ), 36 ) + bn_t::lcm( x, x, x ); + REQUIRE_EQUAL( x, 36 ) + } + // Jacobi symbol { using bn_t = fixed_bigint<512>; diff --git a/tests/include/ack/tests/sha2.hpp b/tests/include/ack/tests/sha2.hpp index 0853772..31352b6 100644 --- a/tests/include/ack/tests/sha2.hpp +++ b/tests/include/ack/tests/sha2.hpp @@ -100,7 +100,7 @@ namespace ack::tests { 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 }; - auto chunk = [&hash, &k](const uint8_t* chunk_data) { + auto chunk = [&hash](const uint8_t* chunk_data) { uint32_t w[64] = {0}; for (int i = 0; i != 16; ++i) { @@ -230,7 +230,7 @@ namespace ack::tests { 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817}; - auto chunk = [&hash, &k](const uint8_t* chunk_data) { + auto chunk = [&hash](const uint8_t* chunk_data) { uint64_t w[80] = {0}; for ( int i = 0; i != 16; ++i ) { diff --git a/tests/include/ack/tests/utils.hpp b/tests/include/ack/tests/utils.hpp index ae9f73d..361c60f 100644 --- a/tests/include/ack/tests/utils.hpp +++ b/tests/include/ack/tests/utils.hpp @@ -10,6 +10,7 @@ #include namespace ack::tests { + [[maybe_unused]] static void init_test_intrinsics() { using namespace eosio::native; From 1120ae683fb4035b5f5d1298581560fddbe699c9 Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Wed, 20 Dec 2023 03:05:08 +0100 Subject: [PATCH 04/18] Implement modular square root for Fp --- include/ack/fe.hpp | 11 +- include/ack/fp.hpp | 133 +++++++++-- tests/include/ack/tests/fp_test.hpp | 345 +++++++++++++++++++++++++++- 3 files changed, 471 insertions(+), 18 deletions(-) diff --git a/include/ack/fe.hpp b/include/ack/fe.hpp index 41c5531..ec3ebb4 100644 --- a/include/ack/fe.hpp +++ b/include/ack/fe.hpp @@ -193,7 +193,7 @@ namespace ack { return underlying().mul( x ); } - /** + /** * Calculates square of this element. * @return R = this^2. */ @@ -202,6 +202,15 @@ namespace ack { return underlying().sqr(); } + /** + * Calculates square root of this element. + * @return R = sqrt(this). + */ + [[nodiscard]] Derived sqrt() const + { + return underlying().sqrt(); + } + /** * Calculates division of this element with another. * @param x - Element to divide. diff --git a/include/ack/fp.hpp b/include/ack/fp.hpp index 347ba15..240a597 100644 --- a/include/ack/fp.hpp +++ b/include/ack/fp.hpp @@ -92,6 +92,69 @@ namespace ack { { return ( a * b.modinv( p ) ) % p; } + + template + [[nodiscard]] inline bigint fp_sqrt(const bigint& n, const bigint& p) + { + // Check that n is indeed a square: (n | p) must be = 1 + // The Legendre symbol (n | p) denotes the value of n^(p-1)/2 (mod p). + if ( n.jacobi( p ) != 1 ) { + return 0; + } + + if (( p % 4 ) == 3 ) { + // sqrt(a) = a^((p + 1) / 4) (mod p) + return n.modexp( ( p + 1 ) / 4, p ); + } + + /* Fallback to general Tonelli-Shanks algorithm */ + + // Find q and s such that p - 1 = q2^s with q odd + auto q = p - 1; + std::size_t s = 0; + while ( q.is_even() ) { + s++; + q >>= 1; + } + + // Find non-square z such that (z | p) = -1 + bigint z = 2; + while ( z.jacobi( p ) != -1 ) { // TODO: Possible infinite loop + ++z; + } + + auto c = z.modexp( q, p ); + auto r = n.modexp(( q - 1 ) / 2, p ); + auto t = ( r.sqr() % p ) * n % p; + r = n * r % p; + + while ( t != 1 ) + { + std::size_t m = 0; + z = t; + do + { + m++; + z = z.sqr() % p; + if ( m == s ) { + return 0; + } + } + while ( z != 1 ); + + auto b = c; + for ( std::size_t i = 0; i < ( s - m - 1 ); i++ ) { + b = b.sqr() % p; + } + + c = b.sqr() % p; + s = m; + r = r * b % p; + t = t * c % p; + } + + return r; + } } /** Checks if finite field element a is valid. @@ -321,18 +384,40 @@ namespace ack { * Out of range values are not checked and will produce wrong results. * * @tparam BufferA - Type of the finite field element. - * @tparam BufferC - Type of the prime modulus. + * @tparam BufferB - Type of the prime modulus. * * @param a - Finite field element. * @param p - Prime modulus of the finite field. * @return a * a mod p. */ - template - [[nodiscard]] inline bigint fp_sqr(const bigint& a, const bigint& p) + template + [[nodiscard]] inline bigint fp_sqr(const bigint& a, const bigint& p) { return fp_mul( a, a, p ); } + /** + * Calculates the modular square root of an integer 'n' modulo odd prime 'p'. + * The function returns the first root, where r^2 == n (mod p), and not r^2 == -n (mod p). + * The caller is responsible for verifying if the returned root 'r' satisfies r^2 == n (mod p). + * If not, the caller should calculate r = p - r to get the correct root. + * + * @note This function has an optimization for the case where 'p' == 3 (mod 4). + * In this case, the square root is efficiently computed. + * If 'p' is not congruent to 3 modulo 4, the function uses a general + * Tonelli-Shanks algorithm to find the modular square root. + * + * @param n - The integer for which the modular square root is calculated. + * @param p - The odd prime modulus. + * @return The first modular square root of 'n' modulo 'p', or 0 if no square root exists. + * + */ + template + [[nodiscard]] inline bigint fp_sqrt(const bigint& n, const bigint& p) + { + return detail::fp_sqrt( n, p ); + } + /** * Calculates division of prime finite field elements a and b. * The result is a / b mod p. Internally it's calculated as (a * b^-1) mod p. @@ -379,7 +464,7 @@ namespace ack { } /** - * Constructs a one finite field element. + * Constructs a finite field element of value 1. * @note This instance doesn't have a valid modulus, * so it can't be used for any operations. * The returned instance is invalid and can be used only for comparison. @@ -563,7 +648,7 @@ namespace ack { } /** - * Calculate modular addition of this finite field element and another one. + * Calculates modular addition of this finite field element and another one. * @param x - Finite field element to add. * @return (this + x) % modulus. */ @@ -573,7 +658,7 @@ namespace ack { } /** - * Calculate modular addition of this finite field element and big integer. + * Calculates modular addition of this finite field element and big integer. * @tparam BufferT - Buffer type of big integer. * @param x - Big integer to add. * @return (this + x) % modulus. @@ -585,7 +670,7 @@ namespace ack { } /** - * Calculate modular addition of this finite field element and integer. + * Calculates modular addition of this finite field element and integer. * @tparam IntU - Small integer type. * @param x - Integer to add. * @return (this + x) % modulus. @@ -597,7 +682,7 @@ namespace ack { } /** - * Calculate modular subtraction of this finite field element and another one. + * Calculates modular subtraction of this finite field element and another one. * @param x - Finite field element to subtract. * @return (this - x) % modulus. */ @@ -607,7 +692,7 @@ namespace ack { } /** - * Calculate modular subtraction of this finite field element and big integer. + * Calculates modular subtraction of this finite field element and big integer. * @tparam BufferT - Buffer type of big integer. * @param x - Big integer to subtract. * @return (this - x) % modulus. @@ -619,7 +704,7 @@ namespace ack { } /** - * Calculate modular subtraction of this finite field element and integer. + * Calculates modular subtraction of this finite field element and integer. * @tparam IntU - Small integer type. * @param x - Integer to subtract. * @return (this - x) % modulus. @@ -631,7 +716,7 @@ namespace ack { } /** - * Calculate modular multiplication of this finite field element and another one. + * Calculates modular multiplication of this finite field element and another one. * @param x - Finite field element to multiply. * @return (this * x) % modulus. */ @@ -641,7 +726,7 @@ namespace ack { } /** - * Calculate modular multiplication of this finite field element and big integer. + * Calculates modular multiplication of this finite field element and big integer. * @tparam BufferT - Buffer type of big integer. * @param x - Big integer to multiply. * @return (this * x) % modulus. @@ -659,7 +744,7 @@ namespace ack { } /** - * Calculate modular multiplication of this finite field element and integer. + * Calculates modular multiplication of this finite field element and integer. * @tparam IntU - Small integer type. * @param x - Integer to multiply. * @return (this * x) % modulus. @@ -677,7 +762,7 @@ namespace ack { } /** - * Calculate modular square of this finite field element. + * Calculates modular square of this finite field element. * @return (this^2) % modulus. */ [[nodiscard]] fp_element sqr() const @@ -689,7 +774,23 @@ namespace ack { } /** - * Calculate modular division of this finite field element and another one. + * Calculates the modular square root of this finite field element. + * The function returns the first root, where r^2 == n (mod p), and not r^2 == -n (mod p). + * The caller is responsible for verifying if the returned root 'r' satisfies r^2 == n (mod p). + * If not, the caller should calculate r = p - r to get the correct root. + * + * @return The first modular square root of this mod modulus, or 0 if no square root exists. + */ + [[nodiscard]] fp_element sqrt() const + { + if ( v_.is_one() ) { + return *this; + } + return fp_element( fp_sqrt( v_, *pm_ ), *pm_ ); + } + + /** + * Calculates modular division of this finite field element and another one. * @param x - Finite field element to divide. * @return (this / x) % modulus. */ @@ -699,7 +800,7 @@ namespace ack { } /** - * Calculate modular division of this finite field element and big integer. + * Calculates modular division of this finite field element and big integer. * @tparam BufferT - Buffer type of big integer. * @param x - Big integer to divide. * @return (this / x) % modulus. diff --git a/tests/include/ack/tests/fp_test.hpp b/tests/include/ack/tests/fp_test.hpp index b2bc39d..2dfa9b3 100644 --- a/tests/include/ack/tests/fp_test.hpp +++ b/tests/include/ack/tests/fp_test.hpp @@ -383,6 +383,175 @@ namespace ack::tests { REQUIRE_EQUAL( fp_mul( bn_t( "6A9E8EA23CB63C228F31AD9268B4097F156D6AA11DCB29F14BACCFF196CE3F0AD2" ), -bn_t( "6AA11DCB29F14BACCFF196CE3F0AD2" ), bn_t( "6A9E8EA23CB63C228F31AD9268B4097F156D6AA11" ) ), -bn_t( "1A945B1E1A80601352171738E860E7922A6EBAAA6") ) } + // fp_sqr + { + REQUIRE_EQUAL( fp_sqr( bn_t( 0 ), bn_t( 10 ) ), 0 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 1 ), bn_t( 10 ) ), 1 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 2 ), bn_t( 10 ) ), 4 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 3 ), bn_t( 10 ) ), 9 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 4 ), bn_t( 10 ) ), 6 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 5 ), bn_t( 10 ) ), 5 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 6 ), bn_t( 10 ) ), 6 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 7 ), bn_t( 10 ) ), 9 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 8 ), bn_t( 10 ) ), 4 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 9 ), bn_t( 10 ) ), 1 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 10 ), bn_t( 10 ) ), 0 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 11 ), bn_t( 10 ) ), 1 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 12 ), bn_t( 10 ) ), 4 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 13 ), bn_t( 10 ) ), 9 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 14 ), bn_t( 10 ) ), 6 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 15 ), bn_t( 10 ) ), 5 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 16 ), bn_t( 10 ) ), 6 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 17 ), bn_t( 10 ) ), 9 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 18 ), bn_t( 10 ) ), 4 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 19 ), bn_t( 10 ) ), 1 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 20 ), bn_t( 10 ) ), 0 ) + REQUIRE_EQUAL( fp_sqr( bn_t( 21 ), bn_t( 10 ) ), 1 ) + + REQUIRE_EQUAL( fp_sqr( bn_t( -1 ), bn_t( 10 ) ), 1 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -2 ), bn_t( 10 ) ), 4 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -3 ), bn_t( 10 ) ), 9 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -4 ), bn_t( 10 ) ), 6 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -5 ), bn_t( 10 ) ), 5 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -6 ), bn_t( 10 ) ), 6 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -7 ), bn_t( 10 ) ), 9 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -8 ), bn_t( 10 ) ), 4 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -9 ), bn_t( 10 ) ), 1 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -10 ), bn_t( 10 ) ), 0 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -11 ), bn_t( 10 ) ), 1 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -12 ), bn_t( 10 ) ), 4 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -13 ), bn_t( 10 ) ), 9 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -14 ), bn_t( 10 ) ), 6 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -15 ), bn_t( 10 ) ), 5 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -16 ), bn_t( 10 ) ), 6 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -17 ), bn_t( 10 ) ), 9 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -18 ), bn_t( 10 ) ), 4 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -19 ), bn_t( 10 ) ), 1 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -20 ), bn_t( 10 ) ), 0 ) + REQUIRE_EQUAL( fp_sqr( bn_t( -21 ), bn_t( 10 ) ), 1 ) + + // Big numbers + REQUIRE_EQUAL( fp_sqr( bn_t( "6A9E8EA23CB63C228F31" ), bn_t( "6A9E8EA23CB63C228F31AD9268B4097F156D6AA11" ) ), bn_t( "2C67B052BA023CE9E8FDB4FD5866C975511BC761") ) + REQUIRE_EQUAL( fp_sqr( bn_t( "6AA11DCB29F14BACCFF1" ), bn_t( "6A9E8EA23CB63C228F31AD9268B4097F156D6AA11" ) ), bn_t( "2C69D212BBBE3CE8824379FD4E8F6C414ABFA0E1") ) + + REQUIRE_EQUAL( fp_sqr( bn_t( "6A9E8EA23CB63C228F31AD9268B4097F1" ), bn_t( "6A9E8EA23CB63C228F31AD9268B4097F156D6AA11" ) ), bn_t( "39FEFE5D80C16D765627970811925B885C5EE895B") ) + REQUIRE_EQUAL( fp_sqr( bn_t( "6AA11DCB29F14BACCFF196CE3F0AD2" ) , bn_t( "6A9E8EA23CB63C228F31AD9268B4097F156D6AA11" ) ), bn_t( "61A073DF655912F0BD29C66FCD1FA82267512A555") ) + + REQUIRE_EQUAL( fp_sqr( bn_t( "6A9E8EA23CB63C228F31AD9268B4097F156D6AA11DCB29F14BACCFF196CE3F0AD2" ), bn_t( "6A9E8EA23CB63C228F31AD9268B4097F156D6AA11" ) ), bn_t( "63221D108A0978A6D626C73774B45F2CBFF75E686") ) + REQUIRE_EQUAL( fp_sqr( bn_t( "6AA11DCB29F14BACCFF196CE3F0AD2" ), bn_t( "6A9E8EA23CB63C228F31AD9268B4097F156D6AA11" ) ), bn_t( "61A073DF655912F0BD29C66FCD1FA82267512A555") ) + + REQUIRE_EQUAL( fp_sqr( -bn_t( "6A9E8EA23CB63C228F31AD9268B4097F1" ), bn_t( "6A9E8EA23CB63C228F31AD9268B4097F156D6AA11" ) ), bn_t( "39FEFE5D80C16D765627970811925B885C5EE895B") ) + REQUIRE_EQUAL( fp_sqr( -bn_t( "6AA11DCB29F14BACCFF196CE3F0AD2" ) , bn_t( "6A9E8EA23CB63C228F31AD9268B4097F156D6AA11" ) ), bn_t( "61A073DF655912F0BD29C66FCD1FA82267512A555") ) + } + + // fp_sqrt + { + const auto test_sqrt = [](const bn_t& a, const bn_t& p) { + REQUIRE_EQUAL( fp_sqrt( fp_sqr( a, p ), p ), a ) + }; + + const auto test_sqrt_neg = [](const bn_t& a, const bn_t& p) { + REQUIRE_EQUAL( p - fp_sqrt( fp_sqr( a, p ), p ), a ) + }; + + // Test cases where p % 4 != 3 + // i.e.: general Tonelli–Shanks algorithm + { + bn_t p = 17; + test_sqrt( 1, p ); + test_sqrt( 2, p ); + test_sqrt( 4, p ); + test_sqrt( 6, p ); + test_sqrt( 7, p ); + test_sqrt( 8, p ); + test_sqrt( 12, p ); + test_sqrt( 14, p ); + + // special cases (negated roots, invalid roots) + test_sqrt( 0, p ); + + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 3 ), p ), p ), 14 ) + test_sqrt_neg( 3, p); + + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 5 ), p ), p ), 12 ) + test_sqrt_neg( 5, p); + + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 9 ), p ), p ), 8 ) + test_sqrt_neg( 9, p); + + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 10 ), p ), p ), 7 ) + test_sqrt_neg( 10, p); + + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 11 ), p ), p ), 6 ) + test_sqrt_neg( 11, p); + + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 13 ), p ), p ), 4 ) + test_sqrt_neg( 13, p); + + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 15 ), p ), p ), 2 ) + test_sqrt_neg( 15, p); + + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 16 ), p ), p ), 1 ) + test_sqrt_neg( 16, p); + + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 17 ), p ), p ), 0 ) + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 18 ), p ), p ), 1 ) + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 19 ), p ), p ), 2 ) + + // Additional tests + test_sqrt( 7, 13 ); + test_sqrt( 37, 101 ); + test_sqrt( 651, 1009 ); + test_sqrt( 174, 1009 ); + REQUIRE_EQUAL( fp_sqrt( bn_t( 1032 ) , bn_t( 1009 )), 0 ) + + test_sqrt( 378633312, 1000000009 ); + test_sqrt( 378633312, 1000000009 ); + test_sqrt( "15f73ba6b33d469cb81975ea86c422a33be005070c", "446c3b15f9926687d2c40534fdb564000000000241" ); + } + + // Test cases where p % 4 == 3 + { + bn_t p = 11; + test_sqrt( 1, 11 ); + test_sqrt( 3, 11 ); + test_sqrt( 4, 11 ); + test_sqrt( 5, 11 ); + test_sqrt( 9, 11 ); + + // special cases (negated roots, invalid roots) + test_sqrt( 0, 11 ); + + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 2 ), p ), p ), 9 ) + test_sqrt_neg( 2, p ); + + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 6 ), p ), p ), 5 ) + test_sqrt_neg( 6, p ); + + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 7 ), p ), p ), 4 ) + test_sqrt_neg( 7, p ); + + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 8 ), p ), p ), 3 ) + test_sqrt_neg( 8, p ); + + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 10 ), p ), p ), 1 ) + test_sqrt_neg( 10, p ); + + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 11 ), p ), p ), 0 ) + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 12 ), p ), p ), 1 ) + REQUIRE_EQUAL( fp_sqrt( fp_sqr( bn_t( 13 ), p ), p ), 9 ) + + // Additional tests + test_sqrt( 791399408049ULL, 1000000000039ULL ); + + // secp256r1 G.y and p + test_sqrt( "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff" ); + + // secp256k1 G.y and p + test_sqrt( "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f" ); + } + } + // fp_div tests { REQUIRE_EQUAL( fp_div( bn_t( 0 ), bn_t( 1 ), bn_t( 10 ) ), 0 ) @@ -2270,7 +2439,6 @@ namespace ack::tests { fe *= 65536; REQUIRE_EQUAL( fe, 8 ) - REQUIRE_EQUAL( fpe_t( -1, modulus ).mul( fpe_t( -1, modulus ) ), 1 ) REQUIRE_EQUAL( fpe_t( -1, modulus ).mul( bn_t( -1 ) ) , 1 ) REQUIRE_EQUAL( fpe_t( -1, modulus ).mul( -1 ) , 1 ) @@ -2767,6 +2935,181 @@ namespace ack::tests { REQUIRE_EQUAL( fe, -bn_t( "1A945B1E1A80601352171738E860E7922A6EBAAA6") ) } + // fp_sqr + { + bn_t modulus = 10; + + REQUIRE_EQUAL( fpe_t( bn_t(0), modulus ).sqr(), 0 ); + REQUIRE_EQUAL( fpe_t( bn_t(1), modulus ).sqr(), 1 ); + REQUIRE_EQUAL( fpe_t( bn_t(2), modulus ).sqr(), 4 ); + REQUIRE_EQUAL( fpe_t( bn_t(3), modulus ).sqr(), 9 ); + REQUIRE_EQUAL( fpe_t( bn_t(4), modulus ).sqr(), 6 ); + REQUIRE_EQUAL( fpe_t( bn_t(5), modulus ).sqr(), 5 ); + REQUIRE_EQUAL( fpe_t( bn_t(6), modulus ).sqr(), 6 ); + REQUIRE_EQUAL( fpe_t( bn_t(7), modulus ).sqr(), 9 ); + REQUIRE_EQUAL( fpe_t( bn_t(8), modulus ).sqr(), 4 ); + REQUIRE_EQUAL( fpe_t( bn_t(9), modulus ).sqr(), 1 ); + REQUIRE_EQUAL( fpe_t( bn_t(10), modulus ).sqr(), 0 ); + REQUIRE_EQUAL( fpe_t( bn_t(11), modulus ).sqr(), 1 ); + REQUIRE_EQUAL( fpe_t( bn_t(12), modulus ).sqr(), 4 ); + REQUIRE_EQUAL( fpe_t( bn_t(13), modulus ).sqr(), 9 ); + REQUIRE_EQUAL( fpe_t( bn_t(14), modulus ).sqr(), 6 ); + REQUIRE_EQUAL( fpe_t( bn_t(15), modulus ).sqr(), 5 ); + REQUIRE_EQUAL( fpe_t( bn_t(16), modulus ).sqr(), 6 ); + REQUIRE_EQUAL( fpe_t( bn_t(17), modulus ).sqr(), 9 ); + REQUIRE_EQUAL( fpe_t( bn_t(18), modulus ).sqr(), 4 ); + REQUIRE_EQUAL( fpe_t( bn_t(19), modulus ).sqr(), 1 ); + REQUIRE_EQUAL( fpe_t( bn_t(20), modulus ).sqr(), 0 ); + REQUIRE_EQUAL( fpe_t( bn_t(21), modulus ).sqr(), 1 ); + + REQUIRE_EQUAL( fpe_t( bn_t(-1), modulus ).sqr(), 1 ); + REQUIRE_EQUAL( fpe_t( bn_t(-2), modulus ).sqr(), 4 ); + REQUIRE_EQUAL( fpe_t( bn_t(-3), modulus ).sqr(), 9 ); + REQUIRE_EQUAL( fpe_t( bn_t(-4), modulus ).sqr(), 6 ); + REQUIRE_EQUAL( fpe_t( bn_t(-5), modulus ).sqr(), 5 ); + REQUIRE_EQUAL( fpe_t( bn_t(-6), modulus ).sqr(), 6 ); + REQUIRE_EQUAL( fpe_t( bn_t(-7), modulus ).sqr(), 9 ); + REQUIRE_EQUAL( fpe_t( bn_t(-8), modulus ).sqr(), 4 ); + REQUIRE_EQUAL( fpe_t( bn_t(-9), modulus ).sqr(), 1 ); + REQUIRE_EQUAL( fpe_t( bn_t(-10), modulus ).sqr(), 0 ); + REQUIRE_EQUAL( fpe_t( bn_t(-11), modulus ).sqr(), 1 ); + REQUIRE_EQUAL( fpe_t( bn_t(-12), modulus ).sqr(), 4 ); + REQUIRE_EQUAL( fpe_t( bn_t(-13), modulus ).sqr(), 9 ); + REQUIRE_EQUAL( fpe_t( bn_t(-14), modulus ).sqr(), 6 ); + REQUIRE_EQUAL( fpe_t( bn_t(-15), modulus ).sqr(), 5 ); + REQUIRE_EQUAL( fpe_t( bn_t(-16), modulus ).sqr(), 6 ); + REQUIRE_EQUAL( fpe_t( bn_t(-17), modulus ).sqr(), 9 ); + REQUIRE_EQUAL( fpe_t( bn_t(-18), modulus ).sqr(), 4 ); + REQUIRE_EQUAL( fpe_t( bn_t(-19), modulus ).sqr(), 1 ); + REQUIRE_EQUAL( fpe_t( bn_t(-20), modulus ).sqr(), 0 ); + REQUIRE_EQUAL( fpe_t( bn_t(-21), modulus ).sqr(), 1 ); + + // Big numbers + modulus = "6A9E8EA23CB63C228F31AD9268B4097F156D6AA11"; + + REQUIRE_EQUAL(fpe_t( bn_t("6A9E8EA23CB63C228F31"), modulus ).sqr(), bn_t("2C67B052BA023CE9E8FDB4FD5866C975511BC761")) + REQUIRE_EQUAL(fpe_t( bn_t("6AA11DCB29F14BACCFF1"), modulus ).sqr(), bn_t("2C69D212BBBE3CE8824379FD4E8F6C414ABFA0E1")) + + REQUIRE_EQUAL(fpe_t( bn_t("6A9E8EA23CB63C228F31AD9268B4097F1"), modulus ).sqr(), bn_t("39FEFE5D80C16D765627970811925B885C5EE895B")) + REQUIRE_EQUAL(fpe_t( bn_t("6AA11DCB29F14BACCFF196CE3F0AD2"), modulus ).sqr(), bn_t("61A073DF655912F0BD29C66FCD1FA82267512A555")) + + REQUIRE_EQUAL(fpe_t( bn_t("6A9E8EA23CB63C228F31AD9268B4097F156D6AA11DCB29F14BACCFF196CE3F0AD2" ), modulus).sqr(), bn_t("63221D108A0978A6D626C73774B45F2CBFF75E686")) + REQUIRE_EQUAL(fpe_t( bn_t("6AA11DCB29F14BACCFF196CE3F0AD2"), modulus ).sqr(), bn_t("61A073DF655912F0BD29C66FCD1FA82267512A555")) + + REQUIRE_EQUAL(fpe_t( -bn_t("6A9E8EA23CB63C228F31AD9268B4097F1"), modulus ).sqr(), bn_t("39FEFE5D80C16D765627970811925B885C5EE895B")) + REQUIRE_EQUAL(fpe_t( -bn_t("6AA11DCB29F14BACCFF196CE3F0AD2"), modulus ).sqr(), bn_t("61A073DF655912F0BD29C66FCD1FA82267512A555")) + } + + // fp_sqrt + { + const auto test_sqrt = [](const bn_t& a, const bn_t& p) { + REQUIRE_EQUAL( fpe_t( a, p ).sqr().sqrt(), a ) + }; + + const auto test_sqrt_neg = [](const bn_t& a, const bn_t& p) { + REQUIRE_EQUAL( -fpe_t( a, p ).sqr().sqrt(), a ) + }; + + // Test cases where p % 4 != 3 + // i.e.: general Tonelli–Shanks algorithm + { + bn_t p = 17; + test_sqrt( 1, p ); + test_sqrt( 2, p ); + test_sqrt( 4, p ); + test_sqrt( 6, p ); + test_sqrt( 7, p ); + test_sqrt( 8, p ); + test_sqrt( 12, p ); + test_sqrt( 14, p ); + + // special cases (negated roots, invalid roots) + test_sqrt( 0, p ); + + REQUIRE_EQUAL(fpe_t(bn_t(3), p).sqr().sqrt(), 14); + test_sqrt_neg(3, p); + + REQUIRE_EQUAL(fpe_t(bn_t(5), p).sqr().sqrt(), 12); + test_sqrt_neg(5, p); + + REQUIRE_EQUAL(fpe_t(bn_t(9), p).sqr().sqrt(), 8); + test_sqrt_neg(9, p); + + REQUIRE_EQUAL(fpe_t(bn_t(10), p).sqr().sqrt(), 7); + test_sqrt_neg(10, p); + + REQUIRE_EQUAL(fpe_t(bn_t(11), p).sqr().sqrt(), 6); + test_sqrt_neg(11, p); + + REQUIRE_EQUAL(fpe_t(bn_t(13), p).sqr().sqrt(), 4); + test_sqrt_neg(13, p); + + REQUIRE_EQUAL(fpe_t(bn_t(15), p).sqr().sqrt(), 2); + test_sqrt_neg(15, p); + + REQUIRE_EQUAL(fpe_t(bn_t(16), p).sqr().sqrt(), 1); + test_sqrt_neg(16, p); + + REQUIRE_EQUAL(fpe_t(bn_t(17), p).sqr().sqrt(), 0); + REQUIRE_EQUAL(fpe_t(bn_t(18), p).sqr().sqrt(), 1); + REQUIRE_EQUAL(fpe_t(bn_t(19), p).sqr().sqrt(), 2); + + // Additional tests + test_sqrt( 7, 13 ); + test_sqrt( 37, 101 ); + test_sqrt( 651, 1009 ); + test_sqrt( 174, 1009 ); + + p = bn_t( 1009 ); + REQUIRE_EQUAL( fpe_t( bn_t( 1032 ) , p).sqrt(), 0 ) + + test_sqrt( 378633312, 1000000009 ); + test_sqrt( 378633312, 1000000009 ); + test_sqrt( "15f73ba6b33d469cb81975ea86c422a33be005070c", "446c3b15f9926687d2c40534fdb564000000000241" ); + } + + // Test cases where p % 4 == 3 + { + bn_t p = 11; + test_sqrt( 1, 11 ); + test_sqrt( 3, 11 ); + test_sqrt( 4, 11 ); + test_sqrt( 5, 11 ); + test_sqrt( 9, 11 ); + + // special cases (negated roots, invalid roots) + test_sqrt( 0, 11 ); + + REQUIRE_EQUAL(fpe_t(bn_t(2), p).sqr().sqrt(), 9); + test_sqrt_neg(2, p); + + REQUIRE_EQUAL(fpe_t(bn_t(6), p).sqr().sqrt(), 5); + test_sqrt_neg(6, p); + + REQUIRE_EQUAL(fpe_t(bn_t(7), p).sqr().sqrt(), 4); + test_sqrt_neg(7, p); + + REQUIRE_EQUAL(fpe_t(bn_t(8), p).sqr().sqrt(), 3); + test_sqrt_neg(8, p); + + REQUIRE_EQUAL(fpe_t(bn_t(10), p).sqr().sqrt(), 1); + test_sqrt_neg(10, p); + + REQUIRE_EQUAL(fpe_t(bn_t(11), p).sqr().sqrt(), 0); + REQUIRE_EQUAL(fpe_t(bn_t(12), p).sqr().sqrt(), 1); + REQUIRE_EQUAL(fpe_t(bn_t(13), p).sqr().sqrt(), 9); + + // Additional tests + test_sqrt( 791399408049ULL, 1000000000039ULL ); + + // secp256r1 G.y and p + test_sqrt( "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff" ); + + // secp256k1 G.y and p + test_sqrt( "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f" ); + } + } + // Division tests { bn_t modulus = 10; From 331147825336bb42a063180302eacb5e8ac69427 Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Thu, 21 Dec 2023 20:21:13 +0100 Subject: [PATCH 05/18] Add `to_bytes` method --- include/ack/fe.hpp | 33 +++++++++ include/ack/fp.hpp | 34 +++++++++ include/ack/types.hpp | 17 +++++ tests/include/ack/tests/fp_test.hpp | 111 ++++++++++++++++++++++++++++ 4 files changed, 195 insertions(+) diff --git a/include/ack/fe.hpp b/include/ack/fe.hpp index ec3ebb4..80604dc 100644 --- a/include/ack/fe.hpp +++ b/include/ack/fe.hpp @@ -37,6 +37,15 @@ namespace ack { return Derived::one(); } + /** + * Returns the max element bytes size. + * @return max element size. + */ + constexpr std::size_t max_byte_length() const + { + return underlying().max_byte_length(); + } + /** * Casts this element to big integer. * @return const reference to big integer representation of this element. @@ -82,6 +91,30 @@ namespace ack { return underlying().is_negative(); } + /** + * Returns the byte-encoded representation of this object. + * + * @param len - The desired length of the byte-encoded representation + * The full byte-encoded representation is returned if len is smaller + * than the byte length of the original object. + * + * @return The byte-encoded representation of this object. + */ + bytes to_bytes(std::size_t len) const + { + return underlying().to_bytes( len ); + } + + /** + * Returns the byte-encoded representation of this object of size max_byte_length(). + * @return The byte-encoded representation of this object. + */ + bytes to_bytes() const + { + auto len = max_byte_length(); + return to_bytes( len ); + } + /** * Returns the inverse of this element, i.e. 1 / this. * @return Inverse of this element. diff --git a/include/ack/fp.hpp b/include/ack/fp.hpp index 240a597..2d878cd 100644 --- a/include/ack/fp.hpp +++ b/include/ack/fp.hpp @@ -449,6 +449,7 @@ namespace ack { public: using base_type = field_element, IntT, PrimeFieldTag>; using base_type::base_type; + using base_type::to_bytes; /** * Constructs a zero finite field element. @@ -527,6 +528,18 @@ namespace ack { constexpr fp_element& operator=(const fp_element& other) = default; constexpr fp_element& operator=(fp_element&& other) = default; + /** + * Returns the max element bytes size. + * @return max element size. + */ + constexpr std::size_t max_byte_length() const + { + if ( !is_valid()) { + return 0; + } + return ( *pm_ - 1 ).byte_length(); + } + /** * Assigns big integer value to the finite field element. * If element is invalid, then it will not be changed. @@ -638,6 +651,27 @@ namespace ack { return v_.is_negative(); } + /** + * Returns the byte-encoded representation of this object. + * + * @param len - The desired length of the byte-encoded representation + * The full byte-encoded representation is returned if len is smaller + * than the byte length of the original object. + * + * @return The byte-encoded representation of this object. + */ + bytes to_bytes(std::size_t len) const + { + bytes ev; + if ( is_valid() ) { + ev = v_.to_bytes(); + if ( len > ev.size() ) { + ev = bytes( len - ev.size(), 0 ) + ev; + } + } + return ev; + } + /** * Calculates modular inverse of this finite field element. * @return (1 / this) % modulus. diff --git a/include/ack/types.hpp b/include/ack/types.hpp index b65809f..40f67ab 100644 --- a/include/ack/types.hpp +++ b/include/ack/types.hpp @@ -51,4 +51,21 @@ namespace ack { ds.skip( s ); return ds; } + + template, typename AllocB = std::allocator> + inline std::vector operator + (const std::vector& a, const std::vector& b) + { + std::vector c; + c.reserve(a.size() + b.size() ); + std::copy( a.begin(), a.end(), std::back_inserter( c) ); + std::copy( b.begin(), b.end(), std::back_inserter( c) ); + return c; + } + + template, typename AllocB = std::allocator> + inline std::vector& operator += (std::vector& a, const std::vector& b) + { + a.insert( a.end(), b.begin(), b.end() ); + return a; + } } \ No newline at end of file diff --git a/tests/include/ack/tests/fp_test.hpp b/tests/include/ack/tests/fp_test.hpp index 2dfa9b3..9d47e64 100644 --- a/tests/include/ack/tests/fp_test.hpp +++ b/tests/include/ack/tests/fp_test.hpp @@ -3552,6 +3552,117 @@ namespace ack::tests { fe /= b; REQUIRE_EQUAL( fe, "2F1F1FE098ED612AC09FE67F0DF9AE18AC979376C" ) } + + // misc + { + // encoding to bytes + auto mod = bn_t( "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f" ); + auto fe = fpe_t( 0U, mod ); + REQUIRE_EQUAL( fe.to_bytes( 0 ), "00"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 1 ), "00"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 2 ), "0000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 3 ), "000000"_hex ) + REQUIRE_EQUAL( fe.to_bytes() , "0000000000000000000000000000000000000000000000000000000000000000"_hex ) + + fe = 1; + REQUIRE_EQUAL( fe.to_bytes( 0 ), "01"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 1 ), "01"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 2 ), "0001"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 3 ), "000001"_hex ) + REQUIRE_EQUAL( fe.to_bytes() , "0000000000000000000000000000000000000000000000000000000000000001"_hex ) + + fe = 0x0f; + REQUIRE_EQUAL( fe.to_bytes( 0 ), "0F"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 1 ), "0F"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 2 ), "000F"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 3 ), "00000F"_hex ) + REQUIRE_EQUAL( fe.to_bytes() , "000000000000000000000000000000000000000000000000000000000000000F"_hex ) + + fe = 0xff; + REQUIRE_EQUAL( fe.to_bytes( 0 ), "FF"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 1 ), "FF"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 2 ), "00FF"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 3 ), "0000FF"_hex ) + REQUIRE_EQUAL( fe.to_bytes() , "00000000000000000000000000000000000000000000000000000000000000FF"_hex ) + + fe = 0x100; + REQUIRE_EQUAL( fe.to_bytes( 0 ), "0100"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 1 ), "0100"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 2 ), "0100"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 3 ), "000100"_hex ) + REQUIRE_EQUAL( fe.to_bytes() , "0000000000000000000000000000000000000000000000000000000000000100"_hex ) + + fe = 0x1000; + REQUIRE_EQUAL( fe.to_bytes( 0 ), "1000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 1 ), "1000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 2 ), "1000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 3 ), "001000"_hex ) + REQUIRE_EQUAL( fe.to_bytes() , "0000000000000000000000000000000000000000000000000000000000001000"_hex ) + + fe = 0x10000; + REQUIRE_EQUAL( fe.to_bytes( 0 ), "010000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 1 ), "010000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 2 ), "010000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 3 ), "010000"_hex ) + REQUIRE_EQUAL( fe.to_bytes() , "0000000000000000000000000000000000000000000000000000000000010000"_hex ) + + fe = 0x100000; + REQUIRE_EQUAL( fe.to_bytes( 0 ), "100000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 1 ), "100000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 2 ), "100000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 3 ), "100000"_hex ) + REQUIRE_EQUAL( fe.to_bytes() , "0000000000000000000000000000000000000000000000000000000000100000"_hex ) + + fe = 0xffffff; + REQUIRE_EQUAL( fe.to_bytes( 0 ), "FFFFFF"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 1 ), "FFFFFF"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 2 ), "FFFFFF"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 3 ), "FFFFFF"_hex ) + REQUIRE_EQUAL( fe.to_bytes() , "0000000000000000000000000000000000000000000000000000000000FFFFFF"_hex ) + + fe = 0x1000000; + REQUIRE_EQUAL( fe.to_bytes( 0 ), "01000000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 1 ), "01000000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 2 ), "01000000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 3 ), "01000000"_hex ) + REQUIRE_EQUAL( fe.to_bytes() , "0000000000000000000000000000000000000000000000000000000001000000"_hex ) + + fe = 0x10000000; + REQUIRE_EQUAL( fe.to_bytes( 0 ), "10000000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 1 ), "10000000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 2 ), "10000000"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 3 ), "10000000"_hex ) + REQUIRE_EQUAL( fe.to_bytes() , "0000000000000000000000000000000000000000000000000000000010000000"_hex ) + + fe = "2F1F1FE098ED612AC09FE67F0DF9AE18AC979376C"; + REQUIRE_EQUAL( fe.to_bytes( 0 ) , "02F1F1FE098ED612AC09FE67F0DF9AE18AC979376C"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 1 ) , "02F1F1FE098ED612AC09FE67F0DF9AE18AC979376C"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 2 ) , "02F1F1FE098ED612AC09FE67F0DF9AE18AC979376C"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 3 ) , "02F1F1FE098ED612AC09FE67F0DF9AE18AC979376C"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 21 ), "02F1F1FE098ED612AC09FE67F0DF9AE18AC979376C"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 22 ), "0002F1F1FE098ED612AC09FE67F0DF9AE18AC979376C"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 23 ), "000002F1F1FE098ED612AC09FE67F0DF9AE18AC979376C"_hex ) + REQUIRE_EQUAL( fe.to_bytes() , "000000000000000000000002F1F1FE098ED612AC09FE67F0DF9AE18AC979376C"_hex ) + + fe = mod - 1; + REQUIRE_EQUAL( fe.to_bytes( 0 ) , "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2E"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 1 ) , "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2E"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 2 ) , "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2E"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 3 ) , "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2E"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 21 ), "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2E"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 22 ), "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2E"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 23 ), "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2E"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 32 ), "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2E"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 33 ), "00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2E"_hex ) + REQUIRE_EQUAL( fe.to_bytes( 34 ), "0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2E"_hex ) + REQUIRE_EQUAL( fe.to_bytes() , "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2E"_hex ) + + // Should return empty bytes when invalid field element + fe = mod + 1; + REQUIRE_EQUAL( fe.to_bytes(), ""_hex ) + REQUIRE_EQUAL( fpe_t::zero().to_bytes(), ""_hex ) + REQUIRE_EQUAL( fpe_t::one().to_bytes(), ""_hex ) + } EOSIO_TEST_END // fp_element_test EOSIO_TEST_BEGIN(fp_test) From 1a365e60123c0e5bf8b888c147681f96c686b77e Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Fri, 22 Dec 2023 00:15:46 +0100 Subject: [PATCH 06/18] [Test] Add additional `ec_mul_add_fast` tests for `ec_point_fp_jacobi` --- tests/include/ack/tests/ec_test.hpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/include/ack/tests/ec_test.hpp b/tests/include/ack/tests/ec_test.hpp index 7475739..4182275 100644 --- a/tests/include/ack/tests/ec_test.hpp +++ b/tests/include/ack/tests/ec_test.hpp @@ -4401,22 +4401,26 @@ namespace ack::tests { EOSIO_TEST_BEGIN( ec_mul_add_fast_test ) using namespace detail; for_each_curve_do( [](const CurveT& c) { - using point_type = typename CurveT::point_type; - using point_proj_type = ec_point_fp_proj; - for ( int32_t i = 1; i < 101; i++) { auto p = c.g * i; auto p_proj = ec_point_fp_proj( p ); + auto p_jacobi = ec_point_fp_jacobi( p ); + auto q = c.g * (101 - i ); auto q_proj = ec_point_fp_proj( q ); + auto q_jacobi = ec_point_fp_jacobi( q ); + auto u1 = (i * ( c.n - 1 )) % c.n; auto u2 = (i * ( c.n - 2 )) % c.n; auto r = p * u1 + q * u2; auto r_proj = p_proj * u1 + q_proj * u2; - REQUIRE_EQUAL( r, r_proj.to_affine() ); + auto r_jacobi = p_jacobi * u1 + q_jacobi * u2; + REQUIRE_EQUAL( r, r_proj.to_affine() ); + REQUIRE_EQUAL( r, r_jacobi.to_affine() ); REQUIRE_EQUAL( ec_mul_add_fast(u1, p, u2, q), r ); REQUIRE_EQUAL( ec_mul_add_fast(u1, p_proj, u2, q_proj), r_proj ); + REQUIRE_EQUAL( ec_mul_add_fast(u1, p_jacobi, u2, q_jacobi), r_jacobi ); } }); EOSIO_TEST_END // ec_mul_add_fast_test From 2ff9849757f41ad5a7fdd64038a61ccc48e03aac Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Fri, 22 Dec 2023 01:15:59 +0100 Subject: [PATCH 07/18] Refactor `make_point` Added point type template argument. --- include/ack/ec.hpp | 70 ++++++++++++++++------------- tests/include/ack/tests/ec_test.hpp | 20 +++++++++ 2 files changed, 58 insertions(+), 32 deletions(-) diff --git a/include/ack/ec.hpp b/include/ack/ec.hpp index 5248b5b..8561be6 100644 --- a/include/ack/ec.hpp +++ b/include/ack/ec.hpp @@ -828,10 +828,6 @@ namespace ack { [[nodiscard]] ec_point_fp_proj doubled() const { const auto& p = *this; - if ( p.is_identity() ) { - return p; - } - if ( p.is_identity() || p.y == 0 ) { return ec_point_fp_proj(); // identity } @@ -1482,11 +1478,11 @@ namespace ack { * @param verify if true, the point is verified to be valid point on the curve created by the curve generator point g. * @return curve point */ - template - [[nodiscard]] inline constexpr point_type make_point(IntT x, IntT y, bool verify = false) const + template + [[nodiscard]] inline constexpr PointU make_point(IntT x, IntT y, bool verify = false) const { return static_cast( *this ) - .make_point( std::move(x), std::move(y), verify ); + .template make_point( std::move(x), std::move(y), verify ); } /** @@ -1633,63 +1629,61 @@ namespace ack { } /** - * Creates a point from a given pair of integers x & y. + * Creates a point from provided affine coordinates x & y. * @warning Returned point stores pointer to curve prime. * The curve must outlive the point. * @note Expects x|y >= 0 and x|y < p * @note The returned point can be invalid, since the function allows * creating points that were not generated with the generator point. * + * @tparam PointU - point type to make. Default affine point_type. + * * @param x - point x coordinate * @param y - point y coordinate * @param verify - If true, the point is verified to be valid point on the curve created by the curve generator point g. * Default is false. Slow operation, can be be performed also with call to point.is_valid() function. * @return Curve point */ - [[nodiscard]] constexpr point_type make_point(IntT&& x, IntT&& y, bool verify = false) const + template + [[nodiscard]] constexpr PointU make_point(IntT&& x, IntT&& y, bool verify = false) const { check_integer( x, "Invalid point x coordinate" ); check_integer( y, "Invalid point y coordinate" ); - auto p = point_type { - *this, + auto point = make_point( make_field_element( std::move(x) ), - make_field_element( std::move(y) ) - }; - - if ( verify ) { - check( p.is_valid(), "Invalid point" ); - } - return p; + make_field_element( std::move(y) ), + verify + ); + return point; } /** - * Creates a point from a given pair of integers x & y. + * Creates a point from provided affine coordinates x & y. * @warning Returned point stores pointer to curve prime. * The curve must outlive the point. * @note Expects x|y >= 0 and x|y < p * @note The returned point can be invalid, since the function allows * creating points that were not generated with the generator point. * + * @tparam PointU - point type to make. Default affine point_type. + * * @param x - point x coordinate * @param y - point y coordinate * @param verify - If true, the point is verified to be valid point on the curve created by the curve generator point g. * Default is false. Slow operation, can be be performed also with call to point.is_valid() function. * @return Curve point */ - [[nodiscard]] constexpr point_type make_point(const IntT& x, const IntT& y, bool verify = false) const + template + [[nodiscard]] constexpr PointU make_point(const IntT& x, const IntT& y, bool verify = false) const { check_integer( x, "Invalid point x coordinate" ); check_integer( y, "Invalid point y coordinate" ); - auto p = point_type { - *this, + auto point = make_point( make_field_element( x, /*verify=*/ false ), - make_field_element( y, /*verify=*/ false ) - }; - - if ( verify ) { - check( p.is_valid(), "Invalid point" ); - } - return p; + make_field_element( y, /*verify=*/ false ), + verify + ); + return point; } /** @@ -1723,9 +1717,6 @@ namespace ack { auto afe = make_field_element( a, /*verify =*/ false ); auto bfe = make_field_element( b, /*verify =*/ false ); auto y2 = 4 * afe.sqr() * afe + 27 * bfe.sqr(); - if ( y2 == 0 ) { - return false; - } // check that discriminant is nonzero. If zero, the curve is singular. if ( ( -16 * y2 ) == 0) { @@ -1781,6 +1772,21 @@ namespace ack { } return field_element_type( x, p ); } + + template + [[nodiscard]] constexpr PointU make_point(field_element_type x, field_element_type y, bool verify = false) const + { + auto point = PointU{ point_type { + *this, + std::move( x ), + std::move( y ) + }}; + + if ( verify ) { + check( point.is_valid(), "Invalid point" ); + } + return point; + } }; /** diff --git a/tests/include/ack/tests/ec_test.hpp b/tests/include/ack/tests/ec_test.hpp index 4182275..545660e 100644 --- a/tests/include/ack/tests/ec_test.hpp +++ b/tests/include/ack/tests/ec_test.hpp @@ -142,6 +142,8 @@ namespace ack::tests { REQUIRE_EQUAL( p1.is_valid() , false ) auto p1_proj = ec_point_fp_proj( p1 ); + REQUIRE_EQUAL( c23.make_point( x, y ), p1_proj ) + REQUIRE_EQUAL( c23.make_point( x, y, /*verify=*/ false ), p1_proj ) REQUIRE_EQUAL( ( p1_proj.x == 0 ) && ( p1_proj.y == 1 ) && ( p1_proj.z == 0 ), true ) REQUIRE_EQUAL( p1_proj.is_identity(), true ) REQUIRE_EQUAL( p1_proj.is_on_curve(), true ) @@ -149,6 +151,8 @@ namespace ack::tests { REQUIRE_EQUAL( p1_proj.to_affine() , p1 ) auto p1_jacobi = ec_point_fp_jacobi( p1 ); + REQUIRE_EQUAL( c23.make_point( x, y ), p1_jacobi ) + REQUIRE_EQUAL( c23.make_point( x, y, /*verify=*/ false ), p1_jacobi ) REQUIRE_EQUAL( ( p1_jacobi.x == 0 ) && ( p1_jacobi.y == 1 ) && ( p1_jacobi.z == 0 ), true ) REQUIRE_EQUAL( p1_jacobi.is_identity(), true ) REQUIRE_EQUAL( p1_jacobi.is_on_curve(), true ) @@ -176,6 +180,8 @@ namespace ack::tests { REQUIRE_EQUAL( p1.is_valid() , false ) auto p1_proj = ec_point_fp_proj( p1 ); + REQUIRE_EQUAL( c23.make_point( x, y ), p1_proj ) + REQUIRE_EQUAL( c23.make_point( x, y, /*verify=*/ false ) , p1_proj ) REQUIRE_EQUAL( ( p1_proj.x == 3 ) && ( p1_proj.y == 7 ) && ( p1_proj.z == 1 ), true ) REQUIRE_EQUAL( p1_proj.is_identity(), false ) REQUIRE_EQUAL( p1_proj.is_on_curve(), false ) @@ -183,6 +189,8 @@ namespace ack::tests { REQUIRE_EQUAL( p1_proj.to_affine() , p1 ) auto p1_jacobi = ec_point_fp_jacobi( p1 ); + REQUIRE_EQUAL( c23.make_point( x, y ), p1_jacobi ) + REQUIRE_EQUAL( c23.make_point( x, y, /*verify=*/ false ), p1_jacobi ) REQUIRE_EQUAL( ( p1_jacobi.x == 3 ) && ( p1_jacobi.y == 7 ) && ( p1_jacobi.z == 1 ), true ) REQUIRE_EQUAL( p1_jacobi.is_identity(), false ) REQUIRE_EQUAL( p1_jacobi.is_on_curve(), false ) @@ -210,6 +218,8 @@ namespace ack::tests { REQUIRE_EQUAL( p1.is_valid() , false ) // point not generated by base point auto p1_proj = ec_point_fp_proj( p1 ); + REQUIRE_EQUAL( c23.make_point( x, y ), p1_proj ) + REQUIRE_EQUAL( c23.make_point( x, y ), p1_proj ) REQUIRE_EQUAL( ( p1_proj.x == 3 ) && ( p1_proj.y == 10 ) && ( p1_proj.z == 1 ), true ) REQUIRE_EQUAL( p1_proj.is_identity(), false ) REQUIRE_EQUAL( p1_proj.is_on_curve(), true ) @@ -217,6 +227,8 @@ namespace ack::tests { REQUIRE_EQUAL( p1_proj.to_affine() , p1 ) auto p1_jacobi = ec_point_fp_jacobi( p1 ); + REQUIRE_EQUAL( c23.make_point( x, y ), p1_jacobi ) + REQUIRE_EQUAL( c23.make_point( x, y ), p1_jacobi ) REQUIRE_EQUAL( ( p1_jacobi.x == 3 ) && ( p1_jacobi.y == 10 ) && ( p1_jacobi.z == 1 ), true ) REQUIRE_EQUAL( p1_jacobi.is_identity(), false ) REQUIRE_EQUAL( p1_jacobi.is_on_curve(), true ) @@ -244,6 +256,8 @@ namespace ack::tests { REQUIRE_EQUAL( p1.is_valid() , false ) auto p1_proj = ec_point_fp_proj( p1 ); + REQUIRE_EQUAL( c23.make_point( x, y ), p1_proj ) + REQUIRE_EQUAL( c23.make_point( x, y, /*verify=*/ false ), p1_proj ) REQUIRE_EQUAL( ( p1_proj.x == 22 ) && ( p1_proj.y == 22 ) && ( p1_proj.z == 1 ), true ) REQUIRE_EQUAL( p1_proj.is_identity(), false ) REQUIRE_EQUAL( p1_proj.is_on_curve(), false ) @@ -251,6 +265,8 @@ namespace ack::tests { REQUIRE_EQUAL( p1_proj.to_affine() , p1 ) auto p1_jacobi = ec_point_fp_jacobi( p1 ); + REQUIRE_EQUAL( c23.make_point( x, y ), p1_jacobi ) + REQUIRE_EQUAL( c23.make_point( x, y, /*verify=*/ false ), p1_jacobi ) REQUIRE_EQUAL( ( p1_jacobi.x == 22 ) && ( p1_jacobi.y == 22 ) && ( p1_jacobi.z == 1 ), true ) REQUIRE_EQUAL( p1_jacobi.is_identity(), false ) REQUIRE_EQUAL( p1_jacobi.is_on_curve(), false ) @@ -278,12 +294,16 @@ namespace ack::tests { REQUIRE_EQUAL( p1.is_valid() , true ) auto p1_proj = ec_point_fp_proj( p1 ); + REQUIRE_EQUAL( c23.make_point( x, y ), p1_proj ) + REQUIRE_EQUAL( c23.make_point( x, y, /*verify=*/ true ), p1_proj ) REQUIRE_EQUAL( ( p1_proj.x == 5 ) && ( p1_proj.y == 4 ) && ( p1_proj.z == 1 ), true ) REQUIRE_EQUAL( p1_proj.is_identity(), false ) REQUIRE_EQUAL( p1_proj.is_on_curve(), true ) REQUIRE_EQUAL( p1_proj.is_valid() , true ) auto p1_jacobi = ec_point_fp_jacobi( p1 ); + REQUIRE_EQUAL( c23.make_point( x, y, /*verify=*/ false ), p1_jacobi ) + REQUIRE_EQUAL( c23.make_point( x, y, /*verify=*/ true ), p1_jacobi ) REQUIRE_EQUAL( ( p1_jacobi.x == 5 ) && ( p1_jacobi.y == 4 ) && ( p1_jacobi.z == 1 ), true ) REQUIRE_EQUAL( p1_jacobi.is_identity(), false ) REQUIRE_EQUAL( p1_jacobi.is_on_curve(), true ) From b2a9db75ebf6649d699d955656f7551f4b378099 Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Fri, 22 Dec 2023 13:13:16 +0100 Subject: [PATCH 08/18] Add curve methods for computing y from x & encoding/decoding point Added new methods to `ec_point_fp`: - compute_y: solves curve equation y^2 = x^3 + ax + b (mod p) and returns y - decompress_point: same as compute_y but returns point from x and computed y - encode_point/decode_point: encodes/decodes point to/from bytes following SEC1-v2 2.3.3 specification --- include/ack/ec.hpp | 166 +++++++++++++++- tests/include/ack/tests/ec_test.hpp | 289 +++++++++++++++++++++++++++- 2 files changed, 445 insertions(+), 10 deletions(-) diff --git a/include/ack/ec.hpp b/include/ack/ec.hpp index 8561be6..00240c4 100644 --- a/include/ack/ec.hpp +++ b/include/ack/ec.hpp @@ -368,7 +368,7 @@ namespace ack { template struct ec_point_fp : ec_point_base, CurveT> { - static_assert( is_ec_curve_fp ); + static_assert( is_ec_curve_fp> ); using base_type = ec_point_base, CurveT>; using int_type = typename CurveT::int_type; @@ -470,7 +470,7 @@ namespace ack { return *this; } - // TODO: before this sub operation caused error in wasm: memcpy with overlapping memory memcpy can only accept non-aliasing pointers + // TODO: before this sub operation caused error in wasm: memcpy with overlapping memory memcpy can only accept non-aliasing pointers auto s = a.x - x; if ( s.is_zero() ) { if ( y == a.y ) { // double point @@ -1552,7 +1552,7 @@ namespace ack { /** * Generates a point from base point g and given scalar x. * - * @tparam PointT - point type to create. + * @tparam PointT - EC point type to create. * * @param x - scalar to multiply base point g with. * @return PointT - point on the curve. @@ -1571,7 +1571,7 @@ namespace ack { /** * Generates a point from base point g and given hex string scalar sx. * - * @tparam PointU - point type to create. + * @tparam PointU - EC point type to create. * * @param sx - hex string scalar to multiply base point g with. * @return PointU - point on the curve. @@ -1585,7 +1585,7 @@ namespace ack { /** * Generates a point from base point g and given hex string literal scalar sx. * - * @tparam PointU - point type to create. + * @tparam PointU - EC point type to create. * * @param sx - hex string literal scalar to multiply base point g with. * @return PointU - point on the curve. @@ -1636,7 +1636,7 @@ namespace ack { * @note The returned point can be invalid, since the function allows * creating points that were not generated with the generator point. * - * @tparam PointU - point type to make. Default affine point_type. + * @tparam PointU - EC point type to make. Default affine point_type. * * @param x - point x coordinate * @param y - point y coordinate @@ -1644,7 +1644,7 @@ namespace ack { * Default is false. Slow operation, can be be performed also with call to point.is_valid() function. * @return Curve point */ - template + template [[nodiscard]] constexpr PointU make_point(IntT&& x, IntT&& y, bool verify = false) const { check_integer( x, "Invalid point x coordinate" ); @@ -1665,7 +1665,7 @@ namespace ack { * @note The returned point can be invalid, since the function allows * creating points that were not generated with the generator point. * - * @tparam PointU - point type to make. Default affine point_type. + * @tparam PointU - EC point type to make. Default affine point_type. * * @param x - point x coordinate * @param y - point y coordinate @@ -1686,6 +1686,156 @@ namespace ack { return point; } + /** + * Solves the equation y = sqrt( x^3 + ax + b ) (mod p) and returns y. + * + * @param x - field element x-coordinate. + * @param odd - True if the calculated y-coordinate should be odd. + * @return The y-coordinate, or 0 if no square root exists. + */ + [[nodiscard]] + inline field_element_type compute_y(const field_element_type& x, const bool odd) const { + auto y = (( x * x + a ) * x + b ).sqrt(); + if ( odd != y.value().test_bit( 0 )) { + y = -y; + } + return y; + } + + /** + * Solves the equation y = sqrt( x^3 + ax + b ) (mod p) and returns y. + * + * @param x - integer x-coordinate. + * @param odd - True if the calculated y-coordinate should be odd. + * @param verify - True if x coordinate should be verified before calculating y. Default false. + * @return The y-coordinate, or 0 if no square root exists. + */ + [[nodiscard]] + inline field_element_type compute_y(const IntT& x, const bool odd, bool verify = false) const { + return compute_y( make_field_element( x, verify ), odd ); + } + + /** + * Decompress point from provided x-coordinate. + * @tparam PointT - returned EC point type. + * + * @param x - field element x-coordinate. + * @param yodd - True if the calculated y-coordinate should be odd. + * @return The decompressed EC point. If the y-coordinate cannot be computed, the point at infinity is returned. + */ + template + [[nodiscard]] + inline PointT decompress_point(field_element_type x, const bool yodd) const { + auto y = compute_y( x, yodd ); + if ( y.is_zero() ) { + return PointT{}; + } + return make_point( std::move( x ), y ); + } + + /** + * Decompress point from provided x-coordinate. + * @tparam PointT - returned EC point type. + * + * @param x - integer x-coordinate. + * @param yodd - True if the calculated y-coordinate should be odd. + * @param verify - True if x coordinate should be verified before calculating y. Default false. + * @return The decompressed EC point. If the y-coordinate cannot be computed, the point at infinity is returned. + */ + template + [[nodiscard]] + inline PointT decompress_point(const IntT& x, const bool yodd, bool verify = false) const { + return decompress_point( make_field_element( x, verify ), yodd ); + } + + /** + * Encodes an EC point into its byte-encoded form. + * + * This function follows the SEC1-v2 standard for EC point encoding. + * The 'compress' parameter determines whether to use compressed or uncompressed + * point encoding. Compressed encoding includes only the x-coordinate, while uncompressed encoding + * includes both the x and y coordinates. + * + * Encoded Format: | [x] | [y] + * type: + * 0 - point at infinity, not coordinates is encoded + * 2 - compressed form with only x-coordinate (even y-coordinate is derived) + * 3 - compressed form with only x-coordinate (odd y-coordinate is derived) + * 4 - uncompressed form with both x and y coordinates + * + * @see SEC1-v2 section '2.3.3 Elliptic-Curve-Point-to-Octet-String Conversion' + * https://www.secg.org/sec1-v2.pdf#page=16 + * + * @param point - The EC point to be encoded, represented as a `point_type` structure. + * @param compress - If true the encoded point will be in compressed form; otherwise, encodes it in uncompressed form. + * @return The byte-encoded form of the EC point. + */ + [[nodiscard]] bytes encode_point(const point_type& point, bool compress) const + { + bytes epoint = { 0 }; + if ( point.is_identity() ) { + return epoint; + } + + if ( compress ) { + epoint[0] = 2 + point.y.value().test_bit( 0 ); + epoint += point.x.to_bytes(); + } + else { + epoint[0] = 4; + epoint += point.x.to_bytes() + point.y.to_bytes(); + } + return epoint; + } + + /** + * Decodes an EC point from its byte-encoded form. + * + * This function follows the SEC1-v2 standard for EC point encoding. The encoded point + * is expected to be in the format (type | x [| y]), where 'type' represents the encoding type or + * parity of the y-coordinate (if compressed form), and 'x' & 'y' are coordinates of the point. + * + * @see SEC1-v2 section '2.3.4 Octet-String-to-Elliptic-Curve-Point Conversion' + * https://www.secg.org/sec1-v2.pdf#page=17 + * + * @see encode_point + * + * @note internally function halts if epoint is in invalid format or encoded coordinates are invalid. + * + * @tparam PointT - returned EC point type. + * + * @param epoint A bytes view of the encoded EC point (type | x [| y]). + * @return The decoded EC point of type PointT. + */ + template + [[nodiscard]] PointT decode_point(const bytes_view epoint) const + { + check( !epoint.empty(), "invalid encoded point" ); + + const auto type = epoint[0]; + check( type <= 4 && type != 1, "invalid encoded point" ); + + const std::size_t plen = p.byte_length(); + PointT P; // type 0 = point at infinity + switch ( type ) { + // 2.3.4.2 + case 2: + case 3: { + check( epoint.size() == plen + 1, "invalid encoded point" ); + P = decompress_point( /*x=*/epoint.subspan( 1, plen ), /*yodd=*/type & 1 ); + } break; + // 2.3.4.3 + case 4: { + check( epoint.size() == 2 * plen + 1, "invalid encoded point" ); + P = make_point( + epoint.subspan( 1, plen ), + epoint.subspan( 1 + plen, plen ) + ); + } break; + } + return P; + } + /** * Verifies curve parameters. * @note Very basic verification is performed, no check for primality of p and n; diff --git a/tests/include/ack/tests/ec_test.hpp b/tests/include/ack/tests/ec_test.hpp index 545660e..601e4a8 100644 --- a/tests/include/ack/tests/ec_test.hpp +++ b/tests/include/ack/tests/ec_test.hpp @@ -4418,8 +4418,293 @@ namespace ack::tests { } EOSIO_TEST_END // ec_keypair_secp256r1_test - EOSIO_TEST_BEGIN( ec_mul_add_fast_test ) + EOSIO_TEST_BEGIN( ec_misc ) using namespace detail; + + // Test solving curve quadratic equation via `compute_y` function + + { + // Test vectors were generated for sepc256r1 using OpenSSL 3.0.2 + { + auto tv_x = "5cd5c3fb57668b0d6c85543fe480167324ff58a646adfb22a051913f125cf03a"_hex; + auto x = secp256r1.make_field_element( tv_x ); + auto y = secp256r1.compute_y( x , /*odd=*/ true ); + REQUIRE_EQUAL( y, "dbd82d3535a54276e9fff543420ee688c4e3affeaa44d1b6ca755325ffeead7d"_hex ) + y = secp256r1.compute_y( tv_x , /*odd=*/ true ); + REQUIRE_EQUAL( y, "dbd82d3535a54276e9fff543420ee688c4e3affeaa44d1b6ca755325ffeead7d"_hex ) + + tv_x = "ae5af2a936e7fe8dee15ea42c1a568687749b7025937277381993fcd9b80de7a"_hex; + x = secp256r1.make_field_element( tv_x ); + y = secp256r1.compute_y( x , /*odd=*/ false ); + REQUIRE_EQUAL( y, "052bd863421e18a159f38b69f5847a1a3bcc54441ee4bde043b740c91f24b6d2"_hex ) + y = secp256r1.compute_y( tv_x , /*odd=*/ false ); + REQUIRE_EQUAL( y, "052bd863421e18a159f38b69f5847a1a3bcc54441ee4bde043b740c91f24b6d2"_hex ) + } + + // Test vectors were generated for secp256k1 using OpenSSL 3.0.2 + { + auto tv_x = "d2e338aa2899f499525af33e7fe650867d07c31221e77b184161f728a3cfed42"_hex; + auto x = secp256k1.make_field_element( tv_x ); + auto y = secp256k1.compute_y( x , /*odd=*/ true ); + REQUIRE_EQUAL( y, "13dcec036f6b04fad74ff8067213031d03c288f222962519ee7ef0c171e97d77"_hex ) + y = secp256k1.compute_y( tv_x , /*odd=*/ true ); + REQUIRE_EQUAL( y, "13dcec036f6b04fad74ff8067213031d03c288f222962519ee7ef0c171e97d77"_hex ) + + tv_x = "c1ed2c8fa1fc2d913712547a5439c62ddb4dee08ccd1d585c0cdee87433c7ab3"_hex; + x = secp256k1.make_field_element( tv_x ); + y = secp256k1.compute_y( x , /*odd=*/ false ); + REQUIRE_EQUAL( y, "9e3bbc0096832c16a3d1c6573aa2160a2d6c276fc8a5fc74ddb3c92585ede554"_hex ) + y = secp256k1.compute_y( tv_x , /*odd=*/ false ); + REQUIRE_EQUAL( y, "9e3bbc0096832c16a3d1c6573aa2160a2d6c276fc8a5fc74ddb3c92585ede554"_hex ) + } + } + + // Test decompressing point from x-coordinate + // i.e.: point decompression + { + // Test vectors were generated for sepc256r1 using OpenSSL 3.0.2 + { + auto tv_x = "5cd5c3fb57668b0d6c85543fe480167324ff58a646adfb22a051913f125cf03a"_hex; + auto x = secp256r1.make_field_element( tv_x ); + auto p = secp256r1.decompress_point( x , /*odd=*/ true ); + REQUIRE_EQUAL( p.x, x ) + REQUIRE_EQUAL( p.y, "dbd82d3535a54276e9fff543420ee688c4e3affeaa44d1b6ca755325ffeead7d"_hex ) + p = secp256r1.decompress_point( tv_x , /*odd=*/ true ); + REQUIRE_EQUAL( p.x, x ) + REQUIRE_EQUAL( p.y, "dbd82d3535a54276e9fff543420ee688c4e3affeaa44d1b6ca755325ffeead7d"_hex ) + + tv_x = "ae5af2a936e7fe8dee15ea42c1a568687749b7025937277381993fcd9b80de7a"_hex; + x = secp256r1.make_field_element( "ae5af2a936e7fe8dee15ea42c1a568687749b7025937277381993fcd9b80de7a"_hex ); + p = secp256r1.decompress_point( x , /*odd=*/ false ); + REQUIRE_EQUAL( p.x, x ) + REQUIRE_EQUAL( p.y, "052bd863421e18a159f38b69f5847a1a3bcc54441ee4bde043b740c91f24b6d2"_hex ) + p = secp256r1.decompress_point( tv_x , /*odd=*/ false ); + REQUIRE_EQUAL( p.x, x ) + REQUIRE_EQUAL( p.y, "052bd863421e18a159f38b69f5847a1a3bcc54441ee4bde043b740c91f24b6d2"_hex ) + } + + // Test vectors were generated for secp256k1 using OpenSSL 3.0.2 + { + auto tv_x = "d2e338aa2899f499525af33e7fe650867d07c31221e77b184161f728a3cfed42"_hex; + auto x = secp256k1.make_field_element( tv_x ); + auto p = secp256k1.decompress_point( x , /*odd=*/ true ); + REQUIRE_EQUAL( p.x, x ) + REQUIRE_EQUAL( p.y, "13dcec036f6b04fad74ff8067213031d03c288f222962519ee7ef0c171e97d77"_hex ) + p = secp256k1.decompress_point( tv_x , /*odd=*/ true ); + REQUIRE_EQUAL( p.x, x ) + REQUIRE_EQUAL( p.y, "13dcec036f6b04fad74ff8067213031d03c288f222962519ee7ef0c171e97d77"_hex ) + + tv_x = "c1ed2c8fa1fc2d913712547a5439c62ddb4dee08ccd1d585c0cdee87433c7ab3"_hex; + x = secp256k1.make_field_element( tv_x ); + p = secp256k1.decompress_point( x , /*odd=*/ false ); + REQUIRE_EQUAL( p.x, x ) + REQUIRE_EQUAL( p.y, "9e3bbc0096832c16a3d1c6573aa2160a2d6c276fc8a5fc74ddb3c92585ede554"_hex ) + p = secp256k1.decompress_point( tv_x , /*odd=*/ false ); + REQUIRE_EQUAL( p.x, x ) + REQUIRE_EQUAL( p.y, "9e3bbc0096832c16a3d1c6573aa2160a2d6c276fc8a5fc74ddb3c92585ede554"_hex ) + } + + // Test function decompress_point returns point at infinity when y coordinate can't be computed + REQUIRE_EQUAL( secp256k1.decompress_point( "0"_hex, false ).is_identity(), true ) + REQUIRE_EQUAL( secp256k1.decompress_point( "0"_hex, true ).is_identity(), true ) + REQUIRE_EQUAL( secp256k1.decompress_point( secp256k1.make_field_element( "0"_hex ), false ).is_identity(), true ) + REQUIRE_EQUAL( secp256k1.decompress_point( secp256k1.make_field_element( "0"_hex ), true ).is_identity(), true ) + } + + // Test encoding/decoding EC point + { + // Test decoding point at infinity + REQUIRE_EQUAL( secp256k1.decode_point( "00"_hex ).is_identity(), true ) + REQUIRE_EQUAL( secp256r1.decode_point( "00"_hex ).is_identity(), true ) + REQUIRE_EQUAL( secp256k1.decode_point( "00"_hex ).is_identity(), true ) + REQUIRE_EQUAL( secp256k1.decode_point( "00"_hex ).is_identity(), true ) + + // Test decoding point at infinity succeeds when additional data is appended to encode type (1st byte) + REQUIRE_EQUAL( secp256r1.decode_point( "00BADDA7A"_hex ).is_identity(), true ) + + // Test decoding invalid point coordinates results in pointy at infinity + REQUIRE_EQUAL( secp256k1.decode_point( "020000000000000000000000000000000000000000000000000000000000000000"_hex ).is_identity(), true ) + REQUIRE_EQUAL( secp256k1.decode_point( "030000000000000000000000000000000000000000000000000000000000000000"_hex ).is_identity(), true ) + REQUIRE_EQUAL( secp256k1.decode_point( "0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"_hex ).is_identity(), true ) + + // Test vectors were generated for secp256r1 using OpenSSL 3.0.2 + { + auto tv = "035cd5c3fb57668b0d6c85543fe480167324ff58a646adfb22a051913f125cf03a"_hex; + auto p = secp256r1.decode_point( tv ); + REQUIRE_EQUAL( p.x, "5cd5c3fb57668b0d6c85543fe480167324ff58a646adfb22a051913f125cf03a"_hex ) + REQUIRE_EQUAL( p.y, "dbd82d3535a54276e9fff543420ee688c4e3affeaa44d1b6ca755325ffeead7d"_hex ) + + auto p_proj = secp256r1.decode_point( tv ); + REQUIRE_EQUAL( p_proj.to_affine(), p ) + + auto p_jacobi = secp256r1.decode_point( tv ); + REQUIRE_EQUAL( p_jacobi.to_affine(), p) + + + auto ep = secp256r1.encode_point( p, /*compressed=*/ false ); + REQUIRE_EQUAL( ep, "045cd5c3fb57668b0d6c85543fe480167324ff58a646adfb22a051913f125cf03adbd82d3535a54276e9fff543420ee688c4e3affeaa44d1b6ca755325ffeead7d"_hex ) + + ep = secp256r1.encode_point( p, /*compressed=*/ true ); + REQUIRE_EQUAL( ep, tv ) + } + + // Test vectors were generated for secp256r1 using OpenSSL 3.0.2 + { + auto tv = "02ae5af2a936e7fe8dee15ea42c1a568687749b7025937277381993fcd9b80de7a"_hex; + auto p = secp256r1.decode_point( tv ); + REQUIRE_EQUAL( p.x, "ae5af2a936e7fe8dee15ea42c1a568687749b7025937277381993fcd9b80de7a"_hex ) + REQUIRE_EQUAL( p.y, "052bd863421e18a159f38b69f5847a1a3bcc54441ee4bde043b740c91f24b6d2"_hex ) + + auto p_proj = secp256r1.decode_point( tv ); + REQUIRE_EQUAL( p_proj.to_affine(), p ) + + auto p_jacobi = secp256r1.decode_point( tv ); + REQUIRE_EQUAL( p_jacobi.to_affine(), p) + + auto ep = secp256r1.encode_point( p, /*compressed=*/ false ); + REQUIRE_EQUAL( ep, "04ae5af2a936e7fe8dee15ea42c1a568687749b7025937277381993fcd9b80de7a052bd863421e18a159f38b69f5847a1a3bcc54441ee4bde043b740c91f24b6d2"_hex ) + + ep = secp256r1.encode_point( p, /*compressed=*/ true ); + REQUIRE_EQUAL( ep, tv ) + } + + // Test vectors were generated for secp256k1 using OpenSSL 3.0.2 + { + auto tv = "03d2e338aa2899f499525af33e7fe650867d07c31221e77b184161f728a3cfed42"_hex; + auto p = secp256k1.decode_point( tv ); + REQUIRE_EQUAL( p.x, "d2e338aa2899f499525af33e7fe650867d07c31221e77b184161f728a3cfed42"_hex ) + REQUIRE_EQUAL( p.y, "13dcec036f6b04fad74ff8067213031d03c288f222962519ee7ef0c171e97d77"_hex ) + + auto p_proj = secp256k1.decode_point( tv ); + REQUIRE_EQUAL( p_proj.to_affine(), p ) + + auto p_jacobi = secp256k1.decode_point( tv ); + REQUIRE_EQUAL( p_jacobi.to_affine(), p) + + auto ep = secp256k1.encode_point( p, /*compressed=*/ false ); + REQUIRE_EQUAL( ep, "04d2e338aa2899f499525af33e7fe650867d07c31221e77b184161f728a3cfed4213dcec036f6b04fad74ff8067213031d03c288f222962519ee7ef0c171e97d77"_hex ) + + ep = secp256k1.encode_point( p, /*compressed=*/ true ); + REQUIRE_EQUAL( ep, tv ) + } + + // Test vectors were generated for secp256k1 using OpenSSL 3.0.2 + { + auto tv = "02c1ed2c8fa1fc2d913712547a5439c62ddb4dee08ccd1d585c0cdee87433c7ab3"_hex; + auto p = secp256k1.decode_point( tv ); + REQUIRE_EQUAL( p.x, "c1ed2c8fa1fc2d913712547a5439c62ddb4dee08ccd1d585c0cdee87433c7ab3"_hex ) + REQUIRE_EQUAL( p.y, "9e3bbc0096832c16a3d1c6573aa2160a2d6c276fc8a5fc74ddb3c92585ede554"_hex ) + + auto p_proj = secp256k1.decode_point( tv ); + REQUIRE_EQUAL( p_proj.to_affine(), p ) + + auto p_jacobi = secp256k1.decode_point( tv ); + REQUIRE_EQUAL( p_jacobi.to_affine(), p) + + auto ep = secp256k1.encode_point( p, /*compressed=*/ false ); + REQUIRE_EQUAL( ep, "04c1ed2c8fa1fc2d913712547a5439c62ddb4dee08ccd1d585c0cdee87433c7ab39e3bbc0096832c16a3d1c6573aa2160a2d6c276fc8a5fc74ddb3c92585ede554"_hex ) + + ep = secp256k1.encode_point( p, /*compressed=*/ true ); + REQUIRE_EQUAL( ep, tv ) + } + + // Test vectors were generated for secp256k1 using OpenSSL 3.0.2 + { + auto tv = "0200b824dd20143dc94d4242db1d14ae3dc08b732c5a3c90b4cf3c33475dc16674"_hex; + auto p = secp256k1.decode_point( tv ); + REQUIRE_EQUAL( p.x, "b824dd20143dc94d4242db1d14ae3dc08b732c5a3c90b4cf3c33475dc16674"_hex ) + REQUIRE_EQUAL( p.y, "56f4d5f1e4e9586a060926f5776f0f8d570d710589ae2d7126542167194a291e"_hex ) + + auto p_proj = secp256k1.decode_point( tv ); + REQUIRE_EQUAL( p_proj.to_affine(), p ) + + auto p_jacobi = secp256k1.decode_point( tv ); + REQUIRE_EQUAL( p_jacobi.to_affine(), p) + + auto ep = secp256k1.encode_point( p, /*compressed=*/ false ); + REQUIRE_EQUAL( ep, "0400b824dd20143dc94d4242db1d14ae3dc08b732c5a3c90b4cf3c33475dc1667456f4d5f1e4e9586a060926f5776f0f8d570d710589ae2d7126542167194a291e"_hex ) + + ep = secp256k1.encode_point( p, /*compressed=*/ true ); + REQUIRE_EQUAL( ep, tv ) + } + + // Fail tests + { + // Invalid type test + REQUIRE_ASSERT( "invalid encoded point", [&]() { + auto p1 = secp256k1.decode_point( bytes() ); + }) + + REQUIRE_ASSERT( "invalid encoded point", [&]() { + auto p1 = secp256k1.decode_point( "01"_hex ); + }) + + REQUIRE_ASSERT( "invalid encoded point", [&]() { + auto p1 = secp256k1.decode_point( "05"_hex ); + }) + + REQUIRE_ASSERT( "invalid encoded point", [&]() { + auto p1 = secp256k1.decode_point( "08"_hex ); + }) + + REQUIRE_ASSERT( "invalid encoded point", [&]() { + auto p1 = secp256k1.decode_point( "10"_hex ); + }) + + REQUIRE_ASSERT( "invalid encoded point", [&]() { + auto p1 = secp256k1.decode_point( "12"_hex ); + }) + + REQUIRE_ASSERT( "invalid encoded point", [&]() { + auto p1 = secp256k1.decode_point( "22"_hex ); + }) + + REQUIRE_ASSERT( "invalid encoded point", [&]() { + auto p1 = secp256k1.decode_point( "42"_hex ); + }) + + REQUIRE_ASSERT( "invalid encoded point", [&]() { + auto p1 = secp256k1.decode_point( "48"_hex ); + }) + + REQUIRE_ASSERT( "invalid encoded point", [&]() { + auto p1 = secp256k1.decode_point( "FC"_hex ); + }) + + REQUIRE_ASSERT( "invalid encoded point", [&]() { + auto p1 = secp256k1.decode_point( "FD"_hex ); + }) + + REQUIRE_ASSERT( "invalid encoded point", [&]() { + auto p1 = secp256k1.decode_point( "FE"_hex ); + }) + + // Valid type but too little data to decode tests + REQUIRE_ASSERT( "invalid encoded point", [&]() { + auto p1 = secp256k1.decode_point( "02"_hex ); + }) + + REQUIRE_ASSERT( "invalid encoded point", [&]() { + auto p1 = secp256k1.decode_point( "03"_hex ); + }) + + REQUIRE_ASSERT( "invalid encoded point", [&]() { + auto p1 = secp256k1.decode_point( "04"_hex ); + }) + + REQUIRE_ASSERT( "invalid encoded point", [&]() { + // x-coord missing zero padding to match the length of curve's p + auto p1 = secp256k1.decode_point( "02b824dd20143dc94d4242db1d14ae3dc08b732c5a3c90b4cf3c33475dc16674"_hex ); + }) + + REQUIRE_ASSERT( "invalid encoded point", [&]() { + // x-coord missing zero padding to match the length of curve's p + auto p1 = secp256k1.decode_point( "04b824dd20143dc94d4242db1d14ae3dc08b732c5a3c90b4cf3c33475dc1667456f4d5f1e4e9586a060926f5776f0f8d570d710589ae2d7126542167194a291e"_hex ); + }) + } + } + + // Test ec_mul_add_fast for_each_curve_do( [](const CurveT& c) { for ( int32_t i = 1; i < 101; i++) { auto p = c.g * i; @@ -4455,6 +4740,6 @@ namespace ack::tests { EOSIO_TEST( ec_mul_secp256k1_test ) EOSIO_TEST( ec_mul_secp256r1_test ) EOSIO_TEST( ec_keypair_secp256r1_test ) - EOSIO_TEST( ec_mul_add_fast_test ) + EOSIO_TEST( ec_misc ) EOSIO_TEST_END } From 03c8e501dffd9e86ed5d78ee79e51b5ad10b1b45 Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Sat, 23 Dec 2023 04:42:25 +0100 Subject: [PATCH 09/18] Add new elliptic curves Define new elliptic curves: brainpoolP256r1, brainpoolP320r1, brainpoolP384r1, brainpoolP512r1, secp384r1 & secp521r1 --- include/ack/bigint.hpp | 3 + include/ack/buffer.hpp | 126 + include/ack/ec_curve.hpp | 158 +- .../ack/tests/ecdsa_brainpoolP256r1_test.hpp | 4911 +++++++ .../ack/tests/ecdsa_brainpoolP320r1_test.hpp | 4945 +++++++ .../ack/tests/ecdsa_brainpoolP384r1_test.hpp | 5427 ++++++++ .../ack/tests/ecdsa_brainpoolP512r1_test.hpp | 6094 +++++++++ .../ack/tests/ecdsa_secp384r1_test.hpp | 10852 ++++++++++++++++ .../ack/tests/ecdsa_secp521r1_test.hpp | 6286 +++++++++ tests/include/ack/tests/ecdsa_test.hpp | 16 +- tests/scripts/rsp_ec_gen.py | 40 +- tests/scripts/wycheproof_test_gen.py | 31 +- tests/tv/ec/fips186-4/SigVer.rsp | 8032 ++++++++++++ 13 files changed, 46887 insertions(+), 34 deletions(-) create mode 100644 tests/include/ack/tests/ecdsa_brainpoolP256r1_test.hpp create mode 100644 tests/include/ack/tests/ecdsa_brainpoolP320r1_test.hpp create mode 100644 tests/include/ack/tests/ecdsa_brainpoolP384r1_test.hpp create mode 100644 tests/include/ack/tests/ecdsa_brainpoolP512r1_test.hpp create mode 100644 tests/include/ack/tests/ecdsa_secp384r1_test.hpp create mode 100644 tests/include/ack/tests/ecdsa_secp521r1_test.hpp create mode 100644 tests/tv/ec/fips186-4/SigVer.rsp diff --git a/include/ack/bigint.hpp b/include/ack/bigint.hpp index b1f55a8..bcbd343 100644 --- a/include/ack/bigint.hpp +++ b/include/ack/bigint.hpp @@ -2603,6 +2603,9 @@ namespace ack { template using fixed_bigint = bigint>; + template + using bignum = bigint>; + template struct is_bigint : std::false_type {}; diff --git a/include/ack/buffer.hpp b/include/ack/buffer.hpp index eeae0f2..1f31c67 100644 --- a/include/ack/buffer.hpp +++ b/include/ack/buffer.hpp @@ -3,6 +3,8 @@ #pragma once #include #include +#include +#include #include #include @@ -131,6 +133,130 @@ namespace ack { std::size_t size_ = 0; }; + /** + * Flexible buffer which can be constructed at compile time to the size of N. + * @warning if buffer is resized over the size of stack allocated memory (N) + * data is re-allocated on the heap, and this data is never released + * due to constexpr constrains which prohibits defining custom destructor. + * The flexbuffer should be used only in short lived environments like WASM. + */ + template + class flexbuffer final: public buffer_base, T> { + public: + using value_type = T; + + constexpr flexbuffer() = default; + constexpr flexbuffer(const flexbuffer& rhs) = default; + constexpr flexbuffer(flexbuffer&& rhs) = default; + constexpr flexbuffer& operator=(const flexbuffer& rhs) = default; + constexpr flexbuffer& operator=(flexbuffer&& rhs) = default; + + // ~flex_buffer() // destructor deleted otherwise flex_buffer can't be constructed at compile time + // { + // if ( std::is_constant_evaluated() ) { + // if ( ddata_ ) { + // delete[] ddata_; + // } + // } + // } + + constexpr bool resize(size_t n) + { + if ( std::is_constant_evaluated() ) { + if ( n > sdata_.size() ) { + return false; + } + } + else { + if ( n > N && n > dsize ) { + + bool scpy = ( ddata_ == nullptr ); + T* pold = ddata_; + + dsize += std::max( N, n ); + ddata_ = new T[dsize]; + + if ( scpy ) { + memcpy( ddata_, sdata_.data(), N * sizeof( T )); + } + else{ + memcpy( ddata_, pold, (dsize - std::max( N, n )) * sizeof( T )); + delete[] pold; + pold = nullptr; + } + } + } + + size_ = n; + return true; + } + + constexpr void clear() + { + size_ = 0; + } + + constexpr T* data() + { + return ddata_ ? ddata_ : sdata_.data(); + } + + constexpr const T* data() const + { + return ddata_? ddata_ : sdata_.data(); + } + + constexpr std::size_t size() const + { + return size_; + } + + constexpr std::size_t max_size() const + { + return N + std::numeric_limits::max();//ddata_.max_size(); + } + + constexpr void swap(flexbuffer& rhs) + { + std::swap( sdata_, rhs.sdata_ ); + if ( !std::is_constant_evaluated() ) { + std::swap( dsize, rhs.dsize ); + std::swap( ddata_, rhs.ddata_ ); + } + std::swap( size_, rhs.size_ ); + } + + constexpr const T& operator[](size_t n) const + { + check( n < size_, "flexbuffer::operator[]: overflow" ); + if ( std::is_constant_evaluated() ) { + return sdata_[n]; + } + else { + return ddata_ ? ddata_[n] : sdata_[n]; + } + } + + constexpr T& operator[](size_t n) + { + check( n < size_, "flexbuffer::operator[]: overflow" ); + if ( std::is_constant_evaluated() ) { + return sdata_[n]; + } + else { + return ddata_ ? ddata_[n] : sdata_[n]; + } + } + + private: + std::array sdata_ = {}; + T* ddata_ = nullptr; // replace with std::vector when C++20 constexpr ctor is supported + std::size_t size_ = 0; + std::size_t dsize = 0; + }; template using fixed_word_buffer = fixed_buffer; + + template + using word_buffer = flexbuffer; } \ No newline at end of file diff --git a/include/ack/ec_curve.hpp b/include/ack/ec_curve.hpp index 2a36fb3..3d5a633 100644 --- a/include/ack/ec_curve.hpp +++ b/include/ack/ec_curve.hpp @@ -3,28 +3,118 @@ #pragma once #include #include +#include + +namespace ack::detail { + #if defined(__EMSCRIPTEN__) || defined(__wasm__) || defined(__wasm32__) || defined(__wasm64__) + inline static constexpr bool __wasm_env = true; + #else + inline static constexpr bool __wasm_env = false; + #endif +} /** * Macro defines invariant object for elliptic curve over prime field of type ec_curve_fp. * The invariant is constructed at compile time. - * The name of the invariant is the same as the name of the curve. - * Defined invariant uses ec_fixed_bigint as underlying big number type. + * The name of the invariant elliptic curve is the same as the name of the curve. + * Defined curve uses ec_fixed_bigint as underlying big number type. * - * @param name - Name of the variable. Same name is used to create curve tag struct. + * @param name - Name of the variable. Same name is used to create curve tag struct. * @param bitsize - Size of the prime field in bits */ #define ACK_EC_CURVE_FP( name, bitsize, p, a, b, gx, gy, n, h) \ - namespace detail { struct name##_tag {}; } \ - static constexpr auto name = ec_curve_fp, detail::name##_tag> ( \ - /*p =*/ p, \ - /*a =*/ a, \ - /*b =*/ b, \ - /*g =*/ { gx, gy }, \ - /*n =*/ n, \ - /*h =*/ h \ + namespace detail { struct name##_tag {}; } \ + static constexpr auto name = ack::ec_curve_fp<\ + std::conditional_t< ( ack::detail::__wasm_env && bitsize >= 512 ), ack::bignum, ack::ec_fixed_bigint> \ + , detail::name##_tag> ( \ + /*p =*/ p, \ + /*a =*/ a, \ + /*b =*/ b, \ + /*g =*/ { gx, gy }, \ + /*n =*/ n, \ + /*h =*/ h \ ); namespace ack::ec_curve { + /** + * Invariant object representing the brainpoolP256r1 elliptic curve. + * The invariant is constructed at compile time. + * The name of the invariant is the same as the name of the curve. + * + * Domain parameters were taken from RFC 5639: Elliptic Curve Cryptography (ECC) Brainpool Standard Curves and Curve Generation. + * https://datatracker.ietf.org/doc/html/rfc5639#section-3.4 + */ + ACK_EC_CURVE_FP( + brainpoolP256r1, + /*size =*/ 256, + /*p =*/ "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377", + /*a =*/ "7d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9", + /*b =*/ "26dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b6", + /*G.x =*/ "8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262", + /*G.y =*/ "547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997", + /*n =*/ "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7", + /*h =*/ 1 + ) + + /** + * Invariant object representing the brainpoolP320r1 elliptic curve. + * The invariant is constructed at compile time. + * The name of the invariant is the same as the name of the curve. + * + * Domain parameters were taken from RFC 5639: Elliptic Curve Cryptography (ECC) Brainpool Standard Curves and Curve Generation. + * https://datatracker.ietf.org/doc/html/rfc5639#section-3.4 + */ + ACK_EC_CURVE_FP( + brainpoolP320r1, + /*size =*/ 320, + /*p =*/ "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27", + /*a =*/ "3ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb4", + /*b =*/ "520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a6", + /*G.x =*/ "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611", + /*G.y =*/ "14fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1", + /*n =*/ "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311", + /*h =*/ 1 + ) + + /** + * Invariant object representing the brainpoolP384r1 elliptic curve. + * The invariant is constructed at compile time. + * The name of the invariant is the same as the name of the curve. + * + * Domain parameters were taken from RFC 5639: Elliptic Curve Cryptography (ECC) Brainpool Standard Curves and Curve Generation. + * https://datatracker.ietf.org/doc/html/rfc5639#section-3.4 + */ + ACK_EC_CURVE_FP( + brainpoolP384r1, + /*size =*/ 384, + /*p =*/ "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53", + /*a =*/ "7bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826", + /*b =*/ "04a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c11", + /*G.x =*/ "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e", + /*G.y =*/ "8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315", + /*n =*/ "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565", + /*h =*/ 1 + ) + + /** + * Invariant object representing the brainpoolP521r1 elliptic curve. + * The invariant is constructed at compile time. + * The name of the invariant is the same as the name of the curve. + * + * Domain parameters were taken from RFC 5639: Elliptic Curve Cryptography (ECC) Brainpool Standard Curves and Curve Generation. + * https://datatracker.ietf.org/doc/html/rfc5639#section-3.4 + */ + ACK_EC_CURVE_FP( + brainpoolP512r1, + /*size =*/ 512, + /*p =*/ "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3", + /*a =*/ "7830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca", + /*b =*/ "3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f723", + /*G.x =*/ "81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822", + /*G.y =*/ "7dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892", + /*n =*/ "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069", + /*h =*/ 1 + ) /** * Invariant object representing the secp256k1 elliptic curve. @@ -68,4 +158,50 @@ namespace ack::ec_curve { /*n =*/ "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", /*h =*/ 1 ) + + /** + * Invariant object representing the secp384r1 elliptic curve, also known as NIST P-384. + * The invariant is constructed at compile time. + * The name of the invariant is the same as the name of the curve. + * + * Domain parameters were taken from SECG SEC 2: Recommended Elliptic Curve Domain Parameters. + * https://www.secg.org/sec2-v2.pdf + * + * And cross-checked with NIST FIPS SP 800-186: Recommendations for Discrete Logarithm-based Cryptography: Elliptic Curve Domain Parameters + * https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-186.pdf + */ + ACK_EC_CURVE_FP( + secp384r1, + /*size =*/ 384, + /*p =*/ "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff", + /*a =*/ "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc", + /*b =*/ "b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef", + /*G.x =*/ "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7", + /*G.y =*/ "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f", + /*n =*/ "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973", + /*h =*/ 1 + ) + + /** + * Invariant object representing the secp521r1 elliptic curve, also known as NIST P-521. + * The invariant is constructed at compile time. + * The name of the invariant is the same as the name of the curve. + * + * Domain parameters were taken from SECG SEC 2: Recommended Elliptic Curve Domain Parameters. + * https://www.secg.org/sec2-v2.pdf + * + * And cross-checked with NIST FIPS SP 800-186: Recommendations for Discrete Logarithm-based Cryptography: Elliptic Curve Domain Parameters + * https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-186.pdf + */ + ACK_EC_CURVE_FP( + secp521r1, + /*size =*/ 521, + /*p =*/ "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + /*a =*/ "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc", + /*b =*/ "0051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00", + /*G.x =*/ "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66", + /*G.y =*/ "011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650", + /*n =*/ "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409", + /*h =*/ 1 + ) } \ No newline at end of file diff --git a/tests/include/ack/tests/ecdsa_brainpoolP256r1_test.hpp b/tests/include/ack/tests/ecdsa_brainpoolP256r1_test.hpp new file mode 100644 index 0000000..e0cf555 --- /dev/null +++ b/tests/include/ack/tests/ecdsa_brainpoolP256r1_test.hpp @@ -0,0 +1,4911 @@ +// Copyright © 2023 ZeroPass +// Author: Crt Vavros +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace ack::tests { + EOSIO_TEST_BEGIN(ecdsa_brainpoolP256r1_test) + { + using namespace ec_curve; + using bn_t = ec_fixed_bigint<256>; + constexpr auto& curve = brainpoolP256r1; + + // Verify that the curve parameters are correct + REQUIRE_EQUAL( brainpoolP256r1.p , "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377" ) + REQUIRE_EQUAL( brainpoolP256r1.a , "7d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9" ) + REQUIRE_EQUAL( brainpoolP256r1.b , "26dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b6" ) + REQUIRE_EQUAL( brainpoolP256r1.g.x, "8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262" ) + REQUIRE_EQUAL( brainpoolP256r1.g.y, "547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997" ) + REQUIRE_EQUAL( brainpoolP256r1.n , "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7" ) + REQUIRE_EQUAL( brainpoolP256r1.h , 1 ) + REQUIRE_EQUAL( brainpoolP256r1.verify(), true ) + + // Test vectors from Google's Wycheproof RSA signature verification tests. + // Generated from: 'ecdsa_brainpoolP256r1_sha3_256_test.json' + // URL: 'https://raw.githubusercontent.com/google/wycheproof/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_brainpoolP256r1_sha3_256_test.json' + // Note: + // Test vectors with flag(s) 'BER', 'BerEncodedSignature', 'SignatureSize', 'MissingZero', 'InvalidEncoding' were not included. + // All test(s) with BER/DER decoding related errors were not included because they're not part of this test scope. + // + // Algorithm: ECDSA + // GeneratorVersion: 0.9rc5 + // Header: Test vectors of type EcdsaVerify are meant for the verification of ASN encoded ECDSA signatures. + // Notes: ArithmeticError - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.', 'cves': ['CVE-2017-18146']} + // BerEncodedSignature - {'bugType': 'BER_ENCODING', 'description': 'ECDSA signatures are usually DER encoded. This signature contains valid values for r and s, but it uses alternative BER encoding.', 'effect': 'Accepting alternative BER encodings may be benign in some cases, or be an issue if protocol requires signature malleability.', 'cves': ['CVE-2020-14966', 'CVE-2020-13822', 'CVE-2019-14859', 'CVE-2016-1000342']} + // EdgeCasePublicKey - {'bugType': 'EDGE_CASE', 'description': 'The test vector uses a special case public key. '} + // EdgeCaseShamirMultiplication - {'bugType': 'EDGE_CASE', 'description': "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used."} + // GroupIsomorphism - {'bugType': 'EDGE_CASE', 'description': 'Some EC groups have isomorphic groups that allow an efficient implementation. This is a test vector that contains values that are edge cases on an isomorphic group.'} + // IntegerOverflow - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidEncoding - {'bugType': 'CAN_OF_WORMS', 'description': 'ECDSA signatures are encoded using ASN.1. This test vector contains an incorrectly encoded signature. The test vector itself was generated from a valid signature by modifying its encoding.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449', 'CVE-2021-43572', 'CVE-2022-24884']} + // InvalidTypesInSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains invalid types. Dynamic typed languages sometime coerce such values of different types into integers. If an implementation is careless and has additional bugs, such as not checking integer boundaries then it may be possible that such signatures are accepted.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449']} + // ModifiedInteger - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModifiedSignature - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an invalid signature that was generated from a valid signature by modifying it.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModularInverse - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where computing the modular inverse of s hits an edge case.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['CVE-2019-0865']} + // PointDuplication - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.', 'cves': ['2020-12607', 'CVE-2015-2730']} + // RangeCheck - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // SmallRandS - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['2020-13895']} + // SpecialCaseHash - {'bugType': 'EDGE_CASE', 'description': 'The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits.'} + // ValidSignature - {'bugType': 'BASIC', 'description': 'The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported.'} + { + using bn_t = ec_fixed_bigint<256>; + const auto& curve = brainpoolP256r1; + auto pubkey = curve.make_point( "2676bd1e3fd83f3328d1af941442c036760f09587729419053083eb61d1ed22c", "2cf769688a5ffd67da1899d243e66bcabe21f9e78335263bf5308b8e41a71b39" ); + { + // pseudorandom signature + auto m = ""_hex; + bn_t sig_r = "8cb8886a70de6ff2080cd46dca0d7fd99586d561199dc22b49eef2725b3e2c60"; + bn_t sig_s = "137f519df89193db550373a9a5e70ec0a5db85933e3bddae77cb58bb87fe68"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "4d7367"_hex; + sig_r = "35fe352bf714f35c1ecec780565ded86a8e61fbe4a1fbd798c23e94ea8e8b91d"; + sig_s = "4f01535a365c95e62f8a099d113957f0d12cd12fb587e6a657f94a877a0e8f2d"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "313233343030"_hex; + sig_r = "8439f87848d99d467fb465be0732f894f302d6f95a020b554101f8dc817e125b"; + sig_s = "0dd36a690a1b814084052a018a4ddf720b1e9acaa233d96a6a6f51a5c5b83705"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "0000000000000000000000000000000000000000"_hex; + sig_r = "0c18936d0779760d671e5a674396c3dfe5ced2b26662baa146923c74a4066caf"; + sig_s = "5e5c3ab4ba34d39c0b1639a5fbe6c94be94434da1bf07b8176e88d8858d89233"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "019a2d9637743a63ddaefdbca0ee229a163b809b9b145e5313bbeb8defeab9d6", "548caf89bf5ba49499404145651234336401b9b2843a579ed152e090f11b9e59" ); + { + // signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "39bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe03"; + bn_t sig_s = "a97e2bed0c91e92e4b78be61e94a6773183ed36fc945354de1ea9f2822566a9b"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // valid + m = "313233343030"_hex; + sig_r = "39bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe03"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending 0's to r + m = "313233343030"_hex; + sig_r = "39bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe030000"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending null value to r + m = "313233343030"_hex; + sig_r = "39bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe030500"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying first byte of r + m = "313233343030"_hex; + sig_r = "3bbcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe03"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying last byte of r + m = "313233343030"_hex; + sig_r = "39bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe83"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated r + m = "313233343030"_hex; + sig_r = "39bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated r + m = "313233343030"_hex; + sig_r = "bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe03"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // leading ff in r + m = "313233343030"_hex; + sig_r = "ff39bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe03"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replacing r with zero + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending 0's to s + m = "313233343030"_hex; + sig_r = "39bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe03"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c0000"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending null value to s + m = "313233343030"_hex; + sig_r = "39bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe03"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c0500"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying first byte of s + m = "313233343030"_hex; + sig_r = "39bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe03"; + sig_s = "7f2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying last byte of s + m = "313233343030"_hex; + sig_r = "39bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe03"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec8c"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated s + m = "313233343030"_hex; + sig_r = "39bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe03"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated s + m = "313233343030"_hex; + sig_r = "39bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe03"; + sig_s = "2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // leading ff in s + m = "313233343030"_hex; + sig_r = "39bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe03"; + sig_s = "ff7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replacing s with zero + m = "313233343030"_hex; + sig_r = "39bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe03"; + sig_s = "00"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + n + m = "313233343030"_hex; + sig_r = "e3b845f1fff848dca1a19d8e96e30b294d53c48cd26e237d59089d3c034954aa"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r - n + m = "313233343030"_hex; + sig_r = "8fc1963abc1af56424d5886d5bdbf04634e0cf4567aad58e38cc8036d4b8a75c"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 256 * n + m = "313233343030"_hex; + sig_r = "aa3514c9b84cb35b5ec946239b7cecef43fa94ed9e7eb37415e6f91150b457a503"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by -r + m = "313233343030"_hex; + sig_r = "c64311e9a1f660df9cc46d0206a082483ee5b616e2f3837a3715714693ff01fd"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by n - r + m = "313233343030"_hex; + sig_r = "703e69c543e50a9bdb2a7792a4240fb9cb1f30ba98552a71c7337fc92b4758a4"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by -n - r + m = "313233343030"_hex; + sig_r = "ff1c47ba0e0007b7235e5e6271691cf4d6b2ac3b732d91dc82a6f762c3fcb6ab56"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**256 + m = "313233343030"_hex; + sig_r = "0139bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe03"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**320 + m = "313233343030"_hex; + sig_r = "01000000000000000039bcee165e099f20633b92fdf95f7db7c11a49e91d0c7c85c8ea8eb96c00fe03"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + n + m = "313233343030"_hex; + sig_r = "aa7883ca374b6a4a315356bf51bcb370003421d7a17e18a13e517ddd0c3a42b3"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s - n + m = "313233343030"_hex; + sig_r = "ff5681d412f36e16d1b487419e16b5988ce7c12c9036bacab21e1560d7dda99565"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 256 * n + m = "313233343030"_hex; + sig_r = "a9fbd5079084067ccc58f7dccc37c6978aad754ae94dc36939cc41f1f1bd48930c"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by -s + m = "313233343030"_hex; + sig_r = "82d4116aa33f720d12b3d14bc6da018c0558cc13e38e5651cc90a58b0e13f4"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by -n - s + m = "313233343030"_hex; + sig_r = "ff55877c35c8b495b5ceaca940ae434c8fffcbde285e81e75ec1ae8222f3c5bd4d"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**256 + m = "313233343030"_hex; + sig_r = "01007d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s - 2**256 + m = "313233343030"_hex; + sig_r = "ff007d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**320 + m = "313233343030"_hex; + sig_r = "010000000000000000007d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + sig_s = "7d2bee955cc08df2ed4c2eb43925fe73faa733ec1c71a9ae336f5a74f1ec0c"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=0 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=-1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n - 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=0 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=-1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=0 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=-1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=p + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=0 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=-1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n - 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=0 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=-1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=0 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=-1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=0 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=-1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n - 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=0 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=-1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Edge case for Shamir multiplication + m = "3237393033"_hex; + sig_r = "0c939a92486c6d0d619510b4a94162b9221be2eb15faf878bff75e6cdf4e3707"; + sig_s = "222866d875d1b31e23f70e3e8292e5eeef5b7f9442837a3ab8c6e7b0c950911c"; + r = true; // result = valid - flags: ['EdgeCaseShamirMultiplication'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33313930393433323838"_hex; + sig_r = "998d34761948f0cbfd45e36feb0e2408375ec9f89be3b4d224d50e281be9516f"; + sig_s = "441683b18b537c9a7e8a14f104716a04e6ffdf5fd222de9b062dd294c625d06f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383433343734313535"_hex; + sig_r = "33364d51306c4f2bac4d4a4f6ee628ea5a9ea7ee4509e356d7a4f8abe2b34b84"; + sig_s = "319d54e83607370d9d375c4726099c10b4f8417dd1f8c1bb1c4f67e0d6b93d4c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33353732363936383239"_hex; + sig_r = "9355f6c4f55b9a5db82a6935292dcf03f1a6a4d0cd3f930e0d8c8e2c4e441280"; + sig_s = "54b19315a954be2ac97a68b5762979c931a35e66b646073bfa77d2cdff253a88"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353931383333343239"_hex; + sig_r = "51e642a8692cf36e1aa3ec8bb766b54727105233539b1eaee15383b00ca18cff"; + sig_s = "67b1b6514253179a82003aee5696a78d93ec8326f9de13245c4011714f017e06"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3832353330383232353839"_hex; + sig_r = "938fd46c5289179c69954c61505bbc3d6c6df7997ae72218495ca2098b75cde5"; + sig_s = "5bacd87347d752af443e1d748c978894b38aaa35f2c1462abd71dd7eada5460f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3133373334383238313432"_hex; + sig_r = "54b0cd8c19a299662a44729c498d59f07e9dc2c4ff66fa694fb75855c0403165"; + sig_s = "11ca7520f65ca47f7dbfe647b26aea2dcb797257f9955c28ad989394d2b27ba8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313733383135363430"_hex; + sig_r = "88112a8284a1d7520824aa6c092e3f5e1462d79c53b75d7bbd31c307decde865"; + sig_s = "4e81338689b868fde75c395b064777596484189120aea758ffb5596ff3e49c31"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32353533343636353034"_hex; + sig_r = "8fa2d9c34260e60ab42e58fe6f436e660119d56a0d69a54f9b31f1ab7a7d733f"; + sig_s = "730af8362394b6628a34717327bc0e3ad95bccf5c5886c851ce0881d9d574a0e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313833303339313937"_hex; + sig_r = "673f4c6ea7bebbd6fff00a5ee3c36c1ee582c1afcc044a7f709efd8e801ac9ce"; + sig_s = "71e6559d7c6e375b13dc1f1124d562a1a483d2a1423a8a83e5c6b02713d63812"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130353236313736353435"_hex; + sig_r = "9f29cfc476b94fd879457c392e3d8be6226a53072a7517b1da1295dac19cb89f"; + sig_s = "2de81f06ef9fd0feeed4dbbcdeba3cc4140f873935ea210418cbabae97ecb478"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32353031353339393836"_hex; + sig_r = "28c4da9a3de47f0a4fdea62266c0319c2a4316627f98fe4f0acf53895d2bc442"; + sig_s = "63e0407f262dd5072514fca9d2f686fe8670b39af2d9294c7284851e66af1b86"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3134393533313634363139"_hex; + sig_r = "3bec5d12a3ac4e8a887ea481958102779a6ab8bd8ced06ceeb4d0ad815529846"; + sig_s = "730a695c12b5eb574012b71ccdf86a7da0f3ca81e1e87c36dff23ab65345960f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303633383532393036"_hex; + sig_r = "60e6d17a829095d3c2492ef3742df6da92899a6caa1b577db8a20badb124e9c3"; + sig_s = "8297a2480909a2d4ae622f21add36f2828425301baab4f188cd63ba07429db7d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37383339373634393932"_hex; + sig_r = "162dc425af52ef38f169594651591ba45d787c22be374bef136f189a1c5ba785"; + sig_s = "1b7deb7057601c8dfe286478ef39f36d86e73b55f147f7be2740a2e9813674"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313239323634343639"_hex; + sig_r = "9f6085345082d095a5475599bdee7e89ef4875cb3de4e216c5df5a0e9e157a36"; + sig_s = "1fc7007dbfce1ca268e9b6a26f228e26c01d07085f3407402e8396139fb35d9b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34383332303432363833"_hex; + sig_r = "7b86c329a99a59f085c236c38bf90daa9b0a7076bd31f746c6fea9dcd445732d"; + sig_s = "90c9d5bfe10bed534576399886521e6723b5f0ca452362848aa49eefb95c4592"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333635323231383136"_hex; + sig_r = "425130dab339a89ff4130937288ec20e78b977a13379adf979b3ca5425bd65fa"; + sig_s = "4bf62d3a998e2e80781de830f3807ecda4f5a0708f388448efdb77d1e6516c24"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3234393137313236393635"_hex; + sig_r = "5db185253364aee145374027a386eb62f36b6d978f94e23972e03846dc131048"; + sig_s = "a56573f77b516d2fb6f884d155289f7f3d6eaa38d8e60bb14eab8ade6e8cd7e9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32363232373930373738"_hex; + sig_r = "130dd721f7fa3e3c26767522aa7e6404d0ae09988e2de1e7396722439e6b7ced"; + sig_s = "843f12ed77d542bc7118d9f2a04f4de0bcbbbaa0a1efe1fce1b5bf41e32eaaaf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313031323537373238393237"_hex; + sig_r = "8e5b44e47d11be96b0a61a46830f1cec3ba622bee222bde305b23532f3aff839"; + sig_s = "55d56c62d531e5ce09ac86fac4bc020b5a5d0038b5c6c5185a30981cdc7ef7e1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303530383732323032"_hex; + sig_r = "44d6f35ceac727cbcbb28c9220547380c2d7a3a8aa3815849841c21426aa3983"; + sig_s = "1e9ff0aa876f6ed247cdd8904d72b30c74fcb9d064f90b3d6ae0439dfff73976"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32353037373237303332"_hex; + sig_r = "8a90cc3ffd676a334a54c79b5ba860afe94e39c188d06fbf4212c9f0800a5c00"; + sig_s = "2b4a743be3399c2e2be003309ecb6bca9a9d301c4b6dd4ff39918740b51eb79f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373139333435393339"_hex; + sig_r = "89c337cfcb19946eb03a63d423a6a67ce16e202c0fb6aa88e50de813363c91d6"; + sig_s = "7faa8d6a92c6f3dadb5e22ec87f17ce3f6eeae56949c037bd23ab5bccd8d4e01"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363337333035373633"_hex; + sig_r = "96008f8ccd6224d20fea4d342fa61dbc534e519474d148680f26e210c271c4a5"; + sig_s = "19a917d7940f043adb25726642a27645d0e65698aee4d15758a518a476a22ba7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34323431323733373133"_hex; + sig_r = "2f6bc34adc9e8849682e0e37d6ba6c1b6ecf1bcc7fccea1912779e2cbc12bee0"; + sig_s = "976ba20f1355ab13cceaa11b40e4ff356d026c5e4b0f4e5f50ef5f9bed044db7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343735363134373337"_hex; + sig_r = "97aa19a17aba120e980923817061d16f4f1e9ca17bc06492504b89e36a4526b9"; + sig_s = "02d9ba2389a366baef8ae0721ca49da1fea96c1e9aa8369b81045b64ad8d0af7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37313632333237373334"_hex; + sig_r = "4bee9a122b5be02376b8740e85aba2c24129880912a21dc2802a41cebdf9c6fe"; + sig_s = "474db2bf547c68a2713ed2de1bd46896492c4c8ef106ff97336cd0cf31527f76"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31323232343034313239"_hex; + sig_r = "85d3a12940d1ef57875574f9ddeb688a421d1d9f740a7aa1a8dce2a94b5daa0c"; + sig_s = "38f7bc3421c752067ae1f5ac8ce601d3edd7c67a718f236d24d363fd9526db66"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33353234353833333638"_hex; + sig_r = "7dc36259a5d96de102e57d43e6f3061df77004b52899f88a26da2eeb76eb84b4"; + sig_s = "04f8bad78ce1cb424d3d1e7fce4689483e64bdfbd08eaecc23e3553058e885af"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3331363334333936"_hex; + sig_r = "10a69623c61133165ba114d8b38a4f0adb45f7f4a55a4e7f38cff074341681ba"; + sig_s = "64e72745887f950318d85cf2109625bc15b1896fd7319f28b7f0868bf0be7693"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36353332353938343339"_hex; + sig_r = "39e3baf7b801f902c9a25a5a6f0dddf03b534d04d3614682678b8e7f1974ac95"; + sig_s = "44ba3d612d200b62c80770133cb9379f9532980932fbcd974d9c1e7a9b3890"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373338353138353034"_hex; + sig_r = "826b115b5f13153ab40b155afddd33edb84b6a05551b1b863e57bd3743e98177"; + sig_s = "a0f185605a3149337e6a6f6e987850ae93cda4581bb6acf6b34c663dc6aa2f13"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343635323636353739"_hex; + sig_r = "0af239d782346fbbcbd74d4be1f871033a71f1b1378b816d2285dbd606b93263"; + sig_s = "097061e7c273864dba126efbeb26940fb38481a5cea7b45e2801f1ed5492c709"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303334383839343934"_hex; + sig_r = "22d16b132518c27b08c5eea30b45b47b972ae0f0c7b677020e0d2220c6b1ea1e"; + sig_s = "8d7ae5e900e9586d16197e68bd667e2f1e3c94917fe7fc2c3001f38a987449af"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34343730383836373835"_hex; + sig_r = "65c553630a7838bf31a3524645cc562da00557c6f2239f06088ceb9081ea951b"; + sig_s = "965be34c6f827b7933e1f24b0d6af98d5a16d17b4401df6286365fd9624f5184"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353537363430343436"_hex; + sig_r = "375240515612669b8ea7ea65fbfc1ed8b746c840d9c14da0465b3dfe3948f18b"; + sig_s = "9c497e207ca7d47cf55ba9f5aa90afa3b7f4ea90c8ae385acdb77de10bdab5ea"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36333434393536363038"_hex; + sig_r = "3fefc958edf01721a89f3baa381f67c5ae57bbdf88998a7733e14372db2612ad"; + sig_s = "70fa58b2b6ef7487286d960f93c50dd244628dd535159597313332989a33e64b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34393432383039303331"_hex; + sig_r = "3a7158d082149b6baf8ac34defb471225143babec5fa62eac3be5d8a74ff1d91"; + sig_s = "43b3e04385af3f733ea6071d6193f766135d39cc724235c2b082f61a2988b619"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323636353831393339"_hex; + sig_r = "51fa7f7434f18bbacf210645e0e9c352016affbaa5ce527ad2a8929c8e7dba3a"; + sig_s = "1ae516de56de176f3c9a13930973b1a1dc30c8ca751f7f6659248dd31b1d54e1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333332323134313134"_hex; + sig_r = "60e8e5b328e41667993700adcc63573bba75d68172657c031ae5be4f4ecaf1ae"; + sig_s = "369952c938d87586315b58f643b726f3b78a2d2c6b90a3e2d458364a1d9d9b88"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363136353237373135"_hex; + sig_r = "612751cf6c7e64a1654b57ceac7783c365a62ac8a0ddcbb1563426a1ea33e033"; + sig_s = "9abe49dea96227b2257a106fb943bb68dee51fe78b40400e497f20f17d34aac1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333539393535383133"_hex; + sig_r = "8fc0495f721e31329374b39fba9db7e40776ad0210310f7d5001ed061193e685"; + sig_s = "7c4916f329b88fce8dfeb8a920853ebc8491277efcd94163ee113f4cc4fa8672"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323931333631393538"_hex; + sig_r = "5c29a1706fc8ae68dabde31e517716f1143715e5fc71c34c7098891b5553a6d5"; + sig_s = "40c998427588ae8c32cab8e0209e8307c30d8e077a85b3dc79e61203289ee627"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363230393033333936"_hex; + sig_r = "28c55c6681a6c50cb8f2689298be0e7d9abf3706d6f19f88e4a2b4079ef7816b"; + sig_s = "9c23d049e9c06f5363e6307d891e7717d646b37d276cc8b9e5893dfa0e763379"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333633313032383432"_hex; + sig_r = "837293f4ee788a24e6254b805282788f9f2f9e82044dcb8f058e98169f7edee6"; + sig_s = "3eea594d9da1e8df1585a3d96096b5aa5110ce262c62fc081660e8991d3c64e9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363237373433343931"_hex; + sig_r = "37fb6eed1ba2c5fd0d830441077462c7158fb9dcb549ddd3beed5b0d358c9363"; + sig_s = "5ea0872456aca2c20a741806bd1799ab182ba8900dc2214f79f074b0e6658ffe"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33383536373938313437"_hex; + sig_r = "4b85570bff8cd32e092164ee2c9dd34afab98184912d10b678b1ccfdb670708c"; + sig_s = "7dd5d9764f25241e652c42aee48a9a64fc6449e7cb7e7ebc9efb20ff913dc766"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383831313830363430"_hex; + sig_r = "4d333eec7733a0ee3dc2e2979e50551d61ec7d74b3d0fdc1e7bec9b42eb8aa07"; + sig_s = "7730569947e4172594709c286542e49919ba74dfc0b4532c8e42aa8bfe83faba"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130393537333934363738"_hex; + sig_r = "5318c9e492db4c1d782f1c5021a7530dafb42aa7541382ad52ac9473e22d48ea"; + sig_s = "6dd1439225e3e762ddff0618e5b2788144921cda2d7cc12add5c2572f139c1be"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353432373131393834"_hex; + sig_r = "a92d86eeebd62681072166dc69d30648c21506029efe64134759e5bf835250f5"; + sig_s = "06fed21d3062655aed3d9bb77d3792df465363589f9ee2754cf274e37f539b2f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33313530303334333235"_hex; + sig_r = "0648798e55d73a3908179f1f104b1e0c2db5dc1d034d3b4ce758cc83e43ffccf"; + sig_s = "51f88aff826e783f72267571509555c501df186e84378b8bd8d01561635a84a3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393939383231333931"_hex; + sig_r = "52230f92302c0260cfbdaa5aa3726b378631dbf3a277f353fa5c388b0db5cd48"; + sig_s = "4f67e8a17b11b20d6e17b7553fc09021f65a0f6a6a8e003a91a1231494420459"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393731323039323631"_hex; + sig_r = "2f8e590f98bc4ea9435a800ef02f6449543196e233c0444064063473ac2d903a"; + sig_s = "9060e6f3722a62f57237b98125484999f0fad124dd2b0937895401f11928af94"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33353731383338383537"_hex; + sig_r = "0eb6b253f3596c22a3b63344460352d9a2c56554376d5e41d96c3d4b11bf0695"; + sig_s = "30fb778dc08af2849345de1d0ad1ed4f6e2145efbe88a9b32ec2ea652eaf365e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38363832323639383935"_hex; + sig_r = "60901403dfe34e2de5ec913057828d273b07b3a9c44d647e728e0f9a35db8380"; + sig_s = "8cfe902ecc6cda4d8382258971f9e63d5b8d7abff7e49749376c80e5a558558f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32353438383536303331"_hex; + sig_r = "690cdc2596aa164ee0d4abf8ef5743410b923edb846eb29837785e8fb4614a4a"; + sig_s = "11e7234cf30d0f2856c80d5ec8fb5c9e69ee3c61f50900e6496b9d468d37b370"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34393935373031333139"_hex; + sig_r = "8749def3948ec37ea4b70fccc6431b9172376fc48bfda6cccfa279afd8ba0342"; + sig_s = "873d39b5450719e75cf7374cdfc62ba3f1b3ee65b3500e3552c6387739b1dfd2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343536363831373835"_hex; + sig_r = "3eb9855484c096dd22c07abf7cbb7cbeef5a48bfe1e0295d36e1182ff482f9fa"; + sig_s = "10f80ee15511c78aee1adc5f4ed711fa51783604a3a5c6fc3e195a521505a0ae"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34313835333731323336"_hex; + sig_r = "317921b3c180124f168ca56a52b9db0526a6e5e8fb228d6e8fbd5133c5f054e7"; + sig_s = "83ba4764c9c01619702416242d06fe9149754369bd46fa24834666928153bf87"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373237383439303034"_hex; + sig_r = "309e593a5f3ecaaa721c80fc7beaeaa7a11252f0ff5819e1052f61a51f19e319"; + sig_s = "9813529c6a078d0d466d2ca9892e2ab4b940bb574f5ab994fa6b59897d7a65e4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353632383139333138"_hex; + sig_r = "11e526e1c0a46e2c06b580bcc9e5cf01fc4e5c7fa3cb8ea446cfd51afb038ab3"; + sig_s = "21239d6aabc4249464b72cf189400a0ec5f7ec08edbb159e89669aa5d431101b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3231383739393238333836"_hex; + sig_r = "9713dbd1a95ee9248ba9a308003ee01a999170b1b4f2ea40f8a58b80f8292565"; + sig_s = "27e434933cfd22acef5d2068bbfdef9e9150539d6d0f41f8984fea4dbbe57341"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009e1eb3c5e7f987667aed17c6e19cadc2f55a8334023cb3ea1f584d25632c10d4", "7d8c7a2515b298f5a94a6f2ccde6d28876dc03af30cbfd63c7386161cb1f7095" ); + { + // k*G has a large x-coordinate + auto m = "313233343030"_hex; + bn_t sig_r = "e2027b801fc479308ff5399a8825fccf"; + bn_t sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r too large + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6938807dbda68ab439eb446aa8fd73979ccad0f3292c2879320cbf0ad13b1682", "01abb07c2904b1e0f4d488fbe694f1230ecc2854733cbe7808731a980b537b49" ); + { + // r,s are large + auto m = "313233343030"_hex; + bn_t sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a3"; + bn_t sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008b812f51fb276eb64e1236177a1f859a0ca1aebb96d92cdb94c519339b16dec5", "72d2a2da73512c80e824ade98d41c977045c09f44458baca73be3a543877d4bf" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bn_t sig_s = "4ab8de0a51481bc45794b924518f2dd6ac5cce31f3228d624c5a896f79a2d6a2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4628340e3c6e07166b793b1c129057f3d8d7313239411a5a36f2d9efa88ad1ff", "1b9fbdd8416a6dd14a3daa0e2e739eaa9e2c3ded5eda9fd6ebed7a126d513c92" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bn_t sig_s = "8b1b5f89f5bb74caa42d36e601a9f3c20b4e6c91ceb98a52fbfa9f81781b8a17"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6904bf0039ec44d4f78f39da89918745c0d8b565761c5cb9890a3bd5c86370b8", "6f30f70c62ebf40aba1ab170440cb3eb234dc9b8bcb7e85b0d2bf1d90d0d1675" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "01"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "70cf6a9028bd07f540ace7c1936bf6f2979247e56a9aa1a58616cd4f6d582947", "00f840f3094c832e8d751786a57c17520201b9128d1806c866317e30be0dceb3" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "01"; + bn_t sig_s = "02"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "08ca9c9307a1964e579ce0243722c57c0144663e204c209967bd8b3b852bfece", "05ca6f07149865cf761b58f528583a17b4e9ce758cd81d5c3a06912e7c30b70e" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "01"; + bn_t sig_s = "03"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "133427eab0626276c19d37bc4653a76446c3ba42ccffbcd0fccc2651a026c8f6", "713ffbf582bc60502e1531ad6be9585d31688e0ea328863b08cd8183265092af" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "59913408fe0e66c273b8f1c4ab4c6a7ff89086c18f2a0d2e472b2470f6798101", "3054773b00d6af180422a8761be025940bd92c4384fa610c300af9e337ad559c" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "02"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "288044898c24703157857b254f81ada6c7c9c16eca16a77c43d98036fce0833d", "7d3f970dac918e391cee32cbf119034ca2f64fa969a21d838bf9dde094f2c4aa" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "03"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r is larger than n + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a9"; + sig_s = "03"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008f22e8e8087340f983b4743180ba3da0c50a96080b6f1acbeb98537ac88ab5c0", "20cce20f7cb6739e8cf8ae9a0c6cd2e107f7d4b6b65e736969e7b0d2195f69a2" ); + { + // s is larger than n + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82975b2d2e"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a0cfc0a3b79e49b57241dd049e9627bafe9bd443ff181399ea8145d0a4deb1ba", "54ca255ea5b2a6ad4eddb675b08185d8b1974f1e53a9d29551ac423eb282981e" ); + { + // small r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0101"; + bn_t sig_s = "2827370584fdeb9f5d5a9fb9579a09390efb6f9d99b64fc188d8bce05c2d4eed"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2ee5ecc47f0c054d1fab8678b721a4bd281c73367b81f0548f865c642297a531", "10b3a5427f8209a9cee8d540c81513d436b29cafcc91f1bd1c73da12f5d87e08" ); + { + // smallish r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2d9b4d347952ce"; + bn_t sig_s = "4937a087731df4febc2c3a81ddfbab5dc3af950817f41b590d156ed409ad2869"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "326d57f742e0f92fda125f9b012eca442edf6c37fe8fe054d452b31482f41949", "6b36683b61d3ffa6a45f60ef03b310c77d9eaaa080cc72d2d265debe4e2d9391" ); + { + // 100-bit r and small s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "1033e67e37b32b445580bf4efb"; + bn_t sig_s = "91827d03bb6dac31940ba56ed88489048ff173f0bf20cab20dcc086fca37f285"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4b28b5a8f2c20cda6f560f229d877a00f85bf89c42031689df9aab26f10aa9fe", "3a3634780152c39f7933c951c8abe7593cb8f07d719dbb01e0b40598bcb95322" ); + { + // small r and 100 bit s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0101"; + bn_t sig_s = "3eb35fe7e8331f71e4c63b45f349a99d47a5e781798e579f2386195d3827bb15"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0a28eafa6990707aa9e54125fae0fc66ec3942b02b393d76e1fce2ebae01e918", "0082f1595d33f3e3760a9cb5292303f365ae566f2046856a39b37729decfdd373b" ); + { + // 100-bit r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "062522bbd3ecbe7c39e93e7c25"; + bn_t sig_s = "3eb35fe7e8331f71e4c63b45f349a99d47a5e781798e579f2386195d3827bb15"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a2ab9590f64cbb46f261b838cafbb61c6e41cf71cc204183a8a761190ad7021f", "0088c059f5942bf7cc69db600c0afd58a57ab7616dbb473fc1a37633a983a555fa" ); + { + // r and s^-1 are close to n + auto m = "313233343030"_hex; + bn_t sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e8297485628"; + bn_t sig_s = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0fac907b1e46cf40ad9eab51b67c71e75b245c47786b178bc5050ce3020ca061", "34ad94fdbb65331a2d6942857de76cad0b8681bc80a920e9f76fda5fd303cb6f" ); + { + // r and s are 64-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "9c44febf31c3594f"; + bn_t sig_s = "839ed28247c2b06b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "357920c20178f9c95183dfb081c9c38d1a3308bae119074f4e6649ba0fe514eb", "41aa9f98e44e50e319ce91d8dd17cdb6254a47b5c4812318d014c5ae7610f983" ); + { + // r and s are 100-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "09df8b682430beef6f5fd7c7cd"; + bn_t sig_s = "0fd0a62e13778f4222a0d61c8a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3533d5d65ac5f4270ff42bea3880b1ecd41031985cc7d27654ead4ec50b3607a", "0093bb7bd11de59958331eac2fd4e99fe2e9832b2689bd0cfd4179d4a2e01cb5c0" ); + { + // r and s are 128-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "8a598e563a89f526c32ebec8de26367b"; + bn_t sig_s = "84f633e2042630e99dd0f1e16f7a04bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "04f4eda07ec78c730fe753379ff70f09295a8e7dd1849155cede7366dd769ee3", "00a3e38af03dc68f77d3ca3ff5ce93a15525b2e27cfa3ccac69655b9febd9069c8" ); + { + // r and s are 160-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "aa6eeb5823f7fa31b466bb473797f0d0314c0be0"; + bn_t sig_s = "e2977c479e6d25703cebbc6bd561938cc9d1bfb9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "48321e268fddb97c84318983f5f6aaff174077f80bccc965f3f19053f01d5c74", "0c615c4a64b2d1d86181664ace3bf3e16880428d439aa9cc6dbec2f18716901c" ); + { + // s == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // s == 0 + m = "313233343030"_hex; + sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + sig_s = "00"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "536e160ff08fc1d259f92aed4fc46e1b1b76c894937f3ce1ce50e682619a5620", "1f938f6aa400d4907ac9722068f8bde3681e994333a7aede8fcc8101a882d98c" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "253f2522f5ea35c8d48a5aa79ad3da0af8eeaf1a5e0aeaab295494c94bb615b4"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "38c5f7b40e2851c796d88efef5fb41a8a56688dcb146594a2570a2d14b9b5c24", "13473ca79ed9f4ef362ead385a27ff4c0948667798394ae6371e62d78c95bb43" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "28d6daabb1b474bb9f4520cbaecc882cd23bb1042fa657473fd4078ecc80f7c3"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "68934c8bdd432a920e62e891f686e0a42a4caf03f8eeb3d8a20953fde413feb3", "009351acb7b12599e3aa17e1eac9e59bab8a79a70aac0c812cd52d82b5eddca241" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "43afa375cba6e7de23eb4f70f36fd9ce3b7237e43ceaec1fc2fda055ca9871f8"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "323eaadf1a22e3d7edecef3c9a5b9327ce7428ab163306fc0f07b71bde27361b", "3e8d5cf63e1ae9115de626879051e4531d18c1ca56fc7cc8586330489faa0e31" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "4b57b5f040bc7fdd6cef6aee249d68f7ce2bf021fbfcd360783dad600b584064"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "65d22f424c9a20ff58103c260bb9005e943fcbf1c8fbd311bf32fea5be906807", "008e14c2111c8e2aab36bcc08b3ea3ddbff9463e7a5fe08e38cd13fe2669c14384" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "21dcd8dd48892812395c8974ecd00c8455842e5181884da6035f353dfcc48d45"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "41330a6c79b2781782dd5ace6025d49bf02521113d375800708f60118814ce03", "009aace65e5f21c66d6843199c31f458cc376ff567b7ff044316347cf69ac8dfda" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "4c89edc4076ae899f22372689f25460a929a44aba87c1e51070212564beb8cc2"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6a9602bceb7e03886bac62f01e12ff64113f1b060aed58d0f1d2af3fa832edb8", "7102549b5c2d251c1c7394f41bded269b8c40dc693631cae628a822ca0c118eb" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "231fa4702f31c86a790dcd5a013a757ad954950b941a7db865106b6de48eaee6"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "78084bd411afddfbb9e3aec4af693291ed143e0d7519afbb4ad8d441669559b9", "5ccfb4b14bf8028a9cb9baeab02b193ff46f6de0cfc1f1354d05b2237b0412ee" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "3f9826b90802b2725f4f7be70ded05d887e98ea726b3079c0898f078b81f1e71"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2d4abd4ab5947f2de96fe2585c2969c457f2ea292c62c4672ebcc3f6c4dbcab8", "7fc76db526abb84dd893137362417e5d404807e36e0031066bf2cb601ac675c2" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "4cae4be89cee15d91fd495d8a91dd90ad1160236a74d8bbe0f409545042ea5b9"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "65b0448e11c17e55f8d54362d09428c6539eaf85b22fe2ab339c72564c947d73", "208e7682cf9dbfc745415d87ce4752b29d5a1d26f8648331510597ab8983642a" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "328f4ed5ab79a8a1c901b906a0f55b4bab77401f58db4d555db7997c11163426"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0080f2e7e7077b916605249be30ef87ab94f9b6c140d646846ff98e246144e294c", "315c0f4ba1b32eef8fe5785c7f02fda0c7f2fc74ca9e98c9c85924ca107a9e0c" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "310c2a34ac6ab050ea873ea26aa298a5782473469033e021f5e1c13ef0630755"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a81be0116bec92694ba6672f63b1e2ddd5f848e277ea9fb3e3dd1f0374dfcb22", "5c5b329c8668fb876b9189e8aa99559ed6d6c338cf7876be7cd4bb85216af10c" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "241166115f5e25e286b882c3e39558df1d1e6ef90551115118f6251d3a566adc"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "28e479f1a1618760c664ce7693986f54cef758ee078a2ce9d1cf1b79beeca20c", "00905f3aad0bc94335540145f75c54e1439de798de71e0cd2abcb74367b6627da7" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "204373ed57d86a4103e275333a16ff216ea450a5ef3c2019e9351a2c57466d6d"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5ca90c3145a35798b391eec3866674795e204ff0e5b1acb62114618a7aa83c74", "33386886f91b4810b04f4d3463ea8abca5946b5db826be85347eb6387a36667c" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "1804472a04273f8341952e89785cbc7fe86f74edc780d1e89014dd6d5f6f7f37"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3238104f49fbc1c62e7f5f67004c9a844e48d07c9665dd6238602d5c9ed6274a", "00a005643228658a81f2049d905d5e6fc0874434e88710d98494fd0c59f8ee18c9" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "3549f9e472cce3d5a153ad22dcf0b11f7ae5090c8ca925c9897e89f3de070855"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008b6c8429f78188b32a39d02681ba07a09b54d98c59b45dc3ba98f4d8aecff92b", "5feff7418fba564c5d7b0b9db684622814292dfd85c30da6422db8a95f473e35" ); + { + // point at infinity during verify + auto m = "313233343030"_hex; + bn_t sig_r = "54fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b53"; + bn_t sig_s = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + auto r = false; // result = invalid - flags: ['PointDuplication', 'ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "78fb47982223887cb723401321e18c15e9da3201d7c54257997c6cea01488746", "0d35249c1cbdc9d8e597230740114935c7c9653d0ac6185917bd0dbe4a575ea2" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "54fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b53"; + bn_t sig_s = "54fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b53"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "166dccc1c50cd1e27b5b3a520575d4019b6f6253f69382db5f69ea7b1e3315e5", "7edb4a26fa709c78fdc6166eb5a0c252c2b5f74d9478aa6e5b9445868ee00bfb" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "54fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b53"; + bn_t sig_s = "54fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b54"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "02681a0f6ba6f5dea35f6ff1f89adfbdca42e4aed2f579262a2d721d0a969544", "55f9cc26a0a7f5e464a995e2b924221d73237bc0629fd62920f6f1aa1e684449" ); + { + // u1 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "5731b7c4bd04cb9efb836935ff2e547bf2909f86824af4d8df78acf76d7b3d4e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "11d7c17f9524526bb1aa9d5cf1a6d2db2b7c92255725ace2db8beff3b1e3c5aa", "031196815e3b6ab7e0fe7da45d03f6b172fbaf42ebdc03fe37e77a41dc8bfc71" ); + { + // u1 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "52c9a016e4e9de1d42e2a15a9e5538f599a8db1d3316b21eb0a5618b29cd1959"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5c6dfa4fa95dfc400f6a31c62c289cca3c945464317c91ed27f1344a17f61a50", "39f48c452bbdb0065170d8d4462e8cf765e6031916c16188d78959f2ad02e0a9" ); + { + // u2 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "79d861cde2392a21b481b2ae5621e752b4da2a115d6cc82071c0538af6b6272a", "008fb5804b20adde5cc6a8c23f6327bdc1c17355f1621978d583d759e2275a71bc" ); + { + // u2 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "71523a926bf4712829995c6069025e4bb2d0fc6d23966f4fb5695f01ba3039c5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "134b0ce73482b6faf7bb86980ba06b78c040609f94668531ab598a8d57eb8536", "445599e651cd4c2118ac04e1a797b084a4eacb547cc3fda8c41582dea6a4df12" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "1d109296e9ac43dfa92bcdbcaa64c6d3fb858a822b6e519d9fd2e45279d3bf1a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "48e12e669fc1b86c0276e6b7e5a6e23fed6e917f6262bc7c37d1616406d73f8c", "3a1d0e775a2b32fc9922004f0afad6d5f656d016d431513594849e1af60efe44" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "8c2128f5dc4e0b3457ea40c55a89e10c8f42fc8ea3f8c92523face034ebfe9b8"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "796f1a0ae4c7082a70a4568890bc423bdbe33e818c9691d501cb8088380e9532", "7e1a6e26b98abeef038ae97651752e9ff75f98b948a58433a25e92212a1ad413" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "82a87706d98abbc48325a0f7fe6938ccd75e98439d25848f505ea82f492d96e5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0088957c950ed384f600ad37f83cc29f9dc1d2711f40e622de210420cff6449197", "496d739d064ee9416d4388c79cc18f1ed1a4840a7ee36c8d711aa5d3ec822a72" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "3b95fff42513681088902d87fd9130092c08879657ff7279a2da6bc0b2cb1e89"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "762a9cafe969ad88b92b42c6d2a5ca539b94985de36a85a2a20fc38fa6f34c6d", "120f0715e1cdd1ac3837bf46d87a533b2c4f34d4a0c64bfcf04ea5abd053ba16" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "8c19c62c81af96573cdb47362296b7438246f1d63cc4ac78ce40b526af6ad5e3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7ef326d81e603f80db7ca21a7e6c6e9e077a07e72f933ffade8950d64672f9b5", "008d57018d569879f4077d46384f068f8d2de11882095efce324d2fc26bcef3f89" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "6e38347d617082f23b5083dba7a9e11578546908c427b1fa0c635bcac78d551f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "23f4acb9c5c58479f4e783286e65941373e1263b83de2b544bc7ce5288c0db87", "7acfa518e4f7572bf1109e926b912986568647c30a0e47fd7fada09a8eef7ef1" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "6ff922125a63f82d380b75dac21241a89653aeb8137cad2a943d5cbd50491286"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4b8810c9bc3442e2999b0c7c98d84faef2432cd7c13f9b41274ff984bdcb60a8", "08bf47af0eb7671beb922a3c9d6c1e96e19c6c359edca3a7580f98bbb3edc664" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "050e2deb40230cf4fd7736a36cb789168aff681d754a1643014b96b898577800"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6ffd8da5d0f06028e6ed05711ec74eac956010c5ca965c5332f5fabdb777c9d4", "4c1f1eec39656664a7e450eb39b9ec606ca886824decc17f7b6ade3257dc6bc8" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "6c7a2223efad1082e2bcba164c9c3d285e3abaacc7040c601ac638f3fb3799eb"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6d03b4ee7ea7e06f33f3dea09b4ef610ba2adf5d043183c47d531f30c6304e74", "07bce7ca0e6b6c907c81a3d9da66799bc368775eeef0084145da8bc31d66828c" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "8ceac544b84265dc953a3cd3f31ec69d90b3f02189f35559f04b2a301d74978d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "48e0dfeb287670685c1b34f189b7517ca42d622d1fecf8d703b7fdaa57a5493e", "00832f102d2c03f1e48d31b9ad1af7fce77627edfbf532b77f1f3155b858d54f2a" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "7e627bf9436c43ecc0a455f59dec633392f12ae0743c2c8b2061b806e08ab800"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5c71221ef1a42ca69edfd6ce9138d7395c95850019e053ee982851b513de8c4f", "008a0e9f4e1c6e0e80d043615595a4f700d61070a4602d12680a5db39c152be129" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "9651e7713dbcb2c060c5d5c44df6631f31cc0973a94395c3703e5b58f03af6c6"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4a290d8d3f8b60f02fe6b3139b233358abbc807128bc04895297e10cf287801c", "5d9e881b5a8a7272ffeb2f756d723ea9c4e125b0b1eb07aee6b74a4c20249267" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "6353c7f3e0a4e33ebf7758dadf2bd9d0841328e13c75e252855f5a2b87c2c78c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "60773902191533aaa8059d66fab175848ab959b357d686dab1dd1e1ea234884a", "7d09831c178b74c57a387f1e29480e1645a3d07b4b087010067939e04a6bead9" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "14899bc6ff5e72338f3c9847fa6531c4337fde3fcf1c8c32f768fba3a402a964"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0083b1b3da8c421eba1274359f46a74811a92640d0ee2a40c83e9ba9cc72bcfea4", "6c0ddb304b86ac3579dede10dea184a0385f9c3ce9e14466826bf44ab93d1ef7" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "72655c5e4f1cefca22f413a612e5bfdd7ba9ae71053f68b0c74d9a73590013c3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5bf5100f5acd4bdbe472465365fe8a812b60dea8e7ad6559f44a52c779768e0e", "5603625f61bd051b8ff077aa69ce2a884222612b71069ac55e4f4ec84228a1a7" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a2030dbf01d8c9de2900dc3845fda4e4c6bc049c4cd5717a9c629b9ed29d1859"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1fe51c4f385ec8c8120952c19e0f42a184390747b347d733120d0ea9a15b23fc", "008a225a691efc213dbb467d4ec8d2ec6b10c2253ceb5175cc868c3ca2132dea1f" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a1db7293b6f01594b808718e61a4d642dff4fee2fb471167ef7ab42959a473e7"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3b389389a1ba1ce02aab1fd3663232414a5ed4c3b9603fb908725789acdedad5", "62b520aa89b6d426b6c9f564ceda0854bd18fae09415bb4a25e6a7d033afaa71" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "99bb8d4bcbf1816d31aad88c25c61f1433b08322412c7bd84ed759d01c009127"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "72e15babc57a00c4e514ea1963dba385c875cf20fc50b5d9d5fdc03bad104e49", "5019c868931ad8225a5341a0360ddbc380d4e610d81577b24f2f77bf6e8480d2" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "41cee82a6957ef02ab3aa07a3315accc0d0d66c2081d530246d6e681873c90d1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "08d757fc7cca95f3a113d787138f13436abf981f85d7569559fc3e1f21c6cb62", "0f2e63d47486bab267d3bca912a47dd9df40a7572e0ccb31841085e8e8c9dc9a" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "746d61572ecae774691e7809121986d9b93279b00934ff1def1f4798da89ad4c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2fb18733a9327902afc952611773661d2de4280c226f6d4df6431623a211ad4b", "009fec8ae43c8703f70ea2e87ba5d560d9a552afa7f078d4c468919a40575917f5" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "281b26a0908968099f8e1f610f4f358318baa21107b791ef6f24cb244677a64b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "54b4d05112fe86d5ad3b0f15d686a61fc3c2aec134fd0659809397091fed3c87", "0086bd94ade4c9e2658da6fbf7a72cd71f4c3052452f2f0c62d4b27a46115d49" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "46a78fe7c149c67d7eeeb1b5be57b3a1082651c278ebc4a50abeb4570f858f1b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2517e4e13313bd19fb2afa90c840c62118bcdc63e9dfe0d8f658c2f7ba919b52", "05b688fd1a648d5ccc43d1ad188ae75e889e75da84ca15d2e4ea45d1e904d038" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "14fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b55"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "492669178a5c35d6c4618aed32dcd58142247a6e3ea43f39ca9aa1b6dd9d8c86", "7b953440076a2f28bf6cbd69343f30be80bc37868a59d02713d88f88d5d603ef" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "8e305a1cf885ccc330ad0f1b5834a6a783f1948a5d5087d42bb5d47af8243535"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7392ca7c91b33e8628de655d15855ed922d91ee74a7082a5bed82ff6c3237f80", "17ce47579b7bcb5ebba5309a80f9aeda79c21b182f7f9d086e566ea3ea1f0653" ); + { + // point duplication during verification + auto m = "313233343030"_hex; + bn_t sig_r = "074c035603e1eb49ab5382819bf82af82929b500c6e78841c1b2c3ff54a615dd"; + bn_t sig_s = "950f12df902702c52703a52023e3e4d15273369aa38828d72f333c220c16be7b"; + auto r = true; // result = valid - flags: ['PointDuplication'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7392ca7c91b33e8628de655d15855ed922d91ee74a7082a5bed82ff6c3237f80", "00922d10840672de5d82c0d9f61c89de97f479db0ba5a6831fb1bcd979354f4d24" ); + { + // duplication bug + auto m = "313233343030"_hex; + bn_t sig_r = "074c035603e1eb49ab5382819bf82af82929b500c6e78841c1b2c3ff54a615dd"; + bn_t sig_s = "950f12df902702c52703a52023e3e4d15273369aa38828d72f333c220c16be7b"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "330ea7adbc48917a431967580dc3827b160feb627aa441b522fcf360f5b1e09f", "03fe9848347703e4c060456a19a41d9babfcba14ed46ec61306aed5205a3994a" ); + { + // comparison with point at infinity + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "21ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4487"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "42005f92fdf527ad5696e61cc6576d6b930e02a6eadb2bf5dbaa348567c49220", "44b4d482cf64dcb4be0b94fab4c9aadbfc97b66c1d1f33e3e9435fa3bd6d0f30" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e"; + bn_t sig_s = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009b91576b08dc63adc9f8fbe3619ab6232c3721c88448a19b40e73ec88dee3440", "71acefeeeb52b70ee10c59d367d58ac160442b7d6c25afe604fbe9c38c5fa8b2" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e"; + bn_t sig_s = "796a6353bccf0b8675b699d502cbae2c88bb5799818ee4f9f93a0a5d477cd02e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3d0e7513d820e886c4bef479669c4b75c1472a66dbd238c8f645229b34c26196", "009d16487634de9cddb7c371ef8fe30f75e37120e16449f939c16b76d5e61e569a" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e"; + bn_t sig_s = "87fc46494e5887c9cb84d5407e02d78e09c7954fc44e1f2c734b3ecedf6d121f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009254ff5b11d15ee4f1924fb3fe7cb4a2384200897d0ccc8786d9d8090aa92de8", "0d4ddf1ff73da2d2ddefc5bc2cc38be81864cdb6d6f2033cc38d854a506daa78" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e"; + bn_t sig_s = "21ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4488"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2f618d223e384da1b17f8a0d1f8c9c11d284cb4bf699bb24911d159fd54f013b", "3085d7295996afa893dcf254c0740260f88afe62786329704a2eb10548a0e6c1" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e"; + bn_t sig_s = "3090f487e51f9e35c8af70bb9ab7df45037e230a33d2c1fd96e404254fcb8679"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009e94fdd1348123090db23ea5c43811be4d914a17511a30c87394d7d8b889fae2", "5ee81c865fd9ab8ae64859bbe19351582521afd6860dbafc57d7523e4c3a1c2b" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e"; + bn_t sig_s = "77472d9a28b4ece71cf413a68eac0eb423a16fb462b1f48706fed48ca437bd2d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6f50cb633ced6cf3cd331c2acd00284dc92aa32138df5dfe0160be1ab22f4e46", "3b0acf4c4c7fa4832bb153fd86d4fa496595ae6f46c139fa2c8bd631a84763cf" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262"; + bn_t sig_s = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5876c95c7971fbaccc9fa9094c1c86c283f16ab663a205ad119bd30b7b1d3c55", "409911a566c231a9f42aea3c026b2002847cb718af7821075523abd8538eed71" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262"; + bn_t sig_s = "796a6353bccf0b8675b699d502cbae2c88bb5799818ee4f9f93a0a5d477cd02e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0df714940dab1d89db3090e5cf8d8f8a16268259afb115b3326e06c79b75887b", "009f24c7a5f9123cc6522c351ecba8e038e30d05f7a2df914c240762d514a31d" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262"; + bn_t sig_s = "87fc46494e5887c9cb84d5407e02d78e09c7954fc44e1f2c734b3ecedf6d121f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "774818a1b45de6aaa572af3a582b493938139cf992ca6e7e0f9519f8cde80e34", "6de9d55d25e51069afdcec5413a3c0558a7a01c6211a061bc1ebca0b0080482c" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262"; + bn_t sig_s = "21ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4488"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3fcb64a053de3c29a9536e0cc8bedc0f0a8a387cacf614c524bd572b9d51c350", "4961421d773ed341c7e24e0fe99519771c877745db90fcaf58808620cfeedb18" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262"; + bn_t sig_s = "3090f487e51f9e35c8af70bb9ab7df45037e230a33d2c1fd96e404254fcb8679"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3135f9b02a2013363db7540431a235ed38f237a3f040b522284e8bb35d6b0207", "2f5f1339b64e3700b7c5a9280f9c03821a82cb62b4784a31b47a5a6ecf5411fd" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262"; + bn_t sig_s = "77472d9a28b4ece71cf413a68eac0eb423a16fb462b1f48706fed48ca437bd2d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262", "547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "5731b7c4bd04cb9efb836935ff2e547bf2909f86824af4d8df78acf76d7b3d4e"; + bn_t sig_s = "18487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "52c9a016e4e9de1d42e2a15a9e5538f599a8db1d3316b21eb0a5618b29cd1959"; + sig_s = "18487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262", "557c5fa5de13e4bea66dc47689226fa8abc4b110a73891d3c3f5f355f069e9e0" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "5731b7c4bd04cb9efb836935ff2e547bf2909f86824af4d8df78acf76d7b3d4e"; + bn_t sig_s = "18487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "52c9a016e4e9de1d42e2a15a9e5538f599a8db1d3316b21eb0a5618b29cd1959"; + sig_s = "18487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a9fb57db62501389594f0ee9fc1652fa83377fa302e19cef64252fc0b147f774", "009507acf5b04339ed102b9ca60db98c165b94ebe855d2202e46dce15ba1e028be" ); + { + // x-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "9e8d7ee48694337a6410bc221ccb43af751965345a8576c718c7967d3f7016fe"; + bn_t sig_s = "2ad44b1702a0cc8a4f8c226b2bba3d23f11c5d8c1186386318149fb9d39de90a"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "6ca04cea3f989c10224fe0edf37c5c9b94b1c5c382e4c745a1b256e71d2509d1"; + sig_s = "2a3fb7073c9ec8c2c7d17bcddc73b7d8f08e999962a572683ec993512d3ae8d6"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "3d8259b2334c6b0976d00cd89f051d3e12fbd211ee58517b96176c5bfe6b38ef"; + sig_s = "9992d6e8fe401d1d9b2cca4243ad7e5998ac0545adfb5da1bebcccf5825b7915"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "351a45fb920f2c9f1b178438fa3bf272ff9328b881c477a1f56a8c0e88465276", "1270f806fe40ad97ebf76c6825384b780ae6afccc792b05f2fb3eb7b7fffffff" ); + { + // y-coordinate of the public key has many trailing 1's + auto m = "4d657373616765"_hex; + bn_t sig_r = "52b2b92c9e9c3e48db672c0115530c3608d54a1c4ff8dd00a8d064650f3446c3"; + bn_t sig_s = "8aa15d2fd366a3c723a7b8cec0443f5d260b3069beba20f3ad6ef4aa9010492b"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "447d6115695da4085fe718c84dd096c9137a725e69940e79e923f52b74385b8a"; + sig_s = "68c655e01c00d9c77c88eb226bf5d08db20ec62155f700cc12df819f8829f50c"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "92d7b7fd656dec65d658addf4e2cb82d7b5b931e5280ae411fd05d4c00eb16ae"; + sig_s = "25257e0b8c6033ff13598290157b8e1cdfc4737d003960efd64ab0d404cba537"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0129b2146e36fc055545bf8f2cc70f8e73e8b25e539365ad7577cc3535", "4a2b8c0319bc4ccd3e60da119477c23faf8fc2dcefc42d3af75827aeb42f6f0f" ); + { + // x-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "a661e42044c25fbe0500cfff430852ba933e8b0549c7b60baef7f78140715ff4"; + bn_t sig_s = "888953259b2b38bfda78a60fac8eb6d32f70d123e784f99c83f447ab7b6fc417"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "4e2eb5bad00a6df1365d3d3a6c229c129a2555f940f5defacecb500e591177dc"; + sig_s = "74933582e1811b7c19f42dec068c17f6ec8c209638031c1e908d259bd98d511c"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "647531b2bcd13b46662f8ae3b59529a4987473d3caadb1162dc662718d7b4d81"; + sig_s = "0360c5348fd41f3aea94021ab2e88b9c97337a3029ce80c026078adebf50d92e"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "680becabe7d7df4fadfe5ae01fba5ea51b76759606a2e30612e667419b885d05", "08541dcb0723785c3c766581a7514a1ff42e4437d63f878271cb860f00000000" ); + { + // y-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "6b9d743cff6746170c19b10f9754bc6f55bab0c1747b59725278e2fc0432ee14"; + bn_t sig_s = "71c20915b40dcb2d46bc6a8cee777f54535b4d6a2cad53e5cf974e75b643a98b"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "63063dfb0b4b62ff62f80f533116714cb08656071fcbf192a9aaf1c77cf2d512"; + sig_s = "6af7e5ec881834476a7cb89b2f02f4bace4c1a54202099ca8d54f708203baf5f"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "a052d9daab043b0bdf274c65eebda9e9605aa9546eee9be3d5072e86e24c2d42"; + sig_s = "34336e73ca99efcab84916b665c8dd61f6f40e8821fc9d50e70bb7c8d0d18ba3"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee9061", "01469fb456ca6a1720ca8db25d567e121cf921ce13e34000f8c12f5272" ); + { + // y-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "9703683ef0b9774b675bddeebef0210563da0e1ed3bda0d3b6c061f87cba5bfa"; + bn_t sig_s = "638b0e61111aa6f5c47b632da8d4d2429c6255fbc042ef1c8a113df8be48e744"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "722c211d9bd809105cf762b3d44e6b7c69fed153c25767f1688c536b4e97c7a5"; + sig_s = "31201ff894b7b6d7c3afd438e4916bbf7c0b6153d3653310681a28ecde6362cc"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "7364913ccb333a27beca4112cf988a504017161ccff2f67e2b8119eeb7971f24"; + sig_s = "47970ab7bff28f758981853ca85c69f5b4c95e6f759149d505dc5b1eb82834ff"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee9061", "00a9fb57da5b4ef56573fbf36fd2f5db1517bde406dc0452143cd347245e3f0105" ); + { + // y-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "72df73fa6f930da1bbe3701036770cefccffa24e3dd74450daf080296eea6f04"; + bn_t sig_s = "1ccd18e0dd6680349122ef2163810b46eb73a9fbcc9ae82369f0e112577b7e5c"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "855818b2611728024784b2c13cac726e8a7a52cc668565c36e0dc1e72e763bb5"; + sig_s = "9fa291faf3cdefee34460261232f0c078e59be9a1f889d3b107ebdc4d399c791"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "8312ba6067b4b3e191d0712beead0d93068850abefeaff480178be4b964cc165"; + sig_s = "7be43ad1db8369f7e1073e3db0a875c5133e1c35476f9ec7a5953b2cddd3184c"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0081528b7adbbebf1b6b3c7fa1d61284b07759b9a98d31a5702707b018fdecff11", "75bbfccb545381bf8601031731841829401b08dcdc68cc34e06a64e412038512" ); + { + // x-coordinate of the public key has many trailing 1's on brainpoolP256t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "51aa4ecb988af43c944de217ce327ad39f4d1bec88c3e5cc6466e3ae876b8f87"; + bn_t sig_s = "a94ba3ab937fc760420aa25df58bacc6dba958a03dec2acfbe5d7ee5b67321d6"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "7c0dbc412118c58c4650ab5bdd7d9ab06eab42409bdf645b7615d3b22ebfa10d"; + sig_s = "59184531bcc146bdfda20d482246fdb5b1e20fd356e690152f2bc57f5d3e9f8c"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "45be75cb7281bdb08dc914d86a5b32f441e68573da8788c389ae5274490c6510"; + sig_s = "4ab9dba3758ffd45a35b4189c9126e75a1cf0093f7e75b10f2d91b7322332716"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e", "16ea8e03c20977f20aed58106b6d9d1085b4475f75b5469c5f426cb27ec6d872" ); + { + // y-coordinate of the public key is small on brainpoolP256t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "1a54307f9af26d77b75806e8e3fdc2fb3d43984e2e96f2ea457cfb28efc4f3f2"; + bn_t sig_s = "74b9b021a3d96a84e6dec8e99284c60c388da03869f3acc355ca0c28c27e3894"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "10ad224012fa969d7b12664ab20f8c614e7060f2dc5a52f8e90c28e63a98f03f"; + sig_s = "5b1318ee76c065f5638acfef237eb5da24b9cbf260e91938bad80eeaed588d12"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "2a9f1cc11d0d582eeacfca0ca75b2dc24dbb5586ed0328344971cec278fc26df"; + sig_s = "4a42e78efc78c8faf4100a5ad51044d060e12030e47832a05cfd2fefd25612b5"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e", "009310c9d7dfe531ca3378b2803215f061e887aec45f70d98bc0d0db6aa0a77b05" ); + { + // y-coordinate of the public key is large on brainpoolP256t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "743a8596b775047757f24fb9c7f99ba236c57e1ddead441cdad18b3780999b35"; + bn_t sig_s = "515b6ba67b870159cf45d1ca0ad2f13295d08392a1760b6ee0a9a91a31049f75"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "4591277f05c6f10be0b5c530aeadc8f7a623d70f5de97572297840160e07b9ae"; + sig_s = "0d8c543a4d4372f1c2484f9a3a9899630ef474b1ee6038be93e1e24cb745a779"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "61fbf6b91439212c0f8d0aa8741a9b71365d6f7cff93ad77732e3e06022916c4"; + sig_s = "43976a3e0c7ece5e327a09e2b9ee6b5b6509e53fff840a02477fbdf0c0c27a10"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6d499b077ab6d77b244320a2cacab91a764595dd67a7a8dfcf84da7d38b2d8f4", "5994c07b833ff4909c1a92cc9f24dea88be8603b407b00d228faf2158db2354f" ); + { + // y-coordinate of the public key has many trailing 1's on brainpoolP256t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "9fb9da3ab3424c2ced23d5d0050d425f86f88a3fb605e58da2438d3764ce72a6"; + bn_t sig_s = "11864a598557fffd2c922b3be0969fab1f27bb49a247e9417224c21921f485e8"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "763433b92115c225cbf24a6cc57fe02d9c89e14e6ace84ce4afbad1f2a7f2996"; + sig_s = "070dd1cca68fcb52899e422afad5004131865543ee6c142524f3582a53304140"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "9d7918344d1c78b4090a91f8dd7b4bc9a90b28c1c1ce38ca3ee4a2965b21837e"; + sig_s = "46ab957a8d23b17959c43ee3c34bc043a36b7276d9eb4fb32cc00f0b4ee799ce"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "08c2f95ffedde1d55e3f2c9dcf5884347f6904c6492273ad760eb7b9b35f036b", "2bcf7a048caa2c726ae8808dc95312eb2350275a8f4fbeea7c0f32f3839c7b93" ); + { + // x-coordinate of the public key is large on brainpoolP256t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "1f9019731f574f8a5e842b6847d8dee824d5ad54462f244f7f791373f872c93b"; + bn_t sig_s = "0a42f9b0e189278f1aadf579a55d3d5e8ae85615dfd67c89ffe866020fa1514b"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "8834acd9868e5f62f75d8138dc4a0ce7c33a10521909b79e49ef95c8e9212ee7"; + sig_s = "1ba78de4947212c87f0b8cca74189d7855fdf38887b6d40a2244af0f5babcef3"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "819979e8dc2f74cb11a9444480ea072402ee4d8618d81d38335a6752e7094eeb"; + sig_s = "59a6994a157bd8d18856ee4aa878d03524d37db6f3a8d98c82dd6a8dbdd93638"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_256( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } // End of Google's Wycheproof tests ecdsa_brainpoolP256r1_sha3_256_test + + // Test vectors from Google's Wycheproof RSA signature verification tests. + // Generated from: 'ecdsa_brainpoolP256r1_sha256_p1363_test.json' + // URL: 'https://raw.githubusercontent.com/google/wycheproof/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_brainpoolP256r1_sha256_p1363_test.json' + // Note: + // Test vectors with flag(s) 'BER', 'BerEncodedSignature', 'SignatureSize', 'MissingZero', 'InvalidEncoding' were not included. + // All test(s) with BER/DER decoding related errors were not included because they're not part of this test scope. + // + // Algorithm: ECDSA + // GeneratorVersion: 0.9rc5 + // Header: Test vectors of type EcdsaVerify are meant for the verification of IEEE P1363 encoded ECDSA signatures. + // Notes: ArithmeticError - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.', 'cves': ['CVE-2017-18146']} + // EdgeCasePublicKey - {'bugType': 'EDGE_CASE', 'description': 'The test vector uses a special case public key. '} + // EdgeCaseShamirMultiplication - {'bugType': 'EDGE_CASE', 'description': "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used."} + // GroupIsomorphism - {'bugType': 'EDGE_CASE', 'description': 'Some EC groups have isomorphic groups that allow an efficient implementation. This is a test vector that contains values that are edge cases on an isomorphic group.'} + // IntegerOverflow - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449', 'CVE-2021-43572', 'CVE-2022-24884']} + // ModifiedInteger - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModularInverse - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where computing the modular inverse of s hits an edge case.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['CVE-2019-0865']} + // PointDuplication - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.', 'cves': ['2020-12607', 'CVE-2015-2730']} + // RangeCheck - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // SignatureSize - {'bugType': 'LEGACY', 'description': 'This test vector contains valid values for r and s. But the values are encoded using a smaller number of bytes. The size of an IEEE P1363 encoded signature should always be twice the number of bytes of the size of the order. Some libraries accept signatures with less bytes. To our knowledge no standard (i.e., IEEE P1363 or RFC 7515) requires any explicit checks of the signature size during signature verification.'} + // SmallRandS - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['2020-13895']} + // SpecialCaseHash - {'bugType': 'EDGE_CASE', 'description': 'The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits.'} + // ValidSignature - {'bugType': 'BASIC', 'description': 'The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported.'} + { + auto pubkey = curve.make_point( "019a2d9637743a63ddaefdbca0ee229a163b809b9b145e5313bbeb8defeab9d6", "548caf89bf5ba49499404145651234336401b9b2843a579ed152e090f11b9e59" ); + { + // signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f"; + bn_t sig_s = "426e857aad3ff7aa96e4d200c03b45f1846a36d089ee3917768ca1a0d6d4da6e"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + n + m = "313233343030"_hex; + sig_r = "b45ae44c5c1bb1ff143702d28ee43a86a590e44bcafda560b652e5bfdde567c6"; + sig_s = "678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 256 * n + m = "313233343030"_hex; + sig_r = "aa05b76812a8d6c4813bdb88df74ee1ea152d20d5d7742f5f9444359d48ef3b81f"; + sig_s = "00678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by n - r + m = "313233343030"_hex; + sig_r = "9f9bcb6ae7c1a1796895124eac22e05c72e210fb9fc5a88e69e9374550ab4588"; + sig_s = "678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**256 + m = "313233343030"_hex; + sig_r = "010a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f"; + sig_s = "00678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**320 + m = "313233343030"_hex; + sig_r = "0100000000000000000a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f"; + sig_s = "000000000000000000678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + n + m = "313233343030"_hex; + sig_r = "0111882a3c969d5bcde5e743207acbd4f19408be76e0d514d7a9af7b6457bbd2e0"; + sig_s = "00678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 256 * n + m = "313233343030"_hex; + sig_r = "aa62e4ae02e3586e500d8bc92d60d5b90c4149e7888d1a6570379fef7908ca2339"; + sig_s = "00678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**256 + m = "313233343030"_hex; + sig_r = "01678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39"; + sig_s = "00678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**320 + m = "313233343030"_hex; + sig_r = "010000000000000000678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39"; + sig_s = "000000000000000000678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=0 + m = "313233343030"_hex; + sig_r = "0000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=1 + m = "313233343030"_hex; + sig_r = "0000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + m = "313233343030"_hex; + sig_r = "0000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n - 1 + m = "313233343030"_hex; + sig_r = "0000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + 1 + m = "313233343030"_hex; + sig_r = "0000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + m = "313233343030"_hex; + sig_r = "0000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + 1 + m = "313233343030"_hex; + sig_r = "0000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=0 + m = "313233343030"_hex; + sig_r = "0000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=1 + m = "313233343030"_hex; + sig_r = "0000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + m = "313233343030"_hex; + sig_r = "0000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "0000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "0000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + m = "313233343030"_hex; + sig_r = "0000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "0000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=0 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n - 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=0 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=0 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=0 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n - 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=0 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Edge case for Shamir multiplication + m = "3638393434"_hex; + sig_r = "0c939a92486c6d0d619510b4a94162b9221be2eb15faf878bff75e6cdf4e3707"; + sig_s = "3977619b43e6b4ea1870d861206483b306560e3c4a3ef82b11a802ff8892dc1d"; + r = true; // result = valid - flags: ['EdgeCaseShamirMultiplication'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343236343739373234"_hex; + sig_r = "5583dd480964bd2332885fbb50b7475ebd428399e7166fd9bd529611534b9f34"; + sig_s = "0ed035a02c4b665cacb70de8e822facd71645a15f93fee661324f850b847b51d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37313338363834383931"_hex; + sig_r = "300e26027ce7d3f21c8571dc690b1bb990e8fc49ad3e95374bd543b2e22badc6"; + sig_s = "22bc8f2445cd4956bc0db553966a0718aeb5ead65bc66ddb21fea0e571a87ee1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130333539333331363638"_hex; + sig_r = "2907cb01a82a88046640a523f9b9854d95b7ec2ddd67c20723d05829e8438a77"; + sig_s = "38ca08e58623560f724a3e3f9ba0e9ec7974976dd34e6940c0fe6168d540e39b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33393439343031323135"_hex; + sig_r = "0c35840f7b7319f19fd72f29fea4cf937aba2c3fe1dc01aec63c21094c5d3548"; + sig_s = "7bf699868c2b694547aebe9b98c01c5efbe982a84150390894563d4e2cb240b6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333434323933303739"_hex; + sig_r = "4272ff20b8c3d19e8c84141fbe4d1681fa71b51f6c10360db7affac989274d23"; + sig_s = "6772ff768ee6a3edaf0dbdd7b5c6962c2acc8cb14e6347631e25940189729468"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33373036323131373132"_hex; + sig_r = "0a1e072c48a62a583bf94fe63809e95f3202176bfa6d28de8f75a4a3256ca21f"; + sig_s = "9514a6e5b235c29152561cc9492cf47477a0fe23f56040d7206bfb4eb3e18798"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333433363838373132"_hex; + sig_r = "02bcbd38a3e3113445ad2ee42faeaee9fed00277e0b15521329f4c27c963af01"; + sig_s = "06cf399deb1f6fd692075d236272b99c3336aea2cfac34d904646cc1daf54de6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333531353330333730"_hex; + sig_r = "62f3a6a9c9f457211b46b1ca3a782f11f44cb9360bb30702e67136036ccba39e"; + sig_s = "22f02e5f647ceb3d0c49f2e7ac9bbb31b7e3ae29a5ed670c96cad6d0f45df389"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36353533323033313236"_hex; + sig_r = "23d679aed9066b611820a8e02b3daa922b10d5596c8ceb7bd4e4fcd6e5e1dca7"; + sig_s = "9626e1d2205d60e39b633852f623f0f8b35e44797e08c6fad196c33be69b5ac7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353634333436363033"_hex; + sig_r = "0e4c5c077f14a4db197654f8081f10ac2229e6f2084405aea525679e592539a9"; + sig_s = "1355d43667402b9f01959140c414f18d908e2559e57adf35ce794dbc8e222006"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34343239353339313137"_hex; + sig_r = "3246b33954cf1dd4a216218d49b14e39db82004ba0556fb591357aff76a1ea63"; + sig_s = "5b5fcb726ebf18c9151a26a5b0800cbf95b5edc084b42dc6dc7fbb9a0aed8425"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130393533323631333531"_hex; + sig_r = "361a8def874057c715423843bd7bf0775ba6366fa48ca83e1cdce206bf94c2bf"; + sig_s = "365e97493d3382681f1d94657e9888245c9b0762ee7f4ca02e738afdbba274d6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35393837333530303431"_hex; + sig_r = "2c5f51bc91969fd5b804e751323fc80294b0b5b1e20e195ec9bdc6a7806da13f"; + sig_s = "4c246c949bce43d303201fa0d989e70674766555e8d3a99c26babb658d1f7db8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33343633303036383738"_hex; + sig_r = "a9e3f1e83108be78668d4bac7ffb2918d38100ba01f37de5b923eeca07cc05e3"; + sig_s = "3f0d81bcc08802a435599759f51c89f816742710885b4137758130e8acf707d4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39383137333230323837"_hex; + sig_r = "959e9811bb18b4865fde6d5f9c246d67e48d7a5c7ce46d7afb6f5ec0b26d5060"; + sig_s = "0091a097618f2517ad6dcf49bcc208e94cb81af87f65b7880580f99858a9a915"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323232303431303436"_hex; + sig_r = "4f9231b1cbaea183ed9d8591ae3e9f0439201e1067ff00535a415396b77811d6"; + sig_s = "9851c799a311abaefa08c412f6f679a000a6edaa005d05f550a62ff9a6a1a507"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363636333037313034"_hex; + sig_r = "5479acb76c38d47f21940855f1800978a52fb10b7cc9b07caf88af67f2697143"; + sig_s = "244f3cdd683555b88a45e975073735d38713da4bdea340b5fb87d3c443adb0ee"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303335393531383938"_hex; + sig_r = "14990149d3a8f3c96e9c62952f90ef21cbcc0d03da802f72432a041da54db5be"; + sig_s = "87427b96d28499707a6788705cd8a5ee9fd42e2d1f1273752337efcd06aa88a9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31383436353937313935"_hex; + sig_r = "5bb244b511a9828fbe7a041af341a93b242b513310de9f4bc366e18b93a3ce34"; + sig_s = "978be5d58ce70c92dea75ce2f8e88f093f5e4675e750fd088777a7411526c1f7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33313336303436313839"_hex; + sig_r = "070e64f4d19f9fd9a8d3f0a64f951c41db2f0e13490e7ac0b3f6066bc1e540a7"; + sig_s = "835b25029a2ced8df57b0343a2c718db72c2d31f7ef66b230c97d20281d49a33"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32363633373834323534"_hex; + sig_r = "2b5a6dc14e98d2e6c0b627568a748bda04c09500bc63bd744f5dee967db0f0b1"; + sig_s = "3452b13ef8dc01a0b785fbb4fcd057a5880c418427283abc7aa7fa07d507eed0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363532313030353234"_hex; + sig_r = "1d91bda90d0831be058f610fe3e6451791e09689c52bd466ef74dd85b3cbd121"; + sig_s = "4ba37a9341e5923ea93e357344fe7b73446e207a7e449607b1482c510e93b630"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35373438303831363936"_hex; + sig_r = "6a32e1625c1eb7d40b3145f894c7138d6232a6116d50f1270a0e971e2b7a8e75"; + sig_s = "61b6aae56819272813319f7c214f83ce5fccdb58878d592ab0f4479a52d970e1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36333433393133343638"_hex; + sig_r = "5b7526f09dab248551ed8b1229c2447a4521d2d6e22902acbc176c501f5f5f7e"; + sig_s = "3186552f700d9e6b551c893ed2aed9556b3f0ac2a5e2772f8fb1a184949262cb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353431313033353938"_hex; + sig_r = "30d0ffa9c2be042ccd2c9adbcbbba22cc044d69abf37eff2bcab91d45be9b0bd"; + sig_s = "482dd72aa3b3f3f2e6dd4a075fa962b8f6fc25e9d32d0dccbd80831acf7595e0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130343738353830313238"_hex; + sig_r = "200d3b5f915863ada8c84ef5eb50ecf0ab43e2bac10a4c42cf3719121a8d37cd"; + sig_s = "9d137e11a050bfbba746c19ad5f7195c86f24115d1fadfb19ad2cb5624126cda"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130353336323835353638"_hex; + sig_r = "4ac55470789095e9e250332f3790f865fbcc58934588c774babf22de6a8a6958"; + sig_s = "2cfefb0e2be0542c97eb61914f23fb37b58fb17d0d6b766a8f63c8d0dc79e52b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393533393034313035"_hex; + sig_r = "908c1e6da625879fc116ddb65173b9355fa8eb038063de2cec1934e8fb2bfc27"; + sig_s = "6e084ff7c043edfb161aea2605a111cf43d58388e061e8019e99526376e4c71e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393738383438303339"_hex; + sig_r = "97328e1050fc2d44ec89836a7eaae360d6f9d996855e8b144d0c273c4866d7fe"; + sig_s = "3919d7ced9f3e3284978546394fbb277f84d26598dbe83da4ba7c1de372b3340"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33363130363732343432"_hex; + sig_r = "9881e8f75db8163d2be1fc11491926c4125374440da94750a19ecaf8a83b71fc"; + sig_s = "4a9a191a9da8fa3d5641cbb5a88cac5b3780fbbef8ef1a445782394925efc5b1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303534323430373035"_hex; + sig_r = "70cb8bc7d5c372c73cf36fe69aa1a509fe0cf2be642e085ac979d6eefddaa9e1"; + sig_s = "500402f496dc8d904c709695ff02714e607c4bee9d064cd4654b6c466f4010e8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35313734343438313937"_hex; + sig_r = "39c8f870185f87957e009d01e52fbf6c7ae50d734d39ec4113b37b7bd1b68066"; + sig_s = "73d6da2b777ce0c43d49080857c6ec58546fddf17d2676f10f88ddc900ca1891"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393637353631323531"_hex; + sig_r = "2e95b702ed138f42614f07a1b21548ea1d247a4a7fd765628bab68551129ad38"; + sig_s = "2e9a6af078b51812ed71b0eab65350cd081f7999a24a56e96af9d5c5f6bdaf0f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33343437323533333433"_hex; + sig_r = "5837b687f2128063dc67f512cb6670f122b611257f536d45e3984f5ebbc3cd4d"; + sig_s = "6a6c0c41b9cc37ae02c2218d3b8cd80cd3c4fc25771c0caab3b8ed2c611cf7cb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333638323634333138"_hex; + sig_r = "5a73c75d2b5c48af17b7847244262bb9b2c3f2697a9d8c605758a2d33cccd18f"; + sig_s = "97f12aa04b2582373f9bea646bce1b129030ea5f35c9dc2a149e90aa3b56345c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323631313938363038"_hex; + sig_r = "32b603132a96c5b957b08c88532e49fcb73cd7c5f71a1e6ed14a5cc1776d2da7"; + sig_s = "93be0e4c9844bec9d2b62b424e618a845a98537b2356c1f473bba13b08458eea"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39363738373831303934"_hex; + sig_r = "9b76b7aac0a13bf217f24d335bc04694ecdbd5acfe4ec23c065efeb7936a1c62"; + sig_s = "432cde74fdbb4f5437cdeca53cb7ab79f692694f91ed3735fbc4e08a3f527881"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34393538383233383233"_hex; + sig_r = "8f2565b517f62a3b1e19b0917ab2b223fc8193cc0fdf3ab9692bc42cf40910e8"; + sig_s = "1dccfbed8b90ee5391ea743e35b60ed31d19edfbd94504badca4aa4cf2a7bb31"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383234363337383337"_hex; + sig_r = "31c627fd791f734421e5502618aec447c67029b2794ee12b08eeb6c59aedb3ee"; + sig_s = "08f91f3789bd01e5b9d93941cf46698d5e1a2708e70ee9a226e81e7f4a414e9e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131303230383333373736"_hex; + sig_r = "6005293132d7eac0e72b9b218d03212675d5aae0da97bccdf1a5ff784de5cde6"; + sig_s = "13a155c74a9ab27cbdf6cae18d4d1f18b8212d8018551e2baec91979ea5b4c49"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313333383731363438"_hex; + sig_r = "3a6dab51ed9027f5cae192e0586a32c8ef2276ceba3b796059dca135e361795d"; + sig_s = "4bf16b0e62e32a945088f55fb428159af78296dd4f8dfd9713bdb2f677cbcd12"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333232313434313632"_hex; + sig_r = "961de77ed9cf6170d925c233bd3e20eef9bbe6d6c8dac28acde46011f99f8bff"; + sig_s = "977de04779ffe3afe708d81ce8a1ed6c7d2a9a25ef9959c7a951a0555a6d3792"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130363836363535353436"_hex; + sig_r = "778581b3d4030031141e555fa1dbebaef0eed019e0b897b5076544ab80498b9c"; + sig_s = "7132c8d109c1f1a6c10f81e9fc11adea4b9cff599208b6d9cb4e4b27f1972846"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3632313535323436"_hex; + sig_r = "9eeac8f07c40cc8ee3cba107af49d526731d8b7c70130cbb6efa3c61505d6337"; + sig_s = "62db38226b71f64a5b598ab7c4e3f89880fe0d0749dfd5c7a38a3eec3c793876"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37303330383138373734"_hex; + sig_r = "673d41c17e727f0125175b2a9f0561ecc5cf9cd49035828ba7c47545a0b338f4"; + sig_s = "00459ef978e7b03468c80fd4533a334755a0826bf5a30df919129e352d347562"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35393234353233373434"_hex; + sig_r = "8a97f19b0809042cdafe9c32bc0b0b01218a49867a6882d64d5b7bc255eb773d"; + sig_s = "904662b5dfd8cd94eaefd57e5d4f2d14268e1b8c4fbd4ac4e5080f79d53fd24c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343935353836363231"_hex; + sig_r = "287a88bdb561fa2785ca258663f86d3b07aac949f647ee572621b0b70eb3e9ca"; + sig_s = "4a6d7916418443deb4c43f5c69f6490952cf53ee69eec1ac69e144b8f9e26307"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34303035333134343036"_hex; + sig_r = "250db6a8b3813b13b6fb7bf19896f13a502be453c204e6a813a164dbdd9c66ca"; + sig_s = "1d96683ac97f5874ac9538b57bf1eaa50a11a33e9abb825d6b7a7546a698606e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303936343537353132"_hex; + sig_r = "a29b2c4be50f1724a1ce9acd4c5129b391b4b9009abb582397a522c771d54abd"; + sig_s = "0ec1d7aedbfe4e743d7627ea8d207c2460ae4c9f2134b0f84a0255205ac23482"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373834303235363230"_hex; + sig_r = "149f0508aef9fbccf32e1bd3199d630240bb6577593e87566b0a14a5b6f20999"; + sig_s = "5d37b409c01fb9b6cf4ea14432c35631694402d2875a301d761d81811469628d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32363138373837343138"_hex; + sig_r = "6c9b110d8e4453d82ec51a5a691b152edf9fb1a9947bd001beb24d56f3bf27af"; + sig_s = "2a80bbd2f827cc23157526df6ea4e0e324b765a50be77f7e9667558a165eb692"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363432363235323632"_hex; + sig_r = "9086a5c93823b1df21f63951ed6e707fba0d899eef711100e32f2d6017da6590"; + sig_s = "1f831ed30c129dab4266272e01283210ed823c55907ac5ecda85d70bd80279c3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36383234313839343336"_hex; + sig_r = "2af63547dc5ffc8ba4d168d368d9228132a0efa20e3255c332219feced800395"; + sig_s = "3642f53ce9521fab754be7711f00af7888222bf2bbf1ed8995e03b55c98a6022"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343834323435343235"_hex; + sig_r = "91e9acef9bc28c910891b80320af3603c4306174f17e97059267fc817814ff1f"; + sig_s = "7a9c833beb73bdd62df64952b4c848d2180fae385f8084f1fc5b1b1c64575007"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4b402a9ae18fc1a87cda337483900499fe729e471607671651a263fbf0d93f78", "1ef9b0f98fb73bcb605a7823a427ea5f0d98788c7dae42a04536202022c021cd" ); + { + // k*G has a large x-coordinate + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000e2027b801fc479308ff5399a8825fccf"; + bn_t sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r too large + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376"; + sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "40a2df0f17c7873459d5e9ac11fff84deb5f40ff9a52df8745bb4770f6dbf581", "0099c2bf4920e9c8f758c2de69e42c1cb77c58425a9dafa41d7b0873efa894cedc" ); + { + // r,s are large + auto m = "313233343030"_hex; + bn_t sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a3"; + bn_t sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009de669f9444da82e429f842f31c64418d4d7b05e93f41daddd09fc181ac227c6", "1c86210e8291fc5ae30c72e2013ec22bb97d88bf376d4a85dd1bb71b22526d1f" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bn_t sig_s = "4ab8de0a51481bc45794b924518f2dd6ac5cce31f3228d624c5a896f79a2d6a2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "30345b6451377b78a54ac6e110f50c7de71c2c760278373607722c53f5867907", "59acc40014c93d4ad44778bc1a44ebaebe1a97c88ad11c1025057b6bc4377f2d" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bn_t sig_s = "8b1b5f89f5bb74caa42d36e601a9f3c20b4e6c91ceb98a52fbfa9f81781b8a17"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "149d893f1306fb253bbf3a8691aba8a50002b0a27693aa97435a7b5cb33a55ee", "24b075fcdbc1a739f2f492dbe4799474ee3ad3804447e7d584e3430ce15a968a" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000001"; + bn_t sig_s = "0000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "156e626649ce8236982201a24935fb3d36b0d73041b6fdca97990a8d152efb8b", "326f4b20a0cc4623b02a6bb17114901a01de0df1716d669d253de440cc8f9cdd" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000001"; + bn_t sig_s = "0000000000000000000000000000000000000000000000000000000000000002"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "10cc7992ede28c7b4dda5c35cbd71174918e83adab0342cc3d556a413b4ce93b", "3f9c3b38aef0a0e687d7ee6afde70d47d6900ff0ce62156e8645b8103fc66cad" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000001"; + bn_t sig_s = "0000000000000000000000000000000000000000000000000000000000000003"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "77b640fccd8eed0fd78ab7c8fa397e14383cc025f93c6f0e6bab22eca761e6b5", "7dfb114ce223f2af64e7fee5f85b70b14fb5b5c1f3834ded78a4628f3584034b" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "0000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008bef8f57d0dbdbb0af035d2e4225f10a61fb97c763f9a4a8582590f495d1e94a", "4c34e7550bfa94480c4919e001cfa53f08a1d2f501dfdd5f2da16ba73f587c25" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "0000000000000000000000000000000000000000000000000000000000000002"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6db366ee784b945641ae1fb3c7774b81de9fccb6ae3857ffa9df210dc31b78ac", "77f473f0c55c1c5476d72d11dcd872e0993fef11a4a0078d6064001569d62239" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "0000000000000000000000000000000000000000000000000000000000000003"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r is larger than n + m = "313233343030"_hex; + sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a9"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000003"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3a7953621ee48821323f3e15918e3d9bcddb5517557f61cf2ef25ab5235e82b2", "5d135c315cd4bd43ae7b97d314dc8aaf76ac84e88622f1bbbf5b375e494d01b4" ); + { + // s is larger than n + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82975b2d2e"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "113489555bdc112352b08b7ffebcf05090f94da62367646b2e03a3478863914b", "4b4a0a435462a122f6d9ac801319bbc6d2c59228861a3414b500e5cf5943c964" ); + { + // small r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000101"; + bn_t sig_s = "2827370584fdeb9f5d5a9fb9579a09390efb6f9d99b64fc188d8bce05c2d4eed"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "34224746efa8c5d4f4c6b82de4d76d3e7150c1b69e23339f098ff769bcac94bf", "0094618e3624a57d48d19e72867dbc191a0fd05cf6f4b5ec497b797626a57baa22" ); + { + // smallish r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000002d9b4d347952ce"; + bn_t sig_s = "4937a087731df4febc2c3a81ddfbab5dc3af950817f41b590d156ed409ad2869"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6fb0cdf3b08dc5d8b7e5259c7d1bbd31a2235345b7b445631e894b567d23c079", "53243207df5c446011c1cfedde6e5351958affa8f274fe5af435759de87db343" ); + { + // 100-bit r and small s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000001033e67e37b32b445580bf4efb"; + bn_t sig_s = "91827d03bb6dac31940ba56ed88489048ff173f0bf20cab20dcc086fca37f285"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0b8d3bef12ebab43f2f6f6618f0843d5f45d97874f26f9a36b788cb7a69ecf5f", "00855588c99b3839ca9361ddc77645f7592ad371438ee3e186c74081c481dd5295" ); + { + // small r and 100 bit s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000101"; + bn_t sig_s = "3eb35fe7e8331f71e4c63b45f349a99d47a5e781798e579f2386195d3827bb15"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6d24985342a45a55fd99e47521fe3e991b8a1d376fa73899d3bacc067c12ee0d", "6542f148599fccb99b1ba28d3805814292a99bffe371df277b09e8ada1253dcd" ); + { + // 100-bit r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000062522bbd3ecbe7c39e93e7c25"; + bn_t sig_s = "3eb35fe7e8331f71e4c63b45f349a99d47a5e781798e579f2386195d3827bb15"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4125e46820f41206b670882a9d8d51b6bac39091150c9cb33b6d009e0cff5223", "65749240622b40d70a63407952c1b8761c9f8e85aba6f03bbc7219e24e6fb276" ); + { + // r and s^-1 are close to n + auto m = "313233343030"_hex; + bn_t sig_r = "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e8297485628"; + bn_t sig_s = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "43e30112f72779d43e5cfe557a2be4297d757a15f2c3be2dad2bfc897728b5d9", "0db20b59c22bc83b6727eabd87a06fcab44fe828f3963d8b72a21d8425d308c5" ); + { + // r and s are 64-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000009c44febf31c3594f"; + bn_t sig_s = "000000000000000000000000000000000000000000000000839ed28247c2b06b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "161aee41ce7304df1837d010f42acb64f9a46a8f20aa66b9f7a1aded99f10c5d", "222dea3683837dba9f44a9fc7fdb6bc731e4b7296ab3ef5d3c7c5d3bb7446e85" ); + { + // r and s are 100-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000009df8b682430beef6f5fd7c7cd"; + bn_t sig_s = "000000000000000000000000000000000000000fd0a62e13778f4222a0d61c8a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2a5d4cb811e3e22db26027f53ef495d270f5cdbd939f919f10fff6096c9f6125", "008ad926a15fbbed68201d6fcddf09c79d2944c3cb3033f9abaa3e6750279d354b" ); + { + // r and s are 128-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000008a598e563a89f526c32ebec8de26367b"; + bn_t sig_s = "0000000000000000000000000000000084f633e2042630e99dd0f1e16f7a04bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0790b8083bc30fbd4012743417f221b32ff620b276b77e298d8f20f9c9bf035d", "33413b1798fd8c22c46b23d0fde70492c582dc9d1dd4a836f08d815ec54c54b1" ); + { + // r and s are 160-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000aa6eeb5823f7fa31b466bb473797f0d0314c0be0"; + bn_t sig_s = "000000000000000000000000e2977c479e6d25703cebbc6bd561938cc9d1bfb9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0091ba1706a19ce58faca26366dced293399450efa488f2c4baa95693b974d075d", "5e8401565a37b05b9351e408af542bf0f7957e5eed182afeabeafa2bf7bbbb47" ); + { + // s == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "0000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // s == 0 + m = "313233343030"_hex; + sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + sig_s = "0000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0082abe2f6b8150d11478d0014f6bac230f8396fcfea4ac5b6693189ce342cc006", "40252a7f09dc8b0ba0a8b62fcdb00e8ee1bb65c2318a30cd294f856be9cbb639" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "253f2522f5ea35c8d48a5aa79ad3da0af8eeaf1a5e0aeaab295494c94bb615b4"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6dc1877977bdd7a4298ac3509598b772a2a6ba6cc5d57a8269dc62819787cb30", "1ce6111f39c930b0d5c8b51b177109106ea1ab353b60034ea08170db6db48a7e" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "28d6daabb1b474bb9f4520cbaecc882cd23bb1042fa657473fd4078ecc80f7c3"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008518d47b08a0d7d81bdeaac9092248d4cc562e129c9e004af6384a17a8cc8571", "47110a4111943d1065648d047082770366056bf72abe2f41fdc2cced271c6cd4" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "43afa375cba6e7de23eb4f70f36fd9ce3b7237e43ceaec1fc2fda055ca9871f8"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "163c16600e97ab9d6bfc1d5c26b7a4d0024039894449049bf2f275de58c88920", "363198ce524d6c0abea9c577c1fbe84b15ee5d836e7458c1e361233e8bb73ba3" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "4b57b5f040bc7fdd6cef6aee249d68f7ce2bf021fbfcd360783dad600b584064"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a6aaf73ac594c2ffa8cc1eaf1024d8bee42d6c3684654424646e5bfe458da304", "0e60dd5e3ced1d3fdb3fb13503162ceeb0a17ef3b53d3dfe7e95fd056931b3c0" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "21dcd8dd48892812395c8974ecd00c8455842e5181884da6035f353dfcc48d45"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "54ec5794ee0b9ae31f46a1a7515c6e363f310cd1d457fc2734c4086986738e09", "008421f0151e38eb4c4522e2b19ff8ce7735984038b46d4cc8ebcbff12046e1bd9" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "4c89edc4076ae899f22372689f25460a929a44aba87c1e51070212564beb8cc2"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "333a60a99b382db8388eb95e1c67847f2548db83d1eec6e67b1445d4df4ddce0", "009938281530fdb420c72849bb98ffa10f755d1403fa6658c0e982d4d1920c4d22" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "231fa4702f31c86a790dcd5a013a757ad954950b941a7db865106b6de48eaee6"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "183b1e79350ff450b1b727f58276d733b0010793ae3472e47cb566e0c6dfcf88", "2209e1b684d658927217ccd01d568dc6b2f0a4edc0d4b0c4c0fed5d90c021f7e" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "3f9826b90802b2725f4f7be70ded05d887e98ea726b3079c0898f078b81f1e71"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "43b3f86154e15185cc6e12ebc1b3fa5ce417a6d919bc120fd5406c8493b93b79", "00927f0717ae132796a1323250b05e87ebc71ba0dc97ffabe83acb16e422834424" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "4cae4be89cee15d91fd495d8a91dd90ad1160236a74d8bbe0f409545042ea5b9"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0080c6c9bddbb9d6e6a4dc02560985fceb25adbda24439fca562c829b16df20403", "0099e67b5d696de3f1d927023dccb97ea5c237282edeb06dd59e18f4c8eba44047" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "328f4ed5ab79a8a1c901b906a0f55b4bab77401f58db4d555db7997c11163426"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6e54d8370ddb4d70d5d663b3083f0cbc1a30d29ae92a845c678ec99bdebde6d4", "2885d710b3cc0ab3f7c4e770c825a50b945d20906ef9e24038400a41fbf5f44d" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "310c2a34ac6ab050ea873ea26aa298a5782473469033e021f5e1c13ef0630755"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "249a3f311a48b9ef8eb20cdf2376a345434977638130f3a5525f594997acd4dc", "73b3cbf0bcc5c5e90549a02b4c78ee5585333cdd2419034305d3f0e617779ac0" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "241166115f5e25e286b882c3e39558df1d1e6ef90551115118f6251d3a566adc"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009e95cd0da49750be6a69800e80d7304ae5d18b6203bbf9dd28ffaafd292c6ee5", "6c0a500759810462be9e5eee8c2a3e4a25a6f5b813a935cfbdd75cb0869709b4" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "204373ed57d86a4103e275333a16ff216ea450a5ef3c2019e9351a2c57466d6d"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009acafa50929d5ec370f5146373d6eae8c27e6368dc2d61c3d9517f7461c77c15", "008bd7b63d7fad07517593a309e6521300f4537d844b7cfcde2b9cc4951b82aa31" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "1804472a04273f8341952e89785cbc7fe86f74edc780d1e89014dd6d5f6f7f37"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "66575bdbde4ee69150393d008663f6e665182997d0e64608c6c95713943695a1", "2ddee0c32898da02a9feaa261982be986df69d334d94e7a4e3e9c1b8f648efbc" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "3549f9e472cce3d5a153ad22dcf0b11f7ae5090c8ca925c9897e89f3de070855"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "25d17570e4bae1e468e6dd0975b382368061e0c704241c1d18fd5baa8ca8dc13", "5acadcd13992f6665b469c9f9ab7797e3c4b881c6d7f4d2601c96a1536f76d05" ); + { + // point at infinity during verify + auto m = "313233343030"_hex; + bn_t sig_r = "54fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b53"; + bn_t sig_s = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + auto r = false; // result = invalid - flags: ['PointDuplication', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1dc3325ffa55e179e2171a66b2e7534ae12cfc292af2e0fbf1c3fcce5558fc6a", "2420abcdb7df8cf38634648264a681d5ed195bf16a970ffa68ab250b34a93514" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "54fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b53"; + bn_t sig_s = "54fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b53"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3fffa6dbaf667b0a94e5f86b3774b975971a4d2439607def4e5de1d17820a3b2", "1bf36613b50b925264551815c5da783bd158aaa1c6244b40a9fa31a2a433f8e8" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "54fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b53"; + bn_t sig_s = "54fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b54"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008afd47eb0667860bec98d5dcd2f60da9eac1ae99620569892f14e094d635872a", "5e8f0bc67b98a233ade715c04d9daab11a27517a92cf2651c9e5f2fde4e2db98" ); + { + // u1 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0876616636a8dbc82160ac01af2941353ba0eea4a3b8fe31696b47317d4972c9", "23180073061d27984ecf491f394004c3a4846d773f58dc2ab5e43dcbf968d027" ); + { + // u1 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "989c5cc31440c1168f88b32ba6e47900183c0d843f9c41671898030664305d2b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0fabb052217eae8e63fea4eea09953d51862427f341307d819ff6e933bf72ba9", "4b897f2c4a4cf57054c363c720da3d242471cc8e493becb0de022251d2ee4c8c" ); + { + // u2 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "72ebad749b504c874d21bc5e4bba545dd42eb5fbf78af42043f5cef10aeb3ad7", "45227464e1e9cef662f43fc80d4ce7eb7eb615a23699d48e89b278abd46ccc46" ); + { + // u2 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "71523a926bf4712829995c6069025e4bb2d0fc6d23966f4fb5695f01ba3039c5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "744e218a04b31471b05e679c9481446bcd72a4d0fca7a7af1a1fe2f574d9362f", "60c0c52843d8d72cd636153f0f510a09089fc4478372dfc50e5b91d5301ba75e" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "05ca53b2d9e4a2e1e4f47276fcdfb17b26a9cf0a7c9721dad28203d41107fdd4"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7ea53d3c4635a4d5b60d79aac79d974c759263363472146a4605280d935ffc75", "59790403c96459b20477eaa437b3c7decd5e690faa940c0891de0cd07d41813c" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "5448aa82fc57740b2e1ebdf989baa145b018b423b3761feb055959eb6a01f1a1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "750462a163655746af66ba3eb48009a490d970799280586cfe59316365dc4ef0", "00a2f1567257bd9aa1dcca3cd276ffaeb1dd85cea28d888a98642bf09a98f69f11" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "65bfcce69b89eff545fb0a67d2581a5f253484ef538b9b55fa862dfd2d488d52"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "323ae5754b417552cf968f5f3eea7187f7b1726e8c2e510f98d26430ac5849bc", "327101d82adf87c932e8eaa6a57e1d11bd65dc8f404c113f65abaa6eeaf5c7c4" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "7a459e047395d81d3b00f4b8d5ad34442b35dec5e6c1b45a0678e65a1fe9e9e6"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "37a105e3ce3fb636733032d1ca56b4c659b451f64f4ba7378b087987e7a544d2", "782bad9b1654f2770d7a3ee35b672a366f685bc7191889ff2fa5c6b94ebe7ab8" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "3b7739bbe1048b69fd05f9262f628e03b0770e7ecd82337f1482a72db0293232"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "13dd59454f6af3e9db115b7ec8c3a1c8d308fdcb4963c3b8ea1264e4afda652c", "5d260b7fc9bfd200896d229f3c8daab9df2f55aa9ad95d4ea76aed8d74c5494d" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "76ee7377c20916d3fa0bf24c5ec51c0760ee1cfd9b0466fe29054e5b60526464"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2c1dc56459bf09df50fb2d962f5989f3643021c5c360363e10e695a70b5942e8", "6216d3ca0cca31dbd92a4d28bf951437f6f45db41e8e41fdf72414a293f53087" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "4a992824c737b00f02d23d2f2e3decf090b28ffa0e90e6d1e5dd157070719f65"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "137d6fdf836b1824378c08b35fa7ebe4e807d8a20105ce9cb3cd281f0a47c9c3", "07d6475d4958c16d950f0439d3dbf86c2d7e2b12e8b137efc62dd1c723b83a62" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "9c092d165ef1b11a82b59c73aab3496631e3032038feda236db7b0f5a8e0cabb"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "640213be1698b166f0c54e588e1b57a64826bf848adabfef60681d77747d2ca8", "646e45d961419d4ad1338c361228e1c6b6615398582c0e3e97f7ebc85a504423" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a90449e87d9de3ebed92a227735e45325b1d2d774b4876a86d0863349471ac59"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "269154ca58317552c655d2a9b3804dd94c2711145b9cd93c360f2dfe34cc1971", "0098046cc90cc6a8ac48ef7bacc5cb7e57334fa91facbadb48952c9fee543d1bb5" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a4310428c80a06da59719819a0a3dbf6658fab9938ca851cbd9c0aae864058d3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "240e0b64cee2e0b8890c2fa82de5848a5642ef0f7b2414f88f585281df7a1ff5", "3a5990f860da3053f821bea914059ced85c9c2390b0d860532dbccca7ff66692" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a14bda4f5b17b56966f75ede22340338d23ac413fa7ef42f545b08c47dbc59e9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0096f3cb5eb0c33be205ec058a22093d739fe80a7ecc874399c14f7f6c38cfcc51", "47b3eccaecc9add2b1dffc988f13dcab15b7e910d0250e70a1d79b3b931c32ed" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "32dfe6734dc4f7faa2fd8533e92c0d2f929a4277a9c5cdaafd4316fe96a446a9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "103b1bf6343d57260f652d272aaeff6cfa439f1583335eba66fa72d00eff7f85", "20f2bb035bd056c67ca22ca952abb5e1bcb68d67ca81790d24097f13d45209a1" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "6353c7f3e0a4e33ebf7758dadf2bd9d0841328e13c75e252855f5a2b87c2c78c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00959b3bf372301993b37e20b4344f13c06d5c1c53c7737f166efb94832c3b9bbb", "40d35ef46e4cfad475ddd1a1d9609feca7069712d30bdf4638d4c88bc9a12100" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "14899bc6ff5e72338f3c9847fa6531c4337fde3fcf1c8c32f768fba3a402a964"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6e69b17d83894e2e71ffce351b53459c0bb29bec379ff435f23c01a9b37df49e", "3ba1053ad84236d82cf7c762362b37b24e3b0ee1f8ea6c543a2591dcb6681a8f" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "72655c5e4f1cefca22f413a612e5bfdd7ba9ae71053f68b0c74d9a73590013c3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "336fc28e1f250485276747dfc34859b4741667b3ac46a0f6384decc1ac790304", "401206b5508aa06601a2246e7381dfecca6adb2b197ae14549a24c355cd53be1" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a2030dbf01d8c9de2900dc3845fda4e4c6bc049c4cd5717a9c629b9ed29d1859"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00913d9ce35b9c73203578e255d4dd35ff20212d357227d26b8a959180665b542b", "00a503d922d3fd65a07eca18c0a4e2d3f2cf7c05928b406458cb286e11dc62dcb6" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a1db7293b6f01594b808718e61a4d642dff4fee2fb471167ef7ab42959a473e7"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6b76915cc1c854744a78dac9baecd59845b90ad9cd308f5a887dccc909dacd4a", "7260456f8f8d31760d81bf85348d9f50c99d9918b480b1ec25f4e2e34de03769" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "99bb8d4bcbf1816d31aad88c25c61f1433b08322412c7bd84ed759d01c009127"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "647b37b731d3ead759762751995483469031084cd709887c9b6bafba462cbf84", "00888c5b171f2b2fb7bb2b9d88200d79ac94d7d4025f79348e2283511c047891bf" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "41cee82a6957ef02ab3aa07a3315accc0d0d66c2081d530246d6e681873c90d1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1f761a1ae1e82e4af277b399da0a523e85644ce971c7b90236d03115aed9855b", "55cdb3e104361fd2e0979863f29a3b0bf5542c5105c91dfc7c94643b78a2b7f2" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "746d61572ecae774691e7809121986d9b93279b00934ff1def1f4798da89ad4c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "63d303162574962899fd9a323c5fe24a09188fa20d47a8d92ba502d4f886f5b3", "72cd0d82b3fd4f54fedc5d8618b142f63553e438cc1269719dee3abd3316fa21" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "281b26a0908968099f8e1f610f4f358318baa21107b791ef6f24cb244677a64b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3e1d966e05f04c44e162133d97730f6408a88ad990a2c6efb7e3e73a886f7ed4", "00a40e3b3fd8b005fc417437f21011d9fbe38b329a2e7959ed9b040c8e1eb677fd" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "46a78fe7c149c67d7eeeb1b5be57b3a1082651c278ebc4a50abeb4570f858f1b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "56ac8e49b319d5d041ae3d3f91de229c0a820d7ffd97ea06196eee7507363f42", "787fc05eba606f77b984e57cabf911209700b5d39147a14c5d1a95f56cd5feb4" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "14fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b55"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5e2f228631ee7f00ceaf936278f2e2681b429fcfb8cb2c019b31f188839884f5", "30e1079a6b889393cc83fabbd524f21bb486c65b83ab0afafb17265d971bae91" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "8e305a1cf885ccc330ad0f1b5834a6a783f1948a5d5087d42bb5d47af8243535"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6dbc5605b4e113932fede7b4743f4dfc62fdecae16735b51653d79ee008f2fc5", "1288fb2ca09ee336ef316b73919a7f3b329fca2f5c365cc427425fecf64f7bf3" ); + { + // point duplication during verification + auto m = "313233343030"_hex; + bn_t sig_r = "074c035603e1eb49ab5382819bf82af82929b500c6e78841c1b2c3ff54a615dd"; + bn_t sig_s = "2035ac9ea7119e30e54f369cd22aa27af38b566ae6093f1df35b612de6f07598"; + auto r = true; // result = valid - flags: ['PointDuplication'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6dbc5605b4e113932fede7b4743f4dfc62fdecae16735b51653d79ee008f2fc5", "0097725caf014fc6854f349f1d0be90e373b9c2bf478efc363f8d0e830291ed784" ); + { + // duplication bug + auto m = "313233343030"_hex; + bn_t sig_r = "074c035603e1eb49ab5382819bf82af82929b500c6e78841c1b2c3ff54a615dd"; + bn_t sig_s = "2035ac9ea7119e30e54f369cd22aa27af38b566ae6093f1df35b612de6f07598"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008c5635eeaf7e994ff163ebdc9aacfdad1d50f9929a8035c36cf1c1e16d5b28f1", "3de48431f3eb823a384c940b2b0a01512da98b8f72bd9545d179d6f1cd5a2a63" ); + { + // comparison with point at infinity + auto m = "313233343030"_hex; + bn_t sig_r = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + bn_t sig_s = "21ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4487"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2b9999cf86f15a7471ff8d212ca3f9a99225851b6d9608034ce0af55fd539b5a", "25d1d06449a6a9f4db833ab69d1170b4f0f07d2e5f74a9b56212563a0356e0b6" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e"; + bn_t sig_s = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008d40dbb264923c02a484fdc7f06108c727e5d18172c909f79a3845485c939f45", "0094dd7b7c67653a712074d94890a8eb56a7d4b975024d3c82a1151669a6b83821" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e"; + bn_t sig_s = "796a6353bccf0b8675b699d502cbae2c88bb5799818ee4f9f93a0a5d477cd02e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1fb44c46fcdcfe8e37f047bccf57ba1890643f0033d492c4b197ca7057c86067", "763f1041f8c38be3ad20945a6f0fad6f530af96fed289b4e8f02abd80b2f2d83" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e"; + bn_t sig_s = "87fc46494e5887c9cb84d5407e02d78e09c7954fc44e1f2c734b3ecedf6d121f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008a42aef32568d8451e187a9441a6e886342d0033b04aaa4ddbd4d600c6a5c86a", "00855fbb0861c7a642333f3723c6c3dd961f279d9943779d4c237deec94bff846e" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e"; + bn_t sig_s = "21ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4488"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "67f999eb1a40fdda28044d2af23357aac045172ef1e89c6430a68deb0a5e2c21", "550d93565dfc6a0c5b5cf4e7d9111bf4e31a0d0f94b8adfd9b800c5b38cc22b0" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e"; + bn_t sig_s = "3090f487e51f9e35c8af70bb9ab7df45037e230a33d2c1fd96e404254fcb8679"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7cbf2bd2c89069d23ef7417cb783dec50089b3c45573ad00e1214b0c6f51ced5", "6ef5cbc578da2f35cd8a43cf01a7078841fffef2bfaa4b931920ada792019b29" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e"; + bn_t sig_s = "77472d9a28b4ece71cf413a68eac0eb423a16fb462b1f48706fed48ca437bd2d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "33d4259f3ac0ce8a534e7655f2068f80f401c742ec04084784d269c49ef0701f", "3e1dd6fc7c206d4d759c80e3612da4d0fcd4200afe7a68300e9c13f4ef23f880" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262"; + bn_t sig_s = "38a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6eacd3ac7f7be63942b897b75d2826210553e1973a5b38487531e0db4a8418cc", "6b781f1ec2302bf27f8c4a46c9179185b92a53a28b85b3c64171139dede35a05" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262"; + bn_t sig_s = "796a6353bccf0b8675b699d502cbae2c88bb5799818ee4f9f93a0a5d477cd02e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "49680c57a9644af8a3cb5d60f33bbeb54c910bd40dab3fdb8daa09182e4d7918", "0080fca5d924092c316ae8266b2a32b74f186f6cf22c29520871fb2ad2c44ee71a" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262"; + bn_t sig_s = "87fc46494e5887c9cb84d5407e02d78e09c7954fc44e1f2c734b3ecedf6d121f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "69566f1e4619346bf81d4b7e76705781ae6a3e8470806ae4f73d53bb03c207a1", "396a54d57b45951ebce9987f6adb457d7ce77c6c3820d657f9a8882cdfad66cf" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262"; + bn_t sig_s = "21ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4488"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "46868fbfc7150d0bdb1c8e9976d845dc4b8840f4d921299b6d8f989d4dce8657", "0083921b9a729e51d2deb5955f4d87cc2b299c7f01372ae82cd63f529a266d4b52" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262"; + bn_t sig_s = "3090f487e51f9e35c8af70bb9ab7df45037e230a33d2c1fd96e404254fcb8679"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4ba9ffbad26f909e59ff58118fb25d05e1fd2722cf1b9d88abfeb716c9f5461f", "76b2f395fdacb89f3b85fdf4cd733630403068559ba12c0f438f856286773f9b" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262"; + bn_t sig_s = "77472d9a28b4ece71cf413a68eac0eb423a16fb462b1f48706fed48ca437bd2d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262", "547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023"; + bn_t sig_s = "18487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "989c5cc31440c1168f88b32ba6e47900183c0d843f9c41671898030664305d2b"; + sig_s = "18487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262", "557c5fa5de13e4bea66dc47689226fa8abc4b110a73891d3c3f5f355f069e9e0" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023"; + bn_t sig_s = "18487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "989c5cc31440c1168f88b32ba6e47900183c0d843f9c41671898030664305d2b"; + sig_s = "18487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2676bd1e3fd83f3328d1af941442c036760f09587729419053083eb61d1ed22c", "2cf769688a5ffd67da1899d243e66bcabe21f9e78335263bf5308b8e41a71b39" ); + { + // pseudorandom signature + auto m = ""_hex; + bn_t sig_r = "745be1da902d19c76c8f57d4a1f3362b4b20ed7c8de8fc0463d566795f979cea"; + bn_t sig_s = "5916c317a1e325b53735216a0fa37737f08b32245c88084817b468a41f5afee9"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "4d7367"_hex; + sig_r = "0ff9279a0775740b7db8bec07f9a0401b7903886cb198c1b18c46de0673b31c3"; + sig_s = "8b3c8686bd1a1508b5b785e762fece8c6cf19b6156983e5c36b2bbe724d6c23e"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "313233343030"_hex; + sig_r = "351e727003896ec02949a3cf752223bcc6c2b611b30391edd60dc0c83dc9c98f"; + sig_s = "924ad9dc00364d4aa2091416d173862f9b02965ff176e880ea62a673e16db98e"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "0000000000000000000000000000000000000000"_hex; + sig_r = "44a811b2321acbc65cacf80d2dbe848946f1dac528f3e1ae38b0e54d083c258f"; + sig_s = "55d7edfaecdda3bbc062d5074e3c3719d32761159d027ca27c1725ddbd62f688"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a9fb57db62501389594f0ee9fc1652fa83377fa302e19cef64252fc0b147f774", "009507acf5b04339ed102b9ca60db98c165b94ebe855d2202e46dce15ba1e028be" ); + { + // x-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "62aab40a36d6a0d25644719ce31dc629ec684f6f0da32f9dd034ccc421dbd0ed"; + bn_t sig_s = "a1fa6b0dfd9558da29374fb77505ee8ab3572161711f821d11807c7fff910c1c"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "740cd3d3a9cd9dbe05ead4e39e54db27c0f1579da68e3aa5c9245b047aebc3b8"; + sig_s = "8ae78c12233d378fe2ce3c0fb2b769f8463830a71a5e5187c11b20fdd7e50445"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "a28f30245c5fb0c225fdec23924dc2cd4c2da888d1ee1bc5445858c646015ca8"; + sig_s = "0ee364c1491c4551ef3509be8f88db0e04d0afb36528aeda1301b14948cc9cd6"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "351a45fb920f2c9f1b178438fa3bf272ff9328b881c477a1f56a8c0e88465276", "1270f806fe40ad97ebf76c6825384b780ae6afccc792b05f2fb3eb7b7fffffff" ); + { + // y-coordinate of the public key has many trailing 1's + auto m = "4d657373616765"_hex; + bn_t sig_r = "7f202f54f591b51105b227ee6d6da3adddfc4b5e819efc04befcdcbf7484f783"; + bn_t sig_s = "4360ea04503955fc3f025928b2dce50ff2d58b9060b34bbedfc3c219b3b4355b"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "62e218dca32e4ef35692e9315e1e036bef1766073b846e38de20d2d29349f9fe"; + sig_s = "519d4d4c6158d95474d793a0ee9c260a0c5469c5aab79510971b41fb4fae4baf"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "a3902295f6f743ac754db7b3fcd823be917b1191a5705728f5682492784da7f1"; + sig_s = "43def636660eff72e6435edb850c9126c7067938668f249998a0e4006b8ee7db"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0129b2146e36fc055545bf8f2cc70f8e73e8b25e539365ad7577cc3535", "4a2b8c0319bc4ccd3e60da119477c23faf8fc2dcefc42d3af75827aeb42f6f0f" ); + { + // x-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "86d05b26a9ca7e10ae0681bb4c35a06d7a4e918f8625e3dfa7ac2d5aeda91c05"; + bn_t sig_s = "08c5f475a95888769da4a0e1b635c2292f654f934a5c5010fe0c729f3d11e1b1"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "43c4474710d25094a2e21a9cc08585c26015f9f94012b100e72c0763aa9e0cff"; + sig_s = "8345c46fd5592cefbd5ebb258965c05d964e6e6a278198ddc1e388cf1e75867c"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "6d2724167e816528491cce574f0526209de52cd0f2af0085284fd050163d37c5"; + sig_s = "76dd1dd50ff9b553b0e142b7e6c6be8edf3708dd292f03f3e9bf157d21daa9eb"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "680becabe7d7df4fadfe5ae01fba5ea51b76759606a2e30612e667419b885d05", "08541dcb0723785c3c766581a7514a1ff42e4437d63f878271cb860f00000000" ); + { + // y-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "321009a06c759c54cd66baafa0cbfd07eedb19f12a1ed654dd52b56f9c4fac7c"; + bn_t sig_s = "1956310a7e4757ec83ddb92d2763607354678149f1ad92387928cf887b4bed0f"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "9bdd359881c239e2415ca2af3d18463bb24be53f6f636cbd20360b6b333bc345"; + sig_s = "0ff03bc36cc1975bdc8680c44fbf2aefddf67c118c304b8b3d360eb10203c3a4"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "48565eb7e7820d40754b5f264a4ceafa62bf75084241514b491995e7971e6995"; + sig_s = "3da6df3d354f48daef6d078cf1124295fc8c3211f2757967c781dc2e9c62ed1a"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee9061", "01469fb456ca6a1720ca8db25d567e121cf921ce13e34000f8c12f5272" ); + { + // y-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "518e885def022eb5020fc90f4024d87122dc0f3ed7f869ed7720ff74a009fb7b"; + bn_t sig_s = "8a3e26a8cd426d21eba5cd7a5614f3644395cfcecb24fe760a68a7a9e8f09c02"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "04b01e5cc3ce9bf10844bc1cb21deeff6ebc9e2a7010cfbb3af0811354599c81"; + sig_s = "2e65fb8db62f255910ea4d5235bb21aa67aa59ffd519911ecd9893000ab67bb4"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "94bb0601198c4ce266b0932426ffd00132d7d4e2de65ef47f56360825f262438"; + sig_s = "2734327d1989c9580f5458f04aac6fd5752a1ee5e236e9ed1a7c0b2d9b36db10"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee9061", "00a9fb57da5b4ef56573fbf36fd2f5db1517bde406dc0452143cd347245e3f0105" ); + { + // y-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "4dde197f962c63a7799c862e897b3bb1e7a7ddfb9ab77c2a17a54151ce604ad6"; + bn_t sig_s = "017e7aef86e533086425a2c4b32082f118913ef3667c8437672e0bbc7c2b8d7e"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "7c53ed1d504ad4ba53d39792012a34d007250a2b8d1ca189c0d9f75ccc9a9957"; + sig_s = "09b97dcc5c67487114231d601374a8364cafa39581291762202b9215d51135fd"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "513245ab2b6a4206bb0f6970c8ad040a94725ddc9a08db0fd9def93866ffbba1"; + sig_s = "a53a7ab37decedae18dd5b5c48eb642b7a9c927e6bcf6bdac3a757e6d2c169c5"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0081528b7adbbebf1b6b3c7fa1d61284b07759b9a98d31a5702707b018fdecff11", "75bbfccb545381bf8601031731841829401b08dcdc68cc34e06a64e412038512" ); + { + // x-coordinate of the public key has many trailing 1's on brainpoolP256t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "a50318c3066a4966ad18ae8f85253fbb5835a34b2f9187daac71ee28d3d5d0eb"; + bn_t sig_s = "0890ef0fc93df222d11197cb221483ce897b0cf1acf4a909c306c5a485776abc"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "041e0389dda2cf2ae3a9562a0fb5d41c1f7533e6cc84a896e99af781e2109770"; + sig_s = "366b5d88c36f1227df522fdab65e12347d68eb64f2de82c648115fd565bd37b7"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "2a76394a04ae19b25c54291e28bcd42a7edeb20981b8a3b838f9dd0e29b574c1"; + sig_s = "9ce89980ae432c4fa6a68025da554bf900cc2eb0c66906420d322c14b453049c"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e", "16ea8e03c20977f20aed58106b6d9d1085b4475f75b5469c5f426cb27ec6d872" ); + { + // y-coordinate of the public key is small on brainpoolP256t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "66958be3379405826a00daf5495b1657698126a5ff449f9649af26ca96df9667"; + bn_t sig_s = "9b4100816e2741f86c5c0b0dcf82e579f4281d2b8e70c234808d84c1a495079f"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "53ed0f4b8fb33ef277cdd1060435ed3dec518a225659f71f67f9a1f07f85c1ca"; + sig_s = "124d5f94ddf12bb4cbe3c5cea6d2686d4480dabb8ffbb05e5238c877fe20383e"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "46643c7fe0f308b8af4ce2978d797e8c46a7e1f8bfee0b5cdbaecde1f59be41d"; + sig_s = "1bd11a814d1fbd9ae97a49df99beca7fec2512563c0031c5aad5b9fc2fb0a507"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e", "009310c9d7dfe531ca3378b2803215f061e887aec45f70d98bc0d0db6aa0a77b05" ); + { + // y-coordinate of the public key is large on brainpoolP256t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "4f833bec9c80185beacbb73b5f984e2c03d922359be7468ce37584f53d1aea4a"; + bn_t sig_s = "6636744ab7fecaa53541bcf5f37c6cbe828a8efbc4d00f6469ba390a86708a26"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "a2869da416523aad2b8fa8aad5c3b31c5a535fdd413b71af4dffb90c6f96a669"; + sig_s = "29ff3e8d499cabc3cc4cccd0fa811cc3b04770aa71f0d052185210b14d31993d"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "63dbfe29249a506b89fbd2cb1fafc254a9582dfc4b08d143b6d25bf2ab49d55e"; + sig_s = "44cad80c00460905e103f26da84cefd71af4bc7a71962a3bce321bc3b5842736"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6d499b077ab6d77b244320a2cacab91a764595dd67a7a8dfcf84da7d38b2d8f4", "5994c07b833ff4909c1a92cc9f24dea88be8603b407b00d228faf2158db2354f" ); + { + // y-coordinate of the public key has many trailing 1's on brainpoolP256t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "9d907cf88e10d60c3f23892498fe43ddb02f824fb18e6be313e02d94f2c8e090"; + bn_t sig_s = "0c16b9e0db4dc8606c023b001f69b3c886080794fc9d7fe31b00c1cf0935e421"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "7395ce0ef652848a86b61097cc9543998d39dae88a1fc9e4dfdd696429495489"; + sig_s = "7de29e256e8202382f91c116a667a8b946f210447a57369ba61ae4fae73dd136"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "7baf1fde87ccb1bea0f893b3bfb2549c04bca18835d8eb5a31b8d20506ff88c3"; + sig_s = "289ebe829fefb9ad009d7cdd622874aef5fa088f0508a4b43d5895d61645cecf"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "08c2f95ffedde1d55e3f2c9dcf5884347f6904c6492273ad760eb7b9b35f036b", "2bcf7a048caa2c726ae8808dc95312eb2350275a8f4fbeea7c0f32f3839c7b93" ); + { + // x-coordinate of the public key is large on brainpoolP256t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "33e37c3b66acabee3d68cbbb9c55cd52b586de51647723fa84e532a3ec5953ef"; + bn_t sig_s = "3b8a9ee707d1bc5f83e17ea072adc2ecda92e637d7c06060f1af79b929a850b3"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "1f8ebdc94ecddd84f90960cc55d0ca02e33d70535fc1c7322b3c2783b9dc9238"; + sig_s = "205aa8626c3a5da214e5485b11154a378d70b0d3323ab868528ae8048d17b696"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large on brainpoolP256t1 + m = "4d657373616765"_hex; + sig_r = "6b0d70e09ba1642adac06dff9b52e22a3e4aab4180e372665691412241e743a0"; + sig_s = "4d7d30ff8a210de69e3e6d1ecf7175f89f481a4d9ed06beaf7148da47f4af9e9"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } // End of Google's Wycheproof tests ecdsa_brainpoolP256r1_sha256_p1363_test + } + EOSIO_TEST_END // ecdsa_brainpoolP256r1_test +} diff --git a/tests/include/ack/tests/ecdsa_brainpoolP320r1_test.hpp b/tests/include/ack/tests/ecdsa_brainpoolP320r1_test.hpp new file mode 100644 index 0000000..8fe1767 --- /dev/null +++ b/tests/include/ack/tests/ecdsa_brainpoolP320r1_test.hpp @@ -0,0 +1,4945 @@ +// Copyright © 2023 ZeroPass +// Author: Crt Vavros +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace ack::tests { + EOSIO_TEST_BEGIN(ecdsa_brainpoolP320r1_test) + { + using namespace ec_curve; + using bn_t = ec_fixed_bigint<320>; + constexpr auto& curve = brainpoolP320r1; + + // Verify that the curve parameters are correct + REQUIRE_EQUAL( brainpoolP320r1.p , "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27" ) + REQUIRE_EQUAL( brainpoolP320r1.a , "3ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb4" ) + REQUIRE_EQUAL( brainpoolP320r1.b , "520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a6" ) + REQUIRE_EQUAL( brainpoolP320r1.g.x, "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611" ) + REQUIRE_EQUAL( brainpoolP320r1.g.y, "14fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1" ) + REQUIRE_EQUAL( brainpoolP320r1.n , "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311" ) + REQUIRE_EQUAL( brainpoolP320r1.h , 1 ) + REQUIRE_EQUAL( brainpoolP320r1.verify(), true ) + + // Test vectors from Google's Wycheproof RSA signature verification tests. + // Generated from: 'ecdsa_brainpoolP320r1_sha384_p1363_test.json' + // URL: 'https://raw.githubusercontent.com/google/wycheproof/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_brainpoolP320r1_sha384_p1363_test.json' + // Note: + // Test vectors with flag(s) 'BER', 'BerEncodedSignature', 'SignatureSize', 'MissingZero', 'InvalidEncoding' were not included. + // All test(s) with BER/DER decoding related errors were not included because they're not part of this test scope. + // + // Algorithm: ECDSA + // GeneratorVersion: 0.9rc5 + // Header: Test vectors of type EcdsaVerify are meant for the verification of IEEE P1363 encoded ECDSA signatures. + // Notes: ArithmeticError - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.', 'cves': ['CVE-2017-18146']} + // EdgeCaseShamirMultiplication - {'bugType': 'EDGE_CASE', 'description': "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used."} + // IntegerOverflow - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449', 'CVE-2021-43572', 'CVE-2022-24884']} + // ModifiedInteger - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModularInverse - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where computing the modular inverse of s hits an edge case.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['CVE-2019-0865']} + // PointDuplication - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.', 'cves': ['2020-12607', 'CVE-2015-2730']} + // RangeCheck - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // SignatureSize - {'bugType': 'LEGACY', 'description': 'This test vector contains valid values for r and s. But the values are encoded using a smaller number of bytes. The size of an IEEE P1363 encoded signature should always be twice the number of bytes of the size of the order. Some libraries accept signatures with less bytes. To our knowledge no standard (i.e., IEEE P1363 or RFC 7515) requires any explicit checks of the signature size during signature verification.'} + // SmallRandS - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['2020-13895']} + // SpecialCaseHash - {'bugType': 'EDGE_CASE', 'description': 'The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits.'} + // Untruncatedhash - {'bugType': 'MISSING_STEP', 'description': 'If the size of the digest is longer than the size of the underlying order of the multiplicative subgroup then the hash digest must be truncated during signature generation and verification. This test vector contains a signature where this step has been omitted.'} + // ValidSignature - {'bugType': 'BASIC', 'description': 'The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported.'} + { + auto pubkey = curve.make_point( "0fcc8860cb26e262ca8b4ecb9c52f78d82a10a1d30dd0c8ecd7584ce80dbb75c488a062b64375500", "1f27e676c26cd3488c1ef4ec3edd88cf8af78daf9036724b57e66da02cf7c676a53664becdfedc3b" ); + { + // signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "85b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e"; + bn_t sig_s = "833d6661b0576d61a80ffe4d3271c43b2a56c14b3bd90305923ccdcf7b3d988c07ebb1c4cc67381c"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + n + m = "313233343030"_hex; + sig_r = "0159100378a2b190377dcb3bd531e20c378d106931fc183f707dc9d08576f8fb566185594220b8dd7f"; + sig_s = "005020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 256 * n + m = "313233343030"_hex; + sig_r = "d3e3f8dc8f2844f860d907224861c091cb23503f42d49bcffa98b069ac0ecb8bf36c495f2ba1865b6e"; + sig_s = "005020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by n - r + m = "313233343030"_hex; + sig_r = "4dac8ac7cac70f3844adb4e87221b494660f36197105e5d5dcc68d0a6613b67cab9d517468d248a3"; + sig_s = "5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**320 + m = "313233343030"_hex; + sig_r = "0185b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e"; + sig_s = "005020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**384 + m = "313233343030"_hex; + sig_r = "01000000000000000085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e"; + sig_s = "0000000000000000005020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + n + m = "313233343030"_hex; + sig_r = "01237f27debd21320e1a68f2707191fc90c8c8de0031452240c8538fc061cf19470536f8f1bd23ee06"; + sig_s = "005020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 256 * n + m = "313233343030"_hex; + sig_r = "d3ae6800f542b49a3775a4d8e3a17082245f08b41109c8b2cae33a28e6f9a1a9e40ffafedb3df16bf5"; + sig_s = "005020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**320 + m = "313233343030"_hex; + sig_r = "015020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5"; + sig_s = "005020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**384 + m = "313233343030"_hex; + sig_r = "0100000000000000005020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5"; + sig_s = "0000000000000000005020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=0 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n - 1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + 1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + 1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=0 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=0 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n - 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=0 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=0 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=0 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n - 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=0 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Edge case for Shamir multiplication + m = "3730373135"_hex; + sig_r = "25166f47ac99c6bec3b038849ab4ead3b251f18afb0da1da5caa604a92a909c8561817684abffb92"; + sig_s = "3107ffd1aadce5b58a2a1b9517ccedda090433ac6344b027f36fc6b358ef4a8e436df3fd05521668"; + r = true; // result = valid - flags: ['EdgeCaseShamirMultiplication'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373530353531383135"_hex; + sig_r = "103c3ef2b43a8f57d01e2da67edfa003a0d342d7fbde0541332b0b24deea76afff4e2cd0572d73bb"; + sig_s = "0a0a680ebe3644c46b58d67ed8ee94f3aaee2839bc270d6b939bcb7657eeebbb6cccf2bc54af9781"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130333633303731"_hex; + sig_r = "8c70216094feda4e721a72d8a91c51dd17392cf4c4481d7cd94be56da994e5baaa561085cecfe80d"; + sig_s = "1b19f7e89525601820bc17bd595a7dbdef76e5b352fcb16c3a8a1c332ff6a5308ff47a7e54e0b1cb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333632343231333231"_hex; + sig_r = "b4a4a035dbeaee126d09c7b15816b04bc717cb71bb5fe7649ac026269b7fe6d593fe1ff8fc5278a1"; + sig_s = "635516de531104e72176e89a845032b3096e3269e41431c1854fbc4337ba6fb5ea91defd33729d83"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34353838303134363536"_hex; + sig_r = "2a3103cdaad1dd28ecf897491051dd0a9c9da9483753c93490b4a05f1c42e1642925a3a0154d4062"; + sig_s = "672903243b6858a5e09148e403461f31c1ff0e126c365942e0680d314c1a7a7c57e2f0528c8cabbf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313436363035363432"_hex; + sig_r = "b880b6be2a1295af3840a5f374fe77cde1ffdd6df3bb86097d5ce14852f73a1925fa6d192a27b74c"; + sig_s = "c2cb211303aea030a5b92be98fc36770822f8195ad73eee5a9bb87c5717ba4345cb60b099e4d4deb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333335333030383230"_hex; + sig_r = "677f84a0653725b94e4eeddbe0b70aefdf594f5ef9e484b4060567a8365c43a783d81548d1f27408"; + sig_s = "4cb24e15375bdae0b44b336fc7e6c11856d4c6f9dd7e83148dc387c4a8869b11538b7ee94f053f4f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36333936363033363331"_hex; + sig_r = "9d5d984c7544ef737a1001d67f9dbbed521b46f74bc468c03881c2ab5944635af5465c3fa01cf51e"; + sig_s = "0c706dcfe11a4e30d623870fb0f2b979d0fd9daa970d86f64bb48f49aa484d924e9b93bcaf406924"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333931363630373935"_hex; + sig_r = "448464becc13522c90708aa5204930e676fedfbaefe8fe02509a4fe822cc88fd6d92a958438ded7c"; + sig_s = "5de659e080a61c50b5b7489f4677ec4c6931faaf171f2a69756e2f2d1214235bdb1ea3d2a4a75359"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343436393735393634"_hex; + sig_r = "59c0c95941e1a52390e00c2d7796c685dcc4d73d6d6967590aa1767c972e199de3c6dbfca77dcac8"; + sig_s = "507f27ab5ac05ad23cb25fc48ffc766dcb6dc0cd25606505a2d270066c3a74842768b54af2c84751"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35313539343738363431"_hex; + sig_r = "59902d7763e7f1875a4252d133eb6114cfc1972b683adfd767a71ca80c3f78057cea759ea195d31e"; + sig_s = "397deaf96e2903a207f68e5330c9f2c6276a45d0fdba961a04c275fa203678176201ed370999a32d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35323431373932333331"_hex; + sig_r = "d142217584e852a499efa734a10a436a397ba7e068ad70f3eefc4d6731e76a481b260eac1d2147f0"; + sig_s = "17c8482639df8d20fcb835bfe0f3ecd27317eb8315c69b656ebf137dde6582f3409d7c44a8b6e085"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31313437323930323034"_hex; + sig_r = "8a55fa49224592f7e403a4b3e647bf382a26499b37ec2cff51a2be2a1357807fe875359ec8654f87"; + sig_s = "b9506e74af8f552d4abb2c472b8508ce24814e20b27d192e24d36d5ac751922b0c807bf97a7b1ad7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130383738373235363435"_hex; + sig_r = "68ad2da643d66fc5d27b63d7222f835d09fe0b328fc4da4684b86d9c12b3992626f610e3395e4ed0"; + sig_s = "9662f74d52712a2af54f601c4488934fe2826d50e1ee868022437c9b620c93d43fc750f03312897c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37333433333036353633"_hex; + sig_r = "578bdd50de9986fad341a954e51126ff0cb540026abb3d42b3c208e4ad187f7ba2d99b3efe495c92"; + sig_s = "b95afd2d12cdee68c3572a5fe126334ed0ed7ba82d3097eaa6d9d737c09b830b6cd3e878f470e7e0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393734343630393738"_hex; + sig_r = "9d612663497c484084d3d15d8e799e1fe38b7b5922955fc5a7fea4ecfc41954ca707525c1e0dc010"; + sig_s = "59e80cf69be6876b95357ded13ca61a494fac7355ac2e80a89be0219552d916852632617c0946bc2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323237303836383339"_hex; + sig_r = "b4c00f589dbb51ea68270f4b02eff48a4b123c0167bbd24daf2a837903e734339b8a2542041f87aa"; + sig_s = "94c32634baea4452c054295d7aebe23be7e80abbf53789651674182263ee5c2902fbfb3df7da7425"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323332393736343130"_hex; + sig_r = "b9201e49950ce0d1df644356405f0a785a8b8470f83e78a6f35e6234daa92a7685877a59d8c91a97"; + sig_s = "8bee9077443eedde34a2fc2c266f188e844eab2904c84204c816ba3cb1c4b9b253d4a78ce4e81114"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3934303437333831"_hex; + sig_r = "0d42a1899f73ac70c9192558b478db8803c68337d415faebab76858c32a37e399f1727fd599a1817"; + sig_s = "363f1346c0227ec54da1659165ee7b07e06610d36b1ce6226f608bf6cef2144248de37562be8537a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323230353639313233"_hex; + sig_r = "c5d65effab2ec3e4435c258121c493e24ae92005ac80136f21f2f42946fc3745841dbc2a3eb99695"; + sig_s = "85fec2a9080a1ece18896970c9a2e1b32240eaf187d65f6f9e91d27111c4033d471eda67eb8986ed"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343134303533393934"_hex; + sig_r = "a240adea61f748998df2cde95be9d7df30f454bde5b907ec7de6dcdb121bea41bd42c4392476c4f9"; + sig_s = "3ef991d642bd0265b4a7b521b20a42fb2c687ca2f0694b239a113a83575b5727dcb632482a572649"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393531353638363439"_hex; + sig_r = "cad52bdb35af7ee0e8f687c81f2edd8efc2d6ee317f3c6a82121048ef7a3ff3b69187aaea53f4926"; + sig_s = "58f84e186616544af494900241d2b802df2eae3e3f1410865e4cd16e221f277e7b5093ff186e4d76"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35393539303731363335"_hex; + sig_r = "93013ff84151a04ea146a36d2a3b9f497ba5d9323019b730be322bc519e2701e3f0ec1b6c8015e8f"; + sig_s = "872669f33b9b4b93384d9ac3f7c3092560b9af7e6738221e3b289421813601fe569b2c49afec8bb4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323135333436393533"_hex; + sig_r = "26228cdd2c08fbf8dd4ad5d2f80ed15129868e892d33cd892503207e91114c868d0064c60f1bb612"; + sig_s = "afdedc05f0b27e9363c34d9bd1bc64ec0142fcd9f40f3584605bbccf12b0e279e4b3e3d0927a4852"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34383037313039383330"_hex; + sig_r = "731d597c3694a4932f0f14fc3132d2ba9f5b7d833ae91cbe9a450352f4240d5bb712f65b0eea0412"; + sig_s = "1b8a6fc9bc1ecf8c09b1ba27c4c8dcebaf1e669a89036b34fa8ff57280e5741959e6c05e05880a37"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343932393339363930"_hex; + sig_r = "d2ab69ae6110bb67ed99ffbdad8036dfabc46de8ae1fc7e799986b91ba7d454672ebe4896cf72011"; + sig_s = "d29d67bf2b882770d46dbd06a6fbaad583c2ceedcbd772200b7532e354f86eaf9a9418191eafc5b8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313132333535393630"_hex; + sig_r = "81da10c5fef4bfb58b4a73b4cf3fd4f0f028b448b3463dabe0d6f1e101af570fa64116731ea5b9c2"; + sig_s = "ceac01ebad706ef43c80caa1d8962c655bfd810396b94d2bbea299bd5cbcced75562b0fab446ff85"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31323339323735373034"_hex; + sig_r = "38358ba2c46f61f39bef22873a5bf26464f2b05e4874bbb62a2323385f8e87a5b118a0079078b44d"; + sig_s = "93f84f06290f48161922552577482a973404f47c84c6e1a94643c3832fb2912fc4b38529e2f13e9a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303831313838373638"_hex; + sig_r = "afd1fba700fc703fb772f701597adddcce4ff9f530c830dc8c8cbd4b3070f4a22b80516b0b820970"; + sig_s = "76c2e890860c36bbb5f6a1053401f1b51aa83cdfd96a3c15e1a183fdf8357e49d2984e4fcf19c25d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343534363038393633"_hex; + sig_r = "8c90d4c8bf021906d3d577bd16b3e139bbc35d7692a828f0ef5cdf9d51a8442265f815849fe793b8"; + sig_s = "0bfe16492abb58a1d8064767546d29aaf6138c5842c7f7002fbac34b78b324b84426510c1b7b0d89"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333837363837313131"_hex; + sig_r = "6d07da92bd405912b22a993ed30e06149c78743fa195fcd3baf05803fddd5a6408201e68faee622a"; + sig_s = "5ad3c8b4c1c68080279f20ba15548343fca9ec52fe23bdf59619738dd1bd418414ac53ad7ce16c2b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303331333831383735"_hex; + sig_r = "be43df617f79ef83404e7c7393ed3c38c815d06e3c0debf9ba37f36c419a6c3ea690822f88011ff1"; + sig_s = "2f0ad4ee5fe7ad128f58a520a4fbad3f0a502a4a4412639b3dbc206edfb2a03d564010d78d2228b9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323535333538333333"_hex; + sig_r = "844ca29340112d0eb9dd15f62655a0cfa993415e570511a3f7273623b82d892d136c6e8bc57db84e"; + sig_s = "71114ae579d053b5cb3d77d2e9faf1c06cc263ab8fd845a0378f4a75da86ddc23ab4d07946832a77"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34363138383431343732"_hex; + sig_r = "cda8531222502a62368fddc724798870038333b9fa77141d4bc5ef758f7e973e5ab8b4cfae90eaa1"; + sig_s = "9ead50a2533287abe5504efd8db57f8b96a7fe039cc95d1690ea0c1e2c9df5fc29cddd7b01edb99b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303039323435383534"_hex; + sig_r = "5c2c6a661338df365af8ba1080b994e59989f002fa4fff42fc8994ca6395620152f3971300aff6f9"; + sig_s = "8681ea1793bd3e069426127a6b665725ddba4a8f1945851743477a1cbdc7356713ae70fc138531a3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373536343636353238"_hex; + sig_r = "0e061b48b5f7836e0caf73c9770c3fee1f67ec18ded9e1d339ab56d05b9adde369504fedff1d6681"; + sig_s = "009dbc4ad8edc1896fa041ca60ac64b7fa148e3f02b0f697ae22d923f526fd4936e5f584b23ddbc3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313139363937313032"_hex; + sig_r = "a8462605c79437c068523d93d2e1529ccae1b5248e8f9a90f2ef08d9d5e5025b3639f82b70f1e7ed"; + sig_s = "67aa5fe4e79e7c54a8ce389b90e1ce1556aa689b44814a6cb5c2f0fe4569c5cfcee34cbb4a086219"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323333313432313732"_hex; + sig_r = "93b01029421ca30d8abbd06f134ee9dcbe81790d012722ae65214f0aaa34bba642f43949d5ec51a5"; + sig_s = "110e4fce36e0c2acd898122fba756e711ad082087c36b125084f67b22e37a02bd68628cdb164ece0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363733343831383938"_hex; + sig_r = "6b6d893c3055da5d5a2ff6ce038a1bec59b04950bfd8012648d6063186ff861d7aa91a5185aa3c0c"; + sig_s = "a602ed34ee41e4811251a51bd67010f8eb3355b8691dad66035e723d971346f57c8a0f479fef666c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343630313539383237"_hex; + sig_r = "6fc42cf23aa42c36675ff126412c757dde74ef73cadb0425e23cb76230a58b3d002370b4166bfd29"; + sig_s = "4e61b9b10a13fe0dd2758733f6b178af98e0079867837d55f8e5e90b577de90ce0d8dc345ed16b38"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38393930383539393239"_hex; + sig_r = "b529a563a2f4065d333c812b0b6134de9735bb269fea763f01cf7d1c6a0ec70d7223c7e6c1b040e8"; + sig_s = "347fcb8f3971b3d968ba709b1bd4d31b550cceed232268ca0df1e00502a56aa42dde7330bd919d5f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333236343430393831"_hex; + sig_r = "b91b2a73449560522112fa4fd1b57b8c24754791af247a8c9de423e0bd536289a4fe850f7e3c43ae"; + sig_s = "2eb3f874f2e5ec56356bf6baf10b64b7c54b13447ccca1ffc66a1fc89dc8e977801748f8f0ce5a4b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333736343337353537"_hex; + sig_r = "314338683f23b1110d1840732f672254f38079bf11eeafff1ec2e53a5373f74c98887b11ebb78c86"; + sig_s = "b7e3a6b459dd10cfb5df6d2ea7afb15efeb1e5e917e5aa44fa54743689d7daf163f998e05719127a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383630333937373230"_hex; + sig_r = "22d1881a94e1e11cf10620f37d708ebed847f1459129a0d42cb457da8051f81a0f9da846281a68f7"; + sig_s = "404652ebd261f5f6b185de4a16980dc3662fc4573e245577e7ef6e3cbfdd47bc1e487ba206ccf760"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35383037373733393837"_hex; + sig_r = "863970caec6c6ff0a1c70f60859576e3583e6b529de3f928136e848c56b6c6715045fdfe52637747"; + sig_s = "667f525a88be891ec6b9f96d1a68c4f06b3b3d2ad1c15f063d110ec9fb60ae7463dd568a69ce452c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353731383636383537"_hex; + sig_r = "69cf0600384ceb832e237b6b453dea81a3c19cb8fae48ba186d28e3b118464b27af9100f181b738a"; + sig_s = "2780269a8fa40790ed726372ee0956265e72896d9e84f713f883a3bc0548e8d3a2b357333dda4c0c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38363737333039333632"_hex; + sig_r = "30f38139883f71c0c64d63adcb731f1c385df87db7ce7326bf50410acc50f0babf5017f92a1e1a6e"; + sig_s = "597734222482724643f60e48b3b589deaa37b86e1de1cf0b129b286ec67686574f16cfb5f2cc6f45"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343735353135303630"_hex; + sig_r = "174ae98cc25dbed747cedf8697266d16e96bb4f8071c905990f4e72c728c94aaa32dce24a52166fb"; + sig_s = "578099835a3dcb3da2fd42750180079da407c7a142cbccb699fed7af89dd703ba0cad94cdf2c051c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393733313736383734"_hex; + sig_r = "58cfb1511a223c06b3e974b660bed827bee38c59c4523068e9c9faa330c970e6271ea387db6b40b0"; + sig_s = "763594ced6e8413bfd90d5ceca18d6774a3da87473cc4dee726b0325e2df8b257d9e01318ae7e022"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33363938303935313438"_hex; + sig_r = "8ddba4f7aa8cc5e00a3ffd2a082710d42d3a88f9f947ba51f09466c2a9295caa131b8ae9ef51b35c"; + sig_s = "bc3410033a5798d9e4c6a817da1759c00c0d38e3c1ff22f0a41e5ad0d1e914e71c907da8c245ca2c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130373530323638353736"_hex; + sig_r = "2f7e50ee96706d597d8bf0103fa46786746a2c65c021fac7fa378d244c418a42b7908f0fab2dffca"; + sig_s = "b7b94f2a883ba1b49858329cc78fc2a992109809b470b878cc38e1bdd4df3ee00a0ae7e228e466bc"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383639313439353538"_hex; + sig_r = "4591491eee04e10a40a1e8eb82148195123348ec1a7cba06044e8f226ed30910b693ebbbaee0685f"; + sig_s = "1b8b3733cc5ca15dad84809df8499788b4899cba307f93b49ea6a63b9e77487c3c98b803fce69cb9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313734363535343335"_hex; + sig_r = "9d22b864e2706fa43a67ea62f39e4d3f402767d9d038c78e2844d699f41eaf1a641cfdd9d6a63fb5"; + sig_s = "1eaacdad8294ecc2ca0c55e6e73df03d832beafe048fc690895beca5cead9d01d37b3fed5741cb94"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363434353530373932"_hex; + sig_r = "8f1502143eff372fb9bdd956ece35d232403fed7f77eb4f4552d4fc84e4a2e5d6c8ccf06f5a6ad61"; + sig_s = "4621c9fbc37466f7c757f66d171da8ee0a0dd5f24113e2f517a082b7ab5d4123c3eec9eeadf69952"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353332383138333338"_hex; + sig_r = "8dcdcc74a25fcd92e4372e11364a361c7a2d7f3dd74c5d6bc3761c07fe78f084765de8ce70e448fa"; + sig_s = "b3cfdb35c20b1e30d3c216dcef3c73cd44ef1973c8695c8ab439f7e26628574e0f349d81c598d1e6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31313932303736333832"_hex; + sig_r = "bc2a5b098f724830a190480fff5fafa0f2fe85bf17176af8d4eb670e1d55533f820d690e76b3bccd"; + sig_s = "516c576444be0250e33823302adb708b6622f17e2438f01800c58edcf907e505b419f6c0dff11afc"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353332383432323230"_hex; + sig_r = "b3208e3c49a8ce5fb89effb2480e8ca6b9e11b16a049aecf0ce35450e1e53509909b02ab33e663e2"; + sig_s = "362affc091fa46d71ae84e27979ab575c60f115845fc521e0a81591ab233bd32e6ab0e8b08809801"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313536373137373339"_hex; + sig_r = "91cd133d74c701c936758054753591d31f1d854213b4067e033880116d4653cf257015445c5563ea"; + sig_s = "43185b31dbee46dbb62d1cdaadf479aa4f4b0b32dbc49ef5ccad43c9f0fcd94f06bdf6315e67c785"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333033303931313230"_hex; + sig_r = "c63ac9ada6e0a00dbdc171f4ced1c16294881cd7b8cc91e67d0f97f5a61909ac6a694ab0b0d37a6c"; + sig_s = "b33d6876f4464e7ad8e27a195f63b49fad3be8f4684f4c3d42f58913944abc60173e5113581d94b7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37373335393135353831"_hex; + sig_r = "489db46f6ab87624a332376735aaf8e6c4c43affdb9b93c78682d3f90c1e01caadbcac4c975a2213"; + sig_s = "8e10c64116c4042b71bd9872c0506a7b34b6fffa9c3e24f843ce18270e3f163659ddc4a2460a4382"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323433393636373430"_hex; + sig_r = "09f7e103550337e36ea09f9ab3b83580ddc6259fb9daf38b424175d64134d14cae3112bddd7b21af"; + sig_s = "253719f8ce1161959841b06ae31dc9d84cf0df90dffc101f0442c8e98c040e4d53f8ecd709b62049"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333237363032383233"_hex; + sig_r = "41310739de7f1e06169f375d73e06550a50850be6aef432ef2143d7addfaf218f68836375921006e"; + sig_s = "43c4594e625f7aaa757eea847451d0155bd6b820883306b921184ec8141ca2b8c23b1dd64b980f97"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32393332303032353932"_hex; + sig_r = "cf0672d18f93bd9c8c1c5e17d90a918c5cc8fdb967f9d2ad727dd72ec992116741b175d35393885d"; + sig_s = "029e747ea2c1d66f1b4c5be492bd3b0ce01e8420a626a8a8e125c3b58c614cab12e6edbfc13f8a4f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36343039383737323834"_hex; + sig_r = "2a247a37c489974ed8946e5e8bd5a9d298d7afcc416b5efc3a9c69ba61d6538ad5294775d1c2a479"; + sig_s = "48f5716ab8b409f284351051dcd222cc5ec4f1b8c71708b1e85ed4db1ecec73888bd8f78c1e74d05"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36303735363930343132"_hex; + sig_r = "7a2d71ce074eaaa4dff6d104fb6e7b070cb09c235deb697f5334918e181ce9bbe547b79ab37969f1"; + sig_s = "6dc14d2bfa01e0cb36878d1aef216df992b5c3f058fab8ce922249b59cb72556364138389561af5a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333231363233313335"_hex; + sig_r = "851f1d1483719cd183940cf4e9eb30eadde699d8ba8090e216123ff61e41d166505a591a75dac6ce"; + sig_s = "292a45f31ef34bf34c3ccfd4a22adc4cc19c416151f70e95ad19999f9c59685e5fd9079a27b86fce"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36343130313532313731"_hex; + sig_r = "061df326b43ad7aa7bc4af8f3a5830bb0e63297cf690ec60a7259a942dce631e6676742ad12830cf"; + sig_s = "0e88675228b7fa4743ab53d24865193742cd6c5db218dde0044b301654bbab639abc775aae69064d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383337323835373438"_hex; + sig_r = "560e6e5414414dbbd6e9d40522c9f3fce665c4455eae07eafa3724d708689315f6c7515cfe1aedbf"; + sig_s = "a3e619bf5f9d776a591ff74a9252e43bd04ae1f1c34fe5b84f04c3d9c972a80e187888bade5aa9d4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333234373034353235"_hex; + sig_r = "34f9def6f21f5328d1c5e349857f3a7008f0afa5bbcb896ff6247b21a4abac7aedada64fa23f956e"; + sig_s = "cb44dbc53b0b0b43d6b158d90247209c2c74152c4e19a1c703577cf407ada14b198bde1ba79a344b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343033393636383732"_hex; + sig_r = "9721d7991f2968c23856a075e86b70a39f4aa30fd68777dbbf46c1d37cc3be4497cb4714b2f1656a"; + sig_s = "0aa34e858175fef3c0734c5c7c4ccd0459927b0f722e86af6c4045752b4ba154e725946319dc4274"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31323237363035313238"_hex; + sig_r = "aec92108751afc4a0c62a9da2163bb52bdabb9e7a8b566ca8d30fac389c68a3817d21a33df2f68da"; + sig_s = "befbacfb03957c9378903cf9b432093f78954e5224303611e9e96c92a76704e3a6432a24413bd277"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34393531343838333632"_hex; + sig_r = "6e852689b90451a1592fad585ea57c71eb5b446196c07dcf450972ad13fdcd8117319eec75d0781f"; + sig_s = "3608d11f0b8eb773b35878cc43ea95fb4d354ab0ffec9f785a41a17ebcf8f7d957f793479ae89999"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343532313237303139"_hex; + sig_r = "a34ebb41336c252a056097983d56dedd1eda042c7378b8b56d905aa9be1d7f6afb605466c0026c44"; + sig_s = "414c12e2a97f8e427ee9bd95e15bd5c10c16c1eea6011f01f271fe75869a6000fbfbc25a6d1f8541"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373331353530373036"_hex; + sig_r = "1cf27fa96f137e0fbce4da476bdb5c3b875b7fb455fcfe7efd863cb8ed61090f6cf6a2b927fabbdb"; + sig_s = "945bc7e4f319004b2ef4ce2fa2ef270c4abc360e21d8f8b21074080ee8a3422137c96f82e26cfa3c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363637303639383738"_hex; + sig_r = "cdb4f0b7f7de92ec59a2e0a1900318bdd649155bcd3e0914136a7c46c5e4bfd84231c04d64cc5c53"; + sig_s = "7b0ee0d7b7773c3bcd5921239f36b093bd232859d685920eaff53a91ff7188344a3075fe7f342c7c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343431353437363137"_hex; + sig_r = "aa8ef33f59508ea9617a41084a3532e1179d0f5755e08277a568192272cec63f910377a871021c7e"; + sig_s = "708751c6284f7c3cfc57a598c1199c1cfcb3d26e4546484de55228c292bca978ea7698d3f7d806c6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343233393434393938"_hex; + sig_r = "7d57fe006a0563d5570acbcabdf94ed515029f52e02298c79c9891181bd8b4974dde5765433d89cb"; + sig_s = "3be83d7dc7a5dc1a151f2b0957f678b9efca3d0818ec359202d9a4cfe792e95924be9e36e20ef970"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34383037363230373132"_hex; + sig_r = "998c251f0c1f9623980c1cff0e369c7b0a383fc74079113121f982bfe7b87f17b48e5cdd29b0e1c0"; + sig_s = "d0d33d8be8c37fb49c4f49ceee321186ff30b9950a706c6fddd1054772af3c3266fb286677592d69"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313634363636323839"_hex; + sig_r = "2e2384e2621b0f248ad34922f721f434527d354a7ef876defb8e80f6864867ae60c76ce24896a40f"; + sig_s = "08ecea054800ec201f0d1ac893f3bd79ae48533529345e1d3310fdc747d765970fa55ee0a47bdcd1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393432383533383635"_hex; + sig_r = "d290cf0f9fbd691743b9dcdc00c0816fb99b5ad3b89a23f1313e0bf00cb3e12c95648dce175e3447"; + sig_s = "587707db7e9ddf613ff7d979ba9ca411b4bb7826862a380ce7cebecd52f52ff885f8ad536fbf1123"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323139333833353231"_hex; + sig_r = "34b252604ebd8675104266be4df84b51942687a212957dedd4ab6dff4355a0027b7122aeb1e9f449"; + sig_s = "15082c5764df742c40193a8bf1e38d43a5fa4c77416cd8753057521c765062c676f99be659fcd00e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393236393333343139"_hex; + sig_r = "b45baf5ee188cef5413ef3e6f0d917a90cf263d2be0a7039a6064e6e4053b6c960f44de15932855a"; + sig_s = "47602defee00b2fdea095346deae00b46069c95c09e43594889b8d3aa3d75350377aa3431ef63c76"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373639333836333634"_hex; + sig_r = "6d8267065d60dcd375ce041813d6085fa90246cddbbaba12643c736cc9b7e6d619178f12c6fd2d3a"; + sig_s = "9b72611a5b4f8763e30c11aa791eff6b74c34d05e65451736e2a2b728f2e5ef485dc4e2e5c3daa37"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373335393330353733"_hex; + sig_r = "a1a302aa27a32cd25c336c9ed7adaf5caf33dc3485a813718fce395ec0c93eef4cb34a6518a61cc8"; + sig_s = "258acd1b450082fddc05433e2dd66b0321114395a33bd9827d4c44d486c82c2d229869f3762012fe"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333030353634303635"_hex; + sig_r = "63fad28570b4203502a1d105903244dfe2b09530a93d8ea429a197c7121337a99d4c73516ec66135"; + sig_s = "7b4a08b7cdeaf6eedeec6306a0c410b092718c25590190030c5255bf837393d8293890c84909f436"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333037363535373338"_hex; + sig_r = "c1e6232f06a44de1d7213b20eaa1b89c31dd2f5bb033245e8171524cc9110876d778a04834ac88ee"; + sig_s = "cb4aa20d158c3b8d115ec62bb51545bd58b63f1f0176ada04869dfee84019737cb8072f7a8b940f6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39363537303138313735"_hex; + sig_r = "47b6baa1a053eab8b38ed6c9862f2ffed3811449e49ff2e18a588512129d1dea0a6c4fb811dc5eb0"; + sig_s = "a6cceef5a1e12f9b049f72f53732d42903a733ca6f3fae9596e17d9c757ed4ef04fcc37302ad1f45"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature generated without truncating the hash + m = "313233343030"_hex; + sig_r = "67bea53478364ad2cc40eab42535a4bf8e41583c941cb04ef37f11f035654c331d3bb0ddfd74031d"; + sig_s = "76a9eba43713ed8892a627ed3bcbf7d87f7991d128580a057c1b6388b604954d340e92f41827674b"; + r = false; // result = invalid - flags: ['Untruncatedhash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b21ecd48cc46fb306ed54e88adb615208457bd257e7e9d81db5bd1f56100a7aebb1386465507bbf3", "0086224cb383815e1babe561dcb6f49af0073e1bfda366066ef62440fc81dec7eca021cb0c05091dfb" ); + { + // k*G has a large x-coordinate + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000014064fb4c224a8b248a0d933f7642bd56aced9b12"; + bn_t sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r too large + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e23"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009c9701de2ffdb296e6d56a5f3c189ecbb0e4448e38ed65da46eeaa51a7b34e650a91da95faf17900", "1e0a98a598523a34c4918d4180f87d641e4626ce11fa3a244abfb2450736693d38652309240ebda9" ); + { + // r,s are large + auto m = "313233343030"_hex; + bn_t sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930f"; + bn_t sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b6f0ddc834ef8a67903681ea02b788fcff82d12307c8c3f4a44b30d7c5f614dafcc9a839991f8ee4", "27538e30ae5102b2043957dd6124fba3a1b601c04bddaf6c929ffdf2f7796fd7098c387dbc0b26fb" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bn_t sig_s = "8c0736554dbc446063e8e15f297fd4b66fa8879945bbb5c22714a9645f4fa4ef9d710eafa6b226d8"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6df44321d4a5f6af63e01b79bb608ea04ac6f35f795044a04ff400f547fd34d9b78c12c45978f96f", "00b52901cece48aab432c3dbdcbc0e270b2cc9b9915cc1ffb69a365d84c39186c48177387aa9ee0a48" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bn_t sig_s = "5407cdd593acb501fc2848351f9d2e6b5457d3de43c3130e3b74e6a9242b3cce1c24f094f118bcd6"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4e496f056ab5d07f96562c683643440e31fea26d35e6c5b69eefaa4107d345c807bf279f2ea26b60", "288539766fc726cb9e841db5dcfbbb792cade3c1ef64b69dcbda7f5e497b455a911ce2f0ebcacaad" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "11e094f470948e4eaa6aa13fab4e063386e91a638fa226d988d0693dea719ca95f61e493e9835af4", "3f533e89aa2085a9f8121086a2597f1060f73c8d75d66940e50eead73dfd03c476ea1947cdd4dd3f" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000002"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "16517a7d7beab6472ea8f6bc20412a3cd96d242c246ce9f983b2ef08b284cfad1ac28563b56edafb", "009f56fe2df78c239aa16c3c318bc9191a16ec407a700354173f8b862d9a0aa10d67397f26e7c9c0be" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000003"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008c9ec3ec54f615dbdbd0b22d6ff579c778fba6bc95c8a14d9ba958eb5a479dda750f08db36f3e54d", "00b32c812940cfdf0d8ab89498d8d0cd07536e4e02c6d67e7747fbaed80bcc86993e7e53af1da215af" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "11defb02f29a9094d4f7acadba48b4280ee529586c961cda8bf8af50a0240075c1c70b36d614e7c0", "00b492beb9bc7381321ac6c13766ff7af9d7b2f85f92e5c804488247fd5183707f5b6be591402b0e82" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000002"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "231b9a53f5ea2b91259e96a9d7b34f10663721177f9adecc6a8d5bd8f55e9544be1648490d073295", "198b90ae723a749a7dee59bda317d3029c4d65dda8ad66a04f53ea889f8fdb53e2b70fd1e67925c3" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000003"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r is larger than n + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59313"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000003"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008f12bc4f493dea2d62eb988b47706169d2aaac64b32af001e09646a431419d5905ec6da9ed8bf552", "09a2af9ce875fb535b41fdbe5b7acb6679556b79575865a35d85e1adbea86a5ce2b232f3a00f2726" ); + { + // s is larger than n + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44d86998"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00cd1697c6e107f3d90b8df462eb368b75eba585635950177e0a64b1ad4be527c90957fbdf203d67c8", "4b003f20e81659099b7e466618f2610c6f1df315b2011db07b90f3662b51561fffdf3ebb5d443440" ); + { + // small r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000100"; + bn_t sig_s = "21494db879806d4f59e53d4963977a03f6ec51140c9f9a1dba8857ff3bbc76d2214947e60edc982b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b1e3619d9e35873e959bb7de7740e927e3cb7fcf4413bfdbbed72ecc9a86a50d7029cae08ec285ab", "486b5d2f7c9b9314420bc864cfe29b4064bf7b922bbb5bbcd16f3a81ea7d0a61b0a09a62959b7690" ); + { + // smallish r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000000002d9b4d347952cc"; + bn_t sig_s = "43becc876a63564b458280199e382cbad8ef68d406665bbf307ffea45845a9ac69345a84a5a72b87"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0097cfebab588a54242a4d962ef803376c3f43079aa50a8871d6e776f7a0b33aea46ab9a2da63a33d8", "00c81af34af2e9a0c571effb501c4a27fd2aedc13623447af2bc8b6d5e7208c23e87e2d797cc3cf57e" ); + { + // 100-bit r and small s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000001033e67e37b32b445580bf4efc"; + bn_t sig_s = "3992353d916617b49303856488e39fbc26173b8bc426f8207de3d8f1b97f3d12c803b99d57768fa7"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "296e0067947efc07a06ae218fb00164d1ebebcd3787f793481407e2796248e8b65eac57db0c14606", "729e8094b9a54eeac23d98d51d662eff2df33a8693008fd02a0429ef6851ecbdcd93aac67c2fbdb6" ); + { + // small r and 100 bit s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000100"; + bn_t sig_s = "84380881b243236967227191398a3a4909000425576c79465bdaaa0a03267b9e48f68fa0a68b29e3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a3783b01455d92080f520d171f92abeaf48c7238e168b2931f2b322f9c0faa69a24097836cb0a685", "1cbf1a22bac2437551244605682dabcdd4cf39ff9d08443921c99448cbcea5deb85ad952dbb2b967" ); + { + // 100-bit r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000062522bbd3ecbe7c39e93e7c24"; + bn_t sig_s = "84380881b243236967227191398a3a4909000425576c79465bdaaa0a03267b9e48f68fa0a68b29e3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "70d5fd41c416d5b7cdbcb944205bd69ff00ed6354aa502757e089cb19af6f777beb0f6921c0fafac", "22ae7cc65e0e7b617423750b8493a58512e379c00de626c17f7c82bfc907f26610a3f1e4d132c575" ); + { + // r and s^-1 are close to n + auto m = "313233343030"_hex; + bn_t sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59294"; + bn_t sig_s = "8ce984c0247d8a7a9628503f36abeaeea65fdfc3cf0a0c6cc8dac9da9f043b4659b638e7832e620b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a878e3ad1f76c570331a3418765dfdb7316743a14778b859900bc5b2a6adb16217b1933e6878e121", "7bb7d9c606ac5e72f3c7d83d33eeb69ee3f8cfe8b4074ff530c97608c8aa2e3954798412ed47558c" ); + { + // r and s are 64-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000009c44febf31c35950"; + bn_t sig_s = "0000000000000000000000000000000000000000000000000000000000000000839ed28247c2b06b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00caa94725e1292a67fd7f1afb248b60c17a5be2f4c6456ca6b34cd21086cd50db61a39f097947309b", "008b0ddcb72f2652f11b2700c030b687ba2cb42e0d8e05aab0e6cdf45ceb6b6c776df7493f7315a66b" ); + { + // r and s are 100-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000009df8b682430beef6f5fd7c7cd"; + bn_t sig_s = "0000000000000000000000000000000000000000000000000000000fd0a62e13778f4222a0d61c8a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "70a6580abdcc1db9f73635788ca9748fde403b5a85aaffca80ad06e543b8ff38fc9a2009a42bb25e", "0422cce30e0dd5f0fed0b9811d564411c53ff03e078e2cec7a68b109aa1d1e674b48c87a0bfe8505" ); + { + // r and s are 128-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000008a598e563a89f526c32ebec8de26367a"; + bn_t sig_s = "00000000000000000000000000000000000000000000000084f633e2042630e99dd0f1e16f7a04bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0d97429d93169b43aae72e5f7cfbc4b9f497ac4b1698551e6d5d3cf334fa9cd4a5007e0475ba5401", "79c2b1cc2d8271746eca7c19c6fde7855bfd521fe8c761c4cf47c4bf2e4de49f94476776e959af9e" ); + { + // r and s are 160-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000aa6eeb5823f7fa31b466bb473797f0d0314c0bdf"; + bn_t sig_s = "0000000000000000000000000000000000000000e2977c479e6d25703cebbc6bd561938cc9d1bfb9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "06828ce63f3b0d694ce2999d06947fa9e2d1c18ab8032652fa7a98c678cf6bb2c52e7369085e4ef7", "00c56df69128962fbefc2aef1b3f6c467b72fc305acf51b339643ca2ed6bde56317c4cf59895923ded" ); + { + // s == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // s == 0 + m = "313233343030"_hex; + sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a528dceb92a745c1bf3173bc8d1b51d9420b96a474428dbb043cba2b370458a9bb358414d9733e80", "622579790a9a9e38c6774462e77268f77285919be63f80729e8c3007b4e4b9349e917574ae5f8bdd" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "336758275671b26064a2ee5ed995236c650c22045c98e6c1a63b03d2d353cd8d474006977dd0ff40"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4d6e7590224fd2a7726a9c9692485626d7436113c6b1f63b18c8219dce135f212530e2d6e2b5dc60", "00826c8eee3756db6ce23de1919c0302f090493cb5629bb1b2f6ee6a309023cd00d95811d2896773d4" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "52ca79c89313d4f18ad1515df6b2f32c0e95774739ad64391155257026ac1a48d008404e8068b4f9"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "77fdf8489f8677e627e95117995d2e0eb139e52535116f9ab24af470267d828240ab7e303231d691", "00b94572cd603477f753dd52e74a6b3984fa2e9036124fbbf8a5322651400ae53247b1f67c1a614206" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "59bcfbcf6f28b79195bf98394b7ec6b4698ba4fdc6cb72389fabdb07fe29de4ebcc4906bcbbce67b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "755a598c9432ed6ef132dd5a96c710b86d01f53fe2fe58211fcc7c64c768d8afe00e6fa6978f83d9", "449c032f09fbb15d913937cd7db700ea56ba9516f383433b34b2bea7881e51b6009d1f0419a6e528" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "3e58def7758c644788a67c4ef9ee602236fa4d7466066fb6c1d83ad3e90d355489a6eb93baa0bc61"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6d0dd2e3a42aa76e6513f8beee89d1d861bab426bd29069d6054610697069a0b3bc17c9c40672d69", "0358e44f935a6f9aaf1e3e948e8f63df5ffee132766f8e2ad2db31fa315994a1e0810df08f4e0130" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "68ae43de1cec917435cd3b4575c37b3b73b2aa300d9dfab2458b523ebea2d21667a9facc1559a723"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "45ae365e942fed73480077187683987a5263561c4da80d2330638c7f283be2d697f0e533e717cabe", "00b54be0c00cac148e52059af9e5380478c01631a4d68f0dbd0fd5a638bc9c26d06b7a231de2849a98" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "441ac1ef4c8c84c4c7d07c9b08b16822b5bfa5b5bc61f2874c15f9021944a0f6e34ed17f67c27cad"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1d052006191eb87fdddcdfdda6cfb1762073fc96b4c376d6a58e88a61f14dc62f53fa5a9e840488a", "7298debbce38b9afa2b9db3730468a9ac8858daca5968cae52c90a779cc41e426800993c3ed01e1f" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "3f8d645a4bb4a71f78e85d0613cea2efcc80562b215117f8336c4a52b194275ed10fa194e68da54b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c0273f20d057b4e9df5689ee292209fb87878870060626d01cd6f131f07b9be9ce47d253912e9d53", "0091e0921bcdaabf599f82c7be7a36541194e75bcbdf824134d7bde917f6cac4022ae25c6e97be9c70" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "61e07b834a8be8ebf55cef4a7a9c14845eaea0ffe66fb98efb4472fa544c336ece34c991b4ab70b6"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0e39031830ca7edce7972c358be82376e667b10a56367d3dc4c974ad50d802f6613930937bdc65e2", "5951f6f3d52ad94ac8a2ad2535c7d61d7f13cdc7946f715a9ebdeda626a724872867c08735b537ff" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "698ea749c25d9a934d50e1bb20d8246243cc650d16bdc4cb165553a01fdab3dc3bacbf053fe5697d"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "40060af51065e69b454762703ada9e0dee1eb92941253400c125501c932d1d790197be29d8a4573a", "4709195e38285571a23d12086103698849785f1a5957efed861b51bfde70767e2fe00ef5190e1eea" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "586cebd6cc793cc71e949245c5d7044e47b786f3a0779271d3028cd5c9d0eee17c55ca55a82e4801"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "77e02441e9977a3c7d8cd16b1ef27a0de1a658787b82d7bbf70674a4ad31e4125e6282a29dfba202", "0089a75f0dda45602349d7901518df670bc679e3163b25f7f77af50add012bae0b381b564484202724" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "02ee7092471bcbd0194245d7662a7c8ee77414f0316e4401a17e25ffe1c8421e73c0debb46806de2"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a7e3a5a77dcfe4d67b05afb3f51a575208623fcc53b051910efcb660eeb1cf2390846e55524ba564", "00c1c8a6a3fa6e808d44ac7dbe2cf13b4a4d4f46e6db28c6a4ad02f8d74c18cc45fe28be9ef29cd72e" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "443c61e33c82a08bce3bb29d30e976cc97d5d7134f1be7402f841def418e78362133f07224919d88"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "30087102951c74de9c10c6b07116decbba916f2a24debf027de887abec0451dda9e69e5497b180fa", "0354e5ff4cd580364f1fe598877ddbdfdfedc1a24411e9b96bc0d08d0b5ed55e7c10c99ad691ea5c" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "47ae4a0ce41f8da4b35f63b1bd55a01e239571a23981cff63c5f845b314bf81208e374cb3fcd64ed"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009657b24f3a8e68f270ed824c0926d290a62b782fbaf5c9793174c80dc36b7c5678aab8981678c679", "2b9aaae5abe080b9467c5fc58ef8a835d38c9aa821751134c07880a72e1862c63f840f48cf253cc5" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "1de9e7aa69ae45a73f6b3a05cc19b7771277b81e16ad5c508539fe05a86cf112d1b764510b4357e6"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5605f3a5152c30346c7eb48a3cdff5ade0d81e6987460ff68f9d412ec676e84fb9a3164e43eb9c9f", "40de2377f81398e9728569423a93dacd6f07ecd38354ca1f487c4bdd8900b9e6024ae47bd3f44efa" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "1f0eb2e2f039733cbab46abd9fbbe0c2bf8a73b76a12ff21d9c845dd707bf1b9e3d2d629ad4cb8c1"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "202516ad663775f12155521079037f3fca50c64faa4afd886add4daab927f3f62aa2dae684a635d6", "632aedd530e61dab35916962ee8f23ed688198afd5ad6b0705e2ef9d0ba3c5333b15bdab432ee342" ); + { + // point at infinity during verify + auto m = "313233343030"_hex; + bn_t sig_r = "69af23901b5e27dbf09e3c2f6900f032fcc7e7d2db47895196a41763f7432c74c348aaada262c988"; + bn_t sig_s = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + auto r = false; // result = invalid - flags: ['PointDuplication', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00823a830c58d9dd370f687ff819142b644ac9dc18a94681e2245eb22f27e333e62fece397231769da", "36a7e237ea2f3e2472de147e166ce4bd8248208df538ac00f5b2299e2d729b0dd80e3e106c060844" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "69af23901b5e27dbf09e3c2f6900f032fcc7e7d2db47895196a41763f7432c74c348aaada262c988"; + bn_t sig_s = "69af23901b5e27dbf09e3c2f6900f032fcc7e7d2db47895196a41763f7432c74c348aaada262c988"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "387a759284f65d2d93f541f2766f846abdec239190e8cddba9b7564a83d58162a489f25f0d43b4f8", "424625a6c1e1589474c30e6383c925b363239d1a87b9634fd8aac2eb0ce39e3763873de77358bd4b" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "69af23901b5e27dbf09e3c2f6900f032fcc7e7d2db47895196a41763f7432c74c348aaada262c988"; + bn_t sig_s = "69af23901b5e27dbf09e3c2f6900f032fcc7e7d2db47895196a41763f7432c74c348aaada262c989"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6b4327117e9c04d7a58259c5207a36e8d278e873b92b5b3a70a3c4742cc583b41408aaab23a12a9c", "009b0b26160c548abacd7f0e37276f917c09721b3844d0b26e9ed5c76c99787992259bf0f7b02445d3" ); + { + // u1 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb700"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "277f487faf77a65dbb791536e863b8c70f904fcdcaf52740d4bd5c469731e58ea6bd53e8d7720228", "2d346f2b4ca7bacb882fef749c2713f1a75f00827e8b9b9f744a0e1e34bcf80799a120950de95d99" ); + { + // u1 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "ad0b664f9559e29e46fd4fd390e75abebf14997d17a1a3304c80e451fc8f79bb7cff168e17de6f22"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "73bd62f3bb329d65092b5d13c5746d462401d2600994d8fe2ec5ef5b9f3399084b1ddc64cb334bae", "00c1d1ac4f9a0c2a79ef7ccc4ae9165ddfa76138235718cf24032c33f9db4a26b2b03692a56f5202eb" ); + { + // u2 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "20a75551035db95d7a1a673d464d276da0861008e4644c582bc10a1beeaeb070823fd064a2625ebb", "5d47f0c77fc57e3bb0e153bbc7e9bbde8db98b0c46c58154af5b9786b10ba12ab3ba8533a3992883" ); + { + // u2 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "8ce984c0247d8a7a9628503f36abeaeea65fdfc3cf0a0c6cc8dac9da9f043b4659b638e7832e620c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3f436d07cb0264b13f92fd696334a4e51b7d6619e2d043b2d0d278963f2516200ef905ebf6716663", "40e642b6c966072b79278003651128879f19dee01273b66bead8045194277c9284093348d90569b1" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "0cc64af035cb79b3336a62d915b381e268d3bcb834f9cfd0f597c37ca5fcf50f588614ef0ef7b6a5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c16fbe6d0d77327cf9a65f987c2fe7ee1807851c0e1c8bc4f0622807dcd4a88b3b912eb0475471e5", "75421c40540050507a163f23cc7cb90acc52822d01d245ab70dcaac06e2ea644327a85f595d026ef" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "8e765d0d1cf9539f682a4155b6d60eb6aa6862b2af9e9d3f94c9ad46d332f0e029775522815c0e5a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00be924007d6e22b944ac76da7fc2660d1aefab69471bd835bd78edd2c10621e76f718bfd0a5e2307e", "00c62583d5ba5cc1c547630476b399866e7ed953b538f76c86afe9cfd0854b57e33691c77e444ccab8" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "7225a960d967cfe52ac126a50fd79fa85a586397c0b298c8adfaf138317b0f794b24f53bd920c1cf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00acf240130d47d4a57d606595f989129fea7e9744b1e53f5ce679c244c85af35c618607e2ecce1a43", "1b696a7959fe30d049100dd54258181b08a2fe442e41ff29523c11a3e01028eb64b321c2b702579c" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "874f311b6b9ac74fc34c60c0941873651b3c0ec1d097a7861e0c7fbec3226f23a5e2c929d856ecb3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "46243b39e77639ac19e9be53669317d9598e03ec30a0cf6930f800009833826a59ade5321933ff2f", "69d770b978ccc36c90b748e5010636e7004ddc19885da7bb90dbfad479fc52dce4b9281405f1c6bd" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "13753ac90fbc7edfdcb32e1697fdfd41b1fb59c5ad177e96feacc87522ef928de80a60bb0f32e7e2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b4b9b6ba3c0e7509c275894e84e818d71de14577bdb4bf0b8e5e1332d1087f3c333b73e8ab75f2c9", "4f33d0e2ab342d2e1968ce3e1c47be87e39ee88273ae4cf777869d3a1703b63a983d2d43c59303e5" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "26ea75921f78fdbfb9665c2d2ffbfa8363f6b38b5a2efd2dfd5990ea45df251bd014c1761e65cfc4"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "03015b3ca67683467c79446d4b93d10978330856eee40d6d58683ac73500ae315c5b582351c4226b", "18d89561d3ffa0f9311aa616547f7eb1d36e73a6cc4bd230df34a1f319be66bcb2fb0e1f68cc192e" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "9fee192930d30502c05e56adf086ecd13a92cd43ce0c72ea65ead43667890ae19be835333c32c5f0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "187d93f84a0e6043f097d0a87f8dca07739cf44548a7d3403e039e49c4c51285482975af54ec056c", "0623c57538fefb7231d619bbefd4cab373a54b361354e586b1d9981a8835e9c6beab082cb93e13b6" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "963f97cb35a321df62fc219eb2f3703949c483165d06db13c403080a86c1e5d9b43d2e8dd9643cde"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0855cc20351126b38f934fbb56c302f62a360e62493c2d529fb87caea0d71bfdaf5fcc3368d495fd", "1ce7578610cbec465398b2c1238b3e23b9e29b476196106430d76316aaf29937ace658b69c8bfb99" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "13dbff9e667e7bcd44950226f93b09738e793517c02886ae9f2b3dededa756c9049ab9a46bc7c93e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0094c54919004079be0db4c92dc1fc947d79eb0f8e869d94813886ada4254f1dadb4d87a6112a58336", "0086d8b5beac00fafd647ef8b631e899a6a8b72a511d4f50ce156648ad9cb708fb2fb2c638fdb9f332" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "852466cef316992b3ca25cc54b7f4fda2e8a819e7c4b040543e94f9caca02937681c2019bb49ee43"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2bca76043728b5eeefde89d25acdf2e0b160c5ae0ccdab6bd3baa479f17753c3c000ccf8ba8623de", "0092f0c2d68a1bd405e449823fe63b21402aef3e9a017dcbc30af18bcc79a85264834398c72fa2bb16" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "634bfe1800786b0256e90ac2de272f41c85e0976c0caa1691bd835a5a444b1ed1705a0361ae6ee36"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1c013b3a3260ccfb53e3f6ce93e6984865dc8e1293e92301f4cb3a554bd5da8a53ee101b3e1a3009", "0097d2901e26729303e1cb93a8b72dc2afc90ff5b44fd5b6624455487974ed71c7833eff03cc128d0c" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "c697fc3000f0d604add21585bc4e5e8390bc12ed819542d237b06b4b488963da2e0b406c35cddc6c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "624bec4520e6044abed1eee4964668775181464c5d6bf5a8b539f1156f3248c02271bf9425b966b5", "47f406bcc143226d814cdb988d76412ad186bdeeb869ad78a32fe87c76f2545447ddf8fbd0430811" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "5685b327caacf14f237ea7e9c873ad5f5f8a4cbe8bd0d19826407228fe47bcddbe7f8b470bef3791"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1b2b2738e3055d1596f64176cf0ac381b3a8178a2f021403350218fa18f9f860c1bba39fc524bc82", "09fbafca1afc5af7598b878d69cb875be0d39f41ff01b09388693eb310adc9d4836e226c23677e51" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "a2c1f84088120fce85fecf81f0ecc00729f4199ebba0d5b5eda190001000b43168db254b8ef32a70"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "40902bf6b239d2f3588260e9d7f512253fa44f308a0ab81dff05b8fa2e25814d65c2018d49390aae", "016f8ae5691938402adc0ffa29bb87ef0af0ecf3cd446d97c3e8d12b3b09eb78909c1b91b1b8785f" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "711f6d0abce96fe7f5bed2ca4600a021fdda9a8c922fb0e10f180f97fa2cc84dd785c71e6c41dbaf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "726533e26773ac720a115b02de89ac15966677e239b7c577a1c15b81027b1feb73e673601e211aa9", "2accb585bc06cc274b61c9e614746edd248d1cccf8d8b1ab4bc15cc58cdf116065ce9767f2a3223d" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "02a6eb408443d24e96be4ca0278442a8a426087f9beb03ffe5526162bf1dc30434cf7ea79574b19b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "53c3da4de14f7d35775f9beca6d53ee78dac73cd3f18c6fbf709b4ffa7dd3e70b436409b9b285d1c", "2a5b60e457e58422c959142b5ecff236dfd76c99c3018cea904058099a13647db08898cfd0509e84" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "b6ba1aecd240debe77213a4228b125603671c9d5147b6c0b36dd23e42b7cb5078a1b8fdf1b98b93a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00cd24ae7f7523adf859db92e51d48746b8b2f868620898a9c42f8bae8173e3646f586fd818712430e", "55b12d59f7344168f796fe59c026eaaa139745a8ace97df1d5c6bcc21f0cfa6860f9c8c75f391629" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "957b383ba1cebf5ca579ef6ed10027988f8424f42ffbea2e51b3340df9f8c3c60b558d6dc2df10f3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4db460209972c8e9c365119546ac457add157f0c4d2b3cd65c635dcaeca617029cabf75c06101bb6", "009ef8b7626e6b2f9845b0086d2a964018b9b25eb8db426bc90694cc614b7602b1fd6087a9a71cbf1f" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "98ff1db1b9affa33a2e53c684d3f07611772405e8c200f2af2afa9e53c6e8ef30cc143b3f5ff7fb0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3e7ab850840d75987d33837ead46499ce433f3fce67383b2e325dd2fc7e0f500769cbb67b4550a28", "00c30314487a87094750334499dbfbeb2d5cb976ee2d47997321597a41124a038fe867be0ef668c4ce" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "5e9ff4433ca3a4af648e0071c87c2e5c3554b11761b10bb2b81725028a56c4fc92f1320ca7396c4f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7acc919934b0fd90011cd96f59ddba52e12094dac18a2cadcb03a0f31ac72d3fd5984a11e9220f8c", "0629bc5f3f0dabbd3fdd30f47a0a5bea3052892f8e50a4033be4795b32c6671d141b473080e57911" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "c76ce53560163f157b11e4d05c61540a5df6b8241cbd3ba7d911a7541eec55e986ebf811ae50a8b9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "12c163fe25cb79ad59c76b5280dc6706a42c58596230bf7ba7206e6ce2b467e1b7a7063e59b0bed6", "00ccbeaf22accb1ac41ed43ac775b97aea3a688e2f096c3a5e59f868bc919da5ce252cf5d712e7de40" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "4218a45116ea65b283cc7d90a510f077b1b09eddbcfca3e7d2896b869dd3ba556c4f10590b0e08cf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6960bfcddd0021fcb8a3d7aa85f96cf360a7113e3824508525021f83e3085989c35e0c5772650330", "5c1275b9d8b5199d461fcb9d34f8857b65a140462fd5cdc7a33e5cf7f4e2d08a5a34d9ae00b2939a" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "5e5f32423bad3644be718d8195341362c9cba52b330f913b1521af6e5e3eb2069421b05dcac299f7"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "66ad2c26012388c8b9046a466b87bd71b64ab81b54cffc5a611f4b7581ad8365edd08e6afd4a52f6", "1a3066c0b3b703ddce746239a4d3dbf1938945f15ea9497bbfc45b389e130350b9945922b87ce374" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "ac07aaade5c5fb2fe5a18bbefd262e0e439fd68e0a317db06ff4ba623a2a03114ec5b6e084171058"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0cfa6e3838d8113a24d87db97417d68f00c426e9b8550d8a951fed531572e7cca66ffe0ae176ff0e", "312fa02e5cc77c21f4a6630e25bcb987dc1eef14aec80c15b9b292e3acfb30bc2c0438f0a9831c07" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "311f6d0abce96fe7f5bed2ca4600a021fdda9a8c922fb0e10f180f97fa2cc84dd785c71e6c41dbb1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3dabbc36a455ba07432da1aa7239aefdefb72ac09313c3a7f3439850f602543eb4affc5d8225b5ee", "00ce48e2f67e82d448b3d8b9b0fc200832a3d1ac88058872762fcbf027e9f5705d8f5812e507dae125" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "623eda1579d2dfcfeb7da5948c014043fbb53519245f61c21e301f2ff459909baf0b8e3cd883b762"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008a9658dc5f91aa577706f1d91d2252cb0d09f2053e561129105c7f37ddb2f972b3224f12cf9e43fe", "08782ec6105f4c06587eb1ececb2f4f4a04e236304dc75eb2efff0be66b977fa804af73bfcbac78e" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "935e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59313"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "06b43bb9587ee158ad5752d1ad11f6f0f5e316ad21937cdd9253f3844857f0a25e7b677bbf999444", "009705362334bdceb68ae6a584640c95cb10789b19953f5e119973eed735177aabfcb263fc8ef5ef97" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "5b5d0d7669206f5f3b909d21145892b01b38e4ea8a3db6059b6e91f215be5a83c50dc7ef8dcc5c9d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f423999", "00c08367945495d933f206927a2b7f5b74b22f973a898355aa2f7e295e06ef3a4f561546db97f79afa" ); + { + // point duplication during verification + auto m = "313233343030"_hex; + bn_t sig_r = "9563bd68545ccd185ae724d8efcd4cc23234934eef10f280792b2f930c97a6c1e00829a8b975b9ee"; + bn_t sig_s = "c5e79c49abb135129f0636e18e2e73bced30855deeba1477d9521b33a32865155177d946e1babcb4"; + auto r = true; // result = valid - flags: ['PointDuplication'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f423999", "12dadf8be2267683ef35e5e4a68284f14760386c6d70b8452014908e71a4b1d9a6becbd659bb932d" ); + { + // duplication bug + auto m = "313233343030"_hex; + bn_t sig_r = "9563bd68545ccd185ae724d8efcd4cc23234934eef10f280792b2f930c97a6c1e00829a8b975b9ee"; + bn_t sig_s = "c5e79c49abb135129f0636e18e2e73bced30855deeba1477d9521b33a32865155177d946e1babcb4"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5d1a100118bd3610f10e13b5adcc7a90a37f4f988cfa4e22cca77e88444b00216dcfe5f68418d342", "5d5b88c9b8c92b3dec7f7bcc688a6d18e6cdeb9176150d4b1062a832c8a3bc377f8d7e98b1db0b9d" ); + { + // comparison with point at infinity + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "2a460e39a48c0ff193727e795d339347984ff65457b636ed6f74d627fc8144fb81504445742783d0"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00cca9ac38de5b36cf79d8e415cb729e685e0bbdafe161c5e7ecfa4177e826e815d66526aa5daf3227", "009b7799bcefc6b5d8d09ff1a0739fd423188126f80af703314da0d26ba6714aa197a6582c36b0f05d" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "2fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8"; + bn_t sig_s = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00cceaa1203bdcbe15e20434d624f0ed9aca81d4c82f840bba3a86c6756262aa37efed62f5f1d097f7", "457057b98d2b9ea6bd28581d40ac20fcc9d536a117769203447bf41e10ce4da1ad794ca20f8ee146" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8"; + bn_t sig_s = "1e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00cc9ed25f13e94a6ebd531f3b142fabc4ed522dc6127861528830c6787d6ecfd4b704e1774e9118ed", "68e4e172f93f1d5b8d7860fae2c115f4aa0daaf6df5ca3809d79acfdb9ed2be19995658d2f44d235" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8"; + bn_t sig_s = "2a460e39a48c0ff193727e795d339347984ff65457b636ed6f74d627fc8144fb81504445742783d0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6a3cae0edc8455ae16b5eeb6569603bdaeb5793699e85d372857f1319c70dd525b1ea30a0f5c7b44", "075537cd822d9ee2d0e7a49c4c3141445d01b789bbcad02ec4249c2e2355d61db5581dbdb342c993" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8"; + bn_t sig_s = "a91838e692303fc64dc9f9e574ce4d1e613fd9515ed8dbb5bdd3589ff20513ee05411115d09e0f41"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4efb5161ca1a1eeb59a5fc39cd521d40bd3e034512fa2a1eaf3b7e92bb9e95c06a4c726ceccdf9bc", "6bfa801b067137f1b6b4506041130b4d402d90087ad005e3f652e1d91c9d344cd1eeffff61d3a306" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8"; + bn_t sig_s = "b52c3cf70a58445477eab051464ac05768321fb29c7aa242b9194cab5ebc4c35e10edb72cd3ba2a1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5f658687e6a542a91d893b48776a86d528fd399781bbb9305be0797e3a6f36118ae19e68dc1673f6", "676e536c7897a0002f9664929631f418c4537d23749220c50a32121c434dcad2a6cdc203cd035a32" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "2fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8"; + bn_t sig_s = "53bf06e43fcc4236b2ec0d88471379053f1f3437207c5a75b09036b1c40fa8f3128277894a4c96cf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0090537a6827a25060273d44d4846aea596682df0a59d0ffe79be2a1ebe918703cabfac64da5e59100", "3309180d9da5e78237b95403c52f3ceee503067b672715e97d8b6369342684a72f467698741b1a1f" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611"; + bn_t sig_s = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a81ccbf4fc4457033bd49ceac8fa52e459400730b877305be0418153d278d30b5973777a7dd1c2c1", "7544ff1b76208e841053ecaef7a5869e92da08c5c4c3d0a167d5685eb721d620339cc9b00149838e" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611"; + bn_t sig_s = "1e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ba160089327cf8ba163eefa476a4eafd0f6ce9d55292f6724d020f0efac54bf684f9d5f5695f89c2", "00b4de70dc4ab265761827323da3b2b055ac1187fc5341e4555ebc6f6993b4c3fdd89863fc55ea38b4" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611"; + bn_t sig_s = "2a460e39a48c0ff193727e795d339347984ff65457b636ed6f74d627fc8144fb81504445742783d0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4a5cf447550f0ff2efa193c3e185db604fcfd7de5c47a59a392da0c7572f061038c6af5afcfa9bd5", "30b7682b82010c39334ba2edecf0a23bca09e810d745bdf73e445e80ace0e5399fa26102cb3faee6" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611"; + bn_t sig_s = "a91838e692303fc64dc9f9e574ce4d1e613fd9515ed8dbb5bdd3589ff20513ee05411115d09e0f41"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5d3fef1b96dbc8ca9330508ad4ced491e627eb67cba8c6b1537937498ee3021b45ca6759117d89c4", "00ad2b699e3ef9516fff2ed2e134931c96d28d3e14dd51c5b87589a8fa88af2529b8caa0f785ce2033" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611"; + bn_t sig_s = "b52c3cf70a58445477eab051464ac05768321fb29c7aa242b9194cab5ebc4c35e10edb72cd3ba2a1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a8336702c158dcae495f1c9cd720c39f15c123a67750dcd74520c34cf67907e49220bcd020cc3a60", "151a432ee3e23a74c8b8a98d8e7c672216df48d8a60d3f592f6673830ac9ecfbcd00550db7ad5c62" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611"; + bn_t sig_s = "53bf06e43fcc4236b2ec0d88471379053f1f3437207c5a75b09036b1c40fa8f3128277894a4c96cf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611", "14fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb700"; + bn_t sig_s = "1e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "ad0b664f9559e29e46fd4fd390e75abebf14997d17a1a3304c80e451fc8f79bb7cff168e17de6f22"; + sig_s = "1e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611", "00be6076caf0d032ef35fbe53a528ab907f24bcfb9e5828b04a5cb4174cde781612981cce088849f46" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb700"; + bn_t sig_s = "1e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "ad0b664f9559e29e46fd4fd390e75abebf14997d17a1a3304c80e451fc8f79bb7cff168e17de6f22"; + sig_s = "1e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "44ab2320c2297b66114428df33fe641956f82033893398af3b49b0023179201c27d26dd65121c06e", "0c59524c938f19daffc2a9a4679dba7cf1991ced4700592bb75e98cf77dbf6c584c2f72735152921" ); + { + // pseudorandom signature + auto m = ""_hex; + bn_t sig_r = "9cf7f0d60cc1fb2d4b3e78d5f83b374e17a4aebccc6e723f1ad35babb2acfb2b75530389189395f8"; + bn_t sig_s = "001110c5b8b8e5fa8dc7952a7bf6200bddae6c1d66639a07a4b6046e00bfa7a2bd9d5777b80c3a92"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "4d7367"_hex; + sig_r = "26fd695ee1cc50c2661c2434f8699577af181304bceb7690c538b03463df24334395e791f6750ff6"; + sig_s = "b322618cd50c6a7cffcb419ec05b67ec6a117088c78d57cecdd224902d391892ca03e4bc1bd0467b"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "313233343030"_hex; + sig_r = "7a31b7375f924369ec12bc33b834726c95444a4c263557344afa732cf48a155e71a6ee7de42e91ce"; + sig_s = "24d3d72861f4d2b551c10f0294d16a3bf1d4ee3e484439b804d097dea2d7cace76ade14af1663322"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "0000000000000000000000000000000000000000"_hex; + sig_r = "2417eb10a538921621066608243fd6574de84ef1281520f01ebe0444b46a607ab9eda8f3721779a6"; + sig_s = "8f1e2ea294028baeb738181e128c86ad55cb1945436cf69e090c2f6159f6f22011d731733b4433ba"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } // End of Google's Wycheproof tests ecdsa_brainpoolP320r1_sha384_p1363_test + + // Test vectors from Google's Wycheproof RSA signature verification tests. + // Generated from: 'ecdsa_brainpoolP320r1_sha3_384_test.json' + // URL: 'https://raw.githubusercontent.com/google/wycheproof/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_brainpoolP320r1_sha3_384_test.json' + // Note: + // Test vectors with flag(s) 'BER', 'BerEncodedSignature', 'SignatureSize', 'MissingZero', 'InvalidEncoding' were not included. + // All test(s) with BER/DER decoding related errors were not included because they're not part of this test scope. + // + // Algorithm: ECDSA + // GeneratorVersion: 0.9rc5 + // Header: Test vectors of type EcdsaVerify are meant for the verification of ASN encoded ECDSA signatures. + // Notes: ArithmeticError - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.', 'cves': ['CVE-2017-18146']} + // BerEncodedSignature - {'bugType': 'BER_ENCODING', 'description': 'ECDSA signatures are usually DER encoded. This signature contains valid values for r and s, but it uses alternative BER encoding.', 'effect': 'Accepting alternative BER encodings may be benign in some cases, or be an issue if protocol requires signature malleability.', 'cves': ['CVE-2020-14966', 'CVE-2020-13822', 'CVE-2019-14859', 'CVE-2016-1000342']} + // EdgeCaseShamirMultiplication - {'bugType': 'EDGE_CASE', 'description': "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used."} + // IntegerOverflow - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidEncoding - {'bugType': 'CAN_OF_WORMS', 'description': 'ECDSA signatures are encoded using ASN.1. This test vector contains an incorrectly encoded signature. The test vector itself was generated from a valid signature by modifying its encoding.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449', 'CVE-2021-43572', 'CVE-2022-24884']} + // InvalidTypesInSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains invalid types. Dynamic typed languages sometime coerce such values of different types into integers. If an implementation is careless and has additional bugs, such as not checking integer boundaries then it may be possible that such signatures are accepted.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449']} + // ModifiedInteger - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModifiedSignature - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an invalid signature that was generated from a valid signature by modifying it.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModularInverse - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where computing the modular inverse of s hits an edge case.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['CVE-2019-0865']} + // PointDuplication - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.', 'cves': ['2020-12607', 'CVE-2015-2730']} + // RangeCheck - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // SmallRandS - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['2020-13895']} + // SpecialCaseHash - {'bugType': 'EDGE_CASE', 'description': 'The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits.'} + // Untruncatedhash - {'bugType': 'MISSING_STEP', 'description': 'If the size of the digest is longer than the size of the underlying order of the multiplicative subgroup then the hash digest must be truncated during signature generation and verification. This test vector contains a signature where this step has been omitted.'} + // ValidSignature - {'bugType': 'BASIC', 'description': 'The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported.'} + { + auto pubkey = curve.make_point( "44ab2320c2297b66114428df33fe641956f82033893398af3b49b0023179201c27d26dd65121c06e", "0c59524c938f19daffc2a9a4679dba7cf1991ced4700592bb75e98cf77dbf6c584c2f72735152921" ); + { + // pseudorandom signature + auto m = ""_hex; + bn_t sig_r = "1df0b7216839cbb0053b366f923c33026fc24098f018447d0cc6876c1676e07e499d948316cd3a48"; + bn_t sig_s = "826976dc125cf3e56ec88a6f8f0869fec2170d5ddf322057d7b3408860862d8f30752a46c131cc25"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "4d7367"_hex; + sig_r = "990dc69bca3e68f79f0e59a60f0008c70daa5031f09255a5cc7b850d4787339b9a2a35455137b896"; + sig_s = "576c1476d74a36ca1a426b5ad68499eab0a3d1096ddf6783c88718303d11b3646d1b419e16fd7378"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "313233343030"_hex; + sig_r = "26134e31915b884eb75efcc379b720c3e9016efb11d4005f9568d66bf7f160c1f4a67617dce6bdd8"; + sig_s = "47b3bea3826468b7e252bf458fee8992b2ef6957ba41df53f94223a123c9e83db0521fb2be86dbb3"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "0000000000000000000000000000000000000000"_hex; + sig_r = "cd231c280096b5cb236a53f5edde23c7f25f00bbe1b5ebb19852f6586de77ebd9de1a2cc93b95e5f"; + sig_s = "1c8353a32cbc8bd23d58517da603c4ba83caf1655e82cd91692b8f03c7ca10934836284fec067d5c"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0fcc8860cb26e262ca8b4ecb9c52f78d82a10a1d30dd0c8ecd7584ce80dbb75c488a062b64375500", "1f27e676c26cd3488c1ef4ec3edd88cf8af78daf9036724b57e66da02cf7c676a53664becdfedc3b" ); + { + // signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "7859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d7"; + bn_t sig_s = "8f55283e35bba5abb958fe66060bfb1d9f264b8201bfdce10d60c7bad8c50ff6eb8d2170d662cee0"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // valid + m = "313233343030"_hex; + sig_r = "7859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d7"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending 0's to r + m = "313233343030"_hex; + sig_r = "7859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d70000"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending null value to r + m = "313233343030"_hex; + sig_r = "7859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d70500"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying first byte of r + m = "313233343030"_hex; + sig_r = "7a59faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d7"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying last byte of r + m = "313233343030"_hex; + sig_r = "7859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a457"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated r + m = "313233343030"_hex; + sig_r = "7859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated r + m = "313233343030"_hex; + sig_r = "59faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d7"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // leading ff in r + m = "313233343030"_hex; + sig_r = "ff7859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d7"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replacing r with zero + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending 0's to s + m = "313233343030"_hex; + sig_r = "7859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d7"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c4310000"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending null value to s + m = "313233343030"_hex; + sig_r = "7859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d7"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c4310500"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying first byte of s + m = "313233343030"_hex; + sig_r = "7859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d7"; + sig_s = "46091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying last byte of s + m = "313233343030"_hex; + sig_r = "7859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d7"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c4b1"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated s + m = "313233343030"_hex; + sig_r = "7859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d7"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c4"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated s + m = "313233343030"_hex; + sig_r = "7859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d7"; + sig_s = "091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // leading ff in s + m = "313233343030"_hex; + sig_r = "7859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d7"; + sig_s = "ff44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replacing s with zero + m = "313233343030"_hex; + sig_r = "7859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d7"; + sig_s = "00"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + n + m = "313233343030"_hex; + sig_r = "014bb841c7873d9a2e43e2c374755afb4805bb5f433e660ca8be5929e51025c65e9bcc441393b737e8"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r - n + m = "313233343030"_hex; + sig_r = "a4fbb38719c4fabe8169d2b6d1573a7c129bbff7d147e76263c8cc553319148b8ea9995d0a2c11c6"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 256 * n + m = "313233343030"_hex; + sig_r = "d3d6a11ade0cd102579f1ea9e7a53980db9bfb355416e99d32d93fc30ba7f856fba69049fd1484b5d7"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by -r + m = "313233343030"_hex; + sig_r = "87a60558af7eb5899d59b4ea5ca6e51df3d47062782905fa6eef04e2de60928aeac51147b10e5b29"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by n - r + m = "313233343030"_hex; + sig_r = "5b044c78e63b05417e962d492ea8c583ed6440082eb8189d9c3733aacce6eb74715666a2f5d3ee3a"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by -n - r + m = "313233343030"_hex; + sig_r = "feb447be3878c265d1bc1d3c8b8aa504b7fa44a0bcc199f35741a6d61aefda39a16433bbec6c48c818"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**320 + m = "313233343030"_hex; + sig_r = "017859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d7"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**384 + m = "313233343030"_hex; + sig_r = "0100000000000000007859faa750814a7662a64b15a3591ae20c2b8f9d87d6fa059110fb1d219f6d75153aeeb84ef1a4d7"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + n + m = "313233343030"_hex; + sig_r = "011767660237bcf9c4091ff2579df7c5ae53f953c96b5e48654d2f95d50447a1dc21958945b3285742"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s - n + m = "313233343030"_hex; + sig_r = "ff70aad7c1ca445a5446a70199f9f404e260d9b47dfe40231ef29f3845273af0091472de8f299d3120"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 256 * n + m = "313233343030"_hex; + sig_r = "d3a2503f18bd5061ed645bd8cacdd64b41ea3929da43e1d8ef68162efb9c1a32792c598f2f33f5d531"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by -s + m = "313233343030"_hex; + sig_r = "bbf6e11dfeff55f3d81c8607340a1ab7a5967bdc4b30ca3de01898f2ea3eb70d64fbcc15919d3bcf"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by -n - s + m = "313233343030"_hex; + sig_r = "fee89899fdc843063bf6e00da862083a51ac06ac3694a1b79ab2d06a2afbb85e23de6a76ba4cd7a8be"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**320 + m = "313233343030"_hex; + sig_r = "0144091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s - 2**320 + m = "313233343030"_hex; + sig_r = "ff44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**384 + m = "313233343030"_hex; + sig_r = "01000000000000000044091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + sig_s = "44091ee20100aa0c27e379f8cbf5e5485a698423b4cf35c21fe7670d15c148f29b0433ea6e62c431"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=0 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=-1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n - 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=0 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=-1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=0 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=-1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=p + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=0 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=-1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n - 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=0 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=-1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=0 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=-1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=0 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=-1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n - 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=0 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=-1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Edge case for Shamir multiplication + m = "3337313538"_hex; + sig_r = "25166f47ac99c6bec3b038849ab4ead3b251f18afb0da1da5caa604a92a909c8561817684abffb92"; + sig_s = "22430ab3e14b6cf4a56c4c24a05ce4758467232629eb8101a995edb8f81660d4037ba7f057a8b5b7"; + r = true; // result = valid - flags: ['EdgeCaseShamirMultiplication'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131353534393035383139"_hex; + sig_r = "96b56e4f5ca6a77e08fdd100798c4e295c991c23e0bb0862b0a448f26523ba6e621522f0fcb6f4dc"; + sig_s = "681f9bea5bb26e77003cc8e5057d20501e03a08cdf9df4a6b1f92555fbad5142503712e868f4fffb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32363831393031303832"_hex; + sig_r = "c17eadea9492bb860e86519072d1008bdf396231b99734805a311db0c51957d32356720d62b3aac3"; + sig_s = "11bbbed00ec6402bd51885db44e1cf8accd05bb9b6847952234cbd45aa9f1fd0a04623e929342ba7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333336353438363931"_hex; + sig_r = "4f72a949a03227dc057a4c83d5089f076fd0d174fa6387d5907019a876e4b1fd237855e8966276c0"; + sig_s = "575c86b2ca89d6cb2245780898bae6f52e212b14be8ad96c86980a07c274f7a457b9de15490962d1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33363235303538313232"_hex; + sig_r = "68532fdf732db9de308a1bbe79b281567eda1ff0f7c6179ea61f678a6d4457319aee89bca52005bd"; + sig_s = "7884b4f1e9917fd179f3ea4126d7eac61a33b9516e889e060cb3a2f2744820b2a9d8a57da2497dbb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323739333237313834"_hex; + sig_r = "b5b90052ac94ea20b5a1d07ab6f319bc0361661979bff0986ef0c806867ccf06a741c7b6368bfc18"; + sig_s = "30efe58b33ebdac9b7ba0cdbc9d85d9702ea3a8b4cca2d4e3de53f33b44836d268392003bf09a267"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383836363432313439"_hex; + sig_r = "73938d137dc151d1339335c27b51f451781f289abb61d75fb6226e83f6b22d70ee017dbd30d0c731"; + sig_s = "c01c5102209e434dc5bd86f1d4103f29ccdcd79d18cc52039aeda36267a0e3f611d4b683a9681eea"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333737393036313539"_hex; + sig_r = "80f092dacdc272080ab183c5c898aa4aa3169de0785a41c1eb7d3d1b2e193ab76001b6d3be8107ce"; + sig_s = "58a1b05dfdb3ec33cfada6ddec72a24bcaf1a664008a61b702fcfab98a9e320cbda541ea3bc5b8d0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38303833323436363234"_hex; + sig_r = "99e78d55a807be57b8f8b8c514dd56ceff2dcc6e92cc5e78670336ae2021cae4b2099e7185f1f808"; + sig_s = "0faf3c7b95812a4131c68ce5e9e1c0b5348867e368cf041f0d3ab5d6721a057aa8b8ec3a99e91ff8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343832353634393539"_hex; + sig_r = "a9036c8644e3be5d80efbd934a9d4478fcf0acc6d5fdde16cb05e88b29639ff9a697ea0db176f986"; + sig_s = "850f0897b85d8268a6976a8f82a8a660021aa2555a4237a7a1bf26a37ec76eb025d309f9452c7d3e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303635303732353033"_hex; + sig_r = "5564073e989dd7255883b2913657bbeb2abeea525e71905315602d65501d26566b6bae20def57f97"; + sig_s = "bbe1f83cfd14b40de0e4ce620cb6263c5d577296dcf2c6dc4ff1c8062110152e8c00bb6a741c84f0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343932313138323033"_hex; + sig_r = "5513b6a74d7c93e00365d983745d454ff9468139589de293900de216da3dbf08f1fc07c6b4191101"; + sig_s = "a6659a5fb301d6c135e3cbf9cb7db1ad3240820b64574e7e01bb9d15f4dceaef3cc8dd2a636aab26"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353535333230313336"_hex; + sig_r = "2f40a2dee6fbffc556b1d9d27e83db210cfc225d1999814de81ed18b2365388dcabddcf3c498feab"; + sig_s = "7f360df60e70aba2d97f48f1cbba06e16dc5c78e8e0ddc938626feef70ce6c3a0b6b95e119a43201"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333331373032303036"_hex; + sig_r = "5bbff492841621fac5e68205ec994437f0de9aa9d0554faa48502a22a44a97096b5fdf049728d7e1"; + sig_s = "c00d4788caf9aafa244e8f9b51bf6c11d355811bc09ab249812b42fc1d2e7b31c3c1e62d0489942c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373531313832333938"_hex; + sig_r = "862a7df9460a05d6fb199626efae385dc12b9269160d84c90f6b94a9548eca8a3e0c61efc80f1bba"; + sig_s = "a86af4f643715d87fc9da42a5c8a9b64cca36ec8400bf48c3cbd9dca10648b8b9668636162513c4c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3737303439353436343831"_hex; + sig_r = "b2ee1b485f497a633e7d9e81a809bbc0d8a632386655cdbe4cfbbd2eb93bb270ece51f878fae9b53"; + sig_s = "2b73fc1c1e7637fe58b3886e1506278e38adcec92f239ec33171e8cb04f5def355a4bea265ac5c73"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34323539303733303333"_hex; + sig_r = "8273b4dc20862646cd931bb1fad28710153c6955a5262bc0b8a8ffaf24742e0461feb02d65a175c2"; + sig_s = "1b6b8151707f999494569122472e4b3dd160b2f423dcb74ea4a5071cc7a69b8dde5bb86f6d7be2c4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343139373133353036"_hex; + sig_r = "6659e0d0fbd6cdb0136f6b5e5e3c4ca0cec67463d588096c9b2e2cbcbbe185d455a3f22ed429edfe"; + sig_s = "31993a1d231566076c3eaa2fc24dafd59a56f591e8b9a8308ca6abc227e1f1f9e19b388ec5b69bde"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3231393238333534363838"_hex; + sig_r = "2b2ce180dc031b96802053c860624e8a4b5f76ec232dc72465db042b97f7bd37afb501b819bdad2a"; + sig_s = "cfbd71dabe99badf9989e096bedb64bd120c7be892d9a6ba696eaf293e1221e8b9f51149a130d159"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363235393934383739"_hex; + sig_r = "c07fa346e5826db30403f45bc4d706b03a54cb9bc66f4f451aa6fc1bcb4da15a68ca0199ba5f1bf7"; + sig_s = "732405f51c4aad33be2c27c5b161f4d9da234976b13dd910801ec89a17390a1ce8bd01dcbb571105"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393538343937303836"_hex; + sig_r = "a65db0e7c71925071821e73d4dfa4bd2fb8f5644c4de51847c160493df013ef4a4599592e06e3b7a"; + sig_s = "94ba7bea8b5687c0ae8419110e1def2c220d5f1a8e8e07751c10f56afdc4c3384ee9c1d07e834ae3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32353939333434393638"_hex; + sig_r = "1421e07e71b0154b989d6459491adc5c1f7d4ce16be2b0890834dd1e47d90d6abb5367ad7629ab3f"; + sig_s = "432157414e26650f0f14daf1b2a94b92b1f956da9b31acd8dc2d3fb80cd5fcd99eb016b8348d7a0f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36323332343733393531"_hex; + sig_r = "3f0fef46b6751f3dd965fe8e2b2a72b197ab85c1493577e9d7f8f1c400d54f5abc7647ff139b7719"; + sig_s = "73b1b6acebdd946c5232a4256a2319be2ca0cbb1d971b01b1aa0ba7b567dc310baabc48d345c98ef"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3737363033313033323137"_hex; + sig_r = "0413f313eb68b68720bdc351866d4fa6fc877edc91eae7e51c092dec0a253cec7cb6020478c2e40e"; + sig_s = "c7416b3576936e0e9f22e8292d859d6ed16ed1a90dc73c62e6f229c369e3ac1be5f7d7d1f9fb665e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38393534383338363735"_hex; + sig_r = "1361b05e30d1e71cfa8a56cfcc2d54c310cc4c1c23ab7db676f3e2320ed5bb6e9ec0496a30db3dd9"; + sig_s = "6cc089b8072ce69da8a521379464e0ef2a95b2d9a75a4d3377196093dd48fecbbbd9e2d2f082fb49"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343533383530303035"_hex; + sig_r = "6eac926459f7ac5cd4ca3a9bb062e81f332405ad684a97873c12f63edd9d3197a3097d4589e32f82"; + sig_s = "41cc9b217abae590d1e6a9b5bfc70a295da32e330dd8e2c02ed9bb59f5329b95b90434ed6b881892"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32363934383137303236"_hex; + sig_r = "88ad1a9603e2d5d002e7a4255ddafd98711338804c9e97c70023f6f9582c20282cde8675e2a79d3d"; + sig_s = "a3655f2f43eac97b15799a6c7007ecf5bf1bf6811c9735028eac55955bd46945c1c89209c91e20c8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343331323036323937"_hex; + sig_r = "d175a4cd6ae366384d8fdd8025096ff8ee6b4f1f5ad7e41ce1a2b766a94994386a0ded9f280d0def"; + sig_s = "6a3ec3ba0aa4fff1e9ed2ab4a6de6c26cb039f12934db1d9e794ebbfe8d2d164f1c269788b729c12"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323031313936373336"_hex; + sig_r = "59132b6452aa8f8d6a5c68fa027aaa6da9119cbf7f25392041359d50e9b3cd7d1f5942d6bbfad0f9"; + sig_s = "cb27d24a6943dc887eda359cef6351bbd85dc3b7ed18d7c4b5465baa017e09c1d1ff49faf13a7dc2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383330303038353932"_hex; + sig_r = "4d559032c70a97e0700c88af92166c0d2035993d9685e2c22c543af04a82d95914cde11bbfda1bcc"; + sig_s = "c3822076b28d0c86119229b4fa9c66cac3ec9069150e3c9bb5e1c7ba53a5a41125282688f9e5dd57"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383834323632353236"_hex; + sig_r = "437b77c4a2a69fba1b29c5f5a52c211cb7eea38370774d9a7e529cfb451593edd71cf9347a4f001f"; + sig_s = "8ba45c700a5ba46e46283abc06853706b78d6a9e9a16cccca50c0daaffe120e1bb3b35c8ae5b1ac5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132333434393638393037"_hex; + sig_r = "2347c452dd6f7c039294604c79676e747f80a1f650b51ff64c46de737b3aef99828df713ada316f4"; + sig_s = "54170218466b53a3e2ce373a42f012f548a7f911695799357cc21cd62ebba1bb276e68d4177470ee"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353439323433353935"_hex; + sig_r = "8bc6d8a3bfd7a4d2ca8af70bd9b0e9fe2b51d4c8c641bc8b8d22c805d7390dadecf6550eaae311df"; + sig_s = "7a1aac6c927b3d12c805c7fdd780cd545e4d5e802ad6b4ec4f120151e95e493521342924e11ddc23"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303832383235333337"_hex; + sig_r = "4c6c2d69a94bbf0485d54ac20d2de1c90501b9324ee914c7b79531d013807e09d943764fbd90842a"; + sig_s = "3118a437ac08090aeab38d4ad8a0954e7b5bf9a0ced7c08394579c26ff0a8ea0485c1e567f8d85ec"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38303337353732353536"_hex; + sig_r = "3996c88e0007daebd98b1cf5e58d6c7c76b7fa72b9ab80c49af31a8366d47f0f725aadb48467cec3"; + sig_s = "650a0c483aa3e3aa7bd9c9ca6b8efdda9a79f765a650dfe09608fa3489232b612c03f9a7a496f85d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373734343739383034"_hex; + sig_r = "cdfe1e9bb4381080f346c92d52e355f168f065c5ae22c59eb9f32ea23b96cf343c14450a880beafa"; + sig_s = "ce5bb7b26da07a63014dda6f83b7ab52f3d60fb1a2b9915e001bc8d27bfbb77f5f5fa9f5755e56bd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3133333732303536333833"_hex; + sig_r = "89cbc746335c9fc7fe243787ca3ba9963194465ebf0a98715aa35568252665f0a3a5cac6744b3e9b"; + sig_s = "b7f228315eb38cf42509ff1063184557ceb885e3a396ec51956143b4bcfe1092aed78459a64a2889"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35313832373036353336"_hex; + sig_r = "3b5c3f811c46ef775ee2030a19d8259b9ded0474195b18e28d6cc9359e8197b62557963e3ee0c33d"; + sig_s = "1ce2c88e8e23eabc1cfe1d44e9ea20463784f9d8a9377111792bb25894e1acf68b4c1b49a7896de9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34303337363939303936"_hex; + sig_r = "48c248f40db16605ac19f44c70f2e4068d67af2fcea6933ab624aaf60dd63bd0b66a8679dd508b3e"; + sig_s = "8d849dfdf0f7b897c151981152bcc85c8687dfc720f6710d85fd658684f316d2fd753287eebf2a9b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131343230303039363832"_hex; + sig_r = "64b8453fa3274cdce937809eef3a6e9ed284358dc52dcc458c64c4b12cd7cf31a2a207d0ac2f4c27"; + sig_s = "7f1c5f1010c32e0bb16823b2316125f884247a7932fe551365a8ac161f7297d2fab0e27885ecc216"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323037353534303132"_hex; + sig_r = "bda9bd9743ac8dcbc89df2c5e7ce9815fd108bc8f9e9f9912f0087dd7016dce4baef8e3139964343"; + sig_s = "ae4aff57910d9e53a21d785207e9007214a822b8bc9589243d95e0f3ed0fd2827828e0ba419a7a27"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383536323335373531"_hex; + sig_r = "591fc6b75d45d666f2fe61e1117232ff889f175fc3c33dc99367f8134a0ac9c78d94a56ee2493ffc"; + sig_s = "113c0f28eff38485ae23e5e5981605c8ccf4b9f5d83399bb97d0adfb4ddc122e87dfc646ab171817"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32363736343535323539"_hex; + sig_r = "6e846dd1cf589a4d6fc382b2ed5a32381bfff953e6ee34489b54752b32f79d03acfe5a341cbfbfaa"; + sig_s = "0e921da250b2e01a66ae85064483500d012846c1ce49d5a25111f978124a3dc9a1d5b824bb9be94e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313832323433303137"_hex; + sig_r = "07fd1557becb507a6786e3b74eca5c7b31d1a2f2fc39bf8da20f8b62dfac5481701acb5e32a4f092"; + sig_s = "03755c221d4b9c22b808473f2f4c14190be09eabdbf72c8ca5e8db5b54333d464e35f2d96c05b7c4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353232393434373333"_hex; + sig_r = "6639a49c8ba65145603b05a9d6d9c3bbba374347ebb3d001490934978f737182a689270347901202"; + sig_s = "830f19724f13f19c290f1b144c37eeefe5afc49781f04077c7699340dd7dde997ad31c2c8a329ea6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343535383431313936"_hex; + sig_r = "6697940e763aac597144fbf18b3f2ce16dd49fc17cfa3e7fef17cf5d526afb6208cc48234e78e5f6"; + sig_s = "82737609f57af96d915a812658a39988f1e54c7b0860e828d126505b482a0bc12bd7a34f0163462a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132393134353430363938"_hex; + sig_r = "6d97807955a91a231040e46a55161308321469de3d06be91d4f45e4ed0dbebeb375a687e5afc80eb"; + sig_s = "2f4c74da228fb1b1e92ed00de9bc6effc792797355d0f5569b947028ce95f37a8545de3aadc59ae5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323730323132343635"_hex; + sig_r = "454f9537d0d3291e7f6eb4f32526d023546697b539afe9a600e6b6e444d0196a9239c09a8af63d80"; + sig_s = "c60987c5ec0728ed04333daa1006dfc7b0689b71d1c2745f698cfbe827ee38a2466a0d0faae87835"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35313732353737303635"_hex; + sig_r = "d2c2d244730c2fd2571e0bd3ee98e87192f324b5f7d66c5ab27be2cac0ce256dc2113367edffa4fb"; + sig_s = "a263d765df16129caae5e2c322176efd9f881102f7aaf6261359664c4c632cc403adcf6d9f7d49b2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333835393530373037"_hex; + sig_r = "b3d1298278b8cb86d23ff6737c8e8e1bed37027813cb995b8a5890cc4778cc12842aed0cd513b028"; + sig_s = "3b5dadf71ba7d5e1616013ddbc042aee7b4fe07126e7995d0ff6e0e93fd470eba219bc7276f4651d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3634333837383033373037"_hex; + sig_r = "07f24f651b71499aad48cf17192d6971e9c04834a69c8d96222bc21c524fdb697d2f88ba10cbf06e"; + sig_s = "87741939ad3fd3fa3e28bb746fab3e58f8cd501837c0929fbedc40ccb50c0503832fc988d93c97d0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34383637313133303632"_hex; + sig_r = "2c32f640a1086587f862b5a1b93115903b28de765b42afe8ffa040f7c6fdd13d1c867c443c025283"; + sig_s = "85db57ea2b83124dc8e2b6c6a7a116448f8ad123c686b92572f1feef5104ef0734e51ff77dbd68a9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3133343239363139303533"_hex; + sig_r = "47ae60028bc17d58699db3f8329bbc01b1f7370724479df9cae5004d14537abf053df50c9bea7852"; + sig_s = "101efe9ddab6f9626066f8143a55ed46058df3d5c9936814d7f352765fee43ba79ce60505021ec97"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35303634343932363338"_hex; + sig_r = "28f87a101a9197118b0dd17eb02ba4639b35da684b9101513fba12817d0fab28e3f3e77ff30a9c35"; + sig_s = "1b82df365249c14a136912f638942a296a90f0a326f0cbd0198bc4c80320d362f501877ec25ece07"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3232373339393133"_hex; + sig_r = "b96920442a51ceec642e642743328481f38a523dd80fd73a74286d7309356ce84808d4dd70d70c64"; + sig_s = "0aa2f21f342417c4d940e160337332cc8b39ded7a4453331141ec18e8cd3907883efed5b6dcffb42"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333932353736393433"_hex; + sig_r = "49e5f9dcae3e30f3627863d7c02fb0c23f5385b121bb7ddd498aedbe711dd929c12d52d171e25b92"; + sig_s = "b0c3b09b42219b868f848e8cd582afcff5ee8aba775c42bc291d98abaa4c2eb4b630660bc0e56e28"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343435323032373632"_hex; + sig_r = "d21e8e1d320b887867ad4e933c53621fec702753d389c3c4a06fdb3d4251aedb770287fbcab54409"; + sig_s = "1587e48b0c1bc16b8c1643913f098840b6ca02a62091a482f67627ad0c3f34c3f4163e0c1026d687"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37353934393639363532"_hex; + sig_r = "825f8a63b079ff2d0334b32c70873b98a05f6dc43888a37d7ad19abd7f6421b1a40fb7f5df203be0"; + sig_s = "d19a30a76db86b44eb25f79fa9c4b4196f865fbb91560e5d4f506fc0632e17c9b698a90ced3af443"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303134363536343631"_hex; + sig_r = "17731f34231761953eacb2c7e40fdd03ac0c5c4372614ba27678ede7950f1a865268178438acd41d"; + sig_s = "6d40eecb97c22807186535c1e3e5cddf077e9251bdee9fe55dfcbc3ce7a2740bc661037452531e51"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39373034363738313139"_hex; + sig_r = "1086186335ccb6d20b199293c34f205c0077bced548b0ec9d436427c1f9e32e438faa54987654718"; + sig_s = "99fd6a5341f439a7fd04afbaabbb6fb45f4436528190a89f70421949e79f1329880101860fbf2664"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343131303338333134"_hex; + sig_r = "692693694c5b1967eb7102f503608e2589a5e8cb3e5e60d01699df3bfbc7a46fa3c9c9a8026d06ac"; + sig_s = "a550e0c412c6b216f6c8cd443c72c3c97a836c886c5fb17928225f24caca2636a451cbe31a6732e2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353437383438353336"_hex; + sig_r = "02beaef34d8a1c157819c4fc0cb11526b4fcb6693032916261375ae1ece815a64de9f1d369c0b37f"; + sig_s = "b3d7fc2946c369559978528fd17f953ff55b075dbe361bb7b0ba71c13478ae571fb01ba795e49199"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333738363732383631"_hex; + sig_r = "9a90782a8c1674137bbd9616b20aa8cc5514b09c90b2e47b2edb613df6a12b2e27166cfdfab5f815"; + sig_s = "17329fa8d84d4d115f966b920ea5bb2770844c6cd5d67fcc342c9b7ec75c7d8c5ebc4e8efdc7faea"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313636353734353639"_hex; + sig_r = "66991e433630636d5b8aaa65d625594fa645236166d83a57f8bad9dad03e8c8115ddc7788461c3f6"; + sig_s = "23c6deb58c8c94aed5235be1660e46f3cb65a85f0e0364dd9fdf701a69a56a87fac1eccf6e07f88f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363431343037363435"_hex; + sig_r = "8e6909763f6321a7da4d7503291b1ffa8dd1c120086466453455fb61cc2db06ad7f82015a74f74a2"; + sig_s = "9aebc9c0940dead8879d5af426d03ad101dc602fa0948b91938b5af419b31d354d3c3c10f597a4bb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303833363036303631"_hex; + sig_r = "9184b0e82ecb7b4e20bccffd21a2edf7f04a31e86a644866316a94785240f3f62abd80351c3ad78d"; + sig_s = "4faec72e67ee9809d7b8fcd117f0779181dc1b26f2d443d39e5a313d98fc7fcfef0cbce7fd596953"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383235303436303231"_hex; + sig_r = "398eb3dfa49eff3ad448c1ec7cdd2544b58094cad0dc2a5b6ffdcfe21d646e6e2ae2235994d8db22"; + sig_s = "3bfed4e73b6864f669fb37e3c00b1f3c4303f921d10e7bbcfb0141e939086e754b8203746e3bf24d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313432323938323834"_hex; + sig_r = "882d392e0f7d740f062b0e2fb325aed5d77c30220e0313c32b15b582cef5333c89eeb11ec8483e93"; + sig_s = "220e2f6574a1fc0c4e1e7276ca4b85e3c0c7360cffd5902aba3da42991041963ad976daaebdf1192"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313636343232303939"_hex; + sig_r = "8535cf9d81fc5984d9a527aab0834b4e24156a1a02f6b991c03df63d9a4ce13b2b3e26b61b051c3f"; + sig_s = "45ce184b9750779d39e5b2ae468025b3da56a991881ec3294c13c9f807cbf9b55563b120bcd39c01"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343830313930313632"_hex; + sig_r = "40f1f557a440d31f76ed2b0f5c280cb883254b09cd431b2019ebae2cbf06c66bda569e2bf055827a"; + sig_s = "7fc49f3bd6be82c5467de84cc15f3c14e09e7968d6f4eb02727c01a4eff02900c0a50f7efd19f85f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35323138393734303738"_hex; + sig_r = "53cf9b4877aee7c12434c9f08b3199f79c2928b858d27b0fdc1de52b5480a15b59103e39531d17aa"; + sig_s = "a2dc4e94329fd4e5f0dd13925c06d89b35c99dbddf38544c2da45ed97c5b02074cac7d7e335902ac"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130343538383435393733"_hex; + sig_r = "c367b70d77382e5d9bba9f9bb7a22c5cc9829edb30f47231dbde3f12852e01a546db1c06d3b6a2fc"; + sig_s = "2cf154898ea9dcbc30a43139f1d277615b3488cc1fdf5fd43d68f4467b3c5f9aadb3e0d4590d72cc"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343839323235333334"_hex; + sig_r = "bb9605f9cb4bd352761b8747614aab799ff63cd3b7cbb5458937705b0c1dfcbf6521874b982f9007"; + sig_s = "8aba696ec959e4fa3c05a6cf3c8005bdfbb8862d7f91faab9dedc40662ea7d5ac3c278bc21a23301"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35303433393832313335"_hex; + sig_r = "9ba2a1ff04a0cc0345ebe72c51f28bfa9908acf244de6b371ec6b0b4140f8245b24c6c2a563d354f"; + sig_s = "a40bf3d0feff59df18a74f5b8d5a148ce5fecf5038d50345295b74d821c76aa040ba25b26b07e41e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132393833353030363939"_hex; + sig_r = "b56f0e81ebe659a58c852f81db037a9a49cb5cdcc594557856d1a46bacecaea2e65bcfb4b7e3505c"; + sig_s = "6f73be444aba3f1984238515c866a0dfdf7b16248d76db1f38ea0d56c24b55ba1c7e5fbcc5317f33"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131333236373331343032"_hex; + sig_r = "365d3f9b8a9f69bd9f97ee1f3b6ac708a3b534ac8f16fa971c802713e43368cee096b4148dffa49f"; + sig_s = "0edf30d0cff68f0773cf0456d0d6c49336efee434f6c3fd8fa6eeba027d9e7db5b5fc3be3fb6c525"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33353733323839303232"_hex; + sig_r = "2c6e9bc19dff48ab30442cbaba1eff6dcc58e804f61657142f2b875f57bb6111abdfafa7b33b366e"; + sig_s = "a3ea444ebb8bba9fcabb081ea5b38a90b46282d70678699b26bf9489d32951bcaa533e76eb7609a2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131373339353634333738"_hex; + sig_r = "bdb9ad0594250628b6dad1f39d068a616b5e4ecb7f596f90b40dd4fbcffdc78ef09e91c176dece24"; + sig_s = "6f59a48bd38b19eeeff74824dcf64fa779fba066ddb653b88a23ef10fdc6fcf7746db29b4f458e05"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3733383230373935303035"_hex; + sig_r = "31614f1861d72a8a4432409b5d8d3befc487a220e36800d2f964c58c5fc778c92e903c0fe7827dae"; + sig_s = "b4ef673f6976db18ee4c75b3dea0102f1af1ddefb8415a286504b8c19857151df75102d80c39baf9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34353233333738383430"_hex; + sig_r = "0e823a4f5fcd2c951f34a8e0aace9fb253b9a12f9e7b157c4214fd2be3907f61964c233c17bf24b9"; + sig_s = "5880f89553cdded44a40c5e609b1dd9272ff352cd69d66f632654fd0b8b682be60c5db75bebd159f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39303239363535323738"_hex; + sig_r = "636fa3af3848045164fa010bff1231dd5892d22b9840e7316969e684d9c1c3feca0a43c1bd6728b3"; + sig_s = "a9228d626b202bb08fe467f122fe390190b438a88837eb7ef72702ba945ee15b52536007f84befbd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363030353238363330"_hex; + sig_r = "483836a3b810de697ecc6e7ac0b014ef208b9f042f83763ec4c886670d22ec602bc9e857ed7d16bc"; + sig_s = "114f99d0c64bbded3e11642a4452d556c711b655524861b4e5df22403d8342a64750cfea58e1502e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333639343536343136"_hex; + sig_r = "ad0453e59927b80cd5fe3442958892dcb35140b1498de85f59e41f79b39e77be5df7c16b892b6867"; + sig_s = "397dc4fbaee39262a67f80c0aa3b03f1f6d700237f4907adfd24b57b9644797e7c07a4b384e61b65"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130303139393230373030"_hex; + sig_r = "023791e6c75773e72a515c9ac640e617edea0e10fa1b2847694ab66d05f76c2fa482bdc39eb5724e"; + sig_s = "02fdf6813b26951a89f96ebdff19e026a93981ac9aaa8ad8ca6af742fd07a7750e2070e9e1182ddf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373032333133323830"_hex; + sig_r = "678b6b227627ff27553bb2ad262c8c4413f83d7e6e5452f244859603418a10dc986cb8bc7e4821b2"; + sig_s = "2f517ce94b9596dcf4e1ba0076fe5976c95f843fa11f0522f2139137baa8607731c9e859a447ac43"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31383038393439383431"_hex; + sig_r = "63d9e445230d924fe7098088e536dd077e2c5581e6c00f13c256ef6cbbc3b613cb8030b98312affb"; + sig_s = "1b7608d2176d9d8af5b216c2f26929b0e16df39f3ea5bc404e1bca1660accc5a5992fefb05a2498c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373438323839333135"_hex; + sig_r = "2da811e51328a2e7ede4c0ad7e631d84f8d4a851f7689cb4e4a4b6f689be54c960f591aa255748fe"; + sig_s = "5c9753acb54cd733348eab389304ee804d4a36f9a9407e7e70f5f139fb7c0437380ddef2a90663a3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363232313031303338"_hex; + sig_r = "b9e4648ee237d55f732bc49d437dc64d227d751a23d38c902f11bf3b4a8c555dfa8e2fb6718703ca"; + sig_s = "3f361945fcf7232a6da85359ae09b5b60df35e3ce11126d0ab113ac1730e1b70fe96c2306cb11364"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132313833363339"_hex; + sig_r = "a7fd5b24425eaa638e3f987aa31527e058eb4a7c7dc569d4e41f3404db1cb4680065b299fc694e41"; + sig_s = "9f39841891709711a72fc7201d006a13118dffe9de7a5132aa015ffc362a578124870e96f78fb45e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393535323437333036"_hex; + sig_r = "3b672dfc8ff417da0f0cd972d2146145be021e25716d685cf6f64faa9fda420b0b9dca384ce5b17a"; + sig_s = "30fdf5f1f21cf6b64ceb32af8ac4753f0010d02d9de5d3d1ac2d2177bd80dd741c1640cd7046f5a7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393531393636303731"_hex; + sig_r = "a0028fa7b0c6c6e6a2103c67cb4d13c9f189f0dbb4c2d1231d708e1bcaa7921769aaeedafad51715"; + sig_s = "46d0dd8023d8a8f09a7585d5309860b4324323a296ce4d7f06b0a02f99128fd97c4be9a59d5ce70d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383830303734303635"_hex; + sig_r = "a5ebb739b713021fc9505a2c40189deeb652bae9df3c5c128f7039bb87cf491fd30c2af186dfe446"; + sig_s = "722e8faf72304d8e9f4556b8b5c794064915b60a7e9f4461b3bc1a84e5db90ff257f1cdea994536a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3136373937333631323130"_hex; + sig_r = "ca1ff9a2ec2dc5ed447c8a9340744bcb99c90ed6681b6580600f4b89b26f1ac0dcfa516b09f89d64"; + sig_s = "3f28326e96ae8b13a3c7050551a28182493bacc9266f88205b70ef03a91f01a91a39cd3d771939f2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323235353833343239"_hex; + sig_r = "660f0892ba13bdc08164b8e620b579f2f441a50e08644bd24b720f241a96175e447014ec5dd4d26d"; + sig_s = "22a56a4d6d0ca59558768a705c70d435890b940e838cf603c4f02964306080b45f3210c959a3effe"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3236393238343433343334"_hex; + sig_r = "4bffc5a27ba7a7e429cb3034ec3a5ce305877743bee295fc80e39af8e28f45a21c45bec295353b38"; + sig_s = "cfe62f1c089113c46ed5c38b09f684e48709927e6b9a51b6dc57d161e1277f098bffea9ecb4fac73"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36323734383032323238"_hex; + sig_r = "ceaf34dceea01a551d04cafcbfd6cf301d0f8009a37e9f6ae3066856b14bb2c20ece0c6a3ee66744"; + sig_s = "4dbb0ea7fd22c19fa73b64f6a538d52b5511693c22a9c08b55577ebbc38ac9aae815a20c93c2cc04"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31313439323431363433"_hex; + sig_r = "42ba359e3ed7b2aad71f3a60a31d3d27004f52bbf0fee1ac0d5d77447a109f4c9e1ec8ec4589720e"; + sig_s = "0a958cb86e5f87f623b8d353074042f2f2e5caff213f9f6d913f57e227e0666068564349c28bd68a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature generated without truncating the hash + m = "313233343030"_hex; + sig_r = "264aa6b015b2a3b783411c19dbce512a6f4f19841514e7727123219453e7675ff6608ba8c843a461"; + sig_s = "4d9f473fa9914ba12c6d582ed5300fd75521bb432866e28a23d8ddebab4a82e0a4e3bf8b919797dc"; + r = false; // result = invalid - flags: ['Untruncatedhash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3473b57c2dd3714890b885b973767e5ca16670a1cd10209732159c213b6b03eafc734fa5414eb4ed", "0082a27608d88fecb99d6b51ccca2bc337691f8d08b1e8cfc5244addffa08cf6c5ae59fc4b33cde10c" ); + { + // k*G has a large x-coordinate + auto m = "313233343030"_hex; + bn_t sig_r = "014064fb4c224a8b248a0d933f7642bd56aced9b12"; + bn_t sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r too large + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e23"; + sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "04d989de87d41e4122f7974d9120b0d25b731c42c525d46af973b91760c32bd649c9e5025fb47620", "00d1ec28ca053abeb202de57960c2b17458286756280e1268aca90bbd08ff3dd97fa6eb735691eaba5" ); + { + // r,s are large + auto m = "313233343030"_hex; + bn_t sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930f"; + bn_t sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7019d437744f43e9b0d1bcd3c782cc3a69a22f8d13c183ca0b72f29862d09ce93fb9a90c8de3c79b", "5ad221bc30ac27a9b78df3dc0327f4ed2737469c5812f9eac5a48f17f631fbbcdede4e58477a6ad5" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bn_t sig_s = "8c0736554dbc446063e8e15f297fd4b66fa8879945bbb5c22714a9645f4fa4ef9d710eafa6b226d8"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00bc2ea56205d5e358c90ecc2c6384157f2c895fefff81b8304abdaa112eda79fe49b9623979cb0003", "00be5f9cf7f8506e1ca368e948da61e2d76b839789d388e31be0e567adae5b63c2ec8659d9916f3a36" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bn_t sig_s = "5407cdd593acb501fc2848351f9d2e6b5457d3de43c3130e3b74e6a9242b3cce1c24f094f118bcd6"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0092fb2ffc2803bd3461d678e6709a9ca117faca0d9ae578b46a7f7b235210d3811dfee4b369372bd8", "67146fd16a7c6cdcaf4469877c427f2e3d138b4820f82e44a5c40efc1b4dfbb817dc2ea53041a0cf" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "01"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "23ffcd1db5eedcd71cc7432a59be0019af33fa173ddfc85ccb7d2b56be75a2ca04aa8c6d27bd3a33", "00a3649a9160cc08f43c928611e69e5e96bb0f58557eda7bff6fa3de95ea9beb08a297c589191ba75c" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "01"; + bn_t sig_s = "02"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b9d7d5a21f4e7669a212258c985a848a95986a95c5783ed0985a6eab06d76d646510534b6dc82413", "17f152a54a4e1a70df5cfea245389aa9cf31ec51ccd2658552b29db8815bef1f48b789b5e3146289" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "01"; + bn_t sig_s = "03"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00bf9f9c252df13a64ad30c47659c030e4472eff78399971380cb70d6771863880cb7ccfce1bb29b70", "06f411a18864e90045fa8f208a4cc8114ed0b892f3ab012af34bb6d5c4998ce68e565f8a3c3f1525" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "59e216e270c82aadc02854b0a3eac7fcc5a6ef893c934d3d873aaf20b6a278663a1d4052079707f8", "008b9752df581b1ac4b238eb8d1ca113952bdf7810be9e64bc2fb4c09c7c8c1e0fdcd20642c0ae675d" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "02"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3d835e6fd17d80d8a3368256595a492625eafbd4d2a74bf77c102afd21b3a63ea557e60c0297af7a", "02e2f90a7512e723cfe36da5229c31988f167abd74b8e85530d803be004eb555888127a84203d244" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "03"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r is larger than n + m = "313233343030"_hex; + sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59313"; + sig_s = "03"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "71d3ca359409cc4aa2425f4de5f6d37f62ad91b95ccf7b84fef6f199400c3aefaca2b3cb6b97af1b", "0251dc5e673cdb61172303f5ee34ff54ae8257811e1c7c9dc7855d14a6d295ef00602408badb216a" ); + { + // s is larger than n + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44d86998"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008d9c650d233064d5988eef185969f33123848425a888f96c10089c40cf85ab7458d95b3a4630c5cb", "22e81937f36e84c44c05745ec99d790ae7d99a1099f698f8a92b29989117e993ba62f9bfce787e8c" ); + { + // small r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0100"; + bn_t sig_s = "21494db879806d4f59e53d4963977a03f6ec51140c9f9a1dba8857ff3bbc76d2214947e60edc982b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00981947e782f19a1dccca005a51b7c80d74a1ee0e83d3951e33edc2fffd11045bc6d6d1e78844ab57", "478229682bd1b0ce55e8767dde57590da97d1bf8f9eaf7e6a038348b9be80797c7099fa8c537d5ca" ); + { + // smallish r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2d9b4d347952cc"; + bn_t sig_s = "43becc876a63564b458280199e382cbad8ef68d406665bbf307ffea45845a9ac69345a84a5a72b87"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00baca0292ebb424311a1bc3496bd3b030947b67d5798386bda48fd65e5b36c6d36246c4332590a521", "00d26e9fb941de245c14b909c96b0e721c7f2f6c0b34c9b83692e8e512932a60558e6012d4c1c61c56" ); + { + // 100-bit r and small s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "1033e67e37b32b445580bf4efc"; + bn_t sig_s = "3992353d916617b49303856488e39fbc26173b8bc426f8207de3d8f1b97f3d12c803b99d57768fa7"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008fcbe543efe4d7aa1465c89e39b289d09fc899ead8f7af549fefa27ea2c51cfdbfbd5a0e89ccdc6c", "00c89f784bd461ea23c7d534f7f918293d405916507bc6e73ae866dbafa9fc045a31b250415eafae7a" ); + { + // small r and 100 bit s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0100"; + bn_t sig_s = "84380881b243236967227191398a3a4909000425576c79465bdaaa0a03267b9e48f68fa0a68b29e3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3b4e1af7da9c4eabaf884bc20dcd6e8dc87df89e4c6d6a1848e3f8d7be853870e13638761ab55f7d", "712d8bbcad25a3ccd8fb007b9b37b345aa3e465a8015e83700ae1adfa471feb2b1a9f36282b9be62" ); + { + // 100-bit r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "062522bbd3ecbe7c39e93e7c24"; + bn_t sig_s = "84380881b243236967227191398a3a4909000425576c79465bdaaa0a03267b9e48f68fa0a68b29e3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "28a10973947ab71ee74628e1e29ca288940f98816742ce9ee8d97e1843b9a9f22803b572897ef1e6", "5502bb036cbcbc6a93acc92febfcf903a64963e4ff0bc025e9f6fc1a7268cc86c50be3de0f323b98" ); + { + // r and s^-1 are close to n + auto m = "313233343030"_hex; + bn_t sig_r = "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59294"; + bn_t sig_s = "8ce984c0247d8a7a9628503f36abeaeea65fdfc3cf0a0c6cc8dac9da9f043b4659b638e7832e620b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "12481628451051caa5c143efcb5eafcb66ce7e43e3b4d0528be2dd6b5a0f0d3810af2f18362ca310", "1f092ef06707ce75fb4424fa8abf7c774a8426a2f0dacc6a34364f19afe709dde60bd805da3a37d6" ); + { + // r and s are 64-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "9c44febf31c35950"; + bn_t sig_s = "839ed28247c2b06b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "29282bc0b3285ac987f9109308d7e16670dd344258696dba4e445e47050a1dda9203ed4ea6fda654", "0bad0af52528264dc4d448260308b87534f4ac446ff8a51c0e3b143e8a328367a6cc4a911f8a2587" ); + { + // r and s are 100-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "09df8b682430beef6f5fd7c7cd"; + bn_t sig_s = "0fd0a62e13778f4222a0d61c8a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "60ee958cc008387d4ed824d39ff72ff0f4263f196daebd42e586905eca0ca7fa897e5cdeff6a7382", "53e2a576c0740475e56c3893e397d84cf3c3c0463ccafa3c62b190a3e6b23401bb44192195c8b882" ); + { + // r and s are 128-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "8a598e563a89f526c32ebec8de26367a"; + bn_t sig_s = "84f633e2042630e99dd0f1e16f7a04bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "06f7388b968952dca535bd7e7d064722df2f4b0e8f613dbdd5eec3f17cfc4afb0bdaddd486233034", "2417a356fdb027ae6796bd5134a131af5dcf706fd8592ca89f7e4ce8465880364f37e3a7036a5b05" ); + { + // r and s are 160-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "aa6eeb5823f7fa31b466bb473797f0d0314c0bdf"; + bn_t sig_s = "e2977c479e6d25703cebbc6bd561938cc9d1bfb9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c7208c48441de500050d174d47906460e4717e6d6ecb2fe3045be1f78eba9204b2fb27440249b246", "353ffff4482bdf0a89d29d7821288051fc1989353b50897cd5ab488f7b03318b68a196b7a63977e8" ); + { + // s == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // s == 0 + m = "313233343030"_hex; + sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + sig_s = "00"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a18cf3dbd9549015b0381632cef8ec2953bba8a471d759303749c76716947cfb4372fad1462f21d4", "6967f478cd224b8c4d523b9f2e151866943cdae89fc50d4bfdac8432400727f0f9888c40902f61ae" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "336758275671b26064a2ee5ed995236c650c22045c98e6c1a63b03d2d353cd8d474006977dd0ff40"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "22fb1674b631c22263b24a5361da94e9ae2f2efc83aab5ac320635bce4a03242481ff0ceec26ad4e", "008b44a399c0b801cc9c0ceb8e02c940ad5ec423967c4ed78df8cda0160c6d6809b2f4c7d45f7b0bcc" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "52ca79c89313d4f18ad1515df6b2f32c0e95774739ad64391155257026ac1a48d008404e8068b4f9"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ae22530c046c4abd73a038434361949d617547ed280491f4d675d6cd37e61cc7a6669aed7183eecf", "00c82e560bd177236a15f83062dd8bf1f26b7c883e405c48bace4f9ac3e98d3a84a00b3e75d1782ad8" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "59bcfbcf6f28b79195bf98394b7ec6b4698ba4fdc6cb72389fabdb07fe29de4ebcc4906bcbbce67b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "041dc297218a44334057cb19ecf2019d8d458cea4dead8d2718c643ee0dd6947940c90e99fba1b24", "361605d89822855f5d2d727f679135b22ef94d7e1c6f86a3a77715c7403bbe116a95c8c459a4d603" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "3e58def7758c644788a67c4ef9ee602236fa4d7466066fb6c1d83ad3e90d355489a6eb93baa0bc61"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "443a5dde335086ad42d23eb687bfed15e3b44214b1b481aa4dcc0891a2987038a8f71f20fbe3dcc2", "01e06a4dc05af56fd58120ba831e5f7c853b68186804e5922c63e5dbfafdff405d0d455ccb93f8a2" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "68ae43de1cec917435cd3b4575c37b3b73b2aa300d9dfab2458b523ebea2d21667a9facc1559a723"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "62ed3b72b0c6b662571dbfa84d851486738a0e78926cf0510e9e2f6485dd2f094dfd9fefc5f8bd21", "7764bcc281726d3dedf04f3f40029fd6f6b3405a706a2613006c553b7d3abdc4de3b08f1fbc2d1a9" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "441ac1ef4c8c84c4c7d07c9b08b16822b5bfa5b5bc61f2874c15f9021944a0f6e34ed17f67c27cad"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7f734f03b8a7614b210834380e137269f49baecb50f0f47447945cc70e05f382031a3d17865101c1", "00a6519c1c48e75fce16d9437b8ef7b9b444bd40b5203c475af2ac03d39cdc0d5e8067a5d1553daa90" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "3f8d645a4bb4a71f78e85d0613cea2efcc80562b215117f8336c4a52b194275ed10fa194e68da54b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0096bcf5a53f983f7964591a0675d8a71cb1aa7c5ecd961a583c01437d22ab11a2a015b7b37d37e5b2", "3d1c1b2373c94965eee446aeb3024a9d61b7e1561ddfc6089945a1f303cf46de8ab731284a456d90" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "61e07b834a8be8ebf55cef4a7a9c14845eaea0ffe66fb98efb4472fa544c336ece34c991b4ab70b6"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b9f0eb70ca441aa7e62ec72cf72b0767968a54b5a58aede225dfd02df84e03c6ebc7714952b0fc5d", "462d5c3e85d8bd4fb417561bf26d618d0babdf444d2f48b80e65d4e1d060e53fa928bf7945548c0c" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "698ea749c25d9a934d50e1bb20d8246243cc650d16bdc4cb165553a01fdab3dc3bacbf053fe5697d"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2640fbd0c09c0279402b94d87e4cc166de905b75e457ea76d0a17a31841e6a583e3ae5e567cbd797", "00a63a61d12f287d1c57cd13f83a19d276379f9af240e52bf02824fc15ad51859632de17a90a63090a" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "586cebd6cc793cc71e949245c5d7044e47b786f3a0779271d3028cd5c9d0eee17c55ca55a82e4801"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "02a61b260d48e45a851c0d65ae2190f412c3d0ce25ff1d18a52ab049f92862a2234191215417a348", "0088ba6c540bc51f253f0b4acd65e5476720d321a76fbd23d7bf5feeef9ac699d5986a85cc091642ed" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "02ee7092471bcbd0194245d7662a7c8ee77414f0316e4401a17e25ffe1c8421e73c0debb46806de2"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "254d59675918fd3629870d621b445524866759ca61f2c82a4756de42c0cb86ff164ea06dce3e311c", "35c979bc1a27dcb584e5cf1981e1681dca7e7315f19dae33d6d0a0563e1a57e2a8f5f358e7428f27" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "443c61e33c82a08bce3bb29d30e976cc97d5d7134f1be7402f841def418e78362133f07224919d88"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "02934d4873a0ae6c8de89f441cecb5b0e9c5caee0fb9ee25d3a187e4733b107ebdbe96daa620d8eb", "2164f87eb9fa6c52d44dc6029527255c5b3abde269b3f3c0ebe9a0088d35b314c95679686dfe7c4d" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "47ae4a0ce41f8da4b35f63b1bd55a01e239571a23981cff63c5f845b314bf81208e374cb3fcd64ed"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00be580a9490b3ee9bbead5f12dbfd4fb80afd5b58245fcdffa77e25b5f37605812a7aaebcc871e11c", "30e301cd48b41e3bb7e19a3b21cd4e22a7ebba07b937e359938daa0bf65e458b8f2329452c3f8e41" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "1de9e7aa69ae45a73f6b3a05cc19b7771277b81e16ad5c508539fe05a86cf112d1b764510b4357e6"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1800dcd69c7bbfcfed510f9a3dc15ce0ac0df50f2ba1217b63b51e5b43d40bba6d661d9ee00f56d5", "00890f1b7b89b814d7f42e473e4d84311cfcd87c4c82d684faaf5f30dbd4c1319701a092b293ec3cea" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "1f0eb2e2f039733cbab46abd9fbbe0c2bf8a73b76a12ff21d9c845dd707bf1b9e3d2d629ad4cb8c1"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "400d9364b5efe3c2eddccfdca24f73ebfefdcc8fe6a74adae942a4b3e8fb79d79829cca9de1e6bec", "1a51775d5174fbac7424e52300798252c7051357b82cc0193fdfc9f171830dae7d3152c1e5363926" ); + { + // point at infinity during verify + auto m = "313233343030"_hex; + bn_t sig_r = "69af23901b5e27dbf09e3c2f6900f032fcc7e7d2db47895196a41763f7432c74c348aaada262c988"; + bn_t sig_s = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + auto r = false; // result = invalid - flags: ['PointDuplication', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7c44139ecc37288e5ae9e0e4d3db1a3667a9c471734ea35b0cd079f4bdd285c8779127dfcc7e4cfc", "00947cd9c8baa6b9838a7dbb5ffa1ff999c7106351b4632a81eb4e68f29deb52be8e0f51452dcf0f0a" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "69af23901b5e27dbf09e3c2f6900f032fcc7e7d2db47895196a41763f7432c74c348aaada262c988"; + bn_t sig_s = "69af23901b5e27dbf09e3c2f6900f032fcc7e7d2db47895196a41763f7432c74c348aaada262c988"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a0264f2e74b929c6b81ad7b7743b24feb05220bde604c289e15d5bdd21b15b3b5c9b77b43a079f6a", "384333fdcdc0ece729e37af1befa45168e010965899d0bf625a2dc866d1ec985c3738ea44cbd85e0" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "69af23901b5e27dbf09e3c2f6900f032fcc7e7d2db47895196a41763f7432c74c348aaada262c988"; + bn_t sig_s = "69af23901b5e27dbf09e3c2f6900f032fcc7e7d2db47895196a41763f7432c74c348aaada262c989"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0088d7aad940b94c2170a002d7e909dde1157e2d0af942572702f2b0dbdbb9f928e50fac3a5d9ac0a2", "00bd33cfa670bb12994c56157f6b238e741514eb8aacbaeb1023b4abb7e5a7acac4b7b6b5963202035" ); + { + // u1 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "f8723083bde48fae6e2f3ba5d836c2e954aec113030836fb978c08ab1b5a3dfe54aa2fab2423747e"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b74a6be5900bbf62ce66850b7ca898774970d368acb87565a14078364f93746b7ec5da3d979cc559", "00b9499473230e3e333ea7536bb2583bfad8f426b8ef1ea968c63c80685b44836a5b96ac3f6f55e660" ); + { + // u1 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "ae4a5dbcaf940fc15449b517cbccfde29e70de386a15ee4ac30454e4c1b273d4b8787b0b6567b1a4"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "332c3ed3e34de227761144aac7625775a90fa1b47fed57e04236b9bd402806c640041e3de8bc7f1d", "7f96e31f99355c6775c13bfe00dda8de949f998b9b68d34ca51ce7b351f66804e93fdeffb63a5a22" ); + { + // u2 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1bb77718efe5a68f77ba50854ce1e779d95f739368bcf1a7793705a129d6ca334979bb932980da4e", "00aad388cfe4b2e3ab7edf790d052a93991f30fd13287c11c1cf936c158d63fdc000c54a0ddbed9e29" ); + { + // u2 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "8ce984c0247d8a7a9628503f36abeaeea65fdfc3cf0a0c6cc8dac9da9f043b4659b638e7832e620c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009a9faf8d4aabbd7b231b7891d0dc361fefd214dc0569367c8c155212705300ea5d820112a3386c6b", "7eeb846392288d06b570185734c0cfa56df71a888f9a8fbb41af3b278e287433dafefb2136e7091b" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "0c5bf8768262bffcd9a64117acbc4b811e5fa5cf197db6c8236bf34bb99bf706ef5d9e1a9fc9f5cf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ad831f444fdce2ad84db6fdaa4769e405c6f8c11b541378d51aa9f59b600ee3dca673310e224f473", "5f68561380a66953bac16b71f2dbf40ddda850609465ff303bd0eb7afb031a5636726a759ec17d52" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "703ed1db7cbe8938377b5683b745ee348c3422533ed1ef1eaba30037403751b3744b9ddd2f981e8d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00913e2ad9490d96b3abf2dac8b68c177dff16304b83e3de65b28d99c43af75fa13676377faa816d78", "0097613c3ad7a71da296a20dfd99848440f93c31837013bb9c15adb8fe80b5f75c3321ab21c4e7dbc8" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "a188a03f44459e91cf77371a377bb28af208da01db60034d52f158231904d9412f1d36d1ade9ce3e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "54aed183ca575dcac58572d2e5bfc5868988c2254932f0db9ec1c278c6b9bdafe69a5628be619542", "7b6810b87c308e5c2b48ec76d258d3dd2d43019d48435cff0513ac5c6fb9b38b45e5133c704858ef" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "783b488dbfe35fa347638901c737cdd8bd04abfca4320f5e3e0b47a1f6dd89446cb5a2187005dfb0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "63e52576b88d9296e7533541efaf2244103cbe11f72fa2819ade7b8ba8492e291c5aa57949f679bf", "35eccdbdf826fc6ff3126eb18d86f255bb71cc56cc889e7cd6b2bba1bf8fe4c2b796c85a7d3dfad0" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "bfd3c7ec3ec8f496196d05cee9cb0c14dd67afa945555559bec88684d455624219effbabb4840a57"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5f2668100d2843ce961d687062a20491f193313b8be563697881b746e3565ef067ed94dcb4441149", "72d77b6a35b269bcacd717f1bbd289a43c4093db841bfa926a3812e635275f6422005665634d8c48" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "ac4948b846d59974519d933f019437c3c13f8facd41b98105048de41ba246b9aad4ea1fc2442819d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "30c1fa8c28f242144ebcb5a86a53ab0dd5bee5043d919d24ba65b9ce0bac7e747c5fe86042302a3a", "342ef78a3cca855163db4836ef7371359eb8aee7ad1ac6f18621926134d9d15220be93445688bacd" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "187c226158dae4df569ad6bd6b8974e5ff02eeefcb9da127aaa9303f259c1c6ced466e20a90b7c7d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a8d756150d86d8490d633e80b06ba06e3978ca98edc8931d3fd5fe4ccc25b1d59683eb0c04ad9a1c", "00a739481edadbad6a85448f4b37d90d4810f4ebd0d1349a67b6960d21994bfb7d594211a28e7a7e60" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01daa9d927feda0a3a1692445697f7ceaa895ef5b4df8d6dbb4421957f5652ef32fbd5bc093fbdce"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00989d5b7b14c27c72f4c8bd8fa7a9fa1e16a1e2d790adb009ed65b3b2bd93c2139bfb78a1193720b6", "6787bc24b4b22ba7946caccb17f1f190d4baac79380eabcd1a7cf5389b424f24b4a11b807f2ac47f" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "6872bdeaa7ede175dada68e03e214f0c79be573e2587c3d72cb2e575fe4d2d5a7825b477c59b6427"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0092769a986f96d19b08cef2052de18d80831b1c79fbe9832c1099fe168fa999952f3c7b16bf93dc05", "00a2450334fd62051d1b149c5e16e0472358d51af449f663cc7be7e1e487c53c26afe1812252b08e59" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "a36d397fea7ecc5a4b7999c56db48dd906b7ed55d31e9e5552d8709f25ecb57f242745c201823ee1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0c45be8925ade79c653e8748c2dea9b6f379c2c92f7c1070678d81c7cbc3ce1ab7b166297a40578e", "00b7f7097191a38493be0cd10bd750b0ff34ba2e91051e52a58007b11da33a17b8d32931f9b1a649cb" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "63812754da2cc7dd83cb1ba392a2ca726d9814eb4e88aded84ee1dbe1a7530f14b99dba0527dcea1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00899b7ab40ab1d0cfb2c13cb5ed523339e818b1a9caaaa421748197533cdc76ed8f249e9fb73eec18", "0098bdb312b40b6df9bd8d684276498859190f1c8ec9a0981d25d1c6df1e9c30e44f847363d210dab4" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "c7024ea9b4598fbb07963747254594e4db3029d69d115bdb09dc3b7c34ea61e29733b740a4fb9d42"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5d7b0fb562a6997bdc76bd4fbd248fd42634bb37cd6817bea472a278a94fd2d077bb2a38c23bb594", "47478aff38b28dced95bfeaac7054170a3fd691cc6571a6ea56f0ab336c8061742b7b20bf9a4975b" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "57252ede57ca07e0aa24da8be5e67ef14f386f1c350af72561822a7260d939ea5c3c3d85b2b3d8d2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ca806a035517b677e221a91fdce5ecc8405a299ee3dcc9392c6c9f21b52e50fa6cde36fe5d8979de", "695122aa069159683d1b3822814fa1ed964a20d4380b484f29af91771862d68a7d80e2be96ed0650" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "50c4501fa222cf48e7bb9b8d1bbdd94579046d00edb001a6a978ac118c826ca0978e9b68d6f4e71f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008a204cbe49f7aec5bfd78f0940c84f7199813051cdee0740712b2bb4ac3c307f424417817ccd5aa7", "7c262daef83997044d9f8de5194a570167d4b19e068e963412f546512cff5c4559592a763bd23061" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "711f6d0abce96fe7f5bed2ca4600a021fdda9a8c922fb0e10f180f97fa2cc84dd785c71e6c41dbaf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "56c56160e80f003224fc3af0e6eb5ebaa76571a86d82924cb4e6268cc1088503c79ab123b767beb5", "008ea1864e81c98875aa72d64cd7dd1b989e131f5e0522982f6e7f73cf702e6e15d35587026dcfecac" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "02a6eb408443d24e96be4ca0278442a8a426087f9beb03ffe5526162bf1dc30434cf7ea79574b19b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3b26481a3a38226619cd43d0c3400ec98af68f1cdc53bdddbe31703621b5c5b341902b0e4e691a17", "388f2e30a0eb720e44fb95ef341c9184f852eca6dd1761d4025fc48fb7d25109011846f62cee682e" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "b6ba1aecd240debe77213a4228b125603671c9d5147b6c0b36dd23e42b7cb5078a1b8fdf1b98b93a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d06666a6d693c9a5a963c303852689705fde5b221fd93192b53e43c1808c20f12d9a6da344f74808", "038f8a5fc61ebb0da89f5795bf062457e0f504f5d512c19ebc7ae0ffbfb080facdcd091556811948" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "957b383ba1cebf5ca579ef6ed10027988f8424f42ffbea2e51b3340df9f8c3c60b558d6dc2df10f3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c769eed15fe7c5d8ba82958d34bd4f2594230a1dc331faba491a5f933aebdb4bda2073c06710f9e4", "164efea0ebe407450b25f0362de80407f6cd373deb373012d22c35d02766d0fc3604df2b351f75a7" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "98ff1db1b9affa33a2e53c684d3f07611772405e8c200f2af2afa9e53c6e8ef30cc143b3f5ff7fb0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c5d2f44a5dc61c0ae41adddbe258349008a5f37879e59058d26e1000c4b03c066788532318b78233", "00c78dd8481332d6868ddcabc0a278b6e2f22e0ae1786a4af08d50cbd1e3b521bda933eea6fc6e84a4" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "5e9ff4433ca3a4af648e0071c87c2e5c3554b11761b10bb2b81725028a56c4fc92f1320ca7396c4f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0096b69df13be64fcbef7ca8a8ed38ded52ecc98b74ce723ffeed5f830c8904c3640532623763b48f3", "00b7f351fe8aeba0489cd52e3cc0280c22f30aeaab0ebc57710522f5ac8d48c69d369a14ed06369201" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "c76ce53560163f157b11e4d05c61540a5df6b8241cbd3ba7d911a7541eec55e986ebf811ae50a8b9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "15eb2caeca2200c2e57bbe0e57a2c836596a9742422ee3dc71fc8b296f8b0e721e73615f49cf5001", "4d93a7626ab6e148e9c10a85e60ead47e092bd713845ae4324d3200720fbc22d9ac1770670e90a29" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "4218a45116ea65b283cc7d90a510f077b1b09eddbcfca3e7d2896b869dd3ba556c4f10590b0e08cf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2bd1ec0a492c0e4aaa8c17b1e70e37e79c8f68314dd1541a44d316a58f42205f4e8d057f0450ec98", "492c358a93adf5aa93c186dd690ddd60132f38aa4dcbc714c4a7a8550ffb02667d85fb78bcb3c838" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "5e5f32423bad3644be718d8195341362c9cba52b330f913b1521af6e5e3eb2069421b05dcac299f7"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "39a33006d490275f09bd36cb7acc5021e63871d47fd8966d9e4d513adf6db56ffb67ef34d6add366", "00c24bccc7d66fa8c7ffa532474666387ebd354d8920fa98bf5a39ceadc5e655ec4ee5c2fcbe05d1f8" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "ac07aaade5c5fb2fe5a18bbefd262e0e439fd68e0a317db06ff4ba623a2a03114ec5b6e084171058"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a1f8a2eaaa09febd3c4689e541173ed8a0fdd59ae4288df96e790224b3795098451ec55db40b54d4", "2f84af7511e8b9123f61829bdfd90a9f577f8c78520e4d85dbb4c900d131b3d72a0cfa0d9cada0a6" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "311f6d0abce96fe7f5bed2ca4600a021fdda9a8c922fb0e10f180f97fa2cc84dd785c71e6c41dbb1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009998152be343ded303960ff65045dd9b8ff54ae9d4366a94d3543141d12347d731c88dcfe1b107ab", "7667f2b7ba92148552473892dc770636de6dd27a39c05a98fd3b71bbc29aa983c120ab3b7296cb92" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "623eda1579d2dfcfeb7da5948c014043fbb53519245f61c21e301f2ff459909baf0b8e3cd883b762"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c3dfc19f1df3523fb884d7716246f1c25f7b031209cd15e6746e2ea797aa0cd5afd7e5d0f7b31f86", "730c46e4db23a10e9a269388bace71ab84ec3ffaa28ef9b0a2d4bc77770c7c7f4b975d1ebc1f3752" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "935e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59313"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "70ef60b28eb0a5f1fa990a842f4732c8874f76b6d3eac5dd3320784d52c93809b74a166f9bb9b84b", "2e277755a4e266119505b1ff35fe37487b47fca5ac8223811fe260d7c95d7ad6ec28b6ccc4f1e5a6" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "5b5d0d7669206f5f3b909d21145892b01b38e4ea8a3db6059b6e91f215be5a83c50dc7ef8dcc5c9d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0098bac10c8bbff34b38f1df0cd51d7eada1ff2d26c405b30e3a7110f802eb47126ac48303280b3ce1", "0e8ded10664774f20b72b364d1a27d359b4086df9fd327128c4b17cceca45036e8491236a1aba277" ); + { + // point duplication during verification + auto m = "313233343030"_hex; + bn_t sig_r = "9563bd68545ccd185ae724d8efcd4cc23234934eef10f280792b2f930c97a6c1e00829a8b975b9ee"; + bn_t sig_s = "360fe79f7d37f49c103553733438a2334f690bebe9643b8d1e32a4bd7daa2aa764306ef240a40ea0"; + auto r = true; // result = valid - flags: ['PointDuplication'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0098bac10c8bbff34b38f1df0cd51d7eada1ff2d26c405b30e3a7110f802eb47126ac48303280b3ce1", "00c4d05a0fd074dac5d5c9c4fa005f63305e4f48c75720e6dcc347a21f8bef9bf2148b007b50078bb0" ); + { + // duplication bug + auto m = "313233343030"_hex; + bn_t sig_r = "9563bd68545ccd185ae724d8efcd4cc23234934eef10f280792b2f930c97a6c1e00829a8b975b9ee"; + bn_t sig_s = "360fe79f7d37f49c103553733438a2334f690bebe9643b8d1e32a4bd7daa2aa764306ef240a40ea0"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00bb8cfdc1f2361bcdc96729951668dee7e495a9f756cac1a387574b0af1d369bafeec4b47c42c2475", "062a170b2654e92c21799ca0fc8b24d7143a45695ef42ca1b0b5291d1719e3e36d5749d4cb7506a5" ); + { + // comparison with point at infinity + auto m = "313233343030"_hex; + bn_t sig_r = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + bn_t sig_s = "2a460e39a48c0ff193727e795d339347984ff65457b636ed6f74d627fc8144fb81504445742783d0"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b2a76d25e1dbf660a6cad955bea08417be5796a8cce6387a85a3aa3c9d029e43c63521b0f139d8ae", "58ac60e914ba44fa030234e786e182cd433c073f605b59aeefbdc54e72a61ca3aec91edba900a0e5" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "2fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8"; + bn_t sig_s = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009e0bbc0ac4c5ed2b0b6fa291e1170d8da5cdd275253daa0a18e12eb432445d3db917b22102bacd8d", "7ec333565bbb2797b920612bbecfb566724763c204c6bbb1a6f65a09f0ffb19a2c040e9d4b1818bf" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8"; + bn_t sig_s = "1e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a11b3f9d0070b554d009b08391d915aaf41e1c9375049119bab40721938f605d400b8cf7a9aca57b", "6b7b137f08f28cd5cf6ba0cadce3c3077f10dcad55e7694ad4c62000806f911137b4bb795ea14127" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8"; + bn_t sig_s = "2a460e39a48c0ff193727e795d339347984ff65457b636ed6f74d627fc8144fb81504445742783d0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009e9f7515ba68f12580afc3f39e7cebb9cc10284ddb256780c863d18939c7b0c39a50183eaefd28df", "3a9cfda5eb4f0ba24095e7b86fe2f359ce4b5ab95f834360acd8ac5c8baf935faaf8e9f945bbe54a" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8"; + bn_t sig_s = "a91838e692303fc64dc9f9e574ce4d1e613fd9515ed8dbb5bdd3589ff20513ee05411115d09e0f41"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "355cdfa9507a6540db1820c2e0f96eeedaaf95829e5b6f9914d9a00f1396d9b0422973634f4afd60", "2a0476aaa8724129241d086ec0bd5b0d811fc07be632989611769983245adc15d81f9c331e5cda9f" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8"; + bn_t sig_s = "b52c3cf70a58445477eab051464ac05768321fb29c7aa242b9194cab5ebc4c35e10edb72cd3ba2a1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2e3bca2cd9b527a42cc2dc98d71480118336a99f6292b08132ab6b786e4e9069b695d21b05b72629", "7fe24daab6d40fce101ec559f3778e50c9968692e64bdaebc2409bb3665b9591cd0f702ebd388bd4" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "2fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8"; + bn_t sig_s = "53bf06e43fcc4236b2ec0d88471379053f1f3437207c5a75b09036b1c40fa8f3128277894a4c96cf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "06c77c49220712d4e5d25b6dc29c8808f77c77aa64cbed09c62646cd85b2f719cd563c371b5a6f3e", "00a61472da2cce3dc200a88da45e1b75adb7f794595fe632709679544daef719efb8ba3744c59bc513" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611"; + bn_t sig_s = "4674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0081d7a07368b3f6a8027bc428208c847931786913ba8bc9317592e84789b9457aa01e01bc8252a44d", "332fad05f9e1d2448a0916f3c5e2d1a357d7abfedb227726a855f5027be8032da95454632fa89567" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611"; + bn_t sig_s = "1e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008ec14f657dee3bc9e34eaf274e02d619602563530f60a4b6ee79a1cf7c8119e09b33efb35a3d1c4a", "3f4f464d05634cbba22fd067387b34c88fef98dd63ca5e1bc6b29cc27afdf0335dbcc190733163b2" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611"; + bn_t sig_s = "2a460e39a48c0ff193727e795d339347984ff65457b636ed6f74d627fc8144fb81504445742783d0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1c1f096bc926e45775a30475032ee246883d1e57f9fa4d7afd521ad102952b42919679748703c850", "009e448e9c8613278a98bf0d53b6b9eef8c79d6f3fb0bb0771163a3b19504cdd8a69d80e4aaf3b3acf" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611"; + bn_t sig_s = "a91838e692303fc64dc9f9e574ce4d1e613fd9515ed8dbb5bdd3589ff20513ee05411115d09e0f41"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0705d356eac8acfbcfbb361809868fb95569e2921142d9596ec385e92cbc02d595d4958dce284e95", "5608889e26ec9d70b5fd1f388c80aea7fb777ff46596fc9d18c64f6b026c8c8cda6e49c261a5e5e5" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611"; + bn_t sig_s = "b52c3cf70a58445477eab051464ac05768321fb29c7aa242b9194cab5ebc4c35e10edb72cd3ba2a1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5a3f50bb9624aa2de0d1c4eee53702a1882da39b4c26874c3aa49109971c5cb1cbe7d2fcf9dd1441", "10f5ca2a6799bab7d719553ccd25a9eaded90658a94f73b0bccfd50aee9acd1d85a3cfe9761a2153" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611"; + bn_t sig_s = "53bf06e43fcc4236b2ec0d88471379053f1f3437207c5a75b09036b1c40fa8f3128277894a4c96cf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611", "14fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "f8723083bde48fae6e2f3ba5d836c2e954aec113030836fb978c08ab1b5a3dfe54aa2fab2423747e"; + bn_t sig_s = "1e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "ae4a5dbcaf940fc15449b517cbccfde29e70de386a15ee4ac30454e4c1b273d4b8787b0b6567b1a4"; + sig_s = "1e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611", "00be6076caf0d032ef35fbe53a528ab907f24bcfb9e5828b04a5cb4174cde781612981cce088849f46" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "f8723083bde48fae6e2f3ba5d836c2e954aec113030836fb978c08ab1b5a3dfe54aa2fab2423747e"; + bn_t sig_s = "1e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "ae4a5dbcaf940fc15449b517cbccfde29e70de386a15ee4ac30454e4c1b273d4b8787b0b6567b1a4"; + sig_s = "1e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } // End of Google's Wycheproof tests ecdsa_brainpoolP320r1_sha3_384_test + } + EOSIO_TEST_END // ecdsa_brainpoolP320r1_test +} diff --git a/tests/include/ack/tests/ecdsa_brainpoolP384r1_test.hpp b/tests/include/ack/tests/ecdsa_brainpoolP384r1_test.hpp new file mode 100644 index 0000000..2e172b1 --- /dev/null +++ b/tests/include/ack/tests/ecdsa_brainpoolP384r1_test.hpp @@ -0,0 +1,5427 @@ +// Copyright © 2023 ZeroPass +// Author: Crt Vavros +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace ack::tests { + EOSIO_TEST_BEGIN(ecdsa_brainpoolP384r1_test) + { + using namespace ec_curve; + using bn_t = ec_fixed_bigint<384>; + constexpr auto& curve = brainpoolP384r1; + + // Verify that the curve parameters are correct + REQUIRE_EQUAL( brainpoolP384r1.p , "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53" ) + REQUIRE_EQUAL( brainpoolP384r1.a , "7bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826" ) + REQUIRE_EQUAL( brainpoolP384r1.b , "04a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c11" ) + REQUIRE_EQUAL( brainpoolP384r1.g.x, "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e" ) + REQUIRE_EQUAL( brainpoolP384r1.g.y, "8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315" ) + REQUIRE_EQUAL( brainpoolP384r1.n , "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565" ) + REQUIRE_EQUAL( brainpoolP384r1.h , 1 ) + REQUIRE_EQUAL( brainpoolP384r1.verify(), true ) + + // Test vectors from Google's Wycheproof RSA signature verification tests. + // Generated from: 'ecdsa_brainpoolP384r1_sha3_384_test.json' + // URL: 'https://raw.githubusercontent.com/google/wycheproof/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_brainpoolP384r1_sha3_384_test.json' + // Note: + // Test vectors with flag(s) 'BER', 'BerEncodedSignature', 'SignatureSize', 'MissingZero', 'InvalidEncoding' were not included. + // All test(s) with BER/DER decoding related errors were not included because they're not part of this test scope. + // + // Algorithm: ECDSA + // GeneratorVersion: 0.9rc5 + // Header: Test vectors of type EcdsaVerify are meant for the verification of ASN encoded ECDSA signatures. + // Notes: ArithmeticError - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.', 'cves': ['CVE-2017-18146']} + // BerEncodedSignature - {'bugType': 'BER_ENCODING', 'description': 'ECDSA signatures are usually DER encoded. This signature contains valid values for r and s, but it uses alternative BER encoding.', 'effect': 'Accepting alternative BER encodings may be benign in some cases, or be an issue if protocol requires signature malleability.', 'cves': ['CVE-2020-14966', 'CVE-2020-13822', 'CVE-2019-14859', 'CVE-2016-1000342']} + // EdgeCasePublicKey - {'bugType': 'EDGE_CASE', 'description': 'The test vector uses a special case public key. '} + // EdgeCaseShamirMultiplication - {'bugType': 'EDGE_CASE', 'description': "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used."} + // GroupIsomorphism - {'bugType': 'EDGE_CASE', 'description': 'Some EC groups have isomorphic groups that allow an efficient implementation. This is a test vector that contains values that are edge cases on an isomorphic group.'} + // IntegerOverflow - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidEncoding - {'bugType': 'CAN_OF_WORMS', 'description': 'ECDSA signatures are encoded using ASN.1. This test vector contains an incorrectly encoded signature. The test vector itself was generated from a valid signature by modifying its encoding.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449', 'CVE-2021-43572', 'CVE-2022-24884']} + // InvalidTypesInSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains invalid types. Dynamic typed languages sometime coerce such values of different types into integers. If an implementation is careless and has additional bugs, such as not checking integer boundaries then it may be possible that such signatures are accepted.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449']} + // ModifiedInteger - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModifiedSignature - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an invalid signature that was generated from a valid signature by modifying it.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModularInverse - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where computing the modular inverse of s hits an edge case.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['CVE-2019-0865']} + // PointDuplication - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.', 'cves': ['2020-12607', 'CVE-2015-2730']} + // RangeCheck - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // SmallRandS - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['2020-13895']} + // SpecialCaseHash - {'bugType': 'EDGE_CASE', 'description': 'The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits.'} + // ValidSignature - {'bugType': 'BASIC', 'description': 'The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported.'} + { + auto pubkey = curve.make_point( "6c9aaba343cb2faf098319cc4d15ea218786f55c8cf0a8b668091170a6422f6c2498945a8164a4b6f27cdd11e800da50", "1be961b37b09804610ce0df40dd8236c75a12d0c8014b163464a4aeba7cb18d20d3222083ec4a941852f24aa3d5d84e3" ); + { + // pseudorandom signature + auto m = ""_hex; + bn_t sig_r = "1daf64b9ed9a7168b5cff72717d48cd81f01ed3c4b53276cd2e4ab2d2f077847202469b233bcada1fa62938b898a65da"; + bn_t sig_s = "4319e8549570ea906c8b3b8f8167b11f3bedfebcf866c181cea8fd96eaa62d0e492b783cb475432d80c070a0be9d66a6"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "4d7367"_hex; + sig_r = "4ab385f21c710db04e0b81a6305bb0fd64fe7b2a99b367439f7889db459b7080826fa42b61b417c36615f322a27bc889"; + sig_s = "6fcbb543f871762f50f722b32baf28a22f5e525093a9fdaa7f200af055589efed307d7c093d8a8325407c8b7d348c878"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "313233343030"_hex; + sig_r = "383e9bc44741dca761705b98c7b96f10c419d0e4f098f890dfc599faa66987068825e78f5f0a1e70a25b5dceb28665c0"; + sig_s = "26683ebf6fcd3d3650773f9504969d5eced6a8f13c78582c04970a6f016db0259cfe1c4be2432bad1dc4c48cc1b7f693"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "0000000000000000000000000000000000000000"_hex; + sig_r = "61b9e34e28a930a97aee912c83e89a4ffb8e8c6e64b2146b17fc621291c2c1ffdab2b1c9bd31d910f83bdd03326904cb"; + sig_s = "7c6e66bc46f10ed74f0a8d1de7b39c9314f7dc8e5bb7debb7a22b19859d47f66a4ae053bb356b539206ff919b1098375"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "192ed5ce547d2336911d3f6cecba227f08df077f6242a9147a914e854e6e32d325fd23ccc42921dc4a7e4c2eb71defd3", "631e69079ba982e7a1cad0a39eff47fc6d6e3a280d081286b624886ba1f3069671ec1a29986d84fb79736d2799e6fc21" ); + { + // signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "1a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c5"; + bn_t sig_s = "7eaa2412f7983858566190c20c141a3a738094348e8e4be6ec9475c081de685886ff9b1d012e7a0b56a1d5d7b45e2638"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // valid + m = "313233343030"_hex; + sig_r = "1a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c5"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending 0's to r + m = "313233343030"_hex; + sig_r = "1a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c50000"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending null value to r + m = "313233343030"_hex; + sig_r = "1a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c50500"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying first byte of r + m = "313233343030"_hex; + sig_r = "1871e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c5"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying last byte of r + m = "313233343030"_hex; + sig_r = "1a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae045"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated r + m = "313233343030"_hex; + sig_r = "1a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated r + m = "313233343030"_hex; + sig_r = "71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c5"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // leading ff in r + m = "313233343030"_hex; + sig_r = "ff1a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c5"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replacing r with zero + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending 0's to s + m = "313233343030"_hex; + sig_r = "1a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c5"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d0000"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending null value to s + m = "313233343030"_hex; + sig_r = "1a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c5"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d0500"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying first byte of s + m = "313233343030"_hex; + sig_r = "1a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c5"; + sig_s = "0c0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying last byte of s + m = "313233343030"_hex; + sig_r = "1a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c5"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63fad"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated s + m = "313233343030"_hex; + sig_r = "1a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c5"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated s + m = "313233343030"_hex; + sig_r = "1a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c5"; + sig_s = "0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // leading ff in s + m = "313233343030"_hex; + sig_r = "1a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c5"; + sig_s = "ff0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replacing s with zero + m = "313233343030"_hex; + sig_r = "1a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c5"; + sig_s = "00"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + n + m = "313233343030"_hex; + sig_r = "a72b05ba398751eebb9e251adfee92f89c4e3177b4f69d9f5bf6ebf93ea402582a52f7fb8be85b5460fb4b61aa6f462a"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r - n + m = "313233343030"_hex; + sig_r = "8db8c8b4f316779e9ce3461e3e220f3a71ef4f63da4df0391dca0f1fe69bb7088bdd8a9cb4e8d533e9eae75bd8667b60"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 256 * n + m = "313233343030"_hex; + sig_r = "8cd39069dacebc0cd609b033ed754a302eb68fca5b1bf8fa0b534eea3896c5847f95cef0b7a02ba87fada51c47c5d045c5"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by -r + m = "313233343030"_hex; + sig_r = "e58e18c869b11b3953bf4a6370f7aee678e13f92385db913c31f82736d60234fa4e7beb3df9767bbda8ce6a13e951f3b"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by n - r + m = "313233343030"_hex; + sig_r = "7247374b0ce98861631cb9e1c1ddf0c58e10b09c25b20fc6e235f0e0196448f7742275634b172acc161518a4279984a0"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by -n - r + m = "313233343030"_hex; + sig_r = "ff58d4fa45c678ae114461dae520116d0763b1ce884b096260a4091406c15bfda7d5ad08047417a4ab9f04b49e5590b9d6"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**384 + m = "313233343030"_hex; + sig_r = "011a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c5"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**448 + m = "313233343030"_hex; + sig_r = "0100000000000000001a71e737964ee4c6ac40b59c8f085119871ec06dc7a246ec3ce07d8c929fdcb05b18414c206898442573195ec16ae0c5"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + n + m = "313233343030"_hex; + sig_r = "9ac818f24ed8a1f7c8594e3a95b86983b6de4ddf4c1a617f51986718d629e2f71775d241d5d10c15206e8e2e1daaa492"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s - n + m = "313233343030"_hex; + sig_r = "8155dbed0867c7a7a99e6f3df3ebe5c58c7f6bcb7171b419136b8a3f7e2197a7790064e2fed185f4a95e2a284ba1d9c8"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 256 * n + m = "313233343030"_hex; + sig_r = "8cc72d7d12e40d5cdf166b5d0d2b1406b9d11fe6c2b31cbdeb48f065582e4b651e82f1cafdea1459406d185f14390ba42d"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by -s + m = "313233343030"_hex; + sig_r = "f1f10590545fcb3047042143bb2dd85b5e51232aa139f533cd7e0753d5da42b0b7c4e46d95aeb6fb1b19a3d4cb59c0d3"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by -n - s + m = "313233343030"_hex; + sig_r = "ff6537e70db1275e0837a6b1c56a47967c4921b220b3e59e80ae6798e729d61d08e88a2dbe2a2ef3eadf9171d1e2555b6e"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**384 + m = "313233343030"_hex; + sig_r = "010e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s - 2**384 + m = "313233343030"_hex; + sig_r = "ff0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**448 + m = "313233343030"_hex; + sig_r = "0100000000000000000e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + sig_s = "0e0efa6faba034cfb8fbdebc44d227a4a1aedcd55ec60acc3281f8ac2a25bd4f483b1b926a514904e4e65c2b34a63f2d"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=0 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=-1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n - 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=0 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=-1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=0 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=-1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=p + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=0 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=-1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n - 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=0 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=-1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=0 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=-1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=0 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=-1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n - 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=0 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=-1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Edge case for Shamir multiplication + m = "3234373732"_hex; + sig_r = "705c790f8f50061c508c15fc9aabc1f58193ab15b394ab2195e358cb620a5bf4b65449afb9c417bd1a3105e53a9742ce"; + sig_s = "0efd01efddc284165aa2ba53b5590f17a188340c619f27419d74d267937e7f3b883589498ddef7502f399497595bca63"; + r = true; // result = valid - flags: ['EdgeCaseShamirMultiplication'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131353534393035383139"_hex; + sig_r = "565125ffd61ccdaca07b49ac99f3a96b351696f118ad55b8835e8bebb9845c6d41e3ba17f1b43b6ead947aa97a5de1dc"; + sig_s = "54c07b3b304a76841681bc82f946abcda3ace577093adf18d955ad2681307f5b763623e191bfbf578b4e3ee4873a8259"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32363831393031303832"_hex; + sig_r = "05ea63c3519708908e1e679519dd52799ed0b14a9416cdb2d7f52ec86232679d672bc4d1aaf756a40fe56152dae89a8b"; + sig_s = "6494acee7320f80fbcf82b78a834c36daae4c8654a60eeef84e197ab002adfc59755f07f48bd9d36adfdb5caa41158dc"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333336353438363931"_hex; + sig_r = "6d53f8544233998ed06ac75addafd7ce1764b2aab810845a494983ec7fbe1720ec339e7f7e90c691609758e4c12f333a"; + sig_s = "1c9231fd30704345f9e40beaf1ebec9ad615d8623cf45eca6a73db30fb9e2517d5e78ffd6e131ebb4fc19dd1d92cd38d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33363235303538313232"_hex; + sig_r = "13c13d7a66c394a659412e01dfe45ca7782a3bfea1cb484a61c28df44570898957f8a80b9d6523149c586069d116299b"; + sig_s = "72af0fb0998fdf50633996468dec7e9e326cc849d391e58b26853d385e34a588300780c8b8f33927deb546e868caae70"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323739333237313834"_hex; + sig_r = "2063ea75a49a9d3aa184fc57ed68c48d0f2ea1f8d827fe31a960ba6419e570eee8151b08af94f4ee2ecd48ce994a34b4"; + sig_s = "7a1cde664166b07e30d103249a84289ab2ed2600e19bb658edf45f7f51a35f396b0767f48864ab8f9fb685c2f83305f0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383836363432313439"_hex; + sig_r = "44c2e0c4ad78cb695885763c6e8d9ef5f0bd4f5a09196406b68f36bf992851f4817163070cb0f35baae0a90bc94a1d1b"; + sig_s = "591aa095ac806855cdedc05f57e7378a8b59ebcdc4fb905ff1d4d689797656c361b32b42cd50538481485cd6f06047b0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333737393036313539"_hex; + sig_r = "75ae6e8520d51154acfdff75e3af664656cdb160607386461af876ca4a2eac7e67b5704beac4c886c297a2699aed861e"; + sig_s = "3a8eac7e44fdd9fedf4febb309ea01d78dfe3142a49d3078b54fbe307a38706d22c570ea5df26d3872c287015e35b0b3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38303833323436363234"_hex; + sig_r = "56d48a28966e9f49adcff39a1f77833fe461d1cfc27fdc17951c0e0746352905bee45bc342209023f58f1859d63ae9b5"; + sig_s = "053702840fdaebe1f089e320a82e38a628c32c81247f20af2f4168103a8f1941ccbd09ba50724742a7ba35be3f21df6f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343832353634393539"_hex; + sig_r = "40f907da29e38809dedad413605b8ed127c02d9d20f15c109fdfa14afebfafd37af8fced8ede5344bad3b800ea26f23b"; + sig_s = "16b4cc3a9d468b4d6dc42b97b375c1022d46a500cfc5cde3f0cc79fa6a20c51ddb36a8bdcc83d3518ba9ce687ef905fa"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303635303732353033"_hex; + sig_r = "3fdd7a8ec5952f4f173f3268534110fb03450bc365eb381aa9ee46b2864c78193ee0a7a5977cc5b5a6bea70a71fae5ca"; + sig_s = "07398b269557d30c3a7ce89b5e272746086f859818e9cb85e6bc2747d1e4255395a7eb763d961f2a5a75ad0b8ec8a941"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343932313138323033"_hex; + sig_r = "2fa5a988b83979fb34db3fa3ae79e106a9aaf8b22401d0b57e36a454879eb4daa4f2284fe21f53f9dd7097183b968cf8"; + sig_s = "06244acfa15f5e3be2df351e663b7b3adf7cd8c63deb7e4b15ac24952c9c08b2d36a930d493ac743c166fcffcde4a3c9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353535333230313336"_hex; + sig_r = "6545f033bfd39380014bbd6712eba808ca3c2ba4ab34a3165a1593376761e7ee0fec2eca0348ca3056151d1f6a5f1233"; + sig_s = "3a6fdb15cfd1aa3883e784c95fe4b1dc913961309451a9ba050d10e4edd87d60ea54651042d4f91b291cda5814685f21"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333331373032303036"_hex; + sig_r = "16b330f061727c2e3f9b00fa8c2a17780f178b7656a2ff708879a1dbcd2246031b7be4ebfadf3f55482dff8cec25e4a3"; + sig_s = "09d2a8b07dc2dbf323d1fa2acefd4414f6a7412e117dedf1b7703693b0858111f4ce26bcb4b0f2e79998d171df66ab92"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373531313832333938"_hex; + sig_r = "27dcac664f82fe3692992b82d3c5952e647168e923d3e51a4e7f3426efac6b5dbf031b8d203e836edccd8fc4dcca897b"; + sig_s = "2b32737bca118829930cca7b384d099424762b3594678aa13af89e78c3936d2096e10c524a6d0999db928244fc704e6b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3737303439353436343831"_hex; + sig_r = "7ad5a57699933ebc27fd37a66c2985ae6aadefd6a62fe2e8c24aeb8f1419b01d5e7ec84c76a0384284bf871928b670fb"; + sig_s = "760d21026b3dfe11076edd085b19bcac2e7fb9e25a649f1dade75ee14c89f1f462908002b3eb1483a598db971f1ec177"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34323539303733303333"_hex; + sig_r = "7fbfa01642dfec5b12ee47330b0cbc2fc479219e9257ff581ed2e80c611a3843522a7c3941d891df8f0c545fef217713"; + sig_s = "4ec51a80ae925035e444910f5b2c05ee6fa408568364b6e0332064eb7e3a7dad42a6cdb00682933fe56ae05b9c17468b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343139373133353036"_hex; + sig_r = "89214aab319ddb223dbb4e82f8ee72cbe89633f9146e299a650ff0579fc69f95821155144138eec27f2a69d369a2b828"; + sig_s = "73fa0b8ef1ddcfc8508d747e887201677c685052d47fd2512f0f2c6ae37dfd1a9eeae03635312593f115dca881181c77"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3231393238333534363838"_hex; + sig_r = "785b60d1d2dc21eb04c34b77d0bba1363bc57bfd4ed52c4630c3c102a1e7409fc63c2303917f581ea6941a52c555cb20"; + sig_s = "83426967f4e82f3c2856ab9dd7a8d98991ac98358486e9c2bc85e772a15dcab63e578d1d45e67f5fceb4018317cf4bb5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363235393934383739"_hex; + sig_r = "2ad2e67a354549b987124a0dee2ca8b2637323672ed1ecb0f37a15e652f455cad96344c600b7a1e1e9560354224d3a9c"; + sig_s = "523b665a7e9e81a5e29367dc75d064dd37afd08939b167234723599880146a51209e921c5cbd248b37b81294f60bd855"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393538343937303836"_hex; + sig_r = "24ebd78249a8af58bc84197aff563348cf783c6d73bb6c4e2d9e8e037763c628b252ee80fbf54bfc03db647348270f77"; + sig_s = "0b7f61227028eea8ddaa19b1c6d91a07cdf94f3bcd387e37c16dfbc9b047fe3e75446701ce2b063fbdc4cd7df0a9e995"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32353939333434393638"_hex; + sig_r = "33351b9eec7af34317d95447ba7d0c3e9c5ebc6a7dadff2fb90ccc8f1c9d1a835372720f2af06be906b5875bf3063bed"; + sig_s = "55a0fcf16682e36281e6019eff070100abbe16537845fa63aaaa55d89ddc96e3ffec152414ad83ad9bec3f10aa62170d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36323332343733393531"_hex; + sig_r = "6d746dec803866a4bca6b163f8de02620fcf9f9a0d27e058593cbfd611a64ea3fffb2a71cd57a624362f235eff7c5259"; + sig_s = "3544fe6495cce10c4f14d9dfed4ecf1c822e5f3cf90cca36e431dd802018bd2e436687831dbd69b6aceb154c34bbc59e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3737363033313033323137"_hex; + sig_r = "0dcc1b58fa397933f8b66813583fb948c18c29aa3b4dda5745795a086723587663ee653d06b1c257ea0e9655b639c2b8"; + sig_s = "0788d41b5c4c740e0592c5e9741cfb452e177fa59a00c920d928e7af6d9568ab6bdcc7f7f28466dc761de0d0351bedc2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38393534383338363735"_hex; + sig_r = "6c83266be6e540467295a948c295aedde9bda1ba5e37a2a12944f0dfd5d9d5d022bbf9fb1d8b3f8927f82f67b94b0fbf"; + sig_s = "239cab00903e63ed01654222cc0c06d3e9f48598b7d297fcb3d488c381449c324fb160d7e27b498fb0bbb8ab6a74cdfa"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343533383530303035"_hex; + sig_r = "097a10e72312061e1f20a25feb19f74fb7808d5bde2de7455bd03a71cbb746df5c7daff07d018ac353493e7b457be147"; + sig_s = "50e92e7e516c18096233ccd23c5402e80c2c8b4af7ab34eaaf0d22bcb114710f73bfbcba9716ccf67e71d9c0425bb873"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32363934383137303236"_hex; + sig_r = "3cab21b288e5a20ae75609785924844e9d7c045d4a32f696564d17ade3a9279a6bbeb5812107e496396799c562167641"; + sig_s = "829d996521dade6d3f558cdacee55cde45153b8a7aef20646a59150852a5600a57a099e997a4cdaa9dc7c96808dfef99"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343331323036323937"_hex; + sig_r = "0137a95bc18db25460a8af35113f707fff27d3ceb425cc44d471e1268d40a9fc3593f339f73a23defcc86216d5f8ccf5"; + sig_s = "1f4c9962b2143f6debc2c1c87030c343cb0e95cecfb3a98817d5e8cbcc4ecf116c09e75414d7188bdefd42886f1cb1c7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323031313936373336"_hex; + sig_r = "3023753eb50bda7e06bebd6d1a91387322bd32df60b538171590628747bad5073fd2db6538dc0f90702a9e31b560d5af"; + sig_s = "6b422e92e111ba1e5d699be9168af8ffc1ec2b6703d0fb69470f7c58c5e24acc2cba03f10ed9c85dc00080a189f789ae"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383330303038353932"_hex; + sig_r = "0bf7154e0e55012a9bf4e02fa96aa7ad879d3f929eed6406b975f6ccfef6fde8cbb61bec18c5c7c55bac893843e33388"; + sig_s = "75620ea5d958993db548118b4df8e4c1eef97617fa3e7f95c27004815b637cbdd8edccdc141f0cb70f34b0860421f696"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383834323632353236"_hex; + sig_r = "63e27f2902ea8d8d85af24de6445f85a16e9d67844d5999149de289c1e690276ea81bdae0c46db16f5cf24d698afbad2"; + sig_s = "7a68a0aa32079f2125f88d1cc33f0cac17b44262306446eafb541b1350799b053302915c4bdbae504d8774d3bacdaf7b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132333434393638393037"_hex; + sig_r = "6ae4a41527f6eecb460563ded2d4b922a44ab8ea97c9e92c691e5ea1a7f30ea533db07534b4ecda7220f4040f5a5b14c"; + sig_s = "7b8cd45dbf984783e7f55710efaec6e15ed8bbef8c62ec145a1df7390c88590910b065f1585c13743ea1f4e751c4740d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353439323433353935"_hex; + sig_r = "26a71859fcb9b6bcca4a26bbf1488a01a4ab92b921b98518499d28f07840e577739b2c774ae32efb5377b1a6c6b91e51"; + sig_s = "7391d5453978a920dd31ebd2c02e6b5171617783c3eaa7c9791bb11415ada86ef833324c8c44c7eb0ac0ca7a83420d60"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303832383235333337"_hex; + sig_r = "30ec58c3faa5b5aecb5361307bbcb68bdc6d9971eb4eabb09592ce330b49b2157ce16030e127af740bb8b0a0670eb7b4"; + sig_s = "5c97e8d3c3a5a34b52a70c3ccf0fb0394a27fc6a65a29e8d506cea8df4023ead6ed5091898a52dc2c76cc5e66484528c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38303337353732353536"_hex; + sig_r = "6992af8e9608815628a4b326ae031d05bb38a24a095fe1fda0fdcecb78700ec4b90d5f51ed3674786ae328a0278b82cb"; + sig_s = "5e61c47c790c974a5766ba2b93acdaa12a4a85bb7e8d8f22071747a623f6e7999a26930cf0c7f05adbf7f75ac29fb876"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373734343739383034"_hex; + sig_r = "7f882ee50a853b1fda9ce77f53cf097a1b787615584d796f94478d3da390e25b88861cbef5e8ed737e9f859b5ac755fd"; + sig_s = "78c9ab79927d9afeaaa3d057fb48727c13aa016d86205ab7de61ade0fa8a288c9e4f11cf4b395e25af2a86c9f7ae0318"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3133333732303536333833"_hex; + sig_r = "0402167dba17a64103893107f3c8def95b8b838f9c6f0b1b3843610fc0c0c08d0021d91fba432ab957c7e0c79d2ed60e"; + sig_s = "465b8523cb86949c386992b62222161689451e6ac50ca1402a05ddf7eaa8beaf73291d6f87fcdfb9e322da46149beb1a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35313832373036353336"_hex; + sig_r = "27603b118c4ff61be722f9fc7c26c038017713c64ff19c918ca5338cbee5bedd878a05610231e1310f182b661cd6002f"; + sig_s = "6323edc1a9865f227670fda2265a2b20834b6b0ac5335d8036d77f153b808fdde30a04bdb620afaeb1dccee98d2d08bb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34303337363939303936"_hex; + sig_r = "16edfacdae6f2636062ce0d953147260272ad4a0c6f3cd9e6a4ed63be2ed87ff5474d5040338ab4f8fc129ce132627b8"; + sig_s = "3276272ea8d707273965c1691a11b70e422c251319e16b7392043f58468d71caeea34a949271f25b53ff078315be721e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131343230303039363832"_hex; + sig_r = "5ec863f8273a343c7724f445d0291068b5c13fc94dfaaabda4b1cbfa43cb5f0686e94e05683323085af2b443c73a1f1d"; + sig_s = "6110f4477f47c89b6c64f9c303718b516e721e1af186f03889bfb8558d7a631b68d20ee181c9b6c9de3f02719da6b175"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323037353534303132"_hex; + sig_r = "30451161007c9e31665889f57bdeb9943c1980340360648f62cec14cc35c504e201db3bcf7d0472280f229ddfa0cd73e"; + sig_s = "6e45017a00fa408a610a1935f5eff073b79fdc1b02c24b2b8718e93a986bcd709e3a719f57b0b0fa0738c003851e2174"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383536323335373531"_hex; + sig_r = "425d991606b0197a40195c5acff16f45cfc30cec3b65b2225de9d0ec92178869b9481ac0f40afcb0d9ae5fdd0a998b4a"; + sig_s = "43071699dbc0696c9851c89f4e101863071c12003d1547fcee16bdcfac813a361c583f57d23a74c8c295e8c4709c96f3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32363736343535323539"_hex; + sig_r = "5d7f10955454f4f84d8fedf8b1a650612e7cbc90a5d91eef683bf55fb1f3355d9b82329929d9306e549b219dd3c492fc"; + sig_s = "23f1964177842d65667b689e9de323733f4816d1e1e9119e4599fca51224df550144ece9a43b2c4ecea71d1bb6762bdf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313832323433303137"_hex; + sig_r = "21882d0811711afadcc82f2dbb7f14ed813a4fb9dc657f2984708259e7bd24d35791f5ec042c21beb42fab921f90a914"; + sig_s = "25c800a5ebb92f792c76569f5f8251b4131eeb4e3778617978f04b9a0dcdfd6bbdf8a4ada1cd25a6cebd985df1a22dda"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353232393434373333"_hex; + sig_r = "329057280637e0ed09c25a182ed50bc76f33935176305141a2d5bef206a9f599ec9cc1681720a4aef3b895e6298e5c3a"; + sig_s = "57f69b007b4782ed7e32f4aa43b69c63047f6c2e8e74ea64782ea04e3b42b0f2c10b4adb80fed630d9c8248167d338c2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343535383431313936"_hex; + sig_r = "7845d03f8641f31e25b1ca48d1f8cc2d19e446b4f67823a5904208866b0230b4ce1d22ed8a53a76279b93c593d6518fb"; + sig_s = "3ffc0cf301e05e51a7397b90d8d4a28768b2fa0cce53dc7c815ee7e0b57cb50cae6bda5a3c925492f5e288f2719cf89a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132393134353430363938"_hex; + sig_r = "129479285afaca85ec17526f9fb149bccbdbe366860d7cfa65fb1ca53c60c0bfd3234c90d764e7671427211f3a6aaa89"; + sig_s = "15f206287c8147eda7c7f70f7c5ffdeedc53cc91690293a63fe14327e5f5b338460c383ce19fb381994facfc5d200458"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323730323132343635"_hex; + sig_r = "7d8092296c8723198a32333dd0dee17e2ce4757b24122a38c6e62654ce44c9b6f6f5595c7de8a016bb1ca6c253a40d52"; + sig_s = "49e0ad8f638d33bae8639fff3a5fad0e94a94ee7b287f7be34f7f0073314a439d4f3943aae9ac562c3046a65efed8a16"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35313732353737303635"_hex; + sig_r = "52ce3c80be8c13a38702451a19447571786b0763ae53c7eb6520001b718624cb1eded4fee376d4d391ea740fc0adcb72"; + sig_s = "6199919c0ed708cfd6f6b9078c931fa51d964454031c01021649a1a277a663abb9a0adb5be331ffb3f405673aaa23bad"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333835393530373037"_hex; + sig_r = "382d205bdc0d8cee39c46cbef65c4da2c9ad126d9a1012e7940746e6b033239069f24a5c2409e62f5e172eddfd2320e2"; + sig_s = "6b3fa5920f3331f1d551e0e7c99b0d16869a287ad8edb05f862ea0e75df0b015e5470358741f8e8e704b47b002325421"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3634333837383033373037"_hex; + sig_r = "82cf0d374b2760d73df2fc555f5a34aee24f6a89fb0fdd428be6c62200a002816b65e758b396f68311c83daa364548aa"; + sig_s = "107d5db3378dc658f13050611d622e986841de85f9c23f4ebca0fb5825ae3c72ce6b62c4bd018989f6b6bbb655e0f4a4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34383637313133303632"_hex; + sig_r = "4b6f67c5926555e8a4b70f9e23641d8c14e21139cbfb7a263e02fb5630531d48a873e60c133359ad290d9154e1caee10"; + sig_s = "3e984268599d714e8ab1d7370b47b5f7390eea02993aedf389d36cbf2012e58927f3e01e1b910f5ce10f36f2dc0abc70"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3133343239363139303533"_hex; + sig_r = "274ac2266cabdf5f4ecbdc591be781e8a80838ff59127f62b49e3a8fb195bad493f71c9fc6fc6dd9829198183911ce75"; + sig_s = "101c9347d33160f70ec0ee97dc3757b19951b2ad2c8c38a4d78f5d74ed1c6fab534543b60bef269d7ee3e706ca2e3c8c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35303634343932363338"_hex; + sig_r = "3ed1ec4c1c76fa7c81e4ae1a775ab80fc79f959137e5c3187b29f4f04e303136dfb1ab90443a3da9ee49d029595cc8ee"; + sig_s = "3d9658ef7f8f004b7a7f0db676633af40fe8acfeb4bd7a47a130c956fcb9e1c4cce9230463e9becf31c7168d480241d0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3232373339393133"_hex; + sig_r = "208d493794509589f583dd296f60f3c260ca1ece26f21911ddf7e5beeeaf930e69039c7eecffde94a20b7b9565d4a31c"; + sig_s = "125fe71c5d2ee7e8d8c65c9183054e577cf89649a5a7df1ec0ce4a4c3ef018fd4db73f7e4f1e43d9f6847372a277e830"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333932353736393433"_hex; + sig_r = "337e4e2b33e326d716090fd4ba90da3fd9956baaf14c6ec497cc3ed2061947530210a7b64548396028e15f652cae841d"; + sig_s = "5ec653d9a921aadd339fac777a8e93eaa5baf1f73b02977dbf3b4569115de9b4ada8727e962b3d655b05d796f0c963e2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343435323032373632"_hex; + sig_r = "34af94ad4c7ac683ac2796fb058a792d15fcf8065054779fdfa64cebef5b9080aecfd3b053c662ce7b28b10db739acc0"; + sig_s = "6c41ba1f2292e890bbb83f286937d761eaa2bef4cc37b32cf91a66250e6831e205cac55726a6f02ffb611198407edfc1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37353934393639363532"_hex; + sig_r = "38785fdfadec53397131cc888b60c215410ff2048a778a086b94ddd8c222c951cbb42ccd8e92a24e23428ece44441292"; + sig_s = "4201037ef25882724c7cc7714a9d78d85c5b3ec01b15b3a3d98da06048aabeecfb3371e9fb962561abc2f38eec472d15"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303134363536343631"_hex; + sig_r = "72cd77fe013c9385b19b4e2d9b8eac9dfce9a9276b7cb2a117c449a0d9d99f77643de849438ddab51074195be4bba581"; + sig_s = "52063808217ac7b98a9d51126e36910cb88835e17cf82426fd1facbc92179080aaac1ac62e6555aa76da87b715d1bcdf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39373034363738313139"_hex; + sig_r = "34324b1e93f1e60cf1c3faf7330ff5d879591530f633a9becd678772546a0f6f273a1910164120186dcff2d0cb342725"; + sig_s = "79aa7553e42b4535c669b4540a8da3bb6afe7fd50b5244a3759609307d5f07fd826b321e56abcc2790374272cd662be9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343131303338333134"_hex; + sig_r = "08518d07ba1ffd64e48abc6e2573bf1823679a9b166c0cf1a802058096ee4f5bd649f647622a2c85b11c3231e9729201"; + sig_s = "3a6694af3ea13077120980a5e273477fc0e0b4643446ef582efe250153dde390d97193233f693d9fc05a3b60f60376a4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353437383438353336"_hex; + sig_r = "656af35df5da50da492a04743b934f841c3df13aa95cc6ac2953a5785d6082c1cd1e671c3b532c51e08b3b4ae0983c91"; + sig_s = "1d9e7c085bb372a95a212a44df1eadfccda14932bb9b4bf8dfa27fc12826af55cc3412c2930950ee149c14f2937cea7f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333738363732383631"_hex; + sig_r = "1d222484c394ca1782d34b29cfb394bc2cf3872f47088af114c13cf2ac4b6a8816e824e58ef8da51a413ee9c3a49266e"; + sig_s = "1e0b0d67360f8964339a0537e4b6c30008299b43e5986fd4a1c69f791ad2dae6ad36104de0e1133aa0f8aaa3305d629a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313636353734353639"_hex; + sig_r = "22b90ddafba261684df49b6870e3d85c5c827404e12509e264801b41a70ffbe00bc14626e456152e94de897574e110"; + sig_s = "74899ea162b763a24422e42f476a8c71fe244a0a2e7d1487aaf7172443d152adbd3c7bf6a3aab89713b281f9708403a1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363431343037363435"_hex; + sig_r = "564570460c4a8b47e569b2eb21315f252f2ea296395490d5dc0e1183d1dcdf867b0eabdd31c8c24fa4cdc6c53813776d"; + sig_s = "0109989480abe4e198a0c1f421ae68ccdb29b8c899a404e749440d97e555f3a5ade9b108b8e6ea33c6aea60b6004ddb6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303833363036303631"_hex; + sig_r = "765332069e4825f03c6fa75af51697f9e7c5d33faa5def0cf39f91792efb3d7e294d322b78c00efd66497a1c23710e19"; + sig_s = "340832c9d3b057df2d15074c10d53518fdd832f5729a454c52e1978da2b064d40cd81dd0ce585c26e9f5c2da850b858b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383235303436303231"_hex; + sig_r = "7677e8149e8b2378377e1888e1ca99c182b89bbcfb67b83fff6ffb333707bcbc7c9990574b683090b26b168b58e94e51"; + sig_s = "6a76ef7db4018a0588469680af611107a3135229563788dce633b365cb0b051c52707977de70827792ef50893b9f11ce"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313432323938323834"_hex; + sig_r = "03fcd6540d6f43e7c6e2c164f3ab10722f134fefb37ad2cb237a3a72cb4abd4f783290ab6c823ea07adcf15aae35615c"; + sig_s = "2fe038f3824425f1911bb057e34e321e7dbcc4b152e2accde28cc6b721c24d0aa50992e805fd4224b818efad67c6c2f9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313636343232303939"_hex; + sig_r = "3830d6f01837f6f100ee8ba743c73149ac0bded4b57da111b3edca992d08f4e29c78d87bd0e7260d2c018e26a11f5a52"; + sig_s = "1e27bb19ca89cfb3e30f5d4b94f0e3bd7234ca214b1e9ea2890840ff54980d2c44a7d58d8edf4714acb9d9084b7fe391"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343830313930313632"_hex; + sig_r = "2f6e9fed237238b0ee7c861b402d503d10fa3c29cad3b72dc775e01bfa865ab5e57467cd881e8c9570aa341ddad7c58c"; + sig_s = "4675957e5458d998885e7557fed87c015101e87bd33b5facba3f94930969db51bdb590ea9759e87faac495df23bf0c52"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35323138393734303738"_hex; + sig_r = "19e8ebe840e93711a47e4ba3bbe1a8fff87ef8c34b15ec5fdc495557011840c527285254194226ed55be74723ae76748"; + sig_s = "1e9faa2f169c82705c5c78dd2fc4553d094eae5743ce3382d32b9aced60697644bba31ce452cf39ef9815a2d98fd8d40"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130343538383435393733"_hex; + sig_r = "4614ae0e3456663c34770132bb2ff87a05b30cff5c7d8cc4ab9f6cd199fd043996690f1794f9756071be394b0c397b52"; + sig_s = "74d7208703438f5035c8e36a812e2bb80f2f3bf6334e234c7a22bcce4a669eef111613b594a15f336b97fd252e6581f2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343839323235333334"_hex; + sig_r = "59fed5201f3017ad6f98749b1c96bd80a10bc95ec3739c308de63d2bece0abf9597dce293e289456bc079ffdeff74b8c"; + sig_s = "5b645d7d6fab85c6917eb1742114344848212e521112792cfeebcc64d00b97b87d13626fd79947dc5a447b45f2772f6b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35303433393832313335"_hex; + sig_r = "458efee6cc2ac89050cb5aeab43f7cdcd1a9bb8d46fce60ab0af0e089f03bd99051dd4880e8825ebc9dc923abdefad24"; + sig_s = "17b9178ae75f1ac7307ecfd92c4ac4d81cad06d13a5a238db41b5268cbd5a4c9263f6522bd88a6df610da638c7814b58"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132393833353030363939"_hex; + sig_r = "2954391f9b8e37617480291a0231cc60c18d12091fc9cf5a0ff7ff25c7fa21e6900bdf11c1a374cb2420451e3d883ae6"; + sig_s = "4b269278a79baf8b806c0c3c7a794153650da366a1d543bb75626e280b558f7c66c6f9ca861104f7109d27474fe6d7b8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131333236373331343032"_hex; + sig_r = "7129fdaa3a38e618d6022688a64887da92f9acbf45b58ebd06a1f7ba1733c365bf09b669b8dd16c0edf5c5a440833cb8"; + sig_s = "3abaeaa2195943882b1f8d103f15daf98463daf4aa27c565a17e92e51f02ac113e90c2690210b7f5cc0a7c3020742702"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33353733323839303232"_hex; + sig_r = "32209256d52aa9cb05d12588eb357d9a4134170dd9c3a32c1e27a06a9bf486ed3049226fe9e5d117b5ac0b52fcec15c3"; + sig_s = "0623b8226e793c5efce3f5e8288d925e746fda4a30ba3d5eaa6d432976f3be589a9fe0e52ef8023e82df7000a2cc9bb8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131373339353634333738"_hex; + sig_r = "2cb08187f749007cf10ee2069886287416fa5a8a83086c28085fd8639fdffe4b6c9e5bc9724f98f541b86ecdc7257c6b"; + sig_s = "602fa324b1dd388aa13b72b6d41f06e4aa9c98d4e28d2ac374ce7407076e13011b82d80e537476e0a2af80b67160e70a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3733383230373935303035"_hex; + sig_r = "40390fc2bf86c850b2516e3cbc13d7e9ea4b979c97ec027e7c87452fcfd3f843518acac74c2b5ace89ba8dcfc682e70f"; + sig_s = "71affd3c3fafe2d8384190c3e1923b724a30cbda8cde309442d598fe40b195b7cfc8f16cfc2edb5829135f68d52df11e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34353233333738383430"_hex; + sig_r = "69625aced2bd9f67f2250a75b4794fe2dd557934a4ba981f693cf1cc5ef732eebb865c355c5d591732280270eac733ac"; + sig_s = "68508fb0540cb21ab9e3e3f6e2f0dd138bc7a588d834f969383992984e4fdad25c05fdd745ddc852fc393fc49096005f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39303239363535323738"_hex; + sig_r = "1291e74903bae73bc0860f6f2e301d6335e34e2a8bbb289af2826eaad84679588861957c0ce162507f671d8767123cbe"; + sig_s = "6b757bb7ad0b5859369ea30fb25e8ef2e823ee0271c0b3c30781fe031579159837f8e14ebeb1598bd4f8b6a79a24d1ba"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363030353238363330"_hex; + sig_r = "727854c0d62857453c799ca2af12f4c21da66bee3163b5871856b33f123d45033b6eedda51d38026552017dff869e548"; + sig_s = "2c9186327dbc6cc33576d7ad5bf54eec46baf407e82739aca7df9c4853750f50c987851a6d116c9d780bfa3356753ab4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333639343536343136"_hex; + sig_r = "5d07589dab414a1e76f064a303e8fd4c53a42d3f03e543c254ce8b9ad2e97a20385785843fa12716c3bdb9ef86c52871"; + sig_s = "87a7b277b7ee0e10301a5e92f4878815aefa4d5f42e465780aed76eeba002b37223a8caf7af71b9130bbc70ccd3d40c4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130303139393230373030"_hex; + sig_r = "35e2abbee976bb12bf72d33f664391bf1a22790aab3ea15dabc8a8dd917e5edce570c35228a29386c8a4ad00c5256e2d"; + sig_s = "308621467605c3c0374223392fae840dbe8d0580bbc1dcc2e6d13ec805671919b859d470de12084386ccc54aa07530f0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373032333133323830"_hex; + sig_r = "1c06a498320108dea8c69e5c52bdb17e90c314fc8b0da81c5de0589173abe5c4b9a3564b249efa7c78b177a8261e2b33"; + sig_s = "393c27214ff8bc56abd53a9a7a6e7a0f53c10ecfa484bbf619782f517d14b2bb83be9dfe1e6430a23d83964e61004329"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31383038393439383431"_hex; + sig_r = "022433de87fc51fdcdc9aaa2f115969179f7564b65ac20d7370811d8a7da372d21b01afdb81d66b84cf780e9c53c83e2"; + sig_s = "8c4a0f5c22bcc87e133f524566e3d8ca95142d66c2bf7530d9b7d208a17d05b6dedc7ad475de13f59a59632d9114f903"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373438323839333135"_hex; + sig_r = "7921a90739278a21f42c09637f87295636e8ef292d3ef61d88ba01b8d3eb3431e97e8d7f200d79e679538cd368e57386"; + sig_s = "8167a70e895a707dfa5b0265d09a8f6a8ef80cf4bc0bfe89b3b9146fb703efbcd8538dcdfcf91530f609bb9c68e49df0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363232313031303338"_hex; + sig_r = "0a24ef2c73e968f0ad54391bb05abb41b14348e22b5b84c2b08730efa0bb7de25e2c81184729882bac6b67dcd128e8ce"; + sig_s = "0612ab554a37d07a127735b9b23c86d1516ca02d5ea25d1bcf4edb4c29b8a9c7998d8e3daccb86f2bdbdf15cf3094ef1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132313833363339"_hex; + sig_r = "10fed07b829705c40fe5e1bcc4faadac01e10290a1846f916673058095e9651a481231e4959783ff446c3e460b06759f"; + sig_s = "850d0323b6cbf95bdcbe1452d8c4cb52b66b47bf9f0d02828a806be2c4725113953a65b3bfd999e76b2427465e911dcb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393535323437333036"_hex; + sig_r = "689ae6bfa60e623f2b2135d1bfddfc34c41c6614902dbab848deb1c3df9644810bedd7b3e44a32f32178c99945384d3f"; + sig_s = "865687dcaa4a3b2a691c32b3eb2376b005f9225dcb8e5ff472c8f26b7f2d1ce5cc4cee8f4a8df90c958dc341db9e8ad0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393531393636303731"_hex; + sig_r = "14f7b847b8ae94722fe48cab58fd522a89a2d35ab8b18d3bf95f8d555af74be99fdc2556e4957ee1cd70b926aabda315"; + sig_s = "7d1735a44fe647c845522f461923802caa919ed5e724d55604814cb0c1246b478bc259e4266fcd9f01a6d3885d3d49d9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383830303734303635"_hex; + sig_r = "117397220e6d2a00c5002b58253239fed37ddd3b03b69940dec027dc98b603b874c5fcb0db9d4f2c85ac43d7a9d621de"; + sig_s = "6c6003a276a8af3e7c125cc0dfc34a77fb02d02c712b2eddee19a8680e282729b415917f572ee62d5783fee83e6d09d9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3136373937333631323130"_hex; + sig_r = "662419a1e59d5ae6e58dd34ae0f8b87a2891d6badfeeb3da4c85f893578f7aacfef9e41f9b6272766192d4e5e885c900"; + sig_s = "692f597ff42afcb37465ff09c2a3e5518c071a92650778e1bf5fc5f6a0bc6840163cca52552508abba3ea5a2c00ae6d8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323235353833343239"_hex; + sig_r = "6da0261261fd1874cca7634bfa415677123226556bd01380a81cf1deab080870bb19f25d4b16855ec4ad3d77cd09cd9c"; + sig_s = "4a271d7dfbe9abb979e20e41cffa96da0735db2d1f68dd2f8ac6922561c7e0914b5f63455930d258b55a465df1752d3f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3236393238343433343334"_hex; + sig_r = "33d58c98a87d1547858f1e67ce0bb161b28fdbaf34906433934ab973b02fc6b19a62a781111845eb7cd2550335011198"; + sig_s = "5f21c6511d3301d21bedceec307796e25b6715f3ed066b54dff3f3492b01b836c17aedffed03de3194ef9a8debde544a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36323734383032323238"_hex; + sig_r = "7776b606316ef8071ec9aa3dc26be1096d770b86930fceaf8e80719d1bcfd10cd7bfb3cb204c71cf03086805e99670d2"; + sig_s = "84b58fe85ea3b097e59015a9269608532b965df486c5d25aed553dedf254a9c0904d8a4db6cbfb49fdb6838485b35ba4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31313439323431363433"_hex; + sig_r = "23203fc6ad5a5b21d95744c6a6ad9481c2943878d4a30083224d355d421be54d19fe9f6815091731a1d69eec55a51398"; + sig_s = "08f806a4b9211719b2c08b2c2fbfe70e22a4a63b5953140ae77a88513aded5c78f390a88a385831ee8eab0006ca1f766"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "165d3850ecc61e4621f0ae886585a3abd4318a4ac389df217d192e7c48338ce002c59398e974cce5cf5318ad5eca5971", "207147248ba5133ea27c77929eacb80a9895f514476f3f40c8961fda9eea2f951311a78565f1916befa93ef18aa3fedc" ); + { + // k*G has a large x-coordinate + auto m = "313233343030"_hex; + bn_t sig_r = "f39b6bacd3b2eb7bdd98f07a249d57614bbece10480386e8"; + bn_t sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046562"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r too large + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec4d"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046562"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "433be12131d380c25d82c456e363d5f2e99c97253da183009241b109dd280474797abb17370ef26a724b2e1f1aa8061a", "516206daf15b694fe0a517b18df4b0e61a8321f1133e7cda7556e5f3fdf65cedb69e2669b74464ca1c82a6fbe7802de6" ); + { + // r,s are large + auto m = "313233343030"_hex; + bn_t sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + bn_t sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046563"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7f111eabbd0b2abd8c9094cc1abe46cdd76bb6ed0bd9e7324678fa8acf4ff6768321cba8ef8d64071a628eb17f87eab9", "036642215c05d858899c4084cf10012179dee217ff81fe9c4c10f805fb743f59d72296f42de7c20cc95ca5abf2eeda09" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"; + bn_t sig_s = "480eca2874aa6ba71e7fb5711339ac0a7bf84065b3c7d59c64a2c6015e6f794e7dfa2b1fec73a72adb32bdb7dd55cd04"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0984459099a6a2d442d51a0994e167e99988181988232b314cab258cb6426ce26c2334470e9f933818d6efd60035bd2d", "78cb308954ef8a5b26f796f4e2d2fb277ac5bf2c39ea31acd99027209c60eba18dd07fd33e57b333572d55b9e04f2ee4" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"; + bn_t sig_s = "1629ef2d7182d67b6bd9cf6842251fe09c96bfe022b8ad9a0e546fdc8ecf5dc8636fa13059d7e9d83fde50e0d2b392c8"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00861d2fdde84cbf052e0dfadcb53cf4f93ddcda9843afb010ab87748cf1b97018458ec55c35ef83dbaa4a20acc357f9c1", "5951f1b7f97e120bf9a3bd2435e2caa966c6d4a056f618fbe5a9198340e2ec2b41ba1744abc8a8a9837423e4f36b422b" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "01"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4f87cf2d4a95f19512562874d7d0b5ad80680ad1a0a290b480c6a8f8836a104b72261ae83c30f39b1dd11e954eb4f4c5", "008c5a3c298f7af488db67c9f82243729e07f51eb09f2263ca838ba4827719ec44448ef9af55426898c1df7c2bdc2f1db1" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "01"; + bn_t sig_s = "02"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0a516661a19876af819e1fc893fe9ce585855b82c5ce07a12ca2a7efcead7f470db1c38ab9d4266aa59e6af5b679b86b", "0709d833d740beeb7eb0525967195feb3f0dd16f338337dce5a4b310713b584fa8c2e8b3f89737d8faed6de05003b55d" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "01"; + bn_t sig_s = "03"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2c236600c85d2a496639acce8faf62084a0f2aac25eef5cd3a52c4418e2f7828dd763a2c60b6db21367ee9f9d04b42a2", "674f1c018d6ad0b1a6802316a189fb01c1e8d513363bafe832f6f354c3cc7cdfc922fab2be91f0d6fd252a40e219528a" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "03"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "65f34d64454568371283c7dad9abd44c89174f389877282489c115220fab0b081f8d11e10452dff6c708bd1996db2ff0", "1720177810cde4d19c1efb9b1292729e5b48ae1c4cad5f6eaa8657cadf978d5e1f76d2106ced0b5cab703eaf0d4fea08" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "03"; + bn_t sig_s = "03"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "66678df131b3941485a6bd170410245a6f5e62aafe89e14b94976885823d2484350b3e0f3276a8b056fb3fb37e3d3552", "0080001aceaea1763d29a35042e16d94ff440f4a0f5697d4c497e46e45ffa1df5f59b9a73889b79f008c9d852751c0c59d" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "03"; + bn_t sig_s = "04"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r is larger than n + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046568"; + sig_s = "04"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7a849d0bddcb6308b29178cb1c15bf4d421f1f4d600c2c710cd370982960518b77fbff4924d97144a901726fd5672408", "1d37727bb03ebf3f0c50a4fae93451d8099a9519183d52de8dedd392876f66045965650c64684c384058aa9fdc0c6320" ); + { + // s is larger than n + auto m = "313233343030"_hex; + bn_t sig_r = "03"; + bn_t sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9173bec"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008a2722aa0181754ac569d86f9a50f0c02c1aadefa9d1633747ed9e2482613e170a905c6db64afe5a39cc92f93e490c87", "3c726ddb39cd8234c5e0341ccff8618d6f4c4b94a232b3b30f5d5cb60c5555d8a70d43c62b5c33c3255b40e7946b12d2" ); + { + // small r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0101"; + bn_t sig_s = "896621d23283b12111048d1c978e2c286d60b6ef7ce37af36cf7aa4de268d626de7ddcb356d167c7483c69455c752c93"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1b586971ccb55cd7b80c501e9c8ec5d06d4d46ab62512adb048f84226d76ab0f68c270c823c513f71305270b1fdf45f8", "26246892f15f0cd2d0cad344e1b876f2247858f04b57444903deb7bafba74bec2942012d7b6f04d1a76199d2568e2ad4" ); + { + // smallish r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2d9b4d347952cc"; + bn_t sig_s = "38e8dae216c63f06b3edbd0f9ba7a5e4a332ec187251e3d627839d1baac667d7caad2ab0a1ea9fbb12dc5a71e3b49bc9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "72bd449c9fbbac20d4787929b27515d1e5b9e67c9fd4475ff128ebcfb4fec6d6998484d9f2b500119678d4763a3a2563", "629e0470cbe2c952cf99e6cf77c5e5e5fb7c1e4c0b25a380ac46c9b99409d1b7a43b214b38167c567edd1e5a75a416a0" ); + { + // 100-bit r and small s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "1033e67e37b32b445580bf4efc"; + bn_t sig_s = "0d2436a599b396a51c546e05d1c3d25a8f6d05935ae5031dad3cdd7cb36cf6912a433de28f8475d3b1e2e1ce77610879"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "04af06ee476ce1b3d772a5172d101e8c9f4a879d68bc7e5aaf4851328c237a884f0f678b8536db82e97bf69e2474a662", "0ebfb1ef878b18a4b3bc808319832ae9c179a6f65fe1e00decd7343275fa90eb4a067025cb508aa19f7736b02c83def7" ); + { + // small r and 100 bit s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0101"; + bn_t sig_s = "4a289adad7ceec67ae99ef5da797b6bb17d9c168428ab30ea9a68b89652c4b9e9bae876ab3d7fbdf1eb92ed422bd3b93"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "583dafacd7762853ff1086db9761e1b5d0cae7f8066946b96c5cc12c67c331d15bcd2fce4d700f763f0ec903fd48f468", "6eb17fd61ac9c62ec19e705782c2045c7f89ecd9be8814079f9699fdad2d4cf871508d236f89ae787cc36128ba71eff8" ); + { + // 100-bit r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "062522bbd3ecbe7c39e93e7c24"; + bn_t sig_s = "4a289adad7ceec67ae99ef5da797b6bb17d9c168428ab30ea9a68b89652c4b9e9bae876ab3d7fbdf1eb92ed422bd3b93"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "28128eba7bbfc2c4b72ce86c9b822029e9d41f9bd292753bca0a56fa0a51f010eaf25432199e55f69c02ba001c0dc8ef", "75f77d6689d41d39aa0ee27b18e7f26414c7035f1fac7d958f2df0e3e1eb3a5d27c56aa197c75c173f18d2b925f659fb" ); + { + // r and s^-1 are close to n + auto m = "313233343030"_hex; + bn_t sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90464e5"; + bn_t sig_s = "5dd0bf01c2259e1ab4e8f4fee099813f6374f6069e3839ccbf64499dc802c3c534d1cf1f9cffd76027b021574602ee43"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5f387561d6f807825667f9eddaf28ffc34ede303231e03ec94db618a5568a8851fa912af936d7b71e2a331e168b8196f", "07a34d058a61adbdf59f11489f788376325b6b2cee11b086c9021dc5fbe6440e8c93a583178be0b620895df88dbc91ee" ); + { + // r and s are 64-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "9c44febf31c3594e"; + bn_t sig_s = "839ed28247c2b06b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0479d78a564638d7d3cd95b178e50419380f585cd20a4d88853c1e0754c195fac43ec7d1c9b218efb6c2747ca3d2c36a", "1c03c8ba7974c9b7a0f4cb0669033936117f51958e9ab54d2d4e2814e9ae15554b1f74d19c7047b287673ce7d4221831" ); + { + // r and s are 100-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "09df8b682430beef6f5fd7c7cd"; + bn_t sig_s = "0fd0a62e13778f4222a0d61c8a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6124849ee698fc0aa37a511a5dc38d0d77bf06263ac9a84f5038abe68bbbd1631da8546dcc45c38aa7dac3221594cc02", "7892029a11b2e52629060f30d9c831b72e794129de81052d8df6be1195598cd60682666e5063688761ae6c413d1ae5bf" ); + { + // r and s are 128-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "8a598e563a89f526c32ebec8de26367b"; + bn_t sig_s = "84f633e2042630e99dd0f1e16f7a04bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "57a407035f5fd271b32b77b626091cfed62be3a7e461c594be4c9c2c507294320922e28405e8a5e0dd5b310bb102123b", "103b070ed2370f92495858a8611d961d9b8329fb42b8fb526d3de342af7008a0e14f6405b312aac4eff1e6333c63890d" ); + { + // r and s are 160-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "aa6eeb5823f7fa31b466bb473797f0d0314c0be0"; + bn_t sig_s = "e2977c479e6d25703cebbc6bd561938cc9d1bfb9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "05250c98a02a70c27400cfb4d3d107e7d393c67bb818673cb1460e210af30eb0f8ed9e9574ee99669969f2e922e4ef23", "2555bc85a62aaea353a831b33e9f4cea60810b3a8d58cbbac7a7626471a855f2d8c39477951de857b6384b0accd911f9" ); + { + // s == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // s == 0 + m = "313233343030"_hex; + sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + sig_s = "00"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "221d71dd2b257309dda46c8c82afe18189ebfbf49146f18655e40931e05b7a203db5e2da64bc64ffb43a0bf55e3eb76f", "67a763a8760fd8a70e80803a5bfafa9a42029b95c7e0caedf309b022f140e44e8fc840f0ea4ddf2aa76bc5a44b796a98" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "27a1cd4f4d5acfdc4cbd02afc7a079a16af1bd59fc260dab35a3d3cd7387332956451814dae863a8628d608c380b852b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1b999e6f7c39614fe6a35a99c5ef433e1035d051809dfadd2aa54a80a04ead2a48313840e18086c23e08d073c16370a9", "00819397a25fc5e7aed9f4b695043e28b181575472381b0a5ee405be7bde4478fca019f468b306e6ade64d85ca2134ae00" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "115fe822c3e7293e84b732283c95a0446f77d1dc754c456163e7b5262ee2fac43da1b7bfbac5121fec4c276ea126c163"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "72e473b8c6715e679165e67e1f7f977226a36b7db0bae4770b2c05d3b63920e266f4c74066e0755fbf65ab5dbe934ed7", "1b6724e298837766e331b6f25018caf12d8fa202d7b46110fc6d0de00f6502038394caa4cb47ef9531ed1864f2455718" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "38602328c4ca227ee0cfeeed354a5ece9a8c2466ab8ea87c3b67a33db109203fec4304417fa3bc0c2d8592e74a14a17e"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "62ab9ca3e6c4b39e99ac5fb13f81a991588c865a37ed4042cacc7841764661b882386650081689972bfb39d371351e7f", "3552f128e67da32be68a109cab8f3c2c2c5df934d9d20e10fa884c4515095160b264a5474e7087ebbc855e6efe316955" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "0af0ef24c77a97521a957d4102ea0de4e1d16a9cad02a9a9a5ba466bd1a99e4a078772b0636fcac3caf4e3f9321b84d1"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0080ff1bdcad9ab8c41c91267aefeebcd0cfb37cb87a7734f2b2cb1c601810b26800ec201cf6f1cc8f1517a5f394e6c2cb", "00842ebabd0610f9b66f18e339d5569e19e57108d5ef12fe36294d4d9beb20f3424357c499ca38471f2ca51a52b4a48180" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "2a23418cc9d5d7bc149bb47e0ecfb4f50f5f32ce49aec5c11349196bfcf0eebb49d977c76aa524c7dbc7e23adcd5cb56"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0626a3ca17b7a23dd9d7adbc2816bcc1011650f1779a84fd0060e8c89cfcdb90415fbadcf4f1d337d980d947a6380f67", "0085a64c254b2a3fa622782a2a1aceb97bbb532a64ff8d6dff039acfd96e98cbae99fe776a7559879aeaa984a58d594a65" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "360c166f35d9371b4e6acf6c87aca0876ac07ad69efa9383519ecaba2ddaab08253907c2cd41cbd56908f22ae4fe8947"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0088a6a2b81f7b74a0533bb36ae0da989c2e7b3c509ec34ea94d87e8f61ae5fe479979aa0d2b4cb408f7ee161cf942ba32", "21be457eab32fa0d477d16a291527e1beaf9728003e6e05abe2e77fd5a3492ba304f44ca55c7bd42dc1c726d4bbeb560" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "1eb43a98963c2d7bf910155abb629846e35794464a22a01f4efb44a9ca68828a1565ecd890e4676e1887eb9a7599dd9c"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "279113d47cdc1ceb91dff43b26ef9ef65e7d8826a7df2e8ef582338d428ac8e6baa7b671356e610445dbf552c5939919", "0833704e251fcd642f4e42b0e04ac3d4542127c685249c15e64abe9735587f9535723df59cc2a999a8ebd997fe08f483" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "0a66b016b638891819928a01f3e5b3cff629b9f0d878d7ab99e90f8206c062d11cffca73efd3a0f56fc160549b68c5c4"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5ef8ff9ecf2849d44e0d74846dcc0d73a8061200516806e8352a85db78ab8accfdaef60d258cd1ae2483e2a7ab200ee5", "56e31168bdb642a432e3f4401e54029795408f2cd723f276105b51628c74bb36a94f1e2dca91b8e125c3c94b5b1b3e5a" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "0de1b2d3fb8cb15f4ba27fd5da391dd2f833797cd4332111879448cc079658ee6b0cda88a6ef9d921b0d872013f250d8"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1cc73f774f0c9d91015483a76a5ad927d3caee74de86a6aaa01e1ea0dd84c1fd928b65f55af18a0ec59010cbe520b925", "45c417a3a12e4ddaf3248a75961f357c31048c2106d142e2873916747c67a4422ba8623f239340ede0b0e6165e3823a7" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "24f58fbede0aa2ad7cb2b26fc826925f65ca391b2b1db0edbe1270d28200ac5cefb297bc9e68d88659e82b63a925b0cf"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0e3492288b59be042e92927b02d5a0cce6fca75d5a16477a11ce1c50474e79129fe3941615ca8deb71ff744705425db0", "061ae908b78c6b49a47cc9786957b20384290af299e2a1d10f12de9999630704e96f2996c437d3c4d4481885522f8d49" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "37b69194769dff477d4f0706933b9b2f0902b117179132a1174d8848b0be2bc8f2f1b82c3ef6b802e30ddd6fb8237c71"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "75e71f56d922a7c64867406d2c4cf7cb26126a2967dffe437876766e00c49e264b1cbdb5d7d23decef3f1d2ffe949cb8", "65d3e5fa79067614289cbacf0a5f2e23ed7a5f3c367f7fdb368abb87474c0c291e18f0bff5e767963144c73fab48e9ba" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "293fec2aad2e3aca83f5ec93420b651832e5b38f3aef0b5e1e028c521349935b5669b9d54d5b6e3e1c28d20d2389ea52"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2b2269b42d41e95f52bcf253a86ab4ab14ba1874b577ca80fa927ec33cd0d223c7192d10cba77c458f037006e8745250", "4b126a0843ed8f57b77ceb9f1d17a80379deb22aad0384dd336ba1125bb35b45edeea5c7b02512c419f5d70f1f2f558f" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "37c9918695071c1429e155324c602e8d34b8d38398d02e5ae8c32c7afa49033a020484fa6f356abe10e127bf9768874b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "400f5208219e4498cb70975a35edceb9b3065e4d6bbf5cffe18f1745034070ef1b82b4cf5f268b921b6546752ae7e598", "0aff5979d8ac6ae830449cecfda17f27e21dd92590b61889a22ab25ac86cab4a247487bb1ea339be80db578bf196ff7f" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "041de947891467ddb8dc3c7ec190ac4fd330cffd55c6bbbdd008362e2d818871914b6b914a9edff7acd299c2733a7397"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1a233baa5ff74771e47cf1a1503010a683c8933166c4158c2943714c0df997fcf7bbaadc151262ea9b2fa25f896909c2", "00e1efc31f645e8e5236d558a61ca6efbd7e42c30cb1eec06091145cd752aa5c0ddf43d5f433d90e73012ae41ade4823" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "062979476086e29e3dad11eaa1ce5a2935c70bafee5ddefad188ef56d41ba9a70ea25f01a1483ad5ffae4031baee822a"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2e39042a623fc881be5daa99ca75dd025495b1279e235472edd89e3d6b4d6f865ddfc812bb180a620010d9de87fb4b47", "4353861738537f766a86c51009228ad93328cf7be9a4cf6d4b60b31241e07b115b6875d06114fb2cb63e458ecd8ae9d4" ); + { + // point at infinity during verify + auto m = "313233343030"_hex; + bn_t sig_r = "465c8f41519c369407aeb7bf287320ef8a97b884f6aa2b598f8b3736560212d3e79d5b57b5bfe1881dc41901748232b2"; + bn_t sig_s = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + auto r = false; // result = invalid - flags: ['PointDuplication', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4ea035f9b52d737fb1b0405a832d8b7479caba4bb76048f2416fefd21ebaf1d2617aee6ee97e9aa744dc3401299cfecc", "6203db8f62e62864c47c44a4e5dfb854d17fe7a7055654a04fc3aad355573a5dcad97761abf96759a5e4d0b18836001c" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "465c8f41519c369407aeb7bf287320ef8a97b884f6aa2b598f8b3736560212d3e79d5b57b5bfe1881dc41901748232b7"; + bn_t sig_s = "465c8f41519c369407aeb7bf287320ef8a97b884f6aa2b598f8b3736560212d3e79d5b57b5bfe1881dc41901748232b2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4393d0d584299c1ae79ef5df333502e615d72816fa61d524e3515d4ee2b3141f84d17705c2a5b4030e903e5e76948544", "10f2d5d488776966eee74d907004b567efc29449c01f2e1145801f0e8b71e849fc53024f593156c465a9a366413c514d" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "465c8f41519c369407aeb7bf287320ef8a97b884f6aa2b598f8b3736560212d3e79d5b57b5bfe1881dc41901748232b7"; + bn_t sig_s = "465c8f41519c369407aeb7bf287320ef8a97b884f6aa2b598f8b3736560212d3e79d5b57b5bfe1881dc41901748232b3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3c9ffa94a24728ed6a8cfedf23ceebdd69f7c5aa1606b9f6ea23e07b092c3650a81cdc2aba7309a3967b42487aed46fc", "0db0e4f74fb9366c7521f94977730b82c3f73343e9a9ddf6e2e20bb92e109fc564f72db220d9ccabc4bc1ad040f2c41a" ); + { + // u1 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "f8723083bde48fae6e2f3ba5d836c2e954aec113030836fb978c08ab1b5a3dfe54aa2fab2423747e3b4fa70ec744894c"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "309b446d14cbce84c919f7cc60c8f8c5d56875c3a32fbdd099bae90bfcce552d3c715cf9771b3e9bbe65e0efde10712b", "5bbe8cb8a707a54e9e39501eab3b89ad7ced5f47d536a0ca651f473be8cc10a0e8744e4426945712781128adb731f942" ); + { + // u1 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "21000c81888c4aa1b08ba356c995c0d4d5b02100d7a0766aa6a0d42e3cae0d5149cb3db3b2dc11a23bc0bcf70ac4417e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1b050bc1f8dbee85baf54231a2d9d66bb17ececb5db282f7125538382d1a320b08c4fbb7f1cedb02a4854697a01e4feb", "0d438dbc55628cc6521dca22d594f3fbe97d824f1b59ee0d1bc328b1d9e8bcf2f81a59bc6f0ee41369b7cf1cee124fb4" ); + { + // u2 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "61950b9e116c0185d6a0a9d135964304f6fc9b0bb895fe60c5b07ca33945108588f0c567962aa81d20ec1883f54efae4", "20c7ba518b7eeb25122ee98c80f4b820928987a216f822ecca1c01dbe4a24e06437b91c146fd38ccc26b79e73f50cd16" ); + { + // u2 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "5dd0bf01c2259e1ab4e8f4fee099813f6374f6069e3839ccbf64499dc802c3c534d1cf1f9cffd76027b021574602ee44"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0abbed69fbc1e5f98697a2e72a4b8724aceecba8e544a103fa78876d530cc29a9695b9309ba21d01a4f866cd2e4d0765", "267fce2bea29635e09dab69559f26de776cc4436f680315b1030cfcb2a5b395c12e8b6f5e9ae74bed5427790cf7b20a0" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "52d0bad694a1853a24ba6937481240f8718f95b10102bcfe87d95839091e14aa1c38ba8e616126d4be6fe25a426c2dc4"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "09d49878b5443e8a7dfe323d02044d32e3060f12b3020dabbb6917b8f544bab18920e2b7458b59d5d17a38093831f8fd", "2b37501b31f08802c46eb9026b1a363000ef573d9ab30497219aecd7c2733ad73f6e5f358233e263d1acbbf24b83fb04" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "813fc5f8ff37043822c3dc4cd2eb1b4e70f794d25e8513a75a085679b9e7437549508de93addb7b824cf96055fe684dc"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7eaa09a14c8c2e190528e199ac9bcd503e9409d276f793970da094355cf8fe573ba57320a91978062d5fe841921d3c95", "696460275f0a1913d6da488664ebfc03b2a90fcb4eb9ded9c06e3c1330877db58256c2a9992d3c1e971d4d30a1951d36" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "1d1ef15cba432423c24d56a674802dc741cf8939de3ec56290e51346ad4196bda41a1f6e233f043fb36ebc2f34362f95"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "12722219ddcc63bcfbedef7e8601fd45361c241cf4dd9bea8eca3d67dbb52274f444acf455234e099398aad60662ee24", "0340ac71b2c1fde05e2b0415645cf04c93d946aca5ab205ee22a8e62b8c35b4b841474ebad78e9a4c0c80b80d5b6e3d1" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "83eccaf00726160b0a752afbceb9fd442ba91d5da190cb2ca997ee26dc0456e4a376ea68911f2c319d8f40da1d165dc5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "39efdc604f6045fb9d3228fac15a6f4902013649bfe55fc757dbe8d8cd12a1be6eac36c3914c0e4fb08643c2c7fd1450", "7b558974aa703224c151e219dbce67241936f1e613f736445ed91e1c830cd8e4f4b31594c15efad71ae81089ed8fc0bc" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "809e7764b633c4e8e884c5ac72de725bdf65b63b08f2a27a4d807e18b33d9abacd2cf874e1d4e96c34a7a82d0cefca65"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3ece126b1b26b97f9f148fb81d0c96eab6362cae1b9ad15d85a6d354761b0c4e8ce25e247a9fb189d24bdc8247b3f023", "09ff4aaf3077f27162050912252b3244cb3cbbb96559c88f92cd21109c5a5d98b2e14335ab4d20406d9a4cb1924a86e3" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "7483d046c92f1ca9c1ac1bda94d6a2d8a99bfb6c2490ee417bea8dc4ba770fcdcb1f3a3a582a0fc82dc71e5730db2f65"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "60fe6233b2d9082a47e802e445d5d1fe93e47980b2203959092843090913a28d3b5d4f29a1b67404473d17e61fa9bfc9", "613b117b1dd12957a9daec6f44f1e0c3136411dd63175d1804df496e1fdb0172e548b1cb92b60c6ad4b6c780f5a5c899" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "11ee58f613c6c41aa962a638ea53f63c2d52b352de04495989986212c642608599e1aff3a9e2d8e541f5e0052cca8f90"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4ae0c4ca63998347c4385d162b04e112366bcb9b134bc2ec672f5f8bc82e58b05c22c17ee51e744693996ad3b611a7b7", "729000d6c9dad30d9dafacf9ecb0c672f22c2c3f96f4c8afee80a6a1138cd177e80f206af3fd52ecc11ca59a2f6941c8" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "787c8284a545a0bcd2ba79b45220fe0dd3a2317efd91ed3bbec0c0cf34d75936614d7b9404cfb9746339f536761a5796"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0085d760b9e2dda55fcc4eeb506b56bdbb685bf10153e1d784a45dbbe71f3a564f9c6b6a142cc71cae195ae9709b9c71aa", "0b2c59ff91da548f6341e340e6a12024d255b8d228f7d69a7a90cc8c5f966b4f840aa8129fcdf02e1b5a03754735b5fc" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "5b0d13fbee13030991cd7148b1020fc62e77a6865b02c831041595bb9ec4bb7a1e800e54e3cfab7a6e6b11245a975ac6"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7f8028b892284eaad8272515949fc70f76593c8751e185235aa0b02d9d4771261da5ace04a9d856fbc1bd5e7d547955b", "7f28c8f1c84c3ed25e039274719fc829540eb1270b0d2b23b5cc95ba7038dca80555f329d983b88af3be108682ec989e" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "6350c11758e7aa8afd003ae2acdd2162dc67a6316cd2f833db29c25027751b52c11e59683acf2fa5dc5040d5c7ce4e83"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "78628594b220dadc3b97b0bad037a4ab55e7abebeef38d4bf64eea3a928f5ac1f91e3644a4f3ebada2583c9e993b7a24", "50b0ab799caf65cc35348881b2ef1cc95bb48b322ed76fd3fd31a98018feaa96f5e942b971aa63cb04d42cfbffe63528" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "39e863ac0e96e7edeaa3064708d400e6a39fdb58ec5199b4973d1633a2e610fdb301fc210a1e9c3b7d184fa8a69837a1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3c1f536e4b2642f455a7ed956e0f8421aabed66a2b88d714dfe232efc991554fa1162cdf71480eb6e453cbf3db2282de", "51010e435e63f7f3def8307dc2674ad61befd9d75ecaa9f537ae4a17fbe85222d3a9c6c0e7b58681cd9284d217209341" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "10800640c4462550d845d1ab64cae06a6ad810806bd03b3553506a171e5706a8a4e59ed9d96e08d11de05e7b856220bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2c88ab178b4eb40b60b909286760e05ee7b304a643648969a0c1819d47e9efc41760e4157fb5713af8efea1ba4d5b630", "036d78311aea2a2fbac504ef466043b4ecee6d9d1b08f43b5cc2ec3f60174ff5fdf31731f9e12cf267b297fc15c3c398" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "54ec07efaebdc8a5e8d5631262b337d32b7f7d21e5c98e0ad7fdc0d9aca2de32b9aa6b0ec75f63a7f77b77190e9d4a7d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "18964af402a49db10f9b7a3048106640b54fb623f09ad63be2bc55a6e21af06db54824e62d9d3979ee3512650a9ea422", "5df93caf8e9c981e5735ff18459577c6002a96e236ef9a8690bdf3ed06ef61f0b7469e2a3b998766996d2125d7af679b" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "59930a2b8bbd79b8051f252a1af76b4a5c6525adf9c6c7910a5ccf798eac0c8d4513923a792a965abe82bb564dac21cb"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "79d9e291a2d25f06c7d41fe9f3c63e324559fe613760833689405e0db93943a13b7ff5e4a92383391b5080c227546eb3", "00860199b1a242caae029ddb9e8fc2707e64f0bd2ef4139dc5a8ef76d2e76ed4f0129faf884063cb66c39f2ba15a14a066" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "1449901ce4b00f0e3a5ff84cff8c134854b808e504d1b8f027ace9591234e3f62ce70c35a8aa8e60cafe1e0df3ed80e7"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "727701750dba41518739bfbbf229e6c5e532ce46c263a2972d0bdf38127ae01ea7b071ba4b24098f4a9201381de9e5d2", "5013bf277ca6c0212ceaa8258af9b577b78940d1712e040e2dcc158f0a5e44a9b758fe8c067e8d5e2ae876734bc55fc5" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "89ae6f8e215bcf35c7e2afed1a6b9855171687d9edbea8af5bf8e9ddc667aac4e166f05097385fa9ea3a6245fc07b4ad"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4643d3406fa4c948bca3779452cf9494192521f197180c060efa70a67632e96e250cca46c14cbb3f89a29193823b8698", "3dca3a91f77fddbe0da9064220130c1f0c84d5c0617d5af6ff776702b277b31eaa7fa0803566bd6ec642de636f0cb092" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "3fc16256a0914ce2661a54688af4b2546b1b59b043667da6abb5b1a1e0e2e6ab862fe8bb749f7251572bc160567530a7"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1581a1792c97aad0cd0622b6f1b1a98ea8629506be5b1f898e0763513724df65c74d4992b5e0dc37c769bfe367e2d0ac", "747a564cbb2e75bc32053b8bcbc2407b78b579199cbf516b9a1ff22fa0cda3a572f8ff7c7c8e82f84fce2d4cc0e35b20" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "64c1556c5eef311a4f3ba46316adf73732d6ed47b1ba2ecd178ff89bbc5ddd6c6419f62e045ea2d35c33a250dc2fb925"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3545409eb630c0e4588afcef6b526a8566e429f83bb7966faf84f9ef3f88b72d3ac85be8f5c62163803b2a30db1ddb89", "228dc92f007da2375d7fbbf1cbd10e83321a425cfa6a6b2019106a88e090c91833b56af68aeb71eb351dced8cfbe3794" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "3cc98c561aa5f50c8f19d947dc75ac8f507e6985762006e7100982caccb79530f8f935ac9d3d82967cdf129ecf5b0ce5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "788994540ec1124c9d27468728f79074f5812628b61d5148bb356cffe200a5a392cac1024ad150a0336b3cde2f814b19", "6d1e27fd447eb8fc948921fc9fefdf34d4a9fc79190c800d827353ce6281ce3b10db21bf002bb23be66605c0ffe971a7" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "3f2095530f36144e009019eee102b2867d83c9eb4f28bcb31b383e00c8c3746b20cc90e8efc813aefb5b6a4965204c53"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "563e271ab6edd27d6a44ac2afb036a2eb31c3f497211f5067e37b19cfe0f1a9dea9565fa5fc07c095e0edd850efb878a", "0080e7021e892d054b3d781eebc92b0aa1c78dd17d9d10fb510914db6f5509bef4b678b04267df6728f689b54bb7ef51fa" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "704afc6a72080d1728f6cc9fd023e9d2373023377f02599b6ea9fb2923dd7403fe2fd73999f65316b53f910bda4f6f10"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6960cdfb6a1461160d690e3f48bf643e87b6c5d87927de0d89adbf177693b0f1997df3fc0301621a86f22bfd9d868119", "436f637dd07babab5d36393a49914131c25c7ad20aeedf650217a0e5f7b2d95a14d1f650094e347fada99b1debc1b301" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "46f09c4741c1afe74e32f6ff14daaf90f4486c33f5d0e978f9af24f5751988e72b374c5faeffdec309330401965f7d20"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3ba7f9d0b3a66b129cb855d51148ff3976ba404d9bf555066bf275a0d10dc10c28b8222abd99e6e191dd558e3900a475", "008be8383324aef15f3e29be50a18dcbb773a37b9dd4a66028177366e2d0a0a8918f0e1be76c69689230d4f4b377d1ec64" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "19930a2b8bbd79b8051f252a1af76b4a5c6525adf9c6c7910a5ccf798eac0c8d4513923a792a965abe82bb564dac21cd"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "488ec5d4c4b208551afcfdbe25c5ee675d1baba6075c0c0643562196f56d860017b985252b78a1a3b0aba43a67bb1d25", "67e354af2206a42278618f88c75655440d4b358148e908cc9c7497884d9fb88ea1690baaa174f0f05d150eef3c5aaece" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "33261457177af3700a3e4a5435eed694b8ca4b5bf38d8f2214b99ef31d58191a8a272474f2552cb57d0576ac9b58439a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7382c4f7d6176700d3009431515ee38b7f21c050410be0f43d254747acb7f47ef92f67c0d26a8af65d6415e7454c3dfc", "4259dab9097d09fa6afd910ed4b21075bb7856a37bf71003bc9f285315d54febeda0d3ebc0f588685b765e97e06d8f14" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "4cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046567"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "46afd845374839331877709066652dd09610d49ab91c31f741ffffad39c76700a609eb92c9dafddd42433417fe81a0a2", "0f5857ca81244461f7884d68a49e124d09b8c7217834e614422bbea4c780e5e88c8927bea70d8d2c64244db743d97d04" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "8b33c708624a1e2eeba00fb5b5a8ed1a1622fc71ed897fb13d87ac253935e8365850d380015c115d12e14a2472860d09"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1a6180cdf899e53a2fdb9349577d0f7215dd157d593face3adbc1bf0b2c5320cbd7cb697dfbe9081c03e28db88dd6769", "46e89a80ae1a2d4303ffba439ce690778ff3ebc0c1820bb92db4275c3d615600538e4bf99c9f21e74557869ad351454f" ); + { + // point duplication during verification + auto m = "313233343030"_hex; + bn_t sig_r = "8729cbb906f69d8d43f94cb8c4b9572c958272f5c6ff759ba9113f340b9f9aa598837aa37a4311717faf4cf66747a5b4"; + bn_t sig_s = "4a59383efc45e1ed1892dee91cf0d54a36aa42f37fdb83b9a1675a15a8811822864371111e3a7de588987d486a6dac1a"; + auto r = true; // result = valid - flags: ['PointDuplication'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1a6180cdf899e53a2fdb9349577d0f7215dd157d593face3adbc1bf0b2c5320cbd7cb697dfbe9081c03e28db88dd6769", "45d08401f51e3fe50b5db53ab3ffb167853b85492bd24afae4fdb2bd4255bb2359455b2ff37df88a41ef79785db6a704" ); + { + // duplication bug + auto m = "313233343030"_hex; + bn_t sig_r = "8729cbb906f69d8d43f94cb8c4b9572c958272f5c6ff759ba9113f340b9f9aa598837aa37a4311717faf4cf66747a5b4"; + bn_t sig_s = "4a59383efc45e1ed1892dee91cf0d54a36aa42f37fdb83b9a1675a15a8811822864371111e3a7de588987d486a6dac1a"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5b1e699a8b7ac2ce0389856f112412286c9c0f162191b2f611e4e3a92f070dc763ef2630f729e5a376d73b399fc8c299", "3f7a0cf64e3991ac19932c398f52793ed572a8b404be69a667c8a4f9be46f4cbc6ada2b3f07bff42ef9fff967bc681e5" ); + { + // comparison with point at infinity + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "1c25061a20a4e2a19cac497fa9c7a6c6376fe36862aa77bd6c9e1615bc00d454c30bbe23157ff3d00be80a009500e114"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "51965a24d7f19f0290d13792a72c843395c22051b338616c490a71dea737937e5b3e9b8ec1e2f7e6e5ac169db52d23fd", "6473f0cad9fe3b651e6744b9988b37b55bb69214f3e494f8ed8edef2fb7958a2483b9f3e9017acf69bb0d1b22e379d51" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "2282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca"; + bn_t sig_s = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "46a25aec4a5634fff6f9b913b16c3304d71839c14db9d568b77a5d7281197e631649c59621debd1cd9fd5e0ee92add7b", "7962ee9a9d10ad015722d85f817fa65229b91a1d0366e38ff6ce6b39db9771a8b535e1b11a9848f40c9c51198394efd8" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca"; + bn_t sig_s = "141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "054fc0100c01a28550e3d9e87f037fe7bcc43bc45c6148fd031a0a71f67c1677c71ca9f144bfd26283ec92a8b06f7762", "278b0dc167093dc943a5c02954c753287ed394c05cf8ea1f843a52a2080832ca362267a980ee0c5e3e0f9507692110cc" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca"; + bn_t sig_s = "1c25061a20a4e2a19cac497fa9c7a6c6376fe36862aa77bd6c9e1615bc00d454c30bbe23157ff3d00be80a009500e114"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5523b8f31558a2f784fc85828b356c02066542a1efeaf21fd142711e392219ebfa2545987d4dd98cc6a13e8d5e0f01ea", "666ec15baaf29e0cf5dd1e972457b2bc747c954f5a5b6d79ba37d87c00b7bb5c98def088494699c186e88f8904d3202c" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca"; + bn_t sig_s = "7094186882938a8672b125fea71e9b18ddbf8da18aa9def5b2785856f00351530c2ef88c55ffcf402fa0280254038451"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "09ee22a26010590ce22dab5c537c3f4510d5fe09e07caed4eb7fc4df953b991ea25a46abfe926cb6fec0923631b12a1a", "01b23c802d01d7e02bfd74e9a8a39aea48ff9ee55761d6cbd86f306bd8617e0c779b50c33ab20b24128c29ca2ca0a42e" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca"; + bn_t sig_s = "789eac6ff99e146b7ae25f90d7a0cabf36baf32d14916ee2aceea7cadc95d7221f56e5baee6d82a03307064ba32856e9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0785bb71e073e02c47ee2ab8fff41102391720d4a70db7199d765f8d9b54f7670bcbd47e175f6d2fa7b3f1b77d75ad1c", "019d41f9ae7bbbef490e32e5ef171598983de8f0b0330b70bbd6ca60d82173c666d7bdabc5d3ba1dbdb6be60a2e908e1" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "2282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca"; + bn_t sig_s = "64dc78d112cd6ed67d4323b302650a606ed41415bd8cfc40ec7438a70ee3d8680420e5f602aed591a324760c58140642"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "486d357e243fb7f40501b446596a02598e82fe226852331237ecd1347e05732ff26a0d005065f55cdf46ddf3ae414498", "1c80cffe49734b647cf53035093095ba7ac5a8afb9c23f8166530d28fcb8c19a6876bb05d6354f1fd24670328379e39b" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e"; + bn_t sig_s = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2b4b1d4ea334db2aa570df70ba3e078661822b236b287eb078d49fbf276ae2df7227ddf5172586758d1c3f1bed568db9", "7ecf665a25337f2702896c1cd96741d06a3753bc56122affd668bfd34e4a76031aee1bd6b1f1d3bcf199493fa7f5bf94" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e"; + bn_t sig_s = "141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "43f64cc0732c0c45b271f4abf00bcfb5da0f6a3dfe093dbf8ccad74b35560947d38b36d1df2a32e5230e455096a957ef", "66f91078ed6f75ee8f4d8502a56fe2f28b8a765b4c7762249d3c8f4357b9a175705f3f57867c0a69aee0959ed9737d51" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e"; + bn_t sig_s = "1c25061a20a4e2a19cac497fa9c7a6c6376fe36862aa77bd6c9e1615bc00d454c30bbe23157ff3d00be80a009500e114"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6c78821410758dcc7b98cceeabd6a609260f3a0ad5335709bb6f19c0b6a17db13cc72db57ef755cf40b19e1f6aa442da", "49abbc0305b8d4a17b0208949e0337d9bb59f0fddbd9cff41f05bb41c310c1190551a2db1640f65326d6e2b0d67f729c" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e"; + bn_t sig_s = "7094186882938a8672b125fea71e9b18ddbf8da18aa9def5b2785856f00351530c2ef88c55ffcf402fa0280254038451"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "59cf76c463849af8d14cbe4198c9ea95188e9cd1dd67efc96778bf9963ee794dd063b167356b04273ee720b2e3430f6f", "3e96c199bf4c5a1f663de1c7268910486e72f280531fe6fdcefdddb76945978b4d2bcd7a191757c5aa001252ecbc606a" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e"; + bn_t sig_s = "789eac6ff99e146b7ae25f90d7a0cabf36baf32d14916ee2aceea7cadc95d7221f56e5baee6d82a03307064ba32856e9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "061339234188a8e1e420c966802dc49cb8103cafbcbaecc4c18be407d4a678181ed01428f04bc9f32904a698d1026d56", "6f933f65e7b2851be983cd6d025b37a7291734113a1b89587ebbfdf4dfedb192e8f02954e07e23121b4073421ac01a11" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e"; + bn_t sig_s = "64dc78d112cd6ed67d4323b302650a606ed41415bd8cfc40ec7438a70ee3d8680420e5f602aed591a324760c58140642"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e", "008abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "f8723083bde48fae6e2f3ba5d836c2e954aec113030836fb978c08ab1b5a3dfe54aa2fab2423747e3b4fa70ec744894c"; + bn_t sig_s = "141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "21000c81888c4aa1b08ba356c995c0d4d5b02100d7a0766aa6a0d42e3cae0d5149cb3db3b2dc11a23bc0bcf70ac4417e"; + sig_s = "141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e", "01fb010d823eaa83b2ab83efbb166c8cb27865dfee67fe4f3115d4c98625e7fb9e8d6108188b996044c4fcd20acb993e" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "f8723083bde48fae6e2f3ba5d836c2e954aec113030836fb978c08ab1b5a3dfe54aa2fab2423747e3b4fa70ec744894c"; + bn_t sig_s = "141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "21000c81888c4aa1b08ba356c995c0d4d5b02100d7a0766aa6a0d42e3cae0d5149cb3db3b2dc11a23bc0bcf70ac4417e"; + sig_s = "141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "462117d2e33a7db1b95c8a6a3c7982f83da96817e749718caee7b6aa9c9da4e8f2ff7951674eed2b569ab846f59002a8", "50e6606a9726a9209c9e945fbf6cbbc9a487c4a4d81c52ac3684c26c3392b9bd24f7184821be06f6448b24a8ffffffff" ); + { + // y-coordinate of the public key has many trailing 1's + auto m = "4d657373616765"_hex; + bn_t sig_r = "7d8b443046be350ed26c2e8d99ac20bf2dc4c401731692b5f786d48fd3c56ed3ad3a5fb424d565e7230f0e4f6c350eaa"; + bn_t sig_s = "84d28ccc2085b4457791b8d8a1f64ec4eec202b0efc81364464d7d2591f4edf95010a9264315fbf4d9a8e35e45ed94d8"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "05d46f8f619d0c4ec1b1d17e31e4901e962b3d6314d21b77f45d4347e93a2ea95001b2745f5a23cdeb0e700f31ba4393"; + sig_s = "210b01315a6871fe35cdcead524af783be094e1faec9a5c049c724cf79eb793b78efc3237beda5dd36b1743098ba5a25"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "53838ff44cd184f466816340c3217cdde1ba5f8545edd0cbbaeb7f6a64e4642521ac015302f298ccdc3a04827f725ca8"; + sig_s = "5f0711f1e56710770639bf8cdf51535474767f06edeab32d4f48f92c305d525fda5f5747895244835eac1fd2af28be1f"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008cb91e81ee5901b71a59a4f7c8174ae05fe3ba00f699dcbc3c9233265c640587b3c165593c2d76b5ffc4b8dcbcb0e655", "3a0e5d14f2d0e8efe2bd8aa260d8ace06bf964c51bab8207070a2d30410bb6b87aeecb7fff802f2d4ea3caf6e0e7e726" ); + { + // x-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "306ce4903ded55d260552854fdfb8e9b68f746df16ef4922f914a07c66754ff6d6996d009fa70515f60726ebc8eb4dde"; + bn_t sig_s = "481fe80d384cc129ad2b4d4f0803c238be582e2bf251f4f68ae5a916556257832dc4f4e97d4f8c920c1cfde5966192f4"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "38f6fae91830336a0397532725b0a6dc2f8fcda8b6dd9ca6a5da5d5f83fbe392cf289356d43b9a05e310fe4e5f90a9a9"; + sig_s = "26e038717d5dd4522b840326841aa735e43ba904f2e507538fdad82d7cd068fd0ab615f855b7d33dc7929443bfab7563"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "67b019361c256c87bdf26df225d11b8ae1fe491eaadb9691945083252601692542e76c12924e25094f42dccb235a0807"; + sig_s = "20823f55ecfdb8ce97429742ccc850a66156b4b73ba279671abd64bbd820c4436fb9cea575ad6c9370d3d7eface915be"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "69ebf332e1eb2455324a7572a17977a4e2955108ee8bd81bd6d1f555d608687f5bbb39858ebee304985baa7d09c830bb", "672b9c96684dfc007f015e39cdada9fe16db5022bfd173348caafc528684621f97fba24f2c30e3dc728772e800000000" ); + { + // y-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "1d1011fa8c26b01c7aa4de7c48c96f327a6c946ea84f19c02b7d284ce16bcefd700b14a7809fed4a14a541946fbf922c"; + bn_t sig_s = "6a8b59d5445ed2fe0bc09c1d47653113cc7eb53ad4e6d1abd3175cab83637e5ade4f7f8d13f7ed142e7cd36f2ebf2828"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "51cc988bbfbac20f6694ebb9fd361fe08fbd38477c90ce47314cb65a5203d97d31e081c0316dab6e3bbb0ab4b3ed9262"; + sig_s = "27ad4d9c28054c23ac606ff29d026ba40a08cefb5058b6917eabb8660473bd0056e3d38abd0b8e5f2e3f5e3adabaac26"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "8333a227b224d6ff2f291f5e23c22cc8e6a71c21439d6ae0745ca1548c64049d5078f978d5d07cf7fa90464a3456cbf6"; + sig_s = "67fcb7f76ea011cae03c49eb4007fd464c2c49046e34b61a1c1dc84a2061f1d8342e73d66cd3f00038a6905462069241"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4fb5688666673f104287428b5bae6bd82a5c69b523762aa739b24594a9a81297318df613f6b7379af47979ae7fffffff", "7e2d325b41fe831a23cb694cb80a30119c196143536ee334416ba437a419054c180a945154596b83d7f7c3a6b6059645" ); + { + // x-coordinate of the public key has many trailing 1's + auto m = "4d657373616765"_hex; + bn_t sig_r = "721667f80d87c2d23c67505fb9c97d0fd8b45b4dec237e42591e59aaabdc8fc4d28783900648077d06948eae4a1fe09f"; + bn_t sig_s = "79d88c666d12812692b20e645a69366e9fd6caa22d76db1d55e14646e9c8e35cedde0f9a933d94dc9ee4c8c79d2025cb"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "307bc43fd7cdf9e526b1b2fa9ab7e482e1fa013f97140dd2f20ae1d1d005972f7ac424db31b871f0be4b80cfd9aa1e7c"; + sig_s = "08907c1531a8c979c747005fcfd585566bbdb399644c5576842df4456b6de6b44c71ed2cd301dc89698a4c9b121325a2"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "5c85bfd1e059f87263a7a2105c274e029437e712e85a47f516ff39e1b43ddfde3375b403d9100ca74ff920b7fb38cd12"; + sig_s = "8a768cfbd67bd3327d58c5a319307b936e3020b4bd4959d6c27af189f8985c113d0f4ff997e2ea15e6f110d994b3b422"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "34770c73a7e42ce7a57d1de6e54f35f1752047f6513584c7b14bca17d7abc499f8ab037c70fd2e13a8b97b2ae2636886", "22421615ba363f1ffe9a8f2fe0f6e246fda11462a3ec000c685e09a90dbcdc2af6467f9ee69b5e7bead9b8461f4a4be0" ); + { + // x-coordinate of the public key is large on brainpoolP384t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "0bb0a6b0952efd690c97d24ea73af0b706104d7293dbc3ee829f5f5e5bbe2b7304e6cbf771a8dd82f6c24552998730b8"; + bn_t sig_s = "5f2e71efa8480c19bdbdcb6ca40d5f66ff812d12a0a11eededcef465323902d563e236cab48e0854845a45fb6b19eb2c"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "146442fac12092aea525b33e3a6b6dfb316203fcfb894adebb618c6f672a41166cf40da344323736b7e5dd7ec136620f"; + sig_s = "3f2ddf11b3e8eafa0502119486294374154c3a1ea335944daa940f8078ba96476681bb37d8106d4f1737836eae166d5e"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "2174b7e583e32e79cacb53c0bc186299c5b87f8d12fe8bb62175c91feb8598349f139bc5a407c4b20ac59a215c078935"; + sig_s = "8301e9d96a182667ec2e09cbb0feff876c98cbf96ee52b621ffb1f90d5538ba9c6ab64d925bc2542631a20ff2c375a21"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0086f0fc89b7861ec3bd582161aecfc95789ae402459eb7f3015b7dd24e20fc9b005c635fc290a0e2a9ff35863b7b82e3e", "01ebba489e923dad88146077914e3ae5c575e1bececec710962a18ffd91005776c4d9e4bd952c793587a70291ce478b4" ); + { + // x-coordinate of the public key is small on brainpoolP384t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "0e258b20425ea2b4c073d2835781868417160cc3fc137b0b7686b24d7c2f83f032938569ab9f4beb4a6470804faa9fc7"; + bn_t sig_s = "73e6f23737d59c50bb9c1f6fca1a4ccf62e9d46cf0fc82336d4cb6133b0c9730f77031f074772d31b73ed781e0587735"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "55cd81d1afd8c732312255c475c6e6872add5bcf3d0878488cde7859f3fc713dc03691d9c33c2c3425e11ad94211d5a2"; + sig_s = "6b28fb39d20a564c42b5c0f595689b0b963d424ba3d390143554347a82b4290904278c182d7f669f8ee24245a97c61d4"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "3531aba11c2f956c7a450039b37c1e4e4fb85640e5261b0692e2e1d32eb7d78fb6a142bac97afab3fc28d9f7dd186012"; + sig_s = "86c2fab72f7aa4e5b5571aa604392befe77adf00ed5eb16ef49daf9a182fbdacad226180751bdd89df94fd3cf7242a6b"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "082f7dceb585c5ba4894b0faf6604da888a311ad9f41731a1d3937168a10b0795a1fae496cb9a90739e1c0a6e531e807", "2c3b8568eaa1c6f541a665ce7a66f78ea2d5893103e6028add62356492d8b5ac6ab8901d59621c33416c33981bd594ec" ); + { + // x-coordinate of the public key has many trailing 0's on brainpoolP384t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "4fb1913e53d3207a2699ddb10556e8896677846f56bbdf22c30821ef08e7d425d5716c2258ddb6d4ba554e10aa8bf9ef"; + bn_t sig_s = "02ab33fdbdcb76ff8ec00951b26152d00e4cdb464e91f9e2e152c4060a8117b152a882b6df202e8dfa4625cfaa444177"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "0deba649492a3b356758c5bd1f021803269b110c9aad23ff93bc4f744a114dc97a2fe20c5970d58c4131b5c662e4523e"; + sig_s = "729861e4845f89edecce431e88ea91da0e324ac0ba8046176ee966c1ff343dbb7e509acaca64f99b9e2007a296d60c43"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "0a317753464779f6f03647a3ecd5bd1c2cc437464ef9a199842a6644aed09d57fa94badabb52640d487d7d47f964621c"; + sig_s = "5ad431c073ecf9fbd8e3a70ed90ea31b9c7b9f6795305b0e93e83cf4f9a02a0cbe4ce5c386447f8b0f97031561b53a4e"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6afe4ea7705492bda308b789d70da49457dde825d5258960a7a366e4665af9d326392c2672165ea4bbdc33374d88e749", "008475e6937a10a6f6a50f23de9126ba04e5650a1cd06a8066ca423339fc2ce53d91482744a4cdf2f937f76f12aae3f630" ); + { + // y-coordinate of the public key has many trailing 1's on brainpoolP384t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "82f269bffeffd534c413bbb4d05b0fe6c0c5c439c249e7482444e050384c21c488772f51099ed6b62b6d8268c3ff2191"; + bn_t sig_s = "37c3aabc5adb6d74053a7c7d154aac142435539e1a5ad5e4e52b4696e851e8947bc44c08241166f5461e9ffbd62e6e38"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "10b39fc11796007b4247ed9691aa5a3bd0eaa7f5368e3dfc140f76a7437881d334b9dd56a1d3d554e52693b3ff458347"; + sig_s = "382bd622fbb730eb000c17868e29328c538a4332ef7713bc412a1ab2163e35de0a0551fa367b43c00fec690d8f78e0f1"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "83b6ddb0cba84119fbf6e850390c5a32fc4a7d9ae2af497eb7e3f485ef4068f837eae66b916631a6e04c6c7ec5bdb658"; + sig_s = "2ef7f2fedd889faa079c744f9b792c09374dfb51ced559963733d448a5a30c12d5504173a19755792212f429275e0827"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4bc65262c22d322ea89146ccb5c60c4287b65a35228743a5b9dcd15493bd8642478987c421637dd0715079ec90fb8cd4", "7a45557ef653d0773dbe2630f8e000629ed8293e1aa4a96f3b159a245aa35ad92a1019c7e09a9ab75ba43c0786928237" ); + { + // y-coordinate of the public key has many trailing 0's on brainpoolP384t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "5fe6e8c9905a577c8a9f9db81663c3037bd3118ecc17be52a201fe03b8c54b885eae3e54c13ea1034def0b123cc103"; + bn_t sig_s = "46e6a23ba52f9db143d705166c33bc5b601707c22d16e9255f95bb4cfb0cf0341ceabf3640213c7c696439fddde61093"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "1a65b2bdededa977bc586eaf43a9ba6e7659b078e84eef070dfdb21488dfac9180c51385924d684ff1553f68b473e215"; + sig_s = "7c2b319d06478b6ed656b409dee544f053e2fc3b149dfb1d914de90ec39ed4fdc303317a5e7b9b8e2182a8cb2fe6e5b2"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "2a3cd54edc69991e6e31b60b90679c61152dad72ac1ee870b58f0b2fc841af4c8192ba120825e2db9980a0abfb018a8d"; + sig_s = "0ee72ee0ed12588ccf2d701321a90c1f4b8923d263229ca606af0e0a82e73c7e682c9c538e060fd851fb2c4e60350598"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2ac393f20c110e3f97065304397eae0e23187b2b6163dc66083e82aff568426843056aff8dc23eebce297f747830e217", "34c935671391c6efa8b46c5c37b3f84a82e429a7580feb9a1383b55c83a9398e8ecc7b15d699e63962329102a1576f2b" ); + { + // y-coordinate of the public key has many trailing 0's on brainpoolP384t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "2b8fb41b330064dc47191e253e44654acafd33d18791863b83b86cdca0823fd6ff0dcace712e6662f5947a291c666e28"; + bn_t sig_s = "511d38cb38180f1642c23531753fd438a3eaad79d049340ff010081d2e007a64195d1db2167eed84ebf5e161d9ee3ef7"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "72152ef2e229b4e637d65c486d342cb3f075f7d9f64e00a5a35cfa4d11099d02f672e648e91aa71e354b7f66b644849d"; + sig_s = "4bd22080c4c5660908dc790c61e58df79eeec32d4d400ead24644b046c3b8ba5db5fc608753d1da44b2eb81669659efc"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "0764c51cbe588255927756ef3f9e84925486baa4ac7e4dc4f8e0889950690728aa2f748bfbfd7e2f29fc5b9b58a2e4b4"; + sig_s = "522f73fe54b6efddc2566bb5d020eb8183d88f987219c2df9cb98a33958a2698f0384ce93578b1178233bca0411d4754"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } // End of Google's Wycheproof tests ecdsa_brainpoolP384r1_sha3_384_test + + // Test vectors from Google's Wycheproof RSA signature verification tests. + // Generated from: 'ecdsa_brainpoolP384r1_sha384_p1363_test.json' + // URL: 'https://raw.githubusercontent.com/google/wycheproof/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_brainpoolP384r1_sha384_p1363_test.json' + // Note: + // Test vectors with flag(s) 'BER', 'BerEncodedSignature', 'SignatureSize', 'MissingZero', 'InvalidEncoding' were not included. + // All test(s) with BER/DER decoding related errors were not included because they're not part of this test scope. + // + // Algorithm: ECDSA + // GeneratorVersion: 0.9rc5 + // Header: Test vectors of type EcdsaVerify are meant for the verification of IEEE P1363 encoded ECDSA signatures. + // Notes: ArithmeticError - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.', 'cves': ['CVE-2017-18146']} + // EdgeCasePublicKey - {'bugType': 'EDGE_CASE', 'description': 'The test vector uses a special case public key. '} + // EdgeCaseShamirMultiplication - {'bugType': 'EDGE_CASE', 'description': "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used."} + // GroupIsomorphism - {'bugType': 'EDGE_CASE', 'description': 'Some EC groups have isomorphic groups that allow an efficient implementation. This is a test vector that contains values that are edge cases on an isomorphic group.'} + // IntegerOverflow - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449', 'CVE-2021-43572', 'CVE-2022-24884']} + // ModifiedInteger - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModularInverse - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where computing the modular inverse of s hits an edge case.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['CVE-2019-0865']} + // PointDuplication - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.', 'cves': ['2020-12607', 'CVE-2015-2730']} + // RangeCheck - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // SignatureSize - {'bugType': 'LEGACY', 'description': 'This test vector contains valid values for r and s. But the values are encoded using a smaller number of bytes. The size of an IEEE P1363 encoded signature should always be twice the number of bytes of the size of the order. Some libraries accept signatures with less bytes. To our knowledge no standard (i.e., IEEE P1363 or RFC 7515) requires any explicit checks of the signature size during signature verification.'} + // SmallRandS - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['2020-13895']} + // SpecialCaseHash - {'bugType': 'EDGE_CASE', 'description': 'The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits.'} + // ValidSignature - {'bugType': 'BASIC', 'description': 'The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported.'} + { + auto pubkey = curve.make_point( "192ed5ce547d2336911d3f6cecba227f08df077f6242a9147a914e854e6e32d325fd23ccc42921dc4a7e4c2eb71defd3", "631e69079ba982e7a1cad0a39eff47fc6d6e3a280d081286b624886ba1f3069671ec1a29986d84fb79736d2799e6fc21" ); + { + // signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91"; + bn_t sig_s = "83aa7ba485dc060df9922f9ccc5da29adb75d44671d18bad0636d2e09c5e2f95e892a79b9fd3b37e1f798b157b567a24"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + n + m = "313233343030"_hex; + sig_r = "9b472fccbf6d812d65696852cbfcadddaa9ff8b1ed8f8be752cc82bc2aebfc9f6bc887fe5da9bd8a6aafb4c21c74f0f6"; + sig_s = "090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 256 * n + m = "313233343030"_hex; + sig_r = "8cc7ac93ed54a23c14b37b772561584b13c4e191955491e8534a2480fb830d7ec6d74480ba71ed0ab5b75985a837d5f091"; + sig_s = "00090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by n - r + m = "313233343030"_hex; + sig_r = "7e2b0d3887035922b95176a9d5cfd5e07fbee961ed19217eeb605a1d2d1c4eb032ace5607955c8960c60af43b593d9d4"; + sig_s = "090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**384 + m = "313233343030"_hex; + sig_r = "010e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91"; + sig_s = "00090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**448 + m = "313233343030"_hex; + sig_r = "0100000000000000000e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91"; + sig_s = "000000000000000000090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + n + m = "313233343030"_hex; + sig_r = "95c7c160c094d4422528af5fd56ee1234ee90dcd68d721b937f609f8bbaa1bb9b5e2c5c3372bd2a25796d8f056b250a6"; + sig_s = "090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 256 * n + m = "313233343030"_hex; + sig_r = "8cc22d258155c98f29733abe326aca7e59692aa6b0cfd97e252f4e083813cb9de1215ebe7f4b6f1fcda440a9d672135041"; + sig_s = "00090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**384 + m = "313233343030"_hex; + sig_r = "01090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41"; + sig_s = "00090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**448 + m = "313233343030"_hex; + sig_r = "010000000000000000090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41"; + sig_s = "000000000000000000090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=0 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n - 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=0 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=0 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n - 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=0 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=0 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=0 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n - 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=0 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Edge case for Shamir multiplication + m = "3335373632"_hex; + sig_r = "705c790f8f50061c508c15fc9aabc1f58193ab15b394ab2195e358cb620a5bf4b65449afb9c417bd1a3105e53a9742ce"; + sig_s = "6dd7abda4001bc416982ab4326b5d27b1280f02b142f040ce2497f9e153e4e1e3a35c5ffaef72694e677872eb19ddf36"; + r = true; // result = valid - flags: ['EdgeCaseShamirMultiplication'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373530353531383135"_hex; + sig_r = "79df11f0221de0473ccf844ca702b0d3981b8a97eb8f6884f4efeb84715d2c6ede43208c7e98db8e091e6c917fd9f0bb"; + sig_s = "1da9881957bffe209d61dde87ecd9c9d8c5cdad0e4cfb6e08ce2e06a431c3eeb2d141d3b13b5baac30ebfd622cbf5ed6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130333633303731"_hex; + sig_r = "1cfce0ce5fbf6178abb6c27db2d4a48ba5797dc9b99cdfe52f749d079c789ecbe1bd8e7de10e2ac7b83d0381ba0c611f"; + sig_s = "24c37f70691e443b1b70293100c98cf5494e0d6e0b14e4400eef72cd0aa10fb4a689f6b88ae0f0abc3af7d09eb1b0cf9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333632343231333231"_hex; + sig_r = "8c297529b9ce5401f51e5eaeb53115f4b07066c79c4b54a9fac00638fcd16cfaaa9626dc6da6598833d924b0b92867a6"; + sig_s = "787762678f96858f222505f110b97a24987338d5e5dc0c290624c243904f65c0b5780517838a7ba217fac9ff59b6de4e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34353838303134363536"_hex; + sig_r = "69fcb752545d6576b0ce45f8903651831e79ef0e173ad1c8fdad99d6b380aa7ce4a588d14aaf0a307e5bb05b81945d10"; + sig_s = "3fc4151f72c111cd2b0a38fec138083f7d058b7389a266f7030fc55b7d69e490aee05f931c55b769cae93229e7af5e69"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313436363035363432"_hex; + sig_r = "1ff39aa7f866347b6c5a0b62bbc9329483245d524e93dbae9fc350197143460ba6bff2a12401ac12c575fc331d89042a"; + sig_s = "1591933f0e33894abcb72c0e53de6889a00ebc0ab5974d3ab8613a493b168db33da5118f3f3477a73df49af27ed80d05"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333335333030383230"_hex; + sig_r = "61d322d16ca80620bb093333ac1f7b5f38ad5d1bf39b686471b3838d194a4337d3d0ca300125d4b724dc6c7cd1b0aa00"; + sig_s = "595b3d2e24354810c5d20dc81b2ba3d719036c7d4073b170d31d210f58f3b5f7ca0f03007e33702be149517f8ed69ab2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36333936363033363331"_hex; + sig_r = "7c8cd6b9ab6068297f8bd2f4fb5cb86182843b80dd7582317e817899c612bf13bcdf520dcd61353f27a4356dbd167070"; + sig_s = "4331c14c7f033c5f6e5d9d2de76a9020b426357d5ddbaf125765b8ed476a18ebe1bafaf9417bbe0f8f9672fbf20a5cde"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333931363630373935"_hex; + sig_r = "771117177496a9118f2883e57f63a58998d57879166659314c508b6028094d4e16090f277acfd47e097f5bef3dc65939"; + sig_s = "3ec4bc040aaf47f9acba6093c82c3e07c1e607ee238bebb5db96596964bc3af7e57b808c2f6be04128467a56577b40e4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343436393735393634"_hex; + sig_r = "6a05488b75acec4718d7164ec19dcd6d351a5fb2852afc4915e9ebcd8073897a5d559dc9ec56a5aae400dd0cdeefc716"; + sig_s = "2e511d8bf60ebe468f5e045333d43d4be59b4393c8e650e3e6fabcbf10da7ae5f2318bff047413df4dc17fb372d98d8a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35313539343738363431"_hex; + sig_r = "8542c58427f1deb1dbd36227eb96fbff153edbd23ebd13e786a52e4863c888a2dd50941654e551a4fca91b5bf3519789"; + sig_s = "82b68b14b608032945bde3d7061d5f687458ede1b302af8842449788f8314b108579f6c528bdc800afe6b2c8b185fb6e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35323431373932333331"_hex; + sig_r = "58fb974bef2acaf2547cacb6f0cc934b5991c66eb7a223755209acaf5b9e4b0fed712c76606c59c1014ba2c2eb1bb322"; + sig_s = "7d9e265dc09e031014182b369e15b4a34dba3901062d627cffab561e73d38bbea907272346fbb247d3ec63564fe1cbef"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31313437323930323034"_hex; + sig_r = "065ed5994d4b498af7f5ab7d4c08810cb76d242b5d8b7b5537cb8afa6ea852ab714f66b144a486d05b2a56f2056baa11"; + sig_s = "37e676a8d535d0a818dcecccaa4783db6d254925a00dcf6a035a7d9e0d677dc78195a7eccfc7beee8e8eea7456c3699a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130383738373235363435"_hex; + sig_r = "25c147aa99a615a34a6bd152d17184c48d28bf79fa6fba928e678ef638a064da79d5f253f7feb8915a40d6437b7bdfa5"; + sig_s = "0cf7e14c03cf67895721cc2fbdd62d6a0f89aec43dd123d51f813d9b5c82850c07d089e7aea0df2f597e6a1c8e2bfd29"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37333433333036353633"_hex; + sig_r = "853df8d619f3aa7dd0bdd24c34d387cc59abff4a0585e2e9c82066e4d2e957b0437031bc1284ba3d39545d5e850e27a3"; + sig_s = "0435982cefe2cd1581f378c6be16ea77284a178b3f0dc14c169c9ed863cc4a8d8f78651380609df5e05b65041dd7a201"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393734343630393738"_hex; + sig_r = "1b29b1e60895a4920d6861836faa227765404602f4bba3b4faa888a4b1693a7c8b585b59b942487122a9889f4f1454ef"; + sig_s = "7d9fcfbc2ee71fbe32a4262e4777daa38f9722b0a67500b950aae4b469bff9525ae1de389cc17ae719e24ecd19728441"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323237303836383339"_hex; + sig_r = "8937dd05004f6e782a2c91c8d79f40795d169fab6af385f91f5cee928c2a22869f10938ee2edb3ed0e0a0e38144d5064"; + sig_s = "48c692b4b88776b0158b99e15e99de3955ab9d884477418cb740ff917a704c7707f39954186a03977cbedf34bac02715"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323332393736343130"_hex; + sig_r = "1e42fae83460bb8f30d7d6bedf984622a55035d502fc2d7f9ce52c56515fd66d1d593094d4167f4ae051f2b12d0e67ab"; + sig_s = "284d00f98f29202f03b37971978eebf2fbfb94bef2b4d63fbed88c7d29d18b61ca409882aeeea97e30a0b156dce2bb06"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3934303437333831"_hex; + sig_r = "2c07e185941b20628df84808ff9a010e5e112c0632cb3231266e8418ab06f6f18eb41f2f98a5a0ca1a462339228fad9a"; + sig_s = "29051e9231d68ab462ba7aaee39edef69c05f81ba7eab161454bcf4969ba293463e6de2e784677e8d2a92953400fe957"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323230353639313233"_hex; + sig_r = "030687253ad2ccb94342d325a8ad19278ff2ac8cfe00209ab030c7997b3008d4e9588ba2922d62e75a5e6cb842324f72"; + sig_s = "752ae1bdbd94e35bc57815d2758b1fdfee706f410c0ed966be8792eeb54cae8631baa0c095e0742d6dd7d1e0419bc588"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343134303533393934"_hex; + sig_r = "39abdc1943608ef4f5c46bac7ae1e23d2e3252e6fcc2b0ce8f41501df024b7d297362401be87b122bb9ccd98daa533ce"; + sig_s = "58f8d8088faf75fa06d76e8cc10a1d7bcfc225d58b75d8a204e6a5ce4d6d95146e853b6818746cebf7864facb44a2189"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393531353638363439"_hex; + sig_r = "510f5602dbf3a095276e99a67a65249217c6e6c168a6caa64f5aad806b57d29002e60786c6f3ed274690583d18cde72b"; + sig_s = "687568eb41af3f5ccf7f2b16e67a1f4fbcb3bf683d86e49a61fff0c28fc03d797a722af9b02c391a49f5669c7968db1b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35393539303731363335"_hex; + sig_r = "84bedafb46873274ef91de67b20375c7698afbe37f3d5bac1bbcabcbb4aa6616b345267fc9d5285baacca6f1b694619f"; + sig_s = "89b39165949cc435503f4a6ac5754d2afddb99b55a3ba840040d51624a0985251f2c9787b5cb266a218143db5b041879"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323135333436393533"_hex; + sig_r = "251b50b63fe1cbae210431bd1e76563f078454f7c2b2e475abc1b7758920f03b971112c62ca6132a480738768edc35d3"; + sig_s = "8b8c1646900601de4fc9c9dbea228ce9c9edbbce7c31a42d3cba580e191c92d123e11c0634b87bc094cff16e209b6954"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34383037313039383330"_hex; + sig_r = "34b3c6afc0fa7a75385e3d0dbfb237b5c76afe16f0f69e44533b7ac3abf4233799201504ebec0310b2fd7e867f9fdd01"; + sig_s = "2f831f5955c2e4fa5b298bef8f09732d0b15ea7ce141a6dcdbbc60378fd9c969339e826def5681e96f0a1dbc36adaf5e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343932393339363930"_hex; + sig_r = "335bf6b152647bdf8a3c5de8de3c69832101902679bc802612d2f4bff8c7ed7df225a080eff6deaa5dacc74016c5ce3d"; + sig_s = "7f1b116f8d27d894ffe6ab57546851baa5513d110e6960d713263afd542e97f01f4df4f7b64d49496d22c2f6c56050d1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313132333535393630"_hex; + sig_r = "329c5d35adef357339f901657af55da7b041e8c18374c79ab44449b27a83022800f0c938503bdd85b7884a32df9057fe"; + sig_s = "74f56101c7f7b36d634c2175a0d17cec0546b6cdf18e86ef9abb6d6d0bccdd0442af1255e02a5dde707840db48543170"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31323339323735373034"_hex; + sig_r = "1ac3d463df221945adbd28a746817ba83d5957d95657c724f1ad68b98bde6bf7959f7363253ece174d7aed346410dc21"; + sig_s = "2a5a30a8191a4883babf69ba883af7f5067bc990f8dac4a35bc6ef387102fad85d268564c61246dff17510634168a1ac"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303831313838373638"_hex; + sig_r = "5cc9a074e10c41724d55502d72430d707ba755c41d568d79987dc3cde45cf6f70341f91fa2a20e3ba5b57febde05b5c4"; + sig_s = "6d8025162af30cfab2cd16a1342b4174ae171dc3c75bc1fe994ec6c0359295f0390e65856aec5ebd894a15c68577ab0c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343534363038393633"_hex; + sig_r = "0c13ddef4e7e83163090559fa592edba35a92d66e54a34aae2905a10b03a316ffd0c013f7b061909f3a924ac25f1c90a"; + sig_s = "40ab2d40b4007fec32a647784ae4a2d5cb4f7042cce8c374298c345180d0e38aaa5d73875eb859b082d0a17cd496d20f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333837363837313131"_hex; + sig_r = "0af74a3ea3c4121711d10f2e4d725031b1b08cf8eff22834748402453b8eaa00b1578611ee45220753bcbd20a391402e"; + sig_s = "15eb2daf4fb9321283f69157e7c747d6376759d0130e790552b4fd89577139a28daed43ba976a76bec1c7d53a49c9822"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303331333831383735"_hex; + sig_r = "674b6ac9890dcbaba4d744ce9992e9dc698e524b0d1cf4d76d355372631d6f7dce6ff5a607273c0c1469d8e5b12ab60e"; + sig_s = "7cf8f98328f920d29475d5cb38bc35fe71ffd87f1be788d202908eb939c76b7694cecfc21dae50f433773d75e279e303"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323535333538333333"_hex; + sig_r = "89ab51357a7db36d1c26b1e906088b9aa3e3d59658e2bed55dd03deb56908677a59a4b24cd65eae6351b03a9300ae518"; + sig_s = "395e10a6accc3c6e566844c4fac4caa2a8ceda4751df5aab5b3275f825c5940b1db60886f1395318110ca53c69328352"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34363138383431343732"_hex; + sig_r = "5b3f30c83acaa088a372d5588229a3555dba14fbed8cbc2935f6f6eabd8077c853dbc7b2e354683d41dce5b5d4c9de58"; + sig_s = "767024280e5e131b4a46d66b35f2b304a55e6481f094b355e873a7f861029602097a4d300136ea005bf5fbc10843ba95"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303039323435383534"_hex; + sig_r = "32e8abc36623fcb2034662105066afd71fae4d75b8300e32bef4632fac65ecbd285c4061ca64f6813edd2abfbcc213e8"; + sig_s = "0b0013e2a56c36de1ba19a9c304869f3d69806ece6f4a801c27a3d4f1c20af5eb175e95e734ef637653a6cdb2a9ecb44"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373536343636353238"_hex; + sig_r = "45df529d2531d48cab412b680cadb532cd6225304fb742841c89545959b79e198c3b1297dc5c4bd9aa7549193e0780d1"; + sig_s = "5c8f62fc4852069d35232aab7725715e9157d1aa688050f896d690dcd4e41baa66ea6f9b34deea5a607cc391ff097d7d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313139363937313032"_hex; + sig_r = "1020078f6e5717538fef879c5635d4d7d52721be1529585b0a77083c5f347f21b1316d0399a8bc17b367336475a6d97e"; + sig_s = "1ade87ed2e2bdb2481a027dd3fa5b93a81f4ffdc33d4a908d97b40f841821c02929b036135f419752c88d57509d17bef"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323333313432313732"_hex; + sig_r = "0d93d5c63741447fdbed17a738a41efdbb7093333797499fe70d5c54bc86b6bb650424bbd64907375ef92efd13ee25ec"; + sig_s = "66192ac1fb22db75881df7ae890da4953a74fa954e0b5e6b692eca23c3bcfd5fb3228d092d9991071baa4b6e8fa206ea"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363733343831383938"_hex; + sig_r = "049334bf43f7d9c213443c96c4ba119b335757a3e69ba873bdc4ef642139b8687a8a5782b6a900211d6fc1ecf14c2cf9"; + sig_s = "182990bee4787267b6d63b7ea67a25852951d145cf5a39d201babe9f3f1120924e5b283eeb636a8fbbb0c2fc66ddf755"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343630313539383237"_hex; + sig_r = "6b0c248fa39317621af5344f978bd765ec6125cce2f40cdddfa40f7e8c7f4fe9216354bdafc2067288c56794eb5d17d2"; + sig_s = "7584c077ad35b58fb29403b9c2c641271794e26b241dfc8d74d4daa7de3f076c9c4c6d3909e2c0ab9b9a702c0812eead"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38393930383539393239"_hex; + sig_r = "8c048a8eaba1b654c3f687df01714df3b61b98e578205c804a72bde32daae87b37fd2f9f5f82b3c5f7b4a007eaa1986a"; + sig_s = "30b79f44c83bd52e537ccf9a35772fab5ba9faf0decbe34763b5ae280984ac7ff27fb8dbad57218c364b39dc2a03b5af"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333236343430393831"_hex; + sig_r = "2ebcd94d17122442d3e7bd12c4b609dbceef69b3246092e4ad0c83d602c2516e09169b592fdf61a7e881e262bf495714"; + sig_s = "70392cd4e5e17606608c2e4ffff7a9c0e9171198915cf7e50633263d7e071954f12ebb1a4f4acc7683a160d64dda3b88"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333736343337353537"_hex; + sig_r = "4d7191596f50b8309e1490895e62b16c415c1f7b50d2a4260904bc5b7bffde4f92687b029f326f4b48e6fd8d1f19ee50"; + sig_s = "0a54515fad47bb08e586697f28e2bbf98d7575c7bb911bd74db3d9aa848475bbddac66181efd63a24918dec2dd01a2d9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383630333937373230"_hex; + sig_r = "6fdefa7d912cd2c30cf12bae608ab87de12d49ee084d239081e89246e4939d6071dfd11f7401894aee9c13d11013ec75"; + sig_s = "7937495dc0a3a3d66c43945d99cd98dc842ae8677f14d649b22c1e7ec14857a05639ec1fe08be228112832b5e32fcf15"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35383037373733393837"_hex; + sig_r = "05867e5f8abd704007b98c1a8f2c69f4eea14cb4a4210262b474c4eba9073374cab5dd1bb5c781df040df32bf7943187"; + sig_s = "68afdc70aaca5f1b36ef32593d889e377d3f83b329386c982acf9b401b7cd26b75a5389395c15d507d7d67023d6d07b1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353731383636383537"_hex; + sig_r = "88d5f4069be31fc58a38fd8de9dbc7fec64065de4268d41c8db799d0a20ae10492c7e80b30034b7f321cd49b2b9c3f33"; + sig_s = "09912b63c4f88be77211ab533cf13f2b63472006aab5e70df21b87301fe5139aaed4845a421b0f076f968ae4b32490d2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38363737333039333632"_hex; + sig_r = "750e5baeef6934b36512572dd330fa88353e321a521363bda889fd257e4ea4024fb5f92e39f265d789d2a949dd91843b"; + sig_s = "18b8467c63892514847c3b98ee279e3f41b391a47975d7f4d6669385ac0bd2e322f88608870310b635ad28256d8dcab5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343735353135303630"_hex; + sig_r = "8bb6569737c5e01d2596d3ba5d01890f231136c69c6c9f42a944f06602296b1159f29fc1d98b68be06f3052c5fa8619b"; + sig_s = "2d1d4ccd79b00998acf03d3412888f27d274b8788742be27d798dd7db654d964fa4cde3384d88c2a50247792e8820ad3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393733313736383734"_hex; + sig_r = "277b8fe00651998cdcf8b4f40795f454e4dca2fdc2c10dce1fff8f0c852aac0bf6183b1ac3c3826706c3e659854198a0"; + sig_s = "0d71f3f3f681fc391c3cfdb81b61eba0155cb4a8e9ce8049cdf9b459aaf264525fbb893eaa71593a9618c0f117efd90c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33363938303935313438"_hex; + sig_r = "269d14d9867ed23410caf24f5f9f171bc0e52f006d8d16c02c81f1b4edba222de7351ad72943ed09a2e7ac176a1b2156"; + sig_s = "4af93b800fbdca45ac74cfd22cba9a508739f8fcf3ce14e55c39bc770a143f809970e836447a4542d0bb367de6612c89"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130373530323638353736"_hex; + sig_r = "40731dbe64636cd5ef5d2560a23f3891accf0a530a446c6ad213b4ba7ff9cb505aba9331836ab8a98fe565e866c87979"; + sig_s = "19eb3cf6b5faf11e9717d6d0449624a509358936dd0067ffc18f22e6bcbc6aa1df3a45f15ae732197790cc6fdb92c3f0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383639313439353538"_hex; + sig_r = "84335a1c93d996e36c22aee4f33ceff7c6ff088cd5604db8275098600666144607bcfac7e695f2f79a775628a1ab6f82"; + sig_s = "28ca8cdc6bd772cc9f24c14ef71332f192fefd52d03b8df99a257f315e0f6f3296e4a45fd182f06a3d2ba2779c10a40c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313734363535343335"_hex; + sig_r = "520b74d5d33ba289ffccf5187a6000380c31304b1d6f8fb54d880c1908fbd8df5e0857ffa8ca344ff7a4fa9bb6ed5f38"; + sig_s = "03ae877bc1f0bc8e7c9039381f0b66a52047163cb78eabd7a3dbfc538b424fef31d1e0af76c0e1bed7936a88338f1bb6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363434353530373932"_hex; + sig_r = "59492f3e58b5bad9412105b4824dbe939d7cb2864a27680620ac107285505c42ebfaeb154c4eb6d9e6783a12abaa35aa"; + sig_s = "8b4114caf3260e509658243a5f4190e40c268d012578df86866a4e9503c8490804882d0812aa105e245c8c46fb36480d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353332383138333338"_hex; + sig_r = "421dc854479aa611887aa3689b63276fbdc16ec7d3dca449b482dd27b1403c911ef6265ad625279e9d83ce7534f4ac3f"; + sig_s = "2852e16b4276215a62ebcbcffaddbdb2358dcea7084948bc948f9b3d0f91693aba66362d4a2cec70f7952e374886211b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31313932303736333832"_hex; + sig_r = "49110e413aa3e02fc05937d100ae4db14cf3f0038b38679a4aa297b11f9c47f7df538df8cee30efda4ddab2cc51a6b0f"; + sig_s = "018a09a18e1e7983e52b8e6cc8da9c6d7155c5409082f69587420906b75cb5157d3758e992b223eb7e9c274fbff4a973"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353332383432323230"_hex; + sig_r = "884cf64ce726d5758efb9f2f35c92dcc6063b01b7432faffd0f8186ac177e31129633a648a1a6986148384a7d1c4d3f5"; + sig_s = "01850718d7a2d41eb9892f5440ef4b9fc8b996d3b6742eaec3d40b10c5caa890b9a853e1d211f7fd1178116a9e7c5f4b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313536373137373339"_hex; + sig_r = "0d9dbf8ebcf80f256ee2d1f4fb45cd543381f6275c4c10afa85208828e27e6fb3df3ca7491899c68307db66a505c7a90"; + sig_s = "1f0db26dc691680832b3e359905e5e632bc9eaefd1d5eb4f058a0d88f8f2df0d1a60c2f77172caf6554b2d256cce8c67"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333033303931313230"_hex; + sig_r = "6fa1802ac4c2e79b8b5a477b0a5febf630c29c089841484c1d569daedbf13c0bdf793d0a8f6915bdc67dd1480824a1ce"; + sig_s = "28b8063258111e32aa10af0b2068c7f54f0d5e9f02ad39a415c91743d6444c20156c3592d2bcc234f265b46a35864e57"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37373335393135353831"_hex; + sig_r = "3dc1363dd0119a5054afd99484026a2692567d2fbeeb4c6d80a30d22f166b6304544246a35ba854f854601397ce45bd5"; + sig_s = "2b020a770901108ce6ddf69117a2e80734788171604a8f0571db61a4a8c3c4dae33af841afe4a9892306b4f9ecb19b49"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323433393636373430"_hex; + sig_r = "7b984bfa807a8e9b0eef94ed28c24b04d42e0664fbfc0ee1c1b5945c8f0e97fdc515fe09edd6cdaf7fef3151ca4044df"; + sig_s = "4e878741529d7a90125deb8fa5fdab8e9f7d254b8aa48a59a2f335c7d43402f2590f1082c76b2263582c9dd98ca686cb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333237363032383233"_hex; + sig_r = "87731525e787239a232ba3c24b9caeff3ce591c168227b8e2864140b1d7c0c50a7d5fa9f4f6468bca817458c171aa447"; + sig_s = "670598b6e5dfbaab3b622bad9b5b6ae42c9d27bd45b1b0b892af9fd9739dd50414e8eede3c6dc10fc224463b44c8c23b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32393332303032353932"_hex; + sig_r = "1901d0d861205cc3e3f4a189b879ee246486f0cfdc481d63727384feedc46c8baddf891a6e6eab6bede4e46bbff16496"; + sig_s = "4017c9eddaea3112f26f7c6ee472ee1983d7a296a7402295794fddd9e267fe62d85b07b99e81ea513eca8d1a67e705a0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36343039383737323834"_hex; + sig_r = "04143d73f140febac8fd4d6762b9a55bc93264cc3372bf1661b35a4b11be9af7910d3aa8e4f5cb5eafe1de3a9d969577"; + sig_s = "5966b4e1e9ef78e523916dbea37e03ecc356f466441dc45b9b98fe6d09af83e7d57a861c5d2cf94bf0b87f62752b2824"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36303735363930343132"_hex; + sig_r = "5d24a6cb0a9f7f8b9f8d72da989fcbe85c9448b425a368207fce8421e5a60f029184f18611b9a5a1eb66d054d36057da"; + sig_s = "32b8a4d4aca17e8335d84f2a68d74f38d8cce5297efe9e6d0e1a8e5bed1b5759bcb73cff28062963a28bbc1c571e3e1c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333231363233313335"_hex; + sig_r = "1d10c1ec203fa05deed62644b809150cd5e3fa15c9129156fbc0477742328d8d35b1c4ca8baa6138e2e12936a0f4c332"; + sig_s = "4a029bb52ddfb171e4b125d3326deec488cc9f6f2b36d051a35d75c1de4b7abd178c7d4390e511f14d58f49baef62dfe"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36343130313532313731"_hex; + sig_r = "2dcda31189d8d179f7deff208aea8bdfe0cb08a6da46f663c5ca649c84d8fec9c4495921c7791d32aca42557c3bf658b"; + sig_s = "67536e336428bddfb0862bff5bf5d5b1694b82c1e1485498e14fe5c88f75a9d7f520115a35703cc30ba0ce973815189e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383337323835373438"_hex; + sig_r = "2cb81c03c3cefc417fc60f19b740e230982e0b1c68ced12121300d533f485597d1c532d87b235d136be3a43dd85882ca"; + sig_s = "48a04c5d8d867e8849bd3b981f010691f0e7422882573bd5bfcc33d6f069a622d159ca71bd562502ec001bd2b453712f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333234373034353235"_hex; + sig_r = "152464668cefda80dea5232d36bf240ac325e3ca279d8c8e0458306b18fb12ac1ed16586d2d07562691c3205ebb4c774"; + sig_s = "3c385567269279e9bc5a2d076ae9a09e790d1d8d08978871dfc586298f56121b4bc84f7891e91c3d7612249d320e363f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343033393636383732"_hex; + sig_r = "052595a16d03a138d656dec75a5540b80f7efe63b193250de3bf811fb2799d7eb9a6ae274ac953a8fbee741dc1f52100"; + sig_s = "55f0594ffa8d32b91eea8bf079b8f5a9f6b60888500225016095b3e71181ff32dbabcaa5e992b43409f55467bbb65125"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31323237363035313238"_hex; + sig_r = "296f6b3851553203822d7417c176eb3ec5e556e352d24f2834bbdf7089a168e637f3e80999e7a8611466dec370590029"; + sig_s = "64f796945f53fe0b27bbfbc5b5e957d4132c24c8b462075e821bca24983e8b8f850531617a42ed3157dbe20eab31cb28"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34393531343838333632"_hex; + sig_r = "619380558cd14ac909b565e049afa224f7e720af1b22e18b59cb055fdc0f191deff46a6050d1642c5636c032e9a7b46b"; + sig_s = "3c3fd2f278f07954936c6183da8aafc0f61319d9a90b7d3dd11abe13e55e2afa81512f384c13331af1d6fb4d7c6929b3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343532313237303139"_hex; + sig_r = "354ee949bfaca35b1934e88e036b7f376006b79886133d07ff4aea3e057eeeeec0b93f629961c9ac1ee188c1c87e2cd2"; + sig_s = "1d02624a9110f7bad63ef70e134a7ff572d772aae30b4de679494d00ba9cd835d4ec840d772af9f7c0b0dae8cad3837a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373331353530373036"_hex; + sig_r = "881e4eaeff3d3ed173daa166223d9583ac8dd28a310765e7261b0ff52b2b3fafee805d613258add6d056157ccc40da73"; + sig_s = "53bc28cffdedab6452161e05517194e66afcc14d107d1e5ded729f661cd6630d8b6581a8c25251ed7c4b5c364129b58a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363637303639383738"_hex; + sig_r = "1734f666ae2d87271d9ede0da53ba8fc6cc2f83edc15dd26b9349c9e4cc5380434fc37b4ffcfd9b781f07125d85dd660"; + sig_s = "531daed4b855e9117a1ebafa232f06b47f50be4386db27ffa5ceca3e247be95497565c0c97b437d32d7694974b22f2ba"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343431353437363137"_hex; + sig_r = "296917dd85475f8e7b6f858e84740bfa967996e173d63d85aa08f1b6d3683097395e4a7648d14e0bedbbe3667d3db4f5"; + sig_s = "4d3e0279e93bb192f24418a0a05bf17238dcf78dbe8343e55a663418106d7ae22845943459b2641f45ef4ed606c53437"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343233393434393938"_hex; + sig_r = "47f3150db2f4fa598ec25dfe864e11f92bbdd5d6046aef744b794f56704e323cde1eb6eabdc3f72f8940d6a6fb30a1c8"; + sig_s = "4e41a74f6f6cd1950df41133c58608fbd8fb92b17bd3bfbeb1c1cc778489a4fcf884e8006546cb69fa9d3492652d1255"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34383037363230373132"_hex; + sig_r = "41b903c255e90cb719b74684ed9700a924362ecd1cc8ce35b44daa1d41e3ae2ad3df2d01b9100337efbab68c53c6c76b"; + sig_s = "471f451c324025ddbfbe359f1d3ac5e40f712b4e8ae0bb316f54a1ae1def08c95f53ecc51afc375de4368d03d5095964"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313634363636323839"_hex; + sig_r = "61b9b042fd654ca9c685aaab03ed0544e39e1848370537a0d0ac42ea7453d6853795695dda8f4c349b897c2f61f95036"; + sig_s = "634d5a0a8c8571f7685c6c4b68de8b2916d8af2233693a17399acb6048a4d1416ed3b2f91b7853868def58a0eaddce51"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393432383533383635"_hex; + sig_r = "1ac6ec442cbcea48a8c404ac27e42e2122a121ef8484bd91c04aa259438fed1ee8a80ba59464b8a4351089923bb01e92"; + sig_s = "78c0ed4eea7fedda04dad0d3f0d228bc54148b1238c63428fc39a772146947798965caf7ec9276a05a972ca1e4218f84"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323139333833353231"_hex; + sig_r = "6df0b36456bdcf91f6657d05b93738771f183912e27b9fd888af4850b3d979c4b7cb042f27e38615f054d51759381318"; + sig_s = "6a638be5f77cbec37a9766036efbc900498ee4fc850ac983e5b602c9483038da987374d755aa089cfd50bf2cc2de3b95"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393236393333343139"_hex; + sig_r = "31c868d4f028e318c6913a8d1af08abb1f8ad961a85338f8baed7cbd8d79e1337f35be3b03f1f62c033f1388d62b701e"; + sig_s = "77a8d63de68f69ca299aa3ebab0836d1e717285bf403683e03210bd2a333d7b61984d1e13918913c8d1e7d6a93ab7f69"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373639333836333634"_hex; + sig_r = "7d45c7dfa59f13830e9dd79a283e2129d5829be4cb84e04369ed3bfaa08fdb38ea643cceda163fdbe5016623d3f1e41e"; + sig_s = "5b51f7b0ca780125dd6f60d3b40923fcafe6e0d49b84b3dbe508bb169459495a8420028a3e4484412048429e67ca6037"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373335393330353733"_hex; + sig_r = "8732951e64e15ec1203332b9ca9a1dfbeddfb0d1231d0e2898c099f75efd4de9a46db9a780539bb0e28435d5b2970078"; + sig_s = "86b21184542ce50d046d49ec539d33569a5cc45c6432d965fb4c455c63d448194355771d7ddc47af74fd2827e1d72e0d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333030353634303635"_hex; + sig_r = "2631c759a6a86914160766b94a4e4f474a0ad679b5afed8a7237eac773c6b0d67ff3ec36df3730e81adeba58d6e29517"; + sig_s = "16209dcc9237a9ae32d862b33153943f1eaf2a92146af773cf3e5bba48a8551d9c2fa12a01dff3b005426cdaff05a8c0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333037363535373338"_hex; + sig_r = "59b12f6220b046b08f892d69baefc81c510cc25ad090616b350606084216e6c40e1d8cd96a1b315e64ce1d84986d89ac"; + sig_s = "3994a6852b2377dcc80935e2ea1eaf7889ed694cd321bbda342dbd57ede1a47c2b30de46bb05cac66a6235c4bb290c5c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39363537303138313735"_hex; + sig_r = "4f69180fb660597f8e70334b7b6fa97e5928a6c175de912905261f3e1f4df1752d3415370e6272710c7bd4bd42edadec"; + sig_s = "445b0b78099bd99fa78a9945d7bd2058a900b94138d67abd37fdfcf2e9fab6644cb1a8c376163ecb69955e954ce8c320"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008a94164dc7654fda3cd4301d3e972024c2daba71d442128c7f3faecdb9e375a85aa80c4ac28889f258e6cba886d47636", "548b3bf1b675f2318c3d8ab7a1c281a33241c121b3590bfdf703c7cd4bae8f451886d989234c1b8c589614554d429392" ); + { + // k*G has a large x-coordinate + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000f39b6bacd3b2eb7bdd98f07a249d57614bbece10480386e8"; + bn_t sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046562"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r too large + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec4d"; + sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046562"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "73f84ab63789301e88b4cb82cb935decffb8f42b2c9784c7544615b9076ec7a7ab94702ca7f1d9aacfb90537b5d368dc", "502cb7c8c18285994c7b19fa3e2401fdc26de54ffe006bb79bdd7852c666d730bdf76a16c0792a6c6681ed6b647fc81b" ); + { + // r,s are large + auto m = "313233343030"_hex; + bn_t sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564"; + bn_t sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046563"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00895e8461eddbe21367a95b25cd85cd31e80ecf1f95539056fb7e10b4aa49900b2194d919b29cd9bf373a1d53ef571174", "767c02e36b935a65e5a9cbb35589a2a018482065c5e33da8ce483dc7f7fe441574f9e7ab0614bdcfc61022c780a30009" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"; + bn_t sig_s = "480eca2874aa6ba71e7fb5711339ac0a7bf84065b3c7d59c64a2c6015e6f794e7dfa2b1fec73a72adb32bdb7dd55cd04"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "618ad81912e4c31f23eab2f0c693b3ef8404074ab1dce01dc82a768151c9fa0393b4d6aeaeec6858d3f419957a5b997f", "31fa809b1b44677cc5aef1894846142c3e44bba6c471123fa14feb8f3aa9e92f769be549cef9c1d55bc6f1f4f841813d" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"; + bn_t sig_s = "1629ef2d7182d67b6bd9cf6842251fe09c96bfe022b8ad9a0e546fdc8ecf5dc8636fa13059d7e9d83fde50e0d2b392c8"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "79583b4968b576811b567e1620e00b0aab8aa223c5e655b27b1ebeaf83bcd35f4205a5a0e51a2052fffe9fd23785c98f", "77357c8a1008fcb7a3579614c2ff47980fa9e44b6b5ea3f8a33c919dd2aea5dad0ca1a01a9e2106518b1642906e4f275" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0089657bac216c3ac4a3a2d5afd342ad24a4eb103d4dbe2e4461e03c7011826513fe82bd06e17e3ae8eb5811da0bec88bb", "33ee1eddd5d49dd86e785fbfebb9288661964e6fbe0c07af9a4ba3145fc4be11e5484b650c97096db82ebb0ca2bb84ed" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5876f414fa385b403a2d10da5d89b110344ad005bfaf8c759ab1e3561a39ff0db9ff91ec6040316e2fca3654a48c0e89", "0dcb77f896ea475cb97672a8400329554c941b61b4a84bde1f8c8fc5250c29161fc3ca50458a41c77a48bb336882f2ea" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "013ef807f7bd12ebf3eb449b1a780b174ac0b49f7873cc55eb96926a6759d31ad7915e1a9b32725ea35c4874148e1461", "58eb75969fd51f89ff8eea7e3d2e57f7967eadd9dd19276c6fd23ff129dbcd334710361d7b81876f298e23e82fc4f13f" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7a2017b44ccccd1feefa4e2678d0ed19b7c45c7335bbb3fde4937758a76eb6892ed537046e822d8f819e44ee15914b75", "7d1b2da972f6534262b7126031e55f618f78cabcd516ebbc9d8308385934b2c9ebb9f98c630c85b253dcb3eac81ee065" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "48936d9579659b46b476999c476a0d6f2e68c902b5af2c01dcb1e8f7b2fbb06eb93f1f427e836cb07be147c596494dc9", "71c9f2de6c9ae7d343f27eb8ab54e2d1c93ad87131dc3aceac635b8d42996cb750e7e364fe4eab90d9d3e0516abd9c38" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r is larger than n + m = "313233343030"_hex; + sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046568"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3d2f0f89e9359b97058e9008f9aeb26aeab7b41d91438a72a3a2737f0cc91a05a0ddde54212f8a5a234838b3e9a2e0dc", "31b168cdefd0b214b8190e30be9ce4b2f9a5119355d9b2558ffe77d7177709a9ea2b76853caa265c3b40f0bcf5908938" ); + { + // s is larger than n + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + bn_t sig_s = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9173bec"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6b25f8c1629f7579e3c7ee4b029cc029b4bdbed88b9b399303e4a14352d1f3f6048ecdd062d37cba7b70bcbd587231e7", "621313f93d310f144bd3322582804639dd2960969a993a9f2a3609f856e1415a0a4dcf58a7864e41e2a8c80dfc158a30" ); + { + // small r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101"; + bn_t sig_s = "896621d23283b12111048d1c978e2c286d60b6ef7ce37af36cf7aa4de268d626de7ddcb356d167c7483c69455c752c93"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5d082cde6086f8ea6994f46e9dc06c1c1d2c3a3c2dc5c97bf137653d9b2ed21101bad843d46e4b7925b9af7034c6d021", "12c7f56e65d233104063391fb3828b3990e6893d77746e42305e6a5ba111d976d693f595af858f19fac7234f7484c489" ); + { + // smallish r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000002d9b4d347952cc"; + bn_t sig_s = "38e8dae216c63f06b3edbd0f9ba7a5e4a332ec187251e3d627839d1baac667d7caad2ab0a1ea9fbb12dc5a71e3b49bc9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7407ca6c2a183f9ca1376609e9c78a8d080effad15a4f63cbb7a168e3c789b8b59ce4d3122ca08a86907ba487f717fbc", "3e2c56a9b3460a5136b213be8d48cb3dc9c7ad945b1dcecbf93fa6cfaaf8dbd70f1040b97ad8e3ac30f2e64fd7cc76d6" ); + { + // 100-bit r and small s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000001033e67e37b32b445580bf4efc"; + bn_t sig_s = "0d2436a599b396a51c546e05d1c3d25a8f6d05935ae5031dad3cdd7cb36cf6912a433de28f8475d3b1e2e1ce77610879"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4fc32a5226820ec9c3fff2c74e0b36d7de028e59fc005f3807a3bd59892c9ad20dba7168ef9ed9bf99b25ed01bcfc6ca", "6a13da2e852777a6f99d04322a1b9fb4227684bf7c40d4d3ef92798003a3bf2da158d5686457c33d0e24be5c265fc473" ); + { + // small r and 100 bit s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101"; + bn_t sig_s = "4a289adad7ceec67ae99ef5da797b6bb17d9c168428ab30ea9a68b89652c4b9e9bae876ab3d7fbdf1eb92ed422bd3b93"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7350a7d00d7719a318522ef4c5e6be24b3b2cb300c596f79e8dd31a4688fe65a54b2d7497a06821eecbaf31b2fa7cdcb", "4bd72fc7f05e32457fda0cc3f321157744f1841c30bd086e6ddd5bf415eb71ecbe36f0f3fd23d3c41487fb283e0e9794" ); + { + // 100-bit r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000000000000062522bbd3ecbe7c39e93e7c24"; + bn_t sig_s = "4a289adad7ceec67ae99ef5da797b6bb17d9c168428ab30ea9a68b89652c4b9e9bae876ab3d7fbdf1eb92ed422bd3b93"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "61498ad31a84eed102ba2712eb8a7bd92320bda4ac6d07b4326a30869d19eb1b96229d21efd711dcf73048bf166800e3", "0cfcc13a0914132284dbeab6fcf5d70b34ca86a681157e4874abffaeebb69b8b71f69d332306567823dde5407ce739e8" ); + { + // r and s^-1 are close to n + auto m = "313233343030"_hex; + bn_t sig_r = "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90464e5"; + bn_t sig_s = "5dd0bf01c2259e1ab4e8f4fee099813f6374f6069e3839ccbf64499dc802c3c534d1cf1f9cffd76027b021574602ee43"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1d21a6e6b2fc27821f0521d90ab0e38e3cc22e50654424614608f0d80fbb649bf3ce3437d8ab122d412415aaa4121bca", "67fb20763fbaef5201d4efbdb6629395d1a9cc002437a3e08a82a8a468bfb98d2323194f6d406a569f4bf0b99f440c3b" ); + { + // r and s are 64-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000009c44febf31c3594e"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000839ed28247c2b06b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "24188e2bbb6e6503354d84ca83412460e6ab671c224c6ab86e841a8c8b0ed3ecac9e82ea4be74ffb46d4bcd2035255f2", "5fd9a3457d25ffa1217f1018d657b8f1eff257e4cb5bbfcda52f1ba5bb1f46c4617fd750d4c7cf4dd39ef3df599bb400" ); + { + // r and s are 100-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000009df8b682430beef6f5fd7c7cd"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000fd0a62e13778f4222a0d61c8a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6d5b9aa39ee9abd073e78967b4f60cb9afda7dbcda0b01a9db7116bf69acec858d451d2ae4fcbe21d1ff343ed571a73b", "47e554b0231432ff94a4e1dbb689760ffdf89ec7be2f2e93327476db287b947045af522d9a836995a9d434faf2de27b6" ); + { + // r and s are 128-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000008a598e563a89f526c32ebec8de26367b"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000084f633e2042630e99dd0f1e16f7a04bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "033777362bf5001b883fabb5c4ab04fbe279be9a68388f34b7e6df306a14d6b8f49c11c495e29912ccc6bc439c0fe008", "22158fdd56b096056455486eca6151c353a072494a1dbb4bd7b7558ee0dd66147a7537fc34482e321a0a3858469f988e" ); + { + // r and s are 160-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000aa6eeb5823f7fa31b466bb473797f0d0314c0be0"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000e2977c479e6d25703cebbc6bd561938cc9d1bfb9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "050592f34db0263df4c669b8991941be18237a1045bfd165ea4af385376564edf6654a0dff7b5d84474090f265c46b51", "1545918cd8f22260ce21a584edfa0b1644488c997d956529262aef400cc0320ed27ddcec3bde6b9fd79b374af688fa9f" ); + { + // s == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // s == 0 + m = "313233343030"_hex; + sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "082d4c490c6140642a25c7dcedcf0b12e83860e81f5d9650cbda534dff9f9835f673014f3c90a634e3b4a500fa024e2c", "132895fa8a88f37463646f211054c002763861d0b64d8fd7ee253ccd9e6c848aa85777c3dbc21fd90c8729fa0bce5017" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "27a1cd4f4d5acfdc4cbd02afc7a079a16af1bd59fc260dab35a3d3cd7387332956451814dae863a8628d608c380b852b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0089f5564e19ca83d12acf49a19b9aff7ad367ea2a1534c7c073272837c6f66aa26bc8c50d4361d240b988992ed9cae152", "6f2ef5327cd8e502cd9bf16ded0c611cf6f52ad1c2cf59b085360d14dab801cf1f691e6e4b0f5a8ba530df8ba6d20dad" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "115fe822c3e7293e84b732283c95a0446f77d1dc754c456163e7b5262ee2fac43da1b7bfbac5121fec4c276ea126c163"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3eb325acf37a882d502a70f48e7cd658827b5724454512d96206240c9844a7817bff176cd0dc0b4e3a24947d15b29669", "4d785f9663698973905519c85cde963ac3b4ddb5138827569144e975c3faa37fd41b87150f54957ae5282c7e99769957" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "38602328c4ca227ee0cfeeed354a5ece9a8c2466ab8ea87c3b67a33db109203fec4304417fa3bc0c2d8592e74a14a17e"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7a80f2993c95280658aa0ae94efa15b972f6d32052f7f53b0344f5a9d8e7505733ce6ed6cd506f80c849dce9f984765f", "00838672fcb7b1d3e28942d075555ed59b594afc6b5d450f40537acb455717f1565cf98831c1fd68ed1aa499ae4243f1bf" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "0af0ef24c77a97521a957d4102ea0de4e1d16a9cad02a9a9a5ba466bd1a99e4a078772b0636fcac3caf4e3f9321b84d1"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3665e2d0bfca1937aa0ebedf3e9d8edf5f5af1880c7e2c3781b2b3d39d74bb65cf4bf259646f4940cb78e5c5f9ef2121", "18ea424f2f5a866bf459e0d8077061fa19943a218dc139cfed2291f559c0dab851466f5801bbb63e17795733ab595b15" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "2a23418cc9d5d7bc149bb47e0ecfb4f50f5f32ce49aec5c11349196bfcf0eebb49d977c76aa524c7dbc7e23adcd5cb56"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "181b9fcadceb054a95ecf3fc1d76c96a7a0db4361b6f3dd26836dc68267abaeabe8aab79f1819754050b323f192eec71", "048ac15682a2dbb66d200806fe8502027c109a73413748c9887feb7afb54e7fbfdfb83276b5490c8164d26efd26f7da3" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "360c166f35d9371b4e6acf6c87aca0876ac07ad69efa9383519ecaba2ddaab08253907c2cd41cbd56908f22ae4fe8947"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4aee626de33aaeb733246c099af23ae06da262f9e509b8f4ff3b82f905ec46baaf5789211f19874007ba2a39b6d51243", "6dc849c2728b78163f5bcee5e704113c430e65184477573382bed7acf3d97a533ff044ad20f743f5cdc7c4ca27a0af2f" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "1eb43a98963c2d7bf910155abb629846e35794464a22a01f4efb44a9ca68828a1565ecd890e4676e1887eb9a7599dd9c"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "07264bcbe25d2bd542e3c68d9d1c45a09a5de64615fd322a156465c4436aca922ae0afec0e40560ea0cc495a6843b8f0", "4dfceb05a023c427b9a26820fc7aab1494cbb0b6d33ed7d6da0b951799f0c17c632df483e7f0abf08ebb1068684f1f35" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "0a66b016b638891819928a01f3e5b3cff629b9f0d878d7ab99e90f8206c062d11cffca73efd3a0f56fc160549b68c5c4"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4b56303a979ee98272dabbf30dd74764ce9263f8a5d04df8f97f5d908a4b71f0209bea87c2e7b43d1c9920b4604eeac3", "16a6aaabf771fc49a1786d45507429b251a53b348afe08f20c7b486f257f32754673b9f3f010934bccbef91343f12f59" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "0de1b2d3fb8cb15f4ba27fd5da391dd2f833797cd4332111879448cc079658ee6b0cda88a6ef9d921b0d872013f250d8"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5d939c46f1b93492b3564e9dd0e06353d1c4241327b96f2d0c7c48df50d929f2599d3d1ff4a1ee4cce767c22e6ae490d", "2337fe84a27a593e4b0e01b474d8b46735070b54fb375aa481393599c5d44b2dba4ca16d77d027f5cf0aef86efa21902" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "24f58fbede0aa2ad7cb2b26fc826925f65ca391b2b1db0edbe1270d28200ac5cefb297bc9e68d88659e82b63a925b0cf"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "253e9fc91cbf897ddb29d8176ca6b359c187e3bc77b1794c6e2f69bee613118b0987ab705d6d4eb4b87a3799ec43debe", "5a628d2e1b958138b8a562caa7a24e7a89fb60c4851d19b4ef61232228420b928c9484d82cff0715e40244b411b83a5f" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "37b69194769dff477d4f0706933b9b2f0902b117179132a1174d8848b0be2bc8f2f1b82c3ef6b802e30ddd6fb8237c71"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "37e9e758d46ac26400b63762f28e145b33eec8aa1530d1c6772db8b41f01345f3b8601487cc5bc4a54d29960376d9fd8", "39e6deab02faf4d7446b64c4334c00284c421c2da2fd234e0f1d1c7fb7a08cec2f8e31607138f166055312533d1f1d01" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "293fec2aad2e3aca83f5ec93420b651832e5b38f3aef0b5e1e028c521349935b5669b9d54d5b6e3e1c28d20d2389ea52"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4ecd7b617c0b469fcc37915aad0b77d4a975cb8acb57a269b2a9bca1495864c60462c194a8ff3ae2662c4b54dcbd4ffe", "2284cf3e91cf235130c081740e699245fca7395bfa1d37a0c097e6c4b22b73f860602575e51bba7d2871713d8d5a31f2" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "37c9918695071c1429e155324c602e8d34b8d38398d02e5ae8c32c7afa49033a020484fa6f356abe10e127bf9768874b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "58834acdc90a4d5c0e4a98e8fe203dfefaac241ccd731dad8880c29c3ffabaa6e5a4f3473c10d501de00b0e746d09e73", "3d2f31b77f9a50218c98c5a1c6bb8896b9de5dcef92dda679c080f917e65e35fc66bb72b7c22ec96c7fd761c483d5cb0" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "041de947891467ddb8dc3c7ec190ac4fd330cffd55c6bbbdd008362e2d818871914b6b914a9edff7acd299c2733a7397"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6384a216b7a2adc239c8f9e2af706e94c7fbfd424365cdd74a76f87232610bc242b49f6d4eeaad68d9e71b2713e4f85c", "01fd9b61298e1434e5ab112221a94749d909cadd52c0e43eba07274e06db95514a870f9ffdcf47ca453b07b2979dafa0" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "062979476086e29e3dad11eaa1ce5a2935c70bafee5ddefad188ef56d41ba9a70ea25f01a1483ad5ffae4031baee822a"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4df898544c2b10dc3c4d3249fca5130e753d26e08320bd823926acb050d8b6a4feadf29bef07ecdb00e85b341f22069a", "3343695d1e0ac0a78b38490d97c1e90e4ff4ca0d2140b9101f1b63f29ca4f2bf9176e1600483916216bd35abce6741" ); + { + // point at infinity during verify + auto m = "313233343030"_hex; + bn_t sig_r = "465c8f41519c369407aeb7bf287320ef8a97b884f6aa2b598f8b3736560212d3e79d5b57b5bfe1881dc41901748232b2"; + bn_t sig_s = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + auto r = false; // result = invalid - flags: ['PointDuplication', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3e955d284589775837c9b83dbcb49186d695d6b53f5771689f6458e40a2b6dad6254cbb227de4675849d11e0fdf32114", "3c4f0ae8803367716186174f91b7035b35bf8490e49f9c46147b6d3b71d96f74abfa5e40f33c100f79d459624191cee0" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "465c8f41519c369407aeb7bf287320ef8a97b884f6aa2b598f8b3736560212d3e79d5b57b5bfe1881dc41901748232b7"; + bn_t sig_s = "465c8f41519c369407aeb7bf287320ef8a97b884f6aa2b598f8b3736560212d3e79d5b57b5bfe1881dc41901748232b2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "39c44873ccab023c4b366a646decb4beb5672b6d2140fa0fd200374aa01301008c0419c3392c589000816e1f18059a4c", "2b6104be5e26c657aa1f6fa4addf3ff52a45679800dd28cd628711f2d1c11153a36c6c42fba6954cd37fd252112de1a4" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "465c8f41519c369407aeb7bf287320ef8a97b884f6aa2b598f8b3736560212d3e79d5b57b5bfe1881dc41901748232b7"; + bn_t sig_s = "465c8f41519c369407aeb7bf287320ef8a97b884f6aa2b598f8b3736560212d3e79d5b57b5bfe1881dc41901748232b3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5d77134e890ac72f9c69fcc3f181ae746fefffdafc1dfc791cf33a22fb0f8e586188cf2d5d060ddb04004baf56191c9f", "0e7401ddcc47a09b5ecf2719cc936010a9371a7f7624e63e7a00550a13d035cf586d3b522c7fd06251adbb0f0aad3dd7" ); + { + // u1 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "607cd94c42f5bbfcf857a708ac163f0afc0a65c8d88725f18c4bf7eb7cf5d34aca6008a27b4e5fd9476134ed85fcd32c", "0089f248290c59b8fb963e90bab9b0b3e313d3b8e0a6c8901455a22b7b74a108152c5b814ba575de8de07cdb8d67ba2b50" ); + { + // u1 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "1fc115146e521d7ea33f3e128eb01db0f653dc45852c2b50301d639b778b13380e51d9366552cf2049156605d57adffc"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4b4afbd91746b1a4df6d0d717afc7528fa4a9dda9a62afee19a72fc0019aa2ea89a125bea7675506230656caaff52c73", "5f5c3575bf669637efdb672477500f1fe37b45dcf879487ad6ca36c4147329fb741706ce9b928ce47bf6dc0f9e44017f" ); + { + // u2 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0d8b246c623188b7455716ac189b9af441676a1c41cd575754bd02ae4d6825304b961ddf0826bb161e3d63e9bc71f1d4", "6edbeddc2d40dafdccac90ae85cd616a0ea1e4a08ae8fc3358ce7d5142eee8f3bebdc14591c4c9b15bff12b8cf08334a" ); + { + // u2 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "5dd0bf01c2259e1ab4e8f4fee099813f6374f6069e3839ccbf64499dc802c3c534d1cf1f9cffd76027b021574602ee44"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "04d9d4a62d6eb02073e738b1e439cecd5440031911f45190eb6062a33535fc5269bcfc25d4afc1dae0ebad948d7732d8", "029af37e89a3cea7df38b020f624906fca6d944e1486853fe8e5ba9cfba2d74a852ec587d46fe49917c364418ef7eca5" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "533b0d50480a3ef07e7e8af8b1097759bc03ac9a1c7ed6075a052869f57f12b285613162d08ee7aab9fe54aaa984a39a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1a4a55c9b0ce43d7ed78a98d9bf6459ccf349466fccc457598fc15a1d6956d8ce8348b2332fffb3d516b078d28d329dd", "73f45a4ce1f5dc772f3c3283af6564e6e410f9d5064b6484065966936693f62ac9940eb28914a091d2964cd843b41028" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "70a8e817f4ea82b831ba5e671830b4312846b23da14ff7d43baf3a7ee7aa061c86422aaf27ffc5c655406868b5bf19bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "373ac98f088268a86d136de4fa0ce2c41042cd33ed2d07250f53cd4ed43fa1da425da597bd5b413d56cfff954267104f", "069e0453bbbd79280316f8c1c161a846af379a941ed286e593e7f289ba4fff42458b273a3ba499574e134e7fb4a7dc19" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "326c0872a7224e7a104087acf4c4b4e3e5aba4ffe4625fc3955ce9647bf71fb596b83971ad2b52473a2821991c808905"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7e6ab429b9e33a974f6ab9a49eb152c484575fad5d9bcddcb87edce16e79333a937276f36aec9121de450384cb20bb2e", "008595f6c2880d89198e1b625e65056d0a19a58d1d1c551bcc5dd39d281d726dad4108488c8f941ac983169cace3ecc71b" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "65cf0a5bce70af078af6d5a14545ca619e47d6eb0fd0531ecc743a7685530284a83289c2d09e024384ae5e778799e414"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1fbb37f75195c3f2de3afcc88ad7eb32108144608943face3a890005ff2a3e0b558079c5842620f44adc0c38dd88aac5", "51734f8eb827df929d7317714a29cf8ba432caf689094d00eb9d63cbc908ba76ca5b1f93d229477c960842940f4224d3" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "2e099adfe4d9120596e8a1520399b0e249555b171e0a71967307548a3c28753fa40bbcb0a8658369dc8ca0caa05fb001"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "07fa30c837c8ad029326a1d448bd27521b5d26aad4d8244b7242493df70172e6dd1daf5c7e07f4fa102f5c415a4ec61f", "0904527df877527f7d0f5a7f71b6d9c03f2de1df8804868e7337da35c9b1ffc9bf2e279c3af8a0786e6f39832cc6ed1b" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "5c1335bfc9b2240b2dd142a4073361c492aab62e3c14e32ce60ea9147850ea7f4817796150cb06d3b919419540bf6002"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "61397ae7fe8e7e894bfa689e5813514293a0f1b9f1090c0d9696379b61287a752a3f7d1d2480fe4127498d0eeda84c63", "0c2fadd37ea36bfe532b5d3a0f101ddd3ac59458399648f3efaf5833dec1c8c8ece05515893553ef4d58120d37ce2ecd" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "259160b321c350f4f2299aa77c72a09248927957b6414308bf8c7fb4f2dbba5ca79198f80a150e1ceb5a9845144eee9b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7f166efa8d8416d922f57673a2180cfbb49e8d160d60ba5ec90ba547f3eccd22ce6afd99a0fb292cfd16b0692b9cab03", "418579e67c87b359912f6cb4158bdd7ea130b5007726df2fce319915deedc4f7e89ee23f786e25373c9937498bab81b4" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "881964e1bba9a28c7a1d84379c65bb3da72f3cc879f7f579d2f9b34a574432d6c7d1c229ee227d4ddbdd9f15df9978c0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "77c9c2e658b004ab6840d7c33a5e7eb5f93ba3a7c5b32f7275fd75b07c1c92f5ae31576b9cbca046337e6d6ea76c145e", "67c56010dd9749e2d90b3eb57ef1c4c73741233a32a6a4355b8c4e3a24bcf5986627c7480783161db1d2a5332bd75fef" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "0e3c83bb59abc57220170152251cf010b0081fecca2c957ca7ec1a33dae3ca1d7094b1c0f71b03e008bbe64659119f09"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "64d9a317d5b41af30fdfc7389460f357fa9978304d026b312aa5ca04a19bdc0c56440cfd14a0b060c3b8f4ee8d4a5a37", "77299b2280ab4c857ed2531e8db027f8c7238028bd7f7ba59bc80547d4f10da6f2e613580553406f0427ecbd7b75916e" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "631b97da7f334dafd01e2a01f8618632372d9abcdf14ebaf7213da37b1449c4e8c8a1dfe03384f3ade8907ad94421398"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "264ba447f80d721bf1e79877f27a23ee58565e88c49f6b9cd6448c024b6ff53aebb2b08cec22eb2eb38e30fd54727f01", "00801887f9f94dce625ed1d56350a4b252e0dcfc0984928f25ad22a13135baf996bfa82809fbe79c0979670fddc9fba9e6" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "397e11325b2e2e3790dee4859fdcca85592bc46fd0d580abc5114602b68512f549d9854c9af0db658189dd583f7fc1cb"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "04918040a58dc477a7245561273df2d8bd977e5fd39c40d3011536cb2b9cfee82e2ab5f539e5908dcbf3ff24c645db4e", "5969a9d8df5cdaafe3490caa4946acf5ebe3e93aab28a8d4a6f61e2c8e5c02dc605c75806dddddebe23915631159c1f7" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "0fe08a8a37290ebf519f9f0947580ed87b29ee22c29615a8180eb1cdbbc5899c0728ec9b32a96790248ab302eabd6ffe"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "22e44ebe0a351e4c91f7bdfc0c0c3c6e1c679da84a32539c2dbb41ea31061b0825e3f34d7b0ad525261eb9e457c40819", "6089e33034731ba8e9f95f5a234bf8d3539c8381f4d95510d5e0f145fd48205e5c60218c3f84b189c8e4fd5608b49778" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "5f92937aa52d5dd10fcefb95a2d57b617d6d8b04e8db5b3b5a39abe893fda2aeb2f978108c558aabbad829ce02c27735"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "66ed49779ed6a7b10c812bc7ee7b47a5d11c5ea50277273da140bc1b0cf5b8210a6a737f7e9d92eee6d845137e5c44a2", "008accb8f637385cf6519bfae3ed3ae4d0acaa19a260a01bd8cb53ad24dacab1954b20d1472cf3975e87cc733f329ab6bd" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "59930a2b8bbd79b8051f252a1af76b4a5c6525adf9c6c7910a5ccf798eac0c8d4513923a792a965abe82bb564dac21cb"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3024912041bc989a936fb4dcdd178b15e03a0aa94abafb4465b4a89d4416b7a8b029d47c17e69a25962ff3aefe862dcb", "249ee9252b5713e747a2da8aac2b961ee2b6aca157a44888748648fbcdc5661cd4a169bb92c9c1ce50a79a63735002a1" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "1449901ce4b00f0e3a5ff84cff8c134854b808e504d1b8f027ace9591234e3f62ce70c35a8aa8e60cafe1e0df3ed80e7"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6c9393b00e9a62ce0b83674cdcca59b18d5b34246348e37c1d78898a522d813c49d08efc5f3f7ef33f3dc9dd1bc2e5c2", "0b9410ce04a64cd095ae1194bc1f514c7009a4e06871b557154cf492e7c57749487ecfcd04cb31426ab785ffa95e2f" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "89ae6f8e215bcf35c7e2afed1a6b9855171687d9edbea8af5bf8e9ddc667aac4e166f05097385fa9ea3a6245fc07b4ad"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2c58277aaa61c400d7036183af49c99a97fea5a8d5f8608c4c6ac7a282757e4dc4b6f92d82a10272f2a19696a48fa79f", "5a8adb770740669d6010e55f6625b141be469fe1779f4adfe64eab2e4a9ac5bf1c25b3de0b74b8f9644fc216010d9659" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "3fc16256a0914ce2661a54688af4b2546b1b59b043667da6abb5b1a1e0e2e6ab862fe8bb749f7251572bc160567530a7"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6e5f827e1aa225c4b95db52655f67d654bdc69a4bf8f49c19d1e65dcf12ca511505aa1726ca2f5cdf8ab376f94a0c5bd", "5daec6f35f1dfbc68fba024cc8c5f79ce9baa86adfd8d2ba53a798cdcc9025eb9797d3be207bc694abb338e43778ffdd" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "64c1556c5eef311a4f3ba46316adf73732d6ed47b1ba2ecd178ff89bbc5ddd6c6419f62e045ea2d35c33a250dc2fb925"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7fe852a7612a673df351f05afeafcbb16ce4cadf85681b2b5f46cc31ef33d6b695378e7325e9cb3185d7137b2b170046", "5cbd4c810076d135316887e94b14b4b0108db1c944794c398938d42176c32575b6428b3e37b602211c574acafef0911e" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "3cc98c561aa5f50c8f19d947dc75ac8f507e6985762006e7100982caccb79530f8f935ac9d3d82967cdf129ecf5b0ce5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0a49dc359ed4fef683e462dfe685442cea77b733fd95633216794d9a61f7e1022d942a36e781a484a2b479a643469af4", "512ebd0966b68bfecf7a47021bcd9e6aa2703dcc556a9a443d16195aa145738fa36a4dff3d09481f4a86550a8d1f3545" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "3f2095530f36144e009019eee102b2867d83c9eb4f28bcb31b383e00c8c3746b20cc90e8efc813aefb5b6a4965204c53"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "276715087495d52c4160d15446ebb4d758291bf5bc9ca87b56c3f00adc41fa452d66684152d3e19d2fc3ad5d289787ad", "367385d3c3f5c3c2c6c3166adcfafc3d204453cab8797d56e955fbf1cf421763a6653e40efd9035df8128135546b6261" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "704afc6a72080d1728f6cc9fd023e9d2373023377f02599b6ea9fb2923dd7403fe2fd73999f65316b53f910bda4f6f10"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5943dbd66c79fcb882936eccdd6d860c42e20727a2cdb29165c8426c9d192990b71d9a3c7f240e46acab2741b7ee9c7a", "461e5ab1db3eb9b51b3238d3ada33567d251d8fd0fbaf59aa1cfb40fe7b22e0277f166a32edb81ab6a8580f9b1fb3e39" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "46f09c4741c1afe74e32f6ff14daaf90f4486c33f5d0e978f9af24f5751988e72b374c5faeffdec309330401965f7d20"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5285d72925c87c75b6ad9955064182bf2debcb25c88d0606f6672863de413e549688a4fcfbe6689bb23dba2b757bcda6", "4ef6b01766c95b66ff10496d5deebac4b4bf8c3bb4232c019f80b69d8ab0214ceaf5813027ecec133a5a5b971948822e" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "19930a2b8bbd79b8051f252a1af76b4a5c6525adf9c6c7910a5ccf798eac0c8d4513923a792a965abe82bb564dac21cd"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0786afb03dd791dbfc371ab51ffa288b7cedd90d6a35a3c3a92566f895f38cb18536137e010f1cfba2fbed70568d77b8", "4eec840cca8b6f3f612304b602ffad8dcbae1786b2c2216e9a1e59a6b69628b52a408b6a083d727f3ccd0e706f9aeef8" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "33261457177af3700a3e4a5435eed694b8ca4b5bf38d8f2214b99ef31d58191a8a272474f2552cb57d0576ac9b58439a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "46690db403904228e4f736b1344791596628e85669d4dd01374b21274280b421e42f5ba3f3f2fadad27d4469be7d9bdb", "7e883b43c27217f606e0a5ba6c9df781c145776c0e5a8993f0ed65c6ded65a43bddd0fe7611485e8e8d9e7decdf2d8b5" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "4cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046567"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008be6928acad44c9571b5c4015fa3ffae5e639e4130a1a66b473e5dfdfe93b68a8de89583666d4d699e8885469f9b1a4d", "0083b1d5312310e445ae57c85ab1a3df8dbbb706a598fbc007efb602a14a5952fd7e7df0464d533e062ea211285c2f5c27" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "8b33c708624a1e2eeba00fb5b5a8ed1a1622fc71ed897fb13d87ac253935e8365850d380015c115d12e14a2472860d09"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e85", "6a0f0ed8d7f28f916a4e727e55bf0818dcc84ed1132bd7da9f98ff95fb2aec238f4df9185b0982a6682c06c85e6a895e" ); + { + // point duplication during verification + auto m = "313233343030"_hex; + bn_t sig_r = "8729cbb906f69d8d43f94cb8c4b9572c958272f5c6ff759ba9113f340b9f9aa598837aa37a4311717faf4cf66747a5b4"; + bn_t sig_s = "28a9b8c55eb6f5f1cf5c233aff640f48211cd2b9cf0593e8b9ffff67c7e69703f8a6c5382a36769d3cca57711ab63c65"; + auto r = true; // result = valid - flags: ['PointDuplication'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e85", "22aa0fa9cb45dd96a50efcfffb2739c638672238da287ed97318da83848c25001d85ae11351397cb1f1af94ad29d62f5" ); + { + // duplication bug + auto m = "313233343030"_hex; + bn_t sig_r = "8729cbb906f69d8d43f94cb8c4b9572c958272f5c6ff759ba9113f340b9f9aa598837aa37a4311717faf4cf66747a5b4"; + bn_t sig_s = "28a9b8c55eb6f5f1cf5c233aff640f48211cd2b9cf0593e8b9ffff67c7e69703f8a6c5382a36769d3cca57711ab63c65"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0089dd738efcb0f79811df6bec873485169450ada18e602721e61768be0d81e5d41381f24668276f32bfe31ff1c16bcb6b", "1f7a4d2823bcd73f236d90b6ea61d892026190e14317b5d110526e9e2675f03d5ef3fce87b5827a37e0cf19b4d3988c0" ); + { + // comparison with point at infinity + auto m = "313233343030"_hex; + bn_t sig_r = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + bn_t sig_s = "1c25061a20a4e2a19cac497fa9c7a6c6376fe36862aa77bd6c9e1615bc00d454c30bbe23157ff3d00be80a009500e114"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "795592a673e82dff3d77450194e5308d64f45f11f759f34f7c7b5b7cc6ad73f9bff8f6633cc20378cff2e53fb7a53030", "0085b5cd4621665aac8435d8ce85b26d444508b77b282e91cd5315c701d2e5b66ba4c00bf7e1eb0859a13cc351d00041a1" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "2282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca"; + bn_t sig_s = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "39d94ff8757dcdb67480cbc48e9679423e57de5a23232df0db1e0ff7e908614401e6cd8d615008ea8be51299d9e22de9", "438126d70d14e75ce41ea2f409be88e2806f7f73bd513731696bc59e7a2c1d44d5683d3bdc92baba1c2ada58809f8bef" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca"; + bn_t sig_s = "141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "20b1fc8e2480a973e097337343490b12ae40652e4180dd4ae56df521daa9e391777c0d466f018af55519038dead35501", "7232882bca3ccd6b375591f5b5096538ca5778355307e603148fde31f5acffeb4c6863541ad233de3f281ea0d235b6f3" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca"; + bn_t sig_s = "1c25061a20a4e2a19cac497fa9c7a6c6376fe36862aa77bd6c9e1615bc00d454c30bbe23157ff3d00be80a009500e114"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4a391d79cfa82b943123d69ee2d1bc0e0b7e1e6f93c69123bfce0bd4f31a5e3434062dd0e1aa8b886ceba362c4d6720c", "7a2b0543a156f1934e02d31e81d5d2785a71d541cc7e1e6e6132ebee42111f52a844937260719056ae7b10f751606c41" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca"; + bn_t sig_s = "7094186882938a8672b125fea71e9b18ddbf8da18aa9def5b2785856f00351530c2ef88c55ffcf402fa0280254038451"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "36854adacf83ce5f0e4422406d7b6f7db63d73d4c892a01e975ef6ee6b71a9334c9d57ce6ffcdb1a2e4174ddba799e12", "7d619672035db4fd73e5e4b4ea920b74f2e70fd24ebca49d22fdb11e96b7867fa1838ca5babcd9dd096ab85e2f97b5ae" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca"; + bn_t sig_s = "789eac6ff99e146b7ae25f90d7a0cabf36baf32d14916ee2aceea7cadc95d7221f56e5baee6d82a03307064ba32856e9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00804e6c71e493b783ecd375a4edcf86c77b1c2df551bbc73bed8516e4d11ce51a1dd081e19aa6f51c656818b853962178", "580bd6b2c4eabcf5b3741e6b7d59b0e7f2bddb247f5f9d6751cf09e3c6c9d1f7c27c0bb8d21e77a80ebadaf90af8b0d0" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "2282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca"; + bn_t sig_s = "64dc78d112cd6ed67d4323b302650a606ed41415bd8cfc40ec7438a70ee3d8680420e5f602aed591a324760c58140642"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2c115772dd298612197a1c59df9c25a86ac16fa4f27adf74bcc673bb4a6a4bb5d0b5b64470d5d26e0300922ab7237324", "42f6ec209e27ce0b127d334745272643d3666bff54927419764de52322ee1696e620d15e0eea62fed0f20efe6c91e1e3" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e"; + bn_t sig_s = "2ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "295778c9a3be2b373450f57daf10de66d32441750ac4289f6751ff61405ce0237f64e28ac5281a81d13fba81a8454e58", "4c9f3991d615512faf0dc9107193b1b6f5cd684356ca51504d15c1ca4ba00b21c7c68eb4683222a8211e4ffd56da0e06" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e"; + bn_t sig_s = "141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "65a340bc68f3fcead4f04277ee8675f9c17bc8c88426c5ba0313b8ce7da58d92ca9a0ffa32c7eee195857d860ba1eebe", "4dcd5be3a6778008b36ea19d902d93dd488f6fb65dc0719521553b39cb3c524b12681d2e07a8ef720cdc15011c23ba9d" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e"; + bn_t sig_s = "1c25061a20a4e2a19cac497fa9c7a6c6376fe36862aa77bd6c9e1615bc00d454c30bbe23157ff3d00be80a009500e114"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "54a03902656bfaf4d6a54ff3429d9f9719bb61e6caf000e100992b31700e780e0f73f51614954acdddcaaa8b2311195b", "04ad3b19b01e150a39dc0cfaecc6498b18138ce612c492795687a488522644b3ddf7462c3c359bd091b7d39469571879" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e"; + bn_t sig_s = "7094186882938a8672b125fea71e9b18ddbf8da18aa9def5b2785856f00351530c2ef88c55ffcf402fa0280254038451"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "46d10d749a47a4d3f25b6f28951a11f01a54c2413957a477162dabe0d08d8ae9b6a9f44b68ef341fb820b0c24c7a1c0e", "671ff166cd35d2f3cc821d58fa18e35d25e6033b9e790fce4818f9e570921c0034b381cc9ad254eeaf1b386e511b7c89" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e"; + bn_t sig_s = "789eac6ff99e146b7ae25f90d7a0cabf36baf32d14916ee2aceea7cadc95d7221f56e5baee6d82a03307064ba32856e9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008ae92de10b244ac7f0deb6b102d075951d8c13b2960c2e98d7fb42b8abe90fd07a4a21b86eb4c77efe9adb6725676d17", "36063f3407c71627acaa83be9029c7a40e8aa896cb68a9c2fa2aaa1079035a283181cd3f2723b221d5a8747ad392a0f9" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e"; + bn_t sig_s = "64dc78d112cd6ed67d4323b302650a606ed41415bd8cfc40ec7438a70ee3d8680420e5f602aed591a324760c58140642"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e", "008abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace"; + bn_t sig_s = "141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "1fc115146e521d7ea33f3e128eb01db0f653dc45852c2b50301d639b778b13380e51d9366552cf2049156605d57adffc"; + sig_s = "141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e", "01fb010d823eaa83b2ab83efbb166c8cb27865dfee67fe4f3115d4c98625e7fb9e8d6108188b996044c4fcd20acb993e" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace"; + bn_t sig_s = "141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "1fc115146e521d7ea33f3e128eb01db0f653dc45852c2b50301d639b778b13380e51d9366552cf2049156605d57adffc"; + sig_s = "141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6c9aaba343cb2faf098319cc4d15ea218786f55c8cf0a8b668091170a6422f6c2498945a8164a4b6f27cdd11e800da50", "1be961b37b09804610ce0df40dd8236c75a12d0c8014b163464a4aeba7cb18d20d3222083ec4a941852f24aa3d5d84e3" ); + { + // pseudorandom signature + auto m = ""_hex; + bn_t sig_r = "65fd456814371d60883ffda5f74f36dc2d45886121770e29ed3163754716d12c1cab03a2cb6a6e3376fc96d8727bd1bf"; + bn_t sig_s = "1aa65e57932d05788413219b7ab23e5337f63fb2dcb0f89b4227d284a3fcbdf3c54c021a6c0ca42445bf802213121654"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "4d7367"_hex; + sig_r = "01057e36ad00f79e7c1cfcf4dea301e4e2350644d5eff4d4c7f23cdd2f4f236093ff27e33eb44fd804b2f0daf5c327a4"; + sig_s = "2a9b2b910dd23b994cac12f322828461094c8790481b392569c6674ac2eca74dd74957d94456548546b65bd50558f4a6"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "313233343030"_hex; + sig_r = "6dd9d4e98c9c388240e95c49b2100afbe0d722f8a152651c61d7ef9bf46150e3cdf9bf6330e75e4bf2c294cd66e48d06"; + sig_s = "1282d33b5b79d4eaafa03a77bb8ba2c318291f6ea09d548b7704bb00910856dd360557e609add891c6435d7a80afddfb"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "0000000000000000000000000000000000000000"_hex; + sig_r = "46cb43798bc06dbe788a4f4b2b98130e3aae917f1d2a005656bd70a3288caf7c37d1dee0c9108828a69d2a1eeae113c6"; + sig_s = "8180d0c5ba1bed4f2b0d4d8ed7ea17916b63400397e7b6d70e7312c5ff0f4524a49abf7071c8ba470de64fb668570380"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "462117d2e33a7db1b95c8a6a3c7982f83da96817e749718caee7b6aa9c9da4e8f2ff7951674eed2b569ab846f59002a8", "50e6606a9726a9209c9e945fbf6cbbc9a487c4a4d81c52ac3684c26c3392b9bd24f7184821be06f6448b24a8ffffffff" ); + { + // y-coordinate of the public key has many trailing 1's + auto m = "4d657373616765"_hex; + bn_t sig_r = "43a3ac2f3d2b4d3723a97930b023ee73010a7cf8d2a99372f3132bd7d9c83574de3ab86525efc4ee2c59799d5ff7efb4"; + bn_t sig_s = "34f59a3ea9f5267f8458afdaa3873e2336e0ab8a40ca1b797cbd977d192f2024f9eb8d39b37b9a238f208d66bacd27bf"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "3531ada25b8d9af9b87e5224cd6a6d956c17dc323ef8980f497a6e7e44c83d69b74de791d62bceacaff7378863dd725b"; + sig_s = "459d15539399409380af99d560c561217daa5c539729453067dd1aa4bd9df2b534920f0d6213261ecea16f0ed68536b1"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "438a0cff9fcfcf587f8c40775ad44ea4b0ed69f2d547befe295d1fb9c24ddcb97f228027df552a06bf657b4c20272615"; + sig_s = "5e157630bb744fc8e7f75901de498e5af0b5511dfeee0c4c1f2e5c4aa0129de57b87a2a13ea59d187d51cbeb6ef22407"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008cb91e81ee5901b71a59a4f7c8174ae05fe3ba00f699dcbc3c9233265c640587b3c165593c2d76b5ffc4b8dcbcb0e655", "3a0e5d14f2d0e8efe2bd8aa260d8ace06bf964c51bab8207070a2d30410bb6b87aeecb7fff802f2d4ea3caf6e0e7e726" ); + { + // x-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "16496c08c3076773fcd841a5e25e1a87108e0ba90f9727f539034bd2cf688e01a955686a15112e0590fc91e3995ff5f8"; + bn_t sig_s = "31b1b7338f74adba33712a83a7c685e7cd5f3be84ef951ecad50facb7c6ec393a3bac52ea7b1212bd92f4f45a9f8514c"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "87f3090292e79b722cde5aedafa4244f6eb460a280e2e050399b9d802391ad502108704a3c0bb9f9ae571c3f7dec6c0b"; + sig_s = "89ae0043de38a585a1632c7211b78303afa3f8936154a6e65a6f729c3b1ec66a1775aa465af8eed6dfeaa5ba98cedb41"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "720822abefa91265a7b8d446ec3bc405fd192178aa1b85dd663396a896a32c119e64b1a20843f81edd43c03709b8dbc6"; + sig_s = "206ae95bb18d2d3844a39340872edba1611e3ea0e84cea7cb6cff282af414d8b5aa0be8aabc1b51b7121d426916b01b5"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "69ebf332e1eb2455324a7572a17977a4e2955108ee8bd81bd6d1f555d608687f5bbb39858ebee304985baa7d09c830bb", "672b9c96684dfc007f015e39cdada9fe16db5022bfd173348caafc528684621f97fba24f2c30e3dc728772e800000000" ); + { + // y-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "1e5027fcc630aa08750a4725919dd9072422a21aca9d3326bec3e6ac040ba9784951b1fda6f588e60dcb550b75793a4e"; + bn_t sig_s = "0df3224641f6804f4d1bf951051e087ce1fa7365c43bd27878626833f09190cc0a7fa29b16bc2ca0d34fd0660d24718f"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "4e61e34740a9f6db0854faf205719a3d98ef644b86241b858fa22959c04395578bef7be35036ae7a9ffeb9a2173311f4"; + sig_s = "1e967c3b6071d37560fd64a4fe0921b1d600f60d883fdec816836176c5e67ad05182aa080c7e2184c0710050d523f0e2"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "2c3090c581e575da58a8f659f74c5eee566400eb1d91de0a950e787542e6572f73b9f6d4f81f1c8e42f9e460dac3c1dc"; + sig_s = "756b1b693e7fe06686708c2a609854accd21e3195d84b72c11c873908d175dfc00c00ebbdf8e2bb6970f2f19785303cc"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4fb5688666673f104287428b5bae6bd82a5c69b523762aa739b24594a9a81297318df613f6b7379af47979ae7fffffff", "7e2d325b41fe831a23cb694cb80a30119c196143536ee334416ba437a419054c180a945154596b83d7f7c3a6b6059645" ); + { + // x-coordinate of the public key has many trailing 1's + auto m = "4d657373616765"_hex; + bn_t sig_r = "092f0ee1feeb79c054ae36235f8717e9ee72b466b1704d4fa78addfcd13518a64db2b2fdb06439acbc4c045fb2c23c3a"; + bn_t sig_s = "2371ca6d36f4266162ee5c657c71cea35dcec3632c5b220a6f23ace1ba6562a841aeeeefe87a7998adfaf185b8558e4a"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "6c8f4be641afaf5bf91ce08974d284ece6aec74792247229fa86c6597eed3fb507b712bb77af0226e1bbb3bad632b0d8"; + sig_s = "775954fe8bf936157b7ab7a683f6dc1838a8718200621bc8bf2f32b778f6c8e8c656532b50de39ac22d22b37dccfd1f9"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "76e5c07582177400df453114fed746f40704197897b4ca21b72e5b44d4ca40cfcaa55e4446355c91ea9767f38c8172df"; + sig_s = "0c6dd73eefbb4c06e823224d8efaa3ee934e4a97eed2833513b4d735ed06eb550b2a5fa7f86613d627d9db466afa6646"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "34770c73a7e42ce7a57d1de6e54f35f1752047f6513584c7b14bca17d7abc499f8ab037c70fd2e13a8b97b2ae2636886", "22421615ba363f1ffe9a8f2fe0f6e246fda11462a3ec000c685e09a90dbcdc2af6467f9ee69b5e7bead9b8461f4a4be0" ); + { + // x-coordinate of the public key is large on brainpoolP384t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "0e44fdc33aed0c320e371e2a78e9f18fde83434e681afb05a5bdb0f43cac70e83ede56bf8c56acf70e054e2ffef549cf"; + bn_t sig_s = "1324b4cfe684d401eac15b0940f5835436d3a1028e27c1966dbf69fefef82748a05b4443c77c870789135755d0d184cf"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "5966acd8a7714f2015e36fd4fdb3452258ce0aaefb3972091b496bd530bbaf1ec67d7e37e50031b3eea44a8bb8f62c20"; + sig_s = "2a5f309d2fad55b93a7a3012cbda2845efaa4ea0d187d3824f4a6a9227730d3ab15246d8d0952c7ee8c0b9eb83d1c2a2"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "266eace657e1ec88a2adbb38a5afb4f750274ca614d1fde9ea39dff6f2a2aa69923e9a7489f06bf9d84c518cee57e55b"; + sig_s = "3d19027684ef221216f63a591d8e793524e4c1234a56ce415bb9ad9e2ebf25ac94a99261b9157d19daa5aa876291f308"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0086f0fc89b7861ec3bd582161aecfc95789ae402459eb7f3015b7dd24e20fc9b005c635fc290a0e2a9ff35863b7b82e3e", "01ebba489e923dad88146077914e3ae5c575e1bececec710962a18ffd91005776c4d9e4bd952c793587a70291ce478b4" ); + { + // x-coordinate of the public key is small on brainpoolP384t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "13de6eb532321c023092aa78c199f9ee4dce7a18df158c3e799461af9d96c2d38765a78fdb14404d199365de05bd44c5"; + bn_t sig_s = "2514a0359bcb66122bf48c186a4bb2edccf305b06414b11f470d2512cadda129366f6072de715bc2babb8a3a5f260d9b"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "1308d3d9edfe3ad07e215a975b2b067e9f0b803371b3029f4388a3471f4db23f358aea5c03db62d77115c56c4962633b"; + sig_s = "4b8b1fe44b32cc669114a1ce0ba0555446d0c96a32cb602185e8fba414d3a831cbf5b519b0f90647dc45e30a1f23ef90"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "5da3df094155b8f8812d0c6345344e41c3b591b65b95fedbbcbd3c3a3bb1c1dbfc4d4c5b841b8f8874d59b07cf2288fc"; + sig_s = "4a1e4a8399abbdf246929b2559bb0fa404772755fc74523626aeef432fe4764df1e1f5c9b0f897ed8f1ffd7a88167f0e"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "082f7dceb585c5ba4894b0faf6604da888a311ad9f41731a1d3937168a10b0795a1fae496cb9a90739e1c0a6e531e807", "2c3b8568eaa1c6f541a665ce7a66f78ea2d5893103e6028add62356492d8b5ac6ab8901d59621c33416c33981bd594ec" ); + { + // x-coordinate of the public key has many trailing 0's on brainpoolP384t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "0bf6fec0a5be27cddb0e7669ae06d15dfa75837f8ee72b47443ac845ffcd427b0893e10c85c20c7aa576fb70e87761ab"; + bn_t sig_s = "7418b6f374936adca8b07dc51545ee34ed2e9f56f3267033e30ea09a0acd31b6ce83503ee7e098627f8ba8b4c584341e"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "03e306a86f6b2cb248fcb68d1d317a6042b7089e96d74c2f5b934e2e122831268a45e2185b7c21270e8b906cd372e6d7"; + sig_s = "4c82ab6de6bc0194ac1a2e3480a0c80466af7d2a329d20b03151d1806a0bc0720f55d3781a7db9febe7d8bbd0a719bfa"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "14d1df9b3db55ecc8d1e126625bdf5b6316bba1e7f4ea5ec77418c754a597563dc5dc291b7dd047782d518fe74e0be83"; + sig_s = "33ef701c440f280edf81a9632dde9dc17de5f438dcc19e9ca5919b4b73e62905e5f7e0bc9db0b14bc53327f79f70c6da"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6afe4ea7705492bda308b789d70da49457dde825d5258960a7a366e4665af9d326392c2672165ea4bbdc33374d88e749", "008475e6937a10a6f6a50f23de9126ba04e5650a1cd06a8066ca423339fc2ce53d91482744a4cdf2f937f76f12aae3f630" ); + { + // y-coordinate of the public key has many trailing 1's on brainpoolP384t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "6a3a18400686635ae279c385b640d4fa080d9c44a5d421fe4be5a5ec7a8ae31b00bfa406e919e57e39c11360e670d869"; + bn_t sig_s = "729c0b9ff77f88f810548d6db1835312a448114a3bd93cf59422faa2ea026f5d47627f0c11fb859112246d879c859568"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "1ab8d6c31d4577f59ca5714c9eada979fdb9ec0cad32d8cb915dbd70492947187f5a52718e19982f7a2d4cb48b227723"; + sig_s = "872e3ce7d1fd5ae180faf1990b11937558aa44ccdab631492b8925be84fbcb452148edad5bbfe48c06b8c9908ca252fd"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "803ffc58f8150a9c4c229a7b522357f49f9a5f48f82d8bb982954395836e09eb5f8cf1f345ce284674bc369d046d5c8a"; + sig_s = "8a9feb64c410cf3ae6261ad35f7e3e8da13129daf94944f8e08e9649cd006622c3d5c91ec5b9798a1be3a31533a0a851"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4bc65262c22d322ea89146ccb5c60c4287b65a35228743a5b9dcd15493bd8642478987c421637dd0715079ec90fb8cd4", "7a45557ef653d0773dbe2630f8e000629ed8293e1aa4a96f3b159a245aa35ad92a1019c7e09a9ab75ba43c0786928237" ); + { + // y-coordinate of the public key has many trailing 0's on brainpoolP384t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "2ed569f12dbe30a2abf02190bb9e4de7e218e9fd705dc71cbe1480022781b2a2213c3ef2f91052e90840a18f74e375ae"; + bn_t sig_s = "8872b566f387c2bcb639df9c2d866f7631df290c5f66c264d4949e256383b1b4b2098c120f13449d9d7bff6891919c88"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "4b7e5651b035959295092e2efe548da52206c8d0e48ba43e2b8ecd98ece25dc08955b6e7b05e38c4e22829d1658711b5"; + sig_s = "44a973b75528400cef3f63f55f2154d48bb0b826214200d3f33c7bc31155242d4e24f07ed19606fdb2c8ecaeb6981eb7"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "1ecadaceaa479fa4e9aabac4210b1ab77fc1d13a9c4cb022826bb1806575115834a6ecb9dec3e668b8c91d4aca283dc9"; + sig_s = "2de8965a66d56545ad84fdaee16fffa0eb31022186a5b6be2a2475958b9ad72f483ebd4b255748a811806bcd428acfd7"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2ac393f20c110e3f97065304397eae0e23187b2b6163dc66083e82aff568426843056aff8dc23eebce297f747830e217", "34c935671391c6efa8b46c5c37b3f84a82e429a7580feb9a1383b55c83a9398e8ecc7b15d699e63962329102a1576f2b" ); + { + // y-coordinate of the public key has many trailing 0's on brainpoolP384t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "37e256872340da9dc884fd00daa14628372b4bedc0a8a09f9d7513521d3b803a78dc0edbab3c7dc2b2014baf7a9d210e"; + bn_t sig_s = "1ba4b4087973070cca9b957650177eeb41c557731596a966b0b7f68717d8e7b554afd07c2937c95403a90c3a05fa964b"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "00128c199dc27677f23feae28a9b28813cbc3b02fca493005a67c3126a705c49b982cb5817ee2c81161e80b738bbb512"; + sig_s = "73cb6d4547771d254be74348955bee979071358aa3afd62a5838179a0965465aec79bd6cbd9b8b2aa2c79bb88ab21592"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's on brainpoolP384t1 + m = "4d657373616765"_hex; + sig_r = "818b0fd6ca0978a59cad3fa15e84db2896f39b2aa462f0583834fa4444d153fe61e0c93071ba96c5ffa7193f77b806f3"; + sig_s = "1d2d6144172385f857db4b7e7e863962eacacdec034b4b4a9dd1af272604403f39f45a21948b30976e738e9e98fd9cee"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } // End of Google's Wycheproof tests ecdsa_brainpoolP384r1_sha384_p1363_test + } + EOSIO_TEST_END // ecdsa_brainpoolP384r1_test +} diff --git a/tests/include/ack/tests/ecdsa_brainpoolP512r1_test.hpp b/tests/include/ack/tests/ecdsa_brainpoolP512r1_test.hpp new file mode 100644 index 0000000..c2301ab --- /dev/null +++ b/tests/include/ack/tests/ecdsa_brainpoolP512r1_test.hpp @@ -0,0 +1,6094 @@ +// Copyright © 2023 ZeroPass +// Author: Crt Vavros +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace ack::tests { + EOSIO_TEST_BEGIN(ecdsa_brainpoolP512r1_test) + { + using namespace ec_curve; + using bn_t = ec_fixed_bigint<512>; + constexpr auto& curve = brainpoolP512r1; + + // Verify that the curve parameters are correct + REQUIRE_EQUAL( brainpoolP512r1.p , "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3" ) + REQUIRE_EQUAL( brainpoolP512r1.a , "7830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca" ) + REQUIRE_EQUAL( brainpoolP512r1.b , "3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f723" ) + REQUIRE_EQUAL( brainpoolP512r1.g.x, "81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822" ) + REQUIRE_EQUAL( brainpoolP512r1.g.y, "7dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892" ) + REQUIRE_EQUAL( brainpoolP512r1.n , "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069" ) + REQUIRE_EQUAL( brainpoolP512r1.h , 1 ) + REQUIRE_EQUAL( brainpoolP512r1.verify(), true ) + + // Test vectors from Google's Wycheproof RSA signature verification tests. + // Generated from: 'ecdsa_brainpoolP512r1_sha3_512_test.json' + // URL: 'https://raw.githubusercontent.com/google/wycheproof/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_brainpoolP512r1_sha3_512_test.json' + // Note: + // Test vectors with flag(s) 'BER', 'BerEncodedSignature', 'SignatureSize', 'MissingZero', 'InvalidEncoding' were not included. + // All test(s) with BER/DER decoding related errors were not included because they're not part of this test scope. + // + // Algorithm: ECDSA + // GeneratorVersion: 0.9rc5 + // Header: Test vectors of type EcdsaVerify are meant for the verification of ASN encoded ECDSA signatures. + // Notes: ArithmeticError - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.', 'cves': ['CVE-2017-18146']} + // BerEncodedSignature - {'bugType': 'BER_ENCODING', 'description': 'ECDSA signatures are usually DER encoded. This signature contains valid values for r and s, but it uses alternative BER encoding.', 'effect': 'Accepting alternative BER encodings may be benign in some cases, or be an issue if protocol requires signature malleability.', 'cves': ['CVE-2020-14966', 'CVE-2020-13822', 'CVE-2019-14859', 'CVE-2016-1000342']} + // EdgeCasePublicKey - {'bugType': 'EDGE_CASE', 'description': 'The test vector uses a special case public key. '} + // EdgeCaseShamirMultiplication - {'bugType': 'EDGE_CASE', 'description': "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used."} + // GroupIsomorphism - {'bugType': 'EDGE_CASE', 'description': 'Some EC groups have isomorphic groups that allow an efficient implementation. This is a test vector that contains values that are edge cases on an isomorphic group.'} + // IntegerOverflow - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidEncoding - {'bugType': 'CAN_OF_WORMS', 'description': 'ECDSA signatures are encoded using ASN.1. This test vector contains an incorrectly encoded signature. The test vector itself was generated from a valid signature by modifying its encoding.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449', 'CVE-2021-43572', 'CVE-2022-24884']} + // InvalidTypesInSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains invalid types. Dynamic typed languages sometime coerce such values of different types into integers. If an implementation is careless and has additional bugs, such as not checking integer boundaries then it may be possible that such signatures are accepted.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449']} + // MissingZero - {'bugType': 'LEGACY', 'description': 'Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.', 'effect': 'While signatures are more malleable if such signatures are accepted, this typically leads to no vulnerability, since a badly encoded signature can be reencoded correctly.'} + // ModifiedInteger - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModifiedSignature - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an invalid signature that was generated from a valid signature by modifying it.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModularInverse - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where computing the modular inverse of s hits an edge case.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['CVE-2019-0865']} + // PointDuplication - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.', 'cves': ['2020-12607', 'CVE-2015-2730']} + // RangeCheck - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // SmallRandS - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['2020-13895']} + // SpecialCaseHash - {'bugType': 'EDGE_CASE', 'description': 'The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits.'} + // ValidSignature - {'bugType': 'BASIC', 'description': 'The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported.'} + { + auto pubkey = curve.make_point( "1ec7fe2275860c3bc0e4e6e459af7e16985d37adba7351ac357a7c397e07522ea41bcca8e89777fe05b8f0d9dc8c614004fcaf30a97001a5011a159f46fcd544", "3cbc1ddfc7ac89a1a2f8eef77bf9bba8ade73da2100cb6a371546b495fb5ea885eb631645e79591db659c49266d263d5cbd3403081cb407536efe9a5bec69955" ); + { + // pseudorandom signature + auto m = ""_hex; + bn_t sig_r = "8a7e0a277d49c29d3ed8b0dffbff6fb07644f71005a992bed255b2b5a5c10fd931f3b379cd644427a1c3311d863298b75c7cf5413e8ed8ddf11fc74be0b7e0ce"; + bn_t sig_s = "78c5950ad2b4b1b976a643cfc610dcab6bb148c473d4c186904ff30a1da1c68f6f83f6c1db5f7adcdefc1c8de931790779e236f2a504dc8b0b7c6ca4cb163f5c"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "4d7367"_hex; + sig_r = "78fafe72fd0aae1256bb241dcaacf711dfea2db4af56624a8fd950c9840b9b71e1da89683fbcc9950c5d65187657042e5f17d1036f1fa09163b4e05b7ed14b69"; + sig_s = "7175605f805b318aff1abeb65bdf142ed6fdf268193e4adcadbeb14b7901f5fec28cf19bd8eda341b925b80a73e672b53a209aa5be25fb54596e51df2bda9b85"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "313233343030"_hex; + sig_r = "5835eb9c4604e9e8be394ae80ef31a7d4dac25e50e4a196dbc3188e8deac1bb45edafa8b45bead7c0bc21eca91d20a81ea42dd64b9d9bf2c844038bb75f80b51"; + sig_s = "2d480826582a8164646a2bb13408e43bacba3f42cc3351e84a5e572d03e15bf3cdac5e263c495209e420322c7e4e6a2814921dda253d159c4e934cf0e913b92f"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "0000000000000000000000000000000000000000"_hex; + sig_r = "6a73585ada17fe93656e111943a67b2985faf878f82e03b4a67792cf3b320c34c1e0dd53059b5a3b3888ed301df0ac7df87c0c15c8fd73bbf11b78a924995963"; + sig_s = "319f5670210637a0831f4279571b41b5c5edc8cbf1b6edbd44e6e7d21353694bfa64ba12657a2b03267c403b40d4b27b03e46092614416127d44bae133c78417"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "67cea1bedf84cbdcba69a05bb2ce3a2d1c9d911d236c480929a16ad697b45a6ca127079fe8d7868671e28ef33bdf9319e2e51c84b190ac5c91b51baf0a980ba5", "00a7e79006194b5378f65cbe625ef2c47c64e56040d873b995b5b1ebaa4a6ce971da164391ff619af3bcfc71c5e1ad27ee0e859c2943e2de8ef7c43d3c976e9b" ); + { + // signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "4ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e71"; + bn_t sig_s = "115b34f6baf38a5d856de4f6d07add826a4897aaaecb149a1d2226aa7c5e1d98e32adcd58d2fad01ba45a2d4c293b1432011b7aba4af043ff7243cd24461e4ff"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // valid + m = "313233343030"_hex; + sig_r = "4ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e71"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending 0's to r + m = "313233343030"_hex; + sig_r = "4ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e710000"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending null value to r + m = "313233343030"_hex; + sig_r = "4ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e710500"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying first byte of r + m = "313233343030"_hex; + sig_r = "4fdcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e71"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying last byte of r + m = "313233343030"_hex; + sig_r = "4ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1ef1"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated r + m = "313233343030"_hex; + sig_r = "4ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated r + m = "313233343030"_hex; + sig_r = "dcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e71"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // leading ff in r + m = "313233343030"_hex; + sig_r = "ff4ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e71"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replacing r with zero + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending 0's to s + m = "313233343030"_hex; + sig_r = "4ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e71"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a0000"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending null value to s + m = "313233343030"_hex; + sig_r = "4ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e71"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a0500"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying first byte of s + m = "313233343030"_hex; + sig_r = "4ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e71"; + sig_s = "02998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying last byte of s + m = "313233343030"_hex; + sig_r = "4ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e71"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471bea"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated s + m = "313233343030"_hex; + sig_r = "4ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e71"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // leading ff in s + m = "313233343030"_hex; + sig_r = "4ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e71"; + sig_s = "ff00998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replacing s with zero + m = "313233343030"_hex; + sig_r = "4ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e71"; + sig_s = "00"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + n + m = "313233343030"_hex; + sig_r = "f8ba5decee6d4e9119afc13d014c31c9bc79bb449e6ac997c7170fee6c67033131050b0903e5b53a413b1d16eeab9fd2f7732a835a75470bc76bf2d63b271eda"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r - n + m = "313233343030"_hex; + sig_r = "a2ff227b3699c57a9a05f3e099b839ba26189fdd36d7257a1a4fd6598c00f250868852866a936907be2e5ae3ef537f44bc0f838149b991505c5cc5d101d51e08"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 256 * n + m = "313233343030"_hex; + sig_r = "ab2b7a790ffc481545aec188c2977e3d8d21d6e144b473065f54503d942f3c6b161a22f0146062a8628615d57d1b0fd6a98b94d80aaff249e3997adef0477e8771"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by -r + m = "313233343030"_hex; + sig_r = "b2233fcbed7c75fa26252571327dca3e0eb6d26f155f08770f4c8cdc03cc053f2439513848c370df004b440291007074263ea8fdade893d1ee1ba3ac6181e18f"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by n - r + m = "313233343030"_hex; + sig_r = "5d00dd84c9663a8565fa0c1f6647c645d9e76022c928da85e5b029a673ff0daf7977ad79956c96f841d1a51c10ac80bb43f07c7eb6466eafa3a33a2efe2ae1f8"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by -n - r + m = "313233343030"_hex; + sig_r = "ff0745a2131192b16ee6503ec2feb3ce36438644bb6195366838e8f0119398fccecefaf4f6fc1a4ac5bec4e2e91154602d088cd57ca58ab8f438940d29c4d8e126"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**512 + m = "313233343030"_hex; + sig_r = "014ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e71"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**576 + m = "313233343030"_hex; + sig_r = "0100000000000000004ddcc03412838a05d9dada8ecd8235c1f1492d90eaa0f788f0b37323fc33fac0dbc6aec7b73c8f20ffb4bbfd6eff8f8bd9c1570252176c2e11e45c539e7e1e71"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + n + m = "313233343030"_hex; + sig_r = "014460067afcdffeb8fa3be86597191a8d2c1883bcb8c88f838fa512ea6407f347c751dbad0c229f30c8c71f5e3cc46f4b1b51ef566c0cb17b73eaf032f4f01bd3"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s - n + m = "313233343030"_hex; + sig_r = "eea4cb09450c75a27a921b092f85227d95b768555134eb65e2ddd95583a1e2671cd5232a72d052fe45ba5d2b3d6c4ebcdfee48545b50fbc008dbc32dbb9e1b01"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 256 * n + m = "313233343030"_hex; + sig_r = "ab7720219e0abac56d8f4dafeb2d4b26509175a9bcced0cc4b1cde409026dd5b2cb06fc0b8689f92590da1d7c46928a621af739cddc189b45345f9dc4d0147846a"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by -s + m = "313233343030"_hex; + sig_r = "ff667d973ddf09c5d24598fe489cb0e17a9f1809f6fb01428b46be89e00c2b15288dec8094408686e878bf41bb42e7a0fc025fe42a9c512962419ca64fa7b8e496"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by -n - s + m = "313233343030"_hex; + sig_r = "febb9ff9850320014705c4179a68e6e572d3e77c434737707c705aed159bf80cb838ae2452f3dd60cf3738e0a1c33b90b4e4ae10a993f34e848c150fcd0b0fe42d"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**512 + m = "313233343030"_hex; + sig_r = "01998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s - 2**512 + m = "313233343030"_hex; + sig_r = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**576 + m = "313233343030"_hex; + sig_r = "010000000000000000998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + sig_s = "998268c220f63a2dba6701b7634f1e8560e7f60904febd74b941761ff3d4ead772137f6bbf7979178740be44bd185f03fda01bd563aed69dbe6359b058471b6a"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=0 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=-1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n - 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=0 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=-1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=0 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=-1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=p + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=0 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=-1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n - 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=0 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=-1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=0 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=-1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=0 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=-1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n - 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=0 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=-1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Edge case for Shamir multiplication + m = "3336363736"_hex; + sig_r = "7da11e5b4bb7932135cd91accef8892c4286654a7be7c9d384b600d97900ee12a23ff1f9ae9a4fe74cca185d0dc9f59dc24be03d0223d8feb55b6dde1777475f"; + sig_s = "75905ab5d58481f78409cc2e058da26a26ce6cf4fa2725023d7aa59b8393e16c08564035599c47c3c295da467d41c5a242f0a477101ed6bcc672426eef5f2dcc"; + r = true; // result = valid - flags: ['EdgeCaseShamirMultiplication'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373239373236343137"_hex; + sig_r = "6543c55475e7f31a48bc85307455f6eb4d719eb22555ee49c508e95542fff9b7fc7e90be7e4981560bdae23079cdc53a50ca8dfcb77f119fcbae0c8fafd701c8"; + sig_s = "19b4c639be53122f727d61d4c452785a9846e979f8bf59e2038edec19de06443cee4d4152b49ba9fc84d75d3724d134e6b72702b78bc97a3831fdb92642c4d9c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343331343737363137"_hex; + sig_r = "7bf49763f31715ccc377c07dc202a48027871f25e40b09523b7fe459e34c9d7c7763f34f5a81cf9f700c3fd99e84d491a96b78431f848313081da94b02979862"; + sig_s = "8d7b2af106d7dbc5e7cb6d15e64b5073dea52d7985051b532331553b1942908b9db61d95302be7b5aab5f13f0ef41821f0df0fdb2d0d5a425a88f95acc2f0005"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363033343338303333"_hex; + sig_r = "9b822634932ea6d8cadc0bb3cf7155f16d89d1fd27877a54ec8e8880ef9abcf058f46bb3f90b05db2434c804eeb517cf321d45964477b6a5555e877432317bca"; + sig_s = "4c5a0ed6cdbad6205e1a0d5d2be9b43e8ab046621e409ed5ffd0cf0f0d49b4c0459b47eca8ed184f1e30f2684ed8fc3d192f02ce7beffb5930db73b9beae2968"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383239363231343535"_hex; + sig_r = "38f372799a30218935dffc38082f4c9ba081ff688c6f46a1690e8ddcd8c311766862d01b75b959af2d6af8d361e26ecc3862c930eb896e358a6101349327de23"; + sig_s = "7d8b5462ddbd2f73980784452875b7d8726904bfcb88e94feb5088feb820d197dd9ca4cb7b392dfa2f46c8322e11de947af5a64072c766cc601891eec16279e2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333131383231373336"_hex; + sig_r = "220f24ef6699612c80ebd8ec8c5cce625bc43d72ed42f7cfbc78ec033dc549e02b780d503ba6426cf1914cd3152c62b71dae1e59615657dc9aad30bd4efdc7a9"; + sig_s = "706834778448f4dc11a1bacfbd4834b4f6d15ab343963d2bb9e5a12b44214957f453f76535e9a0ff9f010a8fb9944b9d9e1ea8bd0b104b2bdecc14960e4e751c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131373730373734313735"_hex; + sig_r = "4cc3d9fcc06dce19ab12a665eba4e42f09cbefb44e3e87ce73f14986f48e5b9e25773edb4c1e62421f3f4cb437bcde279c247deca659848a26a27700a55f3333"; + sig_s = "75344c9295cf201478f1a45ab81a2ed420b3b829872146d6edab62b61bba2a97c10af4e1b54060d26991960f96ed7e6181c51286034372ea0c88ecbae05bc1cd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353938353135353635"_hex; + sig_r = "4925729610c57144b2d29743df20bfa6f67213f8c22907784d5d127fce0ec07ccf7703498b9ab9d84fac4a99683ec40e6168fc278718bf7437a749382299d83b"; + sig_s = "4b82b497aaedc2d4d7eb34b55928e72d647d93aff27ffee54a029fada7ec18921b9f4d6b7a7317bbe4f1c5fbae8c9445a807971a65dc6bc46b5a27406ddb84cf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383831313031363138"_hex; + sig_r = "09f2dfa97a2c7e3d4ebd3e629cde0f870a3cda0153acb5ab582fc0b8db564c5a9c988eda930b579efcfe4860a1e51e9d471438907dc0f831e8c90884951d580e"; + sig_s = "3ec46f6253ab31e4c5019a0d88a751a4fcc4131e8e24602bc2b712aaca9710048fed4b5ad59c0e74e421fa7e823c597572cb2165c689a22235532fab5627a1ae"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303034373833333332"_hex; + sig_r = "81586e05220f72bfa37681dee7d6bc0945cbae37f54be6cd0a8c479430ba6bd01ac8b92f0cbcfc715b3374d41b3da6c117f5add7b0ca1db122e7a51620239bb0"; + sig_s = "4da1fcec8de0eb6c5aa30975f2f801710648b959112ba473818461d8ee985f631a82b31eef200c3cecbd3750edda2cca49e76f2fd500927b3185e3497d47966a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39353030323437373837"_hex; + sig_r = "a840d04b304d8831907720eba1ce85376910ed6235b42493234e17db24a184feee5cd7175d7c94403ee0f074b87e1460d3befe56f91869221f12a2f05e7f57a4"; + sig_s = "55e69e441567148b84701b542682b53ab8f8f80624609b80191bd9aa2643723d7c793fabe946374d7992d1464e6b9483b36bc9035e0a1be1309e6daa69a671cf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323039353030303630"_hex; + sig_r = "a7b7feea03567fef7afa42fdc19124119344d4e4a5e7b6efcddc28818ef018846697d096269f45231a604b516c1bdf684ed9d98fe2535d4cf8ca6687a8b9c1cf"; + sig_s = "4784ac38fa0e83aef1679389c0b65a55f0622c9ee4666e3f09d9b631ffe8f4b97b9bdb41ffb9f78490f509471cc059fce86ce401804d771d363d680df20d2286"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38313933373839323237"_hex; + sig_r = "9b16f1e8f609a4f60d184e0f2a4350c56e16d73cafc88871e34f5dac404e4e5d80bcb47df9e5aad8fa08d9a55bcabd02d725d5caecf3d907879f76ea7daa7667"; + sig_s = "160afdddbcc76cf7f9dd76ad230c5f6390c7c0144c952f4184b70ea0cd027e5b2a6c2e1ca50da87c2662bd79b7e9bc23640ae306f8eb748341be9794cc58dfb1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33363530363033323938"_hex; + sig_r = "1bcf663b9737d2677f618975a64934e999d600cdffcdce9c08d0b5603fe2c3eeae7368d12db3435377dde41b82e158f06f73e73848dc51d1583b0667304048c7"; + sig_s = "667c384af3eb1f704af8607bd6f76f964b076415cd855c43a94ac68db309140c50caf0790f1935fb1129ed3c89af8fb6bccd8b25f23aac21c7cf9ee3c607cef6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3136333833393533353233"_hex; + sig_r = "181b0500c4bdf3fcaec57c12c81dae84e9765ec3fab2de4c7b27c9b97cba19469b32251ddb39efb0cbbf5606a7efc866046153b791830bfaeab56f3b980aba67"; + sig_s = "81fd9814c445a6c5c76fc3c614b7665b438c7c07be299b80341ec07d9ecd22d2c2952e99dad009cfa543a3be40618f5f58afcbebed70d9db245baa92697f82a8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303931373638323035"_hex; + sig_r = "41c1fb7c47ff901a328e4e934c8a023a943d37942b6ab22198e9d8aac628f1be0d487bdc267ad9c25b1a42734b994614245722671fd5333e8c34338303348e19"; + sig_s = "31dd3d9f1715c3b63ca351b03be2b83ad66bdcd0ef85fae15953c9e9c85c1a8124b2708245b9b7496d9f2599ab808790b0b63ace37f7839e12fcc278d604eac7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39333634373032383235"_hex; + sig_r = "82c6e55736b3670faef789b491a48f493b081ef655987c3994624e666a898f5bfe2160d0da808b83f465c05e7abb4f2ee6e43e6e935faabce2edb620ad593ea5"; + sig_s = "4cb6d243bb3f745e2988caca2b3599dd63f8e7c270435ccd34895e332a858e105bdc5e23e679769143ff5dec5f83a7e51800892ced4445fc1f94568f28b055f0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393236383638373931"_hex; + sig_r = "257dad15a1ca0bbc3957b7c13681a977b5d42c84284321252cd30d480613add5e0e6f28efdb6cca0739f7ced876fa00f82359e339b587119ad8425c16f3ea765"; + sig_s = "5900832bc693c37aaf384da29acc2b7e4e2094517855b3bba50837440028afe42956988be59e7730c5155d737610ba42b9cea876b3c4baaa56072181a43b2a46"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35313738313334383231"_hex; + sig_r = "67730a1a6b716e027c69e3e100a63569467597a9602677c72e4c55531ff8e828bdc544b5fe6b4340ad5dc3e7033de6fd3aefaeae3ccea69c2342d7b34965d8dd"; + sig_s = "106dcb0599858bd2fcd09f501cc00a56df993ba4616e1639cf6b53d752ed2fd3e3125ee8731d8c08eeae32c3765078833576e181d25ac6bdb4965cccc115674c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34373335303130373531"_hex; + sig_r = "a9bc80413ad79361ce8c145ca7484c6a66c5ce5071002df9fc77efcea6c764b90e667f81fd271237fe87d9fa714ae4160a72a162eca02a746a539f2fa47c1caf"; + sig_s = "36ea750ce482aa21602322075803cb8c50ecfb87819ee971f53d56ef076404a1fb5738f2cc55af9a90f433efd011fdd6e9f3bf122914237a3dba9770a93ab98b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3134333533393131363839"_hex; + sig_r = "03892fdcaea7181c73950648ded96fd7c14f1ace1f2fc91ced15ca2f3b190c3b3a650478cf55097d6ba0bbfadb580fa17095eec914065f30e4eeba7d76364575"; + sig_s = "3fff250e80a64c9052387d864453a3ce0dd907f8342074a23e9d4b33b16adec7e55844f384ae85fd25bb76ed1542e35087d09ee96ae44da54769b74a30dc7e08"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333834353439323034"_hex; + sig_r = "105e1a0a5c4f645010d86a38e8cd90e9d25a71e7f0e23d220dcc7e46d8fb5b3d81a412f1c4a95f450060aa60c01b3a5822b9d1c9081ec01f63af00a01f488f69"; + sig_s = "31d412e5c9419544f1011a3418b4e549493abe71a9bcd8cc98eab165ae6f06d9ee26f980cf1d77fac3d003667573d8ef82e3bf992c1a924ff2c5981ec6a33710"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373632313932373839"_hex; + sig_r = "6198b7272716a6f5ebc91d6800efd4faf74536afc96889545b4c7141b590f091497872a7bfb2fd9fc209ffae6b7a3db8d7ad884d9864635d64f34e2d55aea7d6"; + sig_s = "77777ca3f1dba89403c4a006c19285f762187239cdb63c63521c0dfb798f48822248497a7576b157849fce4918513b0c840e68af1d491be126852668766353f8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31383331363534333331"_hex; + sig_r = "5e050ae52e112621686e2cf1bd698dbf6e579c6cdcb27b026f305f65b6c8053f7f3a12b411980e35130c966ecbebb4f7f6b5d5e50cefd716da433195791468a4"; + sig_s = "5e6bc53d676dd39d93bcaf26537fbb7eaad497caa1216e767160bb2b31da550eb248f0d881e19fa36c048a700b2d64a4c8dbe6a9c976a7ff2f4c73feae1c9846"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343336383939303330"_hex; + sig_r = "908318cc1ff55eaceaa63aff859ea5d36968ee1021fa668a547793bb0b3c723b6847cff2c65b53a55e00da9fbdedea1acc8bad954d1830f5328498153c43adb0"; + sig_s = "556d3ee294395a3654b6f1f03b827bd025da19267e92d6b067c5d707d3f477fba87ed6ba8162dd089dc4f787c11c3735940d2aa039438284f032caa3c4c2e98a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323034303431323232"_hex; + sig_r = "4f33da81b8a1e60d75f8170a8cb70c4d109cd06cca95914927e41412befe0d3f4063d4b32fa4bc6db1478b4ef3b89e397321af756da9210922c9d0441e4443f0"; + sig_s = "3249956e6f9b5c1850e937cc112e49e9dc0be14f23f52b25431b7b71a27216ff95360934ea9a5e1b2b588fcf0ba9d964f38d0bd97232bb3e0b2e306b3ec15e00"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333337313139393735"_hex; + sig_r = "5d555e697b22abcf1fd1828365607a2f8699679648cb5b8e6ea511ae9e47ac245f6c858d5e8185b989a6ae84b196c58429dc8edd15cf2d673616225a8d2bd92f"; + sig_s = "18e0497d40515428cdccc92f4d23fe9e60e3db14256ce62a3c2eb0cfe791e39e1caf26da861c863074813e5dae61c08f264ea1c9ce0b0e7d43e2607c4cbd860b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363935363230363738"_hex; + sig_r = "64ded6c7fde2dfcfd74bb88d8a692ae4579668a2e65d6d7cf688c96a5bfb126dc409a67414b175b3f91509d6deb8838f86e3edd7b2232802a5833f0be8820bb8"; + sig_s = "0e6e93007fa43aacac638e9b6b8db3a723f26958c8d8469fd9cb812127b831bab190fd4cba48ea2fee0f8c05e4a64270ce28a58bf278f6a2469511ffa4222837"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303933303137373437"_hex; + sig_r = "19361ca1964ca42975f893df4a7f5f64cbcca783f2d63b3b9c4f2dc672ec8d888611e7987eb7b39e2bcbf11c6c2e70d1edde73672a609ddda3768821d81a49c4"; + sig_s = "93233eb41d2a12e25e5316a74e92ab547ef2fe083d876c9c3e8c1908887f7338a02df6316c268da4817bf266fe666c35bfb34e3a8276c0dedcba42a17f13f038"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313233343137393136"_hex; + sig_r = "4c7650cfc8d2b3e683413878c214f9c3cc809bea391e7309d8a5e2acb9eb8a55bfaf82a0e33e8eedc7bdb7a14d74c7b9504934832aaa2c2a1426a3918357def9"; + sig_s = "475d0c318cbce351dc6e12ed1ee589f96ed6641d0eb2af72df4807c1c5491b968bcedf1559da0c6624e54f008171de73ec788691dacac81c36585f4f883a6fc7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373634333530363837"_hex; + sig_r = "639e391dc1fa17e54872183d7a9c8369e89553c1001294c3769ec6d359c87001687903f9ddf191554d72d3100803e0777e0ba8c20d7254ffefbb67575ced2650"; + sig_s = "210b89a962de417886e8fcb4f6cbda8a329de6c65bfff8ff2bd8e5ff396049c45efc5794915fa09d99000b310a1c962468bc52f8a646a79ceaaa5ed493224739"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131343137323431343431"_hex; + sig_r = "27dceee94a53b7c8a0d074b18fe14d3a0f9a11ebd15fbce3b37e41af461b8b32d0ad33f15816192799a67a996a2acad62f59797343a44e28ce36ac8da342a394"; + sig_s = "6c034233a92eee8b4b7818682220b620542fc1cfd50a80f93df875ee205b9ec8403e6eabff588c688189d1645598b1d5fb09a6eca5ede0fd851025476d7d6625"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323638323436343933"_hex; + sig_r = "6f0bed39c9ff5f84225388c0f7c8f7133ade442b0240bfcb6f11c7e91367596437ea03fc4b04b9d7f7f388ee29ecb2c7b7fc40521bbeea6efda69a9cd7e94c50"; + sig_s = "38bf833bc4eff745a27522fc5826474d50f69532df4c570e2346205f17f1d7f60857caba54d15da88969dabd331bc27825dbac1dab51334e99356c6daae14014"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373234373936373737"_hex; + sig_r = "5f3d5654794645ac13d01a9f9a4d755487f68c3eeecd499297e1a33e466cb309c3384b67ab33295e31bce428d6bb52427b163fab8e2bbf7d49947bf5507ff172"; + sig_s = "092016256207b65ccfa71fad0da7c2ea8b5de277f9abd94d137131636220a2a5261df51c51b4afbefd7b8e818c6525a14ea64acff0d92ec1841dcb15b086d67b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393733333935313139"_hex; + sig_r = "6948a7b577b8dcda98eb50eca3174d59d420e901877003e8fcbf72f1289af5e9eccd56e409be03a04c0eed47a5a68e4f1f83fd52d9532d8dfa0e743da975c113"; + sig_s = "0d13a73824ed1f50e0d15e6218869a8ec293fc38313be3bb8f08a9ec7354ad17e7a415c471c00ef4c98c41d76663758bb4160622ad23e6fb303d2bf3b4b006a2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353037303032373036"_hex; + sig_r = "7d33b0bb04ad2b774c51f7709ca76206e1b98c719b74ea62e1f19114473e5bd93a645fb6093562cdcc21881f90cfb09705c856d90505b408fcac655fe96433ab"; + sig_s = "a5ca990853eed5ce201ccf4a8bd60167684d8dce4b50fbd2067f8de2e058c8bb2384c218db765ccc779870775f28bf2dc79e0665efa869eb60964fdbdf2b4572"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33373433353638373832"_hex; + sig_r = "3414d09e02ebee92cc74e3c0c5225aa94256aedb0e8c12edb14d28a3e001d72a0ec4413b807d5641d22af688fb8ee9a19ca79310642d42d740fe546bcad2be2f"; + sig_s = "575a6c0a321c9e52cd0434b12bf20adcd39cb9acb0849b5dada6226a6384f816680a3e1a04315f1a3228ddcdfbe61d814548cd4f93c006f02fcaf3c02d3f305c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393437363731323438"_hex; + sig_r = "4c5e268a8c22b7093f73a88b31cb6ac30530dddfeca6ef8600d53267dc9517d2f9a7836e05f6897c1a244d1788a81f6b53bd0a1beb60d13ef99c2bf6b491e297"; + sig_s = "136e0cfaaa1c3a1b234d8b32d7f9066d9c629b580f23b70726d816e8d75ab3d19c344b2ae1f3d4bdc589f2305d480ff007ff57be19222879694c160249fc9431"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373235343434333234"_hex; + sig_r = "4089725aa3c3f316dc89ae22df53a92e2056de7285f5766dd4a9c08656b13df5591f8ac64e1154bb344e2ab7a08a2c5604095a1a564b98a0dd1f4b591614de2b"; + sig_s = "2b14d5b412a7f665d6212c06b7c05a694d856d986e6b1b9bab4829a7e9740e1dbd4d91e7533f1227f24141664fb4adad6f9b8f9803252fc2f16f980c2dbfa36b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35353334303231323139"_hex; + sig_r = "478224ff8d3206d8c8bd4b1e2633a236e2b2230aa3fd22d0de3dd2bf2d0807f37cae4f45dcd14b99ec6696a163c295e14a56b484282821d65fa128c7f09beac7"; + sig_s = "0bba71255496bb865614d9170147a4104f1d0f77165433c44eadd892d3aff323855b46ce99d2e08fa620ffe76bec727556059abcd7f6adaea307edb07c2f88d0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132333031383133373933"_hex; + sig_r = "a8e0c11cec76806101ec44e52a1f837669758a66202cc70648e9062b2cd667d93e04195f81c5c9c47b38ff324d5f61e3e7ecc328c9fafd74152cd3ca73f7fe29"; + sig_s = "558a4433498f936786d00287d0998e006c3221552f80847982199650a36b1dea273019615004ee49f9d9ba7c9b9271e392dc071a180e3be7c611395434388b3b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39313135333137363130"_hex; + sig_r = "925f403dea9109e189a10a4ed0d41a974bf38cf7ac35a2750a260467874df610d05c0a4c0a69085ef554a6f369a7f4ae4fec7ff5294a1dd8ff72c20587fd4a5f"; + sig_s = "53c13377bde12fa7138cc584b386d8aff4a63929e99bf7aea3d29f23afdfc69abfb77ce4c542156e66e4b884b692d185ffccfae6721344ff194821771aba77a0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383934333937393632"_hex; + sig_r = "92f405102447f52fc4afb12e3661e5b211c96fce5bdaa3f3e29ea121233653400f15b5d5aec2c6e7986c42f90be637e2d508c3718c7e082bc6304b7c93b696e6"; + sig_s = "47cff632ee7f634691d346e1fd230374e947890029ef3ba7546a6b7a3c8cf9abeba54af97dd74a88caebdc09b3a684ed690c690adde762a59f6846a3789ace11"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31323333353833303333"_hex; + sig_r = "69b000358874fb1e99138e7b709441ef24504d788525f1dd888dc3c6489dbbc8a25f650c6e0f783ec7aa55e1c0105a41a20842647a57a30e040f48016b15038d"; + sig_s = "1c49b84d4cccf874682804869021a4c0eeb180828889f35dd9cf2e7b7a8eadee26a7237ab0ef39ff11690478ec861b28cfb00e911249a00ce24648bf04755aaf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323131323639323536"_hex; + sig_r = "1871a430b8433a5bc53b0f8f6ce585d6373277750a994c795a5cdbad1e2ada6c4781ca673e2a3d938e3108421178bc8f65a1c28f6981f20d252e15b1f6e07ca8"; + sig_s = "a8e972c210a42fa8612a319e3d1d9da87767d5a128929bec7fbceb996de8704e8274bd9400315b750501fcf5ece4a33269669466834d5a530036a88d6ee26bc1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303035343833383634"_hex; + sig_r = "95f5150811a220a7970cb2463a1ea661f7459f42119520d73a5412d9fe7247a52ab077281d24eb0aa17360db6745b606401c296ed966936c7c43856cf060b046"; + sig_s = "59bde00870335387d826de70cd7ff00cacc623b6042add4e60d727cf73733c0de3d2ec8d568e3785c7841b69f06420dffd21087b4fbc851e5836e90e8ac114cf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333536373632373235"_hex; + sig_r = "0386171edeaf1c804722df57a0464af45d1a1012d4f559aef1d465e3363f45de96600561eb8225d10273c7c34ac81cb47b658cc93bdf0ad25172fdde2f4be4d4"; + sig_s = "3f645be06aa634b095fcf01b67da9e638d6c8870a81e04607b702177012c46141bb42b65bfdd609527a9ed1b76edb3cd0d703483c161e069b628c2c16ff6c07b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333239353030373630"_hex; + sig_r = "59dc66313bff1cd3d13c329693d3a235676bd81bf4e15c6e8dc2f9b57f5c5ef56e9007ff9375b8a3cd3ae523cafa374f3e7b26fdfb9f9ee08f0e9d679c3d083b"; + sig_s = "53e514328ac494bc67c2dce32ec519fe4675f642f0409573a03ae3e9c969cc88820e7bea9f9cc3876c63e01e2591103fea81b6ee1f46ce787b36631c9377be2c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393237303834313635"_hex; + sig_r = "2fc100287074d86b8a096a7bdeac4cec9caf6e61d8b7baed7d5bcd8d4b9fd17027b5c70b401cd3ccf1297655be6e085ddc717e0bad17af8e9fcdcf5e7a312717"; + sig_s = "7719372ee3b96eec0e08be76aa980055e90a7dcd10b671e88748fe53bd143f9a352f017a87d366a73f8502d2a56307944a2eb68d8bca40c9d5551922d40d251a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37333032333538323838"_hex; + sig_r = "90f645aa5c874c66df2b5f8d72e03cd5b1012ec845b30a06e4ff1921c00384dabebf165d14f03bd41bef4734913a9e0ead7855f3816cdc23127061134187fb3b"; + sig_s = "2439cbb3dc7c1584b09368999a159e00a33abd11bf29ef659659c2463d7e3902fe7a50b475399a2962e38e839f3988872577b3d225eace837b2d3176d52acdf3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3133343733373337333833"_hex; + sig_r = "99fd8fd33d70fd5bbbd3fa86ed71995bfca1630eeb12e19a56d0c57999adfa0331e626b06d628e678adb8cc8ca72d167bedefe71cb98d836f6ffb5ac674fed4f"; + sig_s = "9054653e461e5871226f4ffdc996cff07dd548db54884d7cc7a416bb39f36a506b4d83ff375cb9be69ec2f8b3c7d1e91ea85f532ee7d09cb04d96abdc3cad5ad"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32353031353533363839"_hex; + sig_r = "a99e95dfe8c3aba5bbf5dd6bd6da28d20cbae081661f7be72794f6aaa004ae56f7e1ce3af4b1b56b8e57cf5ae17260ddd0e957cdcdb81e438ff5a53bae86c84a"; + sig_s = "a194b8ffceead68598336fc5dd99c15a1e68bf9586039bef873680fabbb7db4c48cf156beca5586c89e67deb722704c779863f6c3a6048f9bfa793dc605f231d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33353335303430303239"_hex; + sig_r = "6f2f644a718b7f4d02d75be23766b36590e06a9951c43b01e6b99013f640fc746a1ee1d7a5e104dbdf3cc949ecc7382f28ce31bd39a4430a9a0030b693cfca08"; + sig_s = "33aeb68367627ed6dbfb62a22864b438049c8fb52e55f6338de4d366e7668280b1fa77eaad1bd35a1463990f1b734b5c11ebb0fc47de9b2ffa8272f58f2d82c5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343230333537323930"_hex; + sig_r = "a86511118e902f3833c05d6f54e9243c4128ae271e7408bf464a754cb770d870b3f4d854806aacc3ad3c282c79e2f65a6cb684cc6787d1adeb4ce13c5c6abd1b"; + sig_s = "a6a1fe0890d953a391b96bd2162930a7a4d553fbdc8c42aed23610e2d3aebf23a2d694a1d0427b10af3d8ed7a57d9086e7478dc9ad9e0a6a0b09a6cc659363e3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393035313735303638"_hex; + sig_r = "7fd35d0452fd4db353d7452e3514c2890d74c7b76e577d07d44d69e3f8d445089d5a24487d1ae8471aa861448f77efb8af46fecb3b33c26129e2f4cdd4da3198"; + sig_s = "36868ad62feae1c62dc557b6517fe1e5b4510976bf26306afa3d95a4dff52fed0569e7773a8bf313c9e98981901fdc2654daecf225d3558c5b2ec1af348a978b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363133373734323935"_hex; + sig_r = "42f5dee83215e7d426355fc1d349ff9fb3590a0dc0062afe829396bbe697788b70b5bc599811591dfa5f4fb295b543b16a86a76eb86019f4acdda1daa2b1e0d4"; + sig_s = "57b4bc551e01f1d5c22e60bbd653218879e06cdf9e857ac541beddd416b1cd7b492e162495aa93c65f3bf92a77c9e6525f1567ca72d5fd161c7c36dd3b5ec176"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383733363733343931"_hex; + sig_r = "1423de24b2a7fa75474fb5eb174701f3b08b986cd83e08beba885745eba82775404a2fe230c9ab85d7c6aeefca65d0cf80c89dad47c521c19cb19a5eec400237"; + sig_s = "9a8b969db7c8d0e66c93fd8f3b809bcf09a2afb1f11b48f0d498e62fa92fc86ef121226c953561898de67d51f8507731602b30ea6f164467c5c37d67981dd553"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333535313036343035"_hex; + sig_r = "4c3dcdbc5f9972986c4aa842be234ae7ab9793445937f2192de60eb909d7540dcbc289b9251bd35828c2cd8a765c5df8afff813db43871bbc5c1d4846a147257"; + sig_s = "7887055add325c29a1db3b258c0b8bbb3cac125c201ac0318fab499206b885d64353ab8179581aa6a901e1c42ac8ed6b34dd7d947033560f6cede9549ee08c59"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34353339353735383736"_hex; + sig_r = "711729545a60fee17a795dc047a3b6b0755a804ee4b444e57e368c19d5477b1a9b57b241fe66b51d6b9d7499124a66d5f09c78905cfb742ba30ccaed29e4d80e"; + sig_s = "78b5ec11259d715c91febc2edf5d12c5062bc7f1e282ce6c40193fa93ab88bb71f837c45b9dd63298169e4ca77e8af9b10ca2e33dc3ff4140be90ce73b2efbe9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383933363633323031"_hex; + sig_r = "4393f2368994ddf6d40f2030a31b17ecfc4636249288867b1df09f86da0555128fde2e5fb62a3473b686f90689056e10cc707f0a8af0a4db0cd92c1f9c934599"; + sig_s = "2484e7017105a177cc864a0fa6852ce361a8564265c46de8f5f114b9cd4e27cebf9aaefce44f29b111107e1724a35344a476ea6855bdafff2fe4c0a08edd51f1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33383036303638303338"_hex; + sig_r = "697464e7bdec15d4a51d463998c44cb876feac1658006e0728218a4a96b8df74f2e4575546c76f0563735a84a26b88d53bc1304244f70205406eef42c1547d0b"; + sig_s = "131d28825c45f6e84bc3a4f944d57512d187af058d22169ab9feea9f7cf37fd332a132bffacc496e0ec293ae95f944c6f311dc39be22e70de002c371545db133"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323332383137343937"_hex; + sig_r = "4f102958c48d32805c03459f4350089aba9525e721d2a6e182c6fae709e263f1480a62baa82cc3a1f26f733ad1c3d8662c4245f49d70b1ee29ceb283440694ae"; + sig_s = "53de14ecd131d0226993dd09b0daa6759a9ff38a584c1f03d0aa7c3f62187cdcd18cd24fb8bb52709c6e85c850c04bebc63ec4f729a42a344f8a19dbc261ae38"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34303734333232353538"_hex; + sig_r = "6b8c7245933682bfacb7469a4aee6e8672915fe0e50489e9417dc4e937a67d8b49cd6da38101b5c2dec81494bb8df74cb43345144552794aa975776b0820aec4"; + sig_s = "039b894036546b9c0ebc6483dc2a15b648adebc8187888fd0478cfb626bbd35973403607c7c3a8687bc80faf6e4e269e4fb66d9542a4228121305ed673045ca6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363130363735383237"_hex; + sig_r = "3c72f66f702987c3160b83b119e1b03ceacfaa800e76eec2c1c0de0461dd662863f533ba13277b5bf6572fb20e3310af04f303dc58f5cf5d4d366a171785a226"; + sig_s = "90101e8f6c5f04fa69751622f09ecb453d6c77d6a3f48057fb01654453a3173768360103067e5609b3aa976dd1e81191fb6218726a397f45a824ed9e32d7457e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3137343138373339323133"_hex; + sig_r = "0aa50ed2216248d21a03bfd9f5ebd39e7b00bf628ae4e0ece361e322f6fab02a7faae7a06188535914932fe570e114dc90567b687e39eb7ec79b92b34567bbfb"; + sig_s = "5ceaf012eb60a5d6c99b381f14f15ed926574d8ffd3373aa30dbd7bc0f6034fec60966bd0a451c0272ba2a891fcd333f10a5aaf88f9af55f072777c260a5d7c5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35313237383432323837"_hex; + sig_r = "33649f9c6bbade86585268e8392e4f0cf8fd52cb51a9b15ce5fa5d83e3bb68aa83d2d715ff73a30621c5253aedb6aac9ac446fd04faf5fdbb7c0ee9eec80c128"; + sig_s = "5a7bc3f5ceba177ee3176fbd7ea0aba42f44f3108ec48b3a7ca715cdb41e88c4ab38d33a98d46b8d291ac2746dd065c63db5268b69e9894bda797d5b0f828c7e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35303338363930383739"_hex; + sig_r = "31ed3b0831e299c63e18e272b6e7739f83affa911560a9c25ecb069dfa01d1846f9be452faf01eaab285f89bb0c152559c44da75cfe7994d9f30ca44ba964d9e"; + sig_s = "02b900005d29e41d69b93559591a0c745057f53127177ae9a092bdf71661ea04e5474b2ea0eed255bf8ddd3b80c40b59ee79128b15387a3ba84f6feb03085d88"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33383737303432333937"_hex; + sig_r = "3ad7cc06c3f0a2a9221e75add5fa5ebbe28746cacb21ca744be3924e5bd94fda75bd1a3768063738a55564f70a35d8386e4db71d63c47a240046cb9858f2abeb"; + sig_s = "997dde151505519f7fb33b234b6c4d24011c84c4c72d0ca54e6c2ae7e54c2797df8c3d318444f607fd0b9ef2721fe37d9223330cccf910a090836de0eac1feae"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333231373038313738"_hex; + sig_r = "071f1358c5d58cab0a6732d681d63495679aad04a662ed82ec44d62bb48d4781217d570fff00908dbce8aec0d5f595999ffa8419af470b56303bcbc4bdbf3a4f"; + sig_s = "2b06d900b16bcda3094217ae455cda6fc68aa9deee9adb389817aa2f8f9a90be35991bfbb0fc08eeb0ff3b55a5bb05ae82c68e57e29109d6d9c23f0e7c61b00d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37363637303434323730"_hex; + sig_r = "5d7bc4cf2f4b9bc4031470eccad3b8e16d57bccf22dd613b135e9e1becb9e1326200196c6bdd96807a16d451c46b4f4a7a5f1f011d3ba18c91d3100d18c58f0b"; + sig_s = "41e27ac0793a27e46ec597157521b52c24948dc16a670450a7f7ac657f36012c539e11fc79ccd04b270eb274f51741cc0d42f686801acf89dd7acd35322f8d74"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31313034373435303432"_hex; + sig_r = "a33b9ea0acbf392e5626aa6cb7be147b1a70b66dc7579de7b4700395e1ab43059cb1002aeeb7ebb558037cc72443f33c98c33eb1b1ba209e1f46ba9b9d97c596"; + sig_s = "908e62c1e27b0ec685209d4e3a92055c37133a19af496dc162357174c030b3f5a8081d31621e7ad17deb7d57efc95cef0b6d27017ace11e94cad00afe92cb1ba"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313533383730313534"_hex; + sig_r = "0f390233f19df19f75c0adc8daeb8f45c3b040111eb74e0b09c077877803f64d556b1e0d37708e288677900e54b8120fd98bd966c9225679b7d3f66c38803338"; + sig_s = "928675b66a532d5f73ea9e9f3633c6c4f8f510c175a7889460d2bfdaa0d5479eff306044a32777d684750c83f5d9b9855589c9d56b82910db6445f424e0bd0e0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323631333835303439"_hex; + sig_r = "259e802c033de3db978e920c53b05cbcb9ede5a06d4df635fe0084ef72391692ab59bea2b9c451206df0a4cda921de1d04e8d65cf8cf47963ca797c80f5c3007"; + sig_s = "73b4b437c47a4902d449a52dd6f994477d19a20f1356effbfd5d0f1bb077f6c13eb47ce9274a58b34f760c0e35774f70f66c5753838ccf8b0d8413b0afd3d562"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37353538373437363632"_hex; + sig_r = "9b2e41d7c510ca0cec4b6e4f9198ef049f76ae2391e4b32e1777f12055fe1de7073afbbceee7c38d32492b01b2d8aadb298988bd57a573b1d924888dde9e76eb"; + sig_s = "8ada489f25864c205218194c5e5f36916f3b7178183e154a3d8ec651f219e7c333f526184a73696faa69b3a1fa726874a8623435c9c8c50862ae14d49fdcde59"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33343939333634313832"_hex; + sig_r = "1c9ea493bc021cb92cdfbca8b41353c70ccef8dd7c59d0ca38dcaf92d59aad4bcc4d851bacd8efe03e948f51f41ded9f4a728b5205de6eaa82d2a0e13fa8fc39"; + sig_s = "01c873d4aed3b574f5eeec39c16edd14226ea7a303b7d9bae24a5e13b58e27fe7f67b500b15437d37566c2b7e9468f60baf02b19ac4bfb9d5b5bb1dc0612497a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333639323733393835"_hex; + sig_r = "49f3d76bbfc43b6ec24bb54f13ad477820ced9d2681f59ad2f50cf0e901aac9788300fd2324303b5d432a6eb57e3aeed96c68332571f83fedbd0edfb5da8f092"; + sig_s = "40e04951d68241d5cb73c1ebe9373d01232613c421de6961c92a7fd41ebd9a6a4798bc9a9ffb70c57f81eb4f9c1ff3f336020fb84a529e096257775ca36e31d1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343933383339353635"_hex; + sig_r = "a6a0fe70d503a0c9a2b7e466471205e76faa4e1387475b0dca056d84e5d8564ee4f533754ab1465b458ac156487894ae34f68e93eb70e8a80bc81859003a054a"; + sig_s = "39229289b5ef627260306a06cd53ab63f2fec2e7eb0724f5b312e3201d83274ca69282ed8391cae0561074952681754165a3a919ed0b1130e93f1ef80d83052f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32353334333739393337"_hex; + sig_r = "68e00a1828309d5abcf4d433fbeabe38346e9859360fc1ffb07cf92f72369750673425de56bbc5ec9bd394d0f826cae051c724c6e9170ed0e1fbd9460fcbe3b9"; + sig_s = "016564c09e979ec09814dd9d90cd5c13612c8227c1aff12137e090da41d562c4296139769e29193a2a667fc0de95ad933f953979a6293510376ee9b53947e6a4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383334383031353938"_hex; + sig_r = "1c46fb86c1dbb53d2ad4f1b7cb1df8590b822ab0f04b2199481ad09b4025f8f5df433a370fe186885abd55327930432fe0db49ee4817a1596f405060ad2e010c"; + sig_s = "8498f297efa036dff7816d5a57873a381fb4056f440328775356e4a77d472e8cab84ef113e4091f61dfd2d76c9c168296ef8462412cfe5d2a7cc83f6b5b000ef"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343131303537343836"_hex; + sig_r = "221897c0b6f413236bc039209cda3e8e1d1b33d72cabce5e7b38b515705b91cd4d16c16653889bc07b2374a3011d61246fb5c123c6068aaeab5c3e851471d745"; + sig_s = "89a74e94702c0235e39a60a106e0703d58db95f0f0fa5c7376c4dc9f85f5a6837e3371d7815e057e297f74950c7b073cc4bd15b4eaf5428af99f3805b4e080db"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373836343638363335"_hex; + sig_r = "a9aa42718d6491365c1c533e87501debfec3a139fd96f0986f8b76915df7996d83a06311e899519db64b032d989601cba8cfb1afe7bcb65895299b67f2ec8163"; + sig_s = "48eb1328388afda742e5da8ef86e52489c2483d3f1803cae4110f1f0c2f0a1438138d8c174a6a503af626f5e389cd0b6d477829115338cd5a72063de295c2c0d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303534373733373638"_hex; + sig_r = "aaac0e6f13c2690275b06a11cf9181de50a262a343fea94db5caf693624e95b015c13bd2c4604bc1143538c063c2ba0cc09da764433c5f65e6f7f6d35a29bc42"; + sig_s = "0a5e64034848e86cc360f2c036dbe6f3e2445b488e7288cd03400cb51b0819e42aa3e50fbedf149d975723255cc2f3c819fde8387656e1c0d5e03817ea74026b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393237303137373338"_hex; + sig_r = "3c96b46e7f61415e992b642e601f06aff778e7ff0acc196f967f8432036cdb34e4d1eec1a195448a60d4f331fb1850f83b597a3d22551d1327d57eea4b5a725e"; + sig_s = "a819d0c8b2537762be4eeec1d34d51af4e04e35933a87eb8584a189774135d216a99d32c53c0218c273afc8bb91ba4f7b2c64177fb38f05b2285f6be0e21a8fd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303531333235363334"_hex; + sig_r = "3ae326ab21773a92bbdede99eb07cfe23d8fb1c5ef22ed281b3de504e86e084ef09212f7bdadc28ca45566d2b22b5359b404d49495d03dab14d87949bcee46fe"; + sig_s = "8e8fd0bb62f8b9834e714db306fecf14d7029bb2a9793786d144ec53960f4a653fc0b917693f69737213f31c5eca194465c68b1531bf662d34ee2b1152422f7d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34303139383636363832"_hex; + sig_r = "6f267dd8ee31eaf9ccb9cef5e7ca5556ca41d057b28e668ed25e265163c21a7d2a3bb2812b73c085c00881c04c91e6c072be8302922c0d2a23eba50b8c6055b9"; + sig_s = "9052a0af6159b11715ecf901a6684be3e5f21e797c97fa66982c7402869c05393278ee4558ba0c66c699234fb675a88a7965a18bb5afa6950fd44b6232cde80b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130343530323537333530"_hex; + sig_r = "4ecb0a5c194ff50b1d4b69a7a645a60271e1adc8d686989162686fb18de0396409478fe6a848156d0c31272c833f2685396a5079352765306e3ddf15996382a7"; + sig_s = "6751ee84f6f7b4b5707d23bf0152e5b6ffb1720d29e55539504d7d90b13616e4874bf234840276a945639f4bda6a552f552654afc54760fa0a9f399be54441eb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333236393538353830"_hex; + sig_r = "1ea0614c7fbc25815fb6233a7ef5775cb879bb6f61684443e5ab498656440a7df1d3d61118be2d1a38aecfe6074d66c2307c7c4cdf198273a8db1e5e9f5fb648"; + sig_s = "078ecea82a430eee83b0757bb5ed65906de2c649b64cc64c4520484ccc7ede13ed12b57fef6576e872441511f18b000cab52ee44eb931aaa76f9b8e293225990"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303734363533323431"_hex; + sig_r = "991c3902006721918ac93247b1df2bcb9eac4a709c62df6d9fb47e04f47d3efefa4a1ebd628baf257963379522271eba69c3b57abab1add6221020e5d6554d92"; + sig_s = "104fb2ff081ac705615617c8808c59b7fcf8e7e50478a3dda2e4dd7a7eabac027ac95ffe3dccb26268d6deaf0e63cb4e2e21914eaf027040d5d38a4ef636a60d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37373134363833343830"_hex; + sig_r = "1704da5236cea16d8d71e654c46ee1a7305353edcf50f2747c38688149bbfb6eaac20032bc7ce8f89e06b41be5f3f896fc718b7dd9375063eff4393d2dad2fd1"; + sig_s = "426d4c908e3dac55b1b1db5a78e87cd467a53856abbf3f97000f69f106966ed24667b0cc09abfd7d79386a70f63a9b187a543ee68d8a5def7c2f79afcecaadc7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373933333831333230"_hex; + sig_r = "7b69fff374f1028804d430c5667df5d154ccf6db0d1ca0a43bc07f274f0f2c2a37eff61cb99ec918d9656463c6e519cbbf75c3cbde5105a8a025d853152e7ef3"; + sig_s = "4142e98c6bb45a786db4edc5dc36a28cac4f4074644bac6a39bc54ffac87f779ec23b566dd349bc24a6924db6e7411dace54349dfc12973303cbd0679782e5f6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34383830363235353636"_hex; + sig_r = "9f812984090ef818fe92406009ed483d98e74c67865ea549f220992f6a1537c59d806d9e8c510b6e80d35cfc005c3637b3649fe4ba0d60717c3e10617067df75"; + sig_s = "47c425895cbe2bd638a7e12742f7436adb0ea1c8e23622341c1f31186b6501af7cf794105ecb49469c78da58f0f1b4b2b257d6f6db649fec89bb44d6394edfc4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3439343337363438383537"_hex; + sig_r = "3e06912e9e08d150cb4c528f351889efe2213d9b26b33fa399da60592fc357daea73405265a68a17ca25dbae3fb40501a99d8d5185f6d388f1e1ecda8b6b7cbd"; + sig_s = "8bb2c7a8f3d6b2ac9b923ebec1095d6f1768ddae6371fd29240892517287bf1fdf195220297e6d63fbe725bd655a4092b0a6e05750604e637d9b3279b648c97f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34373038363839373836"_hex; + sig_r = "5add361ac75b46b2fb77d8c027be1e6292b0e344a900270a53114487ae96e5d1783f55c8ea2773f6c8104a1899b0c8a4a6a6f0a21dd835d28af5f5602bc656a4"; + sig_s = "41aae6d2318a156f0e923aa569aa5fd744133069ceff39f49ba67cf0dea7ee594d3b02a4a6cf92b817d1eb682c18bf5edfaf2c7d383607458de33358218932fa"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303239383732393531"_hex; + sig_r = "8b5c49176c301683c590435ff5a66fda99544c3047aca25653fc50f3f2b01147d8b4169334cb1f8fab3fdcd02434b75507d52b4bf807d9978b48bba11ac562a0"; + sig_s = "47e4f24e671876468847fe1e5ded1adf3194d2cd7fb4915b77ada7062454c0505af6c8558cdc6cc578f10cb7e084eab8c68b65133f0ad4cbe33b2dbc684137eb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303137313930333835"_hex; + sig_r = "08389bb3a37f6158449ddcff6daf46d9753a7e16d4460bdeb229606d0c70bb3985ddd2b3bc867553b957ae8f346a8e0d4665748eb04f2a325bb7b49e71d8a70b"; + sig_s = "2178a553c82fd84a556828a5a35f9c2ce4b6cb1ad38f8a0d362e16b80830dc320a04748b151d748e7c4670e44f4db290ccc95cc4c9098944128513b77c2be5b4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393536333633393339"_hex; + sig_r = "41d006969dc0c85187b2b1b6e127adb40662121b4899b51f5942b702f994009bcaddb90b9a848ba40b06ea32f7ec2ac49627804d2b67c90d6ca569eee03be432"; + sig_s = "5f7daf99c264e8a12cadab73bdb7b01cc838be96f073daa1ad044d21b20da65f028ee65903ad8e521fb120164636212d205f30be488075a6cab0be50c936dcb4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35333030373634333530"_hex; + sig_r = "3e07ee970d8466a23d3132800fb7134dfd896a3b96749abcd6f07c23a61f871fc7b1cbf94d442f15dd164fe9b8403536d8bbc4fdcc71836c4053d8e21b38e788"; + sig_s = "1b9c3b6d5d7b5e9023c1768f91818cfefbc11ba6e1bb9f8758d22427aeeb04188f5bbb41beb625ead1628d30def6f23ea1ddd09885ae6cc2e4e6d06d21b40f2f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393334363634383434"_hex; + sig_r = "3fb13f969dda8f26c109eb64ac4ad888654dae726de4bc3a07e73b7a3a73b4305d6b0adfb8305db07d3060518ea26d5b41788fef4e1d45a1244629a8989a78b0"; + sig_s = "5b15d726cb4d5ca3aec41116fdb6f376ea1469efac865b4255922f7df2a642048458207cd374b804829de014a5ceb37a814a770f188b15fad32c5b4ac4c3f6cc"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3335353435303535393632"_hex; + sig_r = "7b19281caf8a1eb559409652648fb93ee7b3f504ad963ace9b9b2bc72e456bd88b56935020f3e80e0cff3e4c4a8aca647d21794579a9fb10ec5160b4a44a91e0"; + sig_s = "0983be13a752043e3fa8de11af2adc822f5264570dce9b1c7bd8d1922cf8c0b0c0923cae4d2c1edb2b360484b1838db6a74461f41bc8d8b3d4f974c076f203d4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333031373232313038"_hex; + sig_r = "925ebc4d18aa8ac199bd98905d369781e5481d82da26c83c2556aa0c1dd56646d628518aa08bc5cdf0d44de09371ccde920e9fec19170c91b9ba6257f5376648"; + sig_s = "89c444144990a830025965c64f711db2e10c650c5c09d7ec8f1932b0ea984daf3592cfc568ebd511446d53c93daf6483af6775265b35884c6f5d23eaf038d40a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35363137363931363932"_hex; + sig_r = "67cb23656f0ffdd0008bc69984e6aebb2d33d98f13c6745492559d420e51dcf516e368a43751be8b4cc9ca24f69969dff8b1f340954bfc350846791ef6cdb131"; + sig_s = "2253a72365c3c31d0fe7d5935ebd16014dc67b6c1edd6a5650f60ac150709f1b7495b3012e490a8b3a8285d0348e563b6ccb8978152d18d7b421f0ebccdd49bf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33353831393332353334"_hex; + sig_r = "47c73085f8761b44bff7ef6537aa61d838a71147c2335efa44c2895a3559056e30080c280be059be54ed25fa5675cbdacc657f86ba0399f37812fc039fdcc260"; + sig_s = "0b195ff29310607fa423ef63086c9a4a3e8f0ada29b9395db99a997dfd7203513993e13df10a02bfb9274651d95a4937f5cf85df252af2f3ed261851a023962d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3135373136363738373434"_hex; + sig_r = "79ed877afa1dd09ac2381513278c0aae49441fd37a2ac61798ea563d8ff676844b4b1b3a85687f0ab2f5df604b8ba0d560de79b94178370532e17c93843c666f"; + sig_s = "370caafae78c97d5b9854e0b21a88bb4bedec86be8e293e2f39239e8e0c06c02524f8732ff4a3ff1f180c6e33f507636342649a1bf14f1f8ee2e712a57a89129"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33313939373833333630"_hex; + sig_r = "5872398adad292594e5e749c8a90143971c0d648a900c7e247924e1d01cf2b5908517e8c5b7fd508baebe2647a48c0702c2804a9f436307b9cd00a916276fab8"; + sig_s = "2b9f56244a8a3e6c6e03f6f740f3a1f8c4a194f07ac95f59dd68196a547ee00f2e91452e869aef9eb656f17c28f9c29b6e7297b46b7fe38067a14f3beed83468"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373430343735303832"_hex; + sig_r = "122bddf0421aa327a9016724fe93a52d818b3bfb4898832fa6c048e2652c24c31fa179f6205a726799e475253bbdda17f538a4069f4de789ce70635074f32e0b"; + sig_s = "2cc5f68f5be6e0939556ce02bda6719c1cc75294fff5c0a3d31d85b495d2471ff88a715c5b335128faabfc1590c2b7a5bd865703349d9df9dd154aeda12d65e0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343137343336353339"_hex; + sig_r = "87c3c301d8e8dd07f8e560ca40763931e9518be8f45bba3fa100de58d3dbf31d813520f7e6e2b7562086c9f1668bbafcc2a039eb0800a7d6e39e2c917e87cfc1"; + sig_s = "38bd9c0c778899833f933a739829da50ec8fc95e69e37b87c595eb9066dfcd5cd163fd19a971bfa0f47c8ceee11c8b239e4ff532620dc806c85a884fc3172355"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31323335363538383839"_hex; + sig_r = "73509ef73de8f3acac4e8d019e6a4533e4ff024ba9f17c3972452342ffc7d0e479ab591466df9f2be22acb5ff9ff78a6fb2aadd8f3784fc13bcee62199cb6e56"; + sig_s = "4c9a60583eaf84841df61b8239088f65776a0a9cddae783f2436722a0e6f130a8dfefd0ff9fa7f367c3f1165da40662070c1d17355a6adf671e6fd9c567a200a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343239323535343034"_hex; + sig_r = "110a23df6e8eeb3862d0c6e62ec518557617357ab8da7f8c9562ca31f6142f8f4385dc1ee777c4247ac6324df64063ef6e7b78da1d678b308e8bc4102e02c69c"; + sig_s = "4c5bca78a31ab9c348857e4c5f4f72038bcb54bfb8c37da8a5a13843659d367f6587d8bb8cd6302096804d2216f25c74eb63f2a10d90128973e8c5d607ffaa0a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3531383033303235343636"_hex; + sig_r = "19347da02c5745304af47cfc7613deb48a00126fbb3adaacefd58028ed07593e6344b706fe2e31224e1312bfa63c51d707cff11e53a143d6ac5436cc8d445845"; + sig_s = "635e7bab82e221872d8cfc4bb2879015ecc09d64a9899759887baffdaef6291fa5af76564479910863a924f540ead7abc29ecb97e667584febe0b686eecda4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34343736333938323030"_hex; + sig_r = "92663d7cd343448a9e019df35e9632d00406d0b9cb86ba03136154ff0bbcdc7280d4edf361629ad00e9f78b0c6c5a2732f64e909556f97b15746978cf4c81bba"; + sig_s = "95c6f8cdc5e2020e113750fc2794255b2c74fe404b9f543f8b3fd96b465f7bcc6964a16fa1584bf03f779b479ca3bda8e3b5d0ef6eda380ee78bcce5a6cb0d73"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39303630303335323132"_hex; + sig_r = "59dfbd5e8d199d331d232b76fcbf4796dcab19cfe9ed9527e5637e9fa0bc3096814a32ec4507315876f0e317e3ec8b8fd79dab7914a0b1d84f214b820230d983"; + sig_s = "9059c19e13d6f532d221a422edee2619ec6e2f140e210a8aa0b10927ca37db944f3cf79e3bc98d4b88f332a22151b9c95619fd923e54264ffa0ae6c4fb6d7343"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373536303533303938"_hex; + sig_r = "a102e38d4c7cb15c582a512c56ec2ce4e4ba49b2682080865ff831621dbbd2bdcc9e1f3891bcfa9a08816bb2fc78d55a161a39a2c9be559e0c54088763f73d82"; + sig_s = "192672c0825a7d492c217547cbf4e02bb784911ba2115868011e0c46e6127f45b1a17f1a6076c496a99c5b3ed269d46fb02a8124600b8ae68f11c0fb4acc337f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34393830383630303338"_hex; + sig_r = "67646900e6061f8808ecb259f561f85a6fd24c0d3f6f7add2c4e535fe72fb9909d1845c3d36e4b7865fe0376cf877bcfcbea58cd775c73561ef00fcfd96f6dea"; + sig_s = "35bdb8e915cb601489f0002d25f967b0cf5b5adf9cba8c16ae877a35da85bf393f0324bf78c0d16a08d9bcef35d84048fea66660160a985bf866d770a7010171"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33363231383735333335"_hex; + sig_r = "35932a4f6dc2891f492c54de54a5462d861dfa09388bb10f0cbcfb231a47c722a80c77045491dbd8cbf2e2870938f5cfd44c56b92fb862b17e7972fc94efb40a"; + sig_s = "79cb49b84ad5be859f019aa803c15c9a14a63d549cce14a37e4ceb1d4f7f1cda9f8ed09b5bcaec4d96ffc76390092e62e443db6b7282fe4efb823a4ae0442e9a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363433333334373231"_hex; + sig_r = "4e585880bb6517f01520c08e76ac3c389db6140e03fef64ca1703f56866bdbee1bbddc7a810d9de3d1af1d60fd099baa1804abd13d3269b19c03c8f042ab64ab"; + sig_s = "89b5bf23f8bd4a0fbc02c49107d39c5da26d933b94b2b402da9b2dd635823612efdf4ba3daab725a25b7d64b64774d287badcbb91203a26dc1ed016981be70a8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34343534393432373832"_hex; + sig_r = "1b488f1af30766ed1b950fe9fe438d94d912b705aa7653185507fa22cd984769b9e340b47495621ed7f14bb222a5ab4f058078ed455915e42202096bbee6719b"; + sig_s = "a53d35fdab6cdde5423ceee7442cdb33a81e9df85b97e19145c5c86cac7287c4cce52e2fb47dc26e8648a4206f6348d864abc07332849e1a69d3a157d7d0c21f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3230313834343032"_hex; + sig_r = "162e53404c99e7b99b139f7ca09424803b918cb7540fa7b2c30875199a978cdaee9a165e31776f720f36c7a70eef6f956fd1a7b715eb136bb7def6afc0c62571"; + sig_s = "4e37328eb243f4354469afa7dd2efbff3af39074b366ce766e61f698fcf26a33d26bb240c865c321dce6207e0916fb16a35484737e8dfbd9b3a3df83503a3244"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3538313332313733"_hex; + sig_r = "71704d8ddf91aa58bed5446fb1c540248b980bb846f71f4f3f3521a49ff9fc77a09a2984e519692a1de00fd59a4e966c49c5a94ce7d884a41ed98f81b9cc0741"; + sig_s = "2007f502697ed732e3ca751f2794b046d55189e238f92fa639b7c09d5bc5c78f1ad07e8c70045e8e25b963ceab3c6041e5846f1e08a2a63a2c1757db0c06894f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31313833383631383131"_hex; + sig_r = "a14b98c3d29abc78a619e937c720436c5fc74fbdbe4a5b9fda848d809c73a2a1893be5a69f6ec25b820299ee072113ed3764b57ed60f590b594bf5f73449621c"; + sig_s = "0c38969e7b6e96fcef416491b66d9b0264fb264a2f043e16a0226062d2ce25b25c5d80c4cd02460f826caaebb5c2bf5b8320f3a133edaa97a08b0952648343ad"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393232363032393036"_hex; + sig_r = "4c4defbd1293035c96ecbf4a6dd554c4869dd7890b3d76efb63d14330e5f2fcb40b8e9be83580b78e40b6fde3ec4cede3c7d8b6d2841ae7b7e65ed2828fdcfae"; + sig_s = "a5b7e18bc8f9f94d77cac1f6d1dc9983be56b1e7d6aa885a1a0ecd039711ec7e1c7ecf1d6d390c49b3394744dccffd755e3f8aca0303bca2855442021aaba648"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393735313433323037"_hex; + sig_r = "0200aec7d8b87fd66b236c1fdeb22d87c467c8848c13b5d3de5a5471f6418b9551496db6f3256d538b54e30a32b61f0203f434a5438b5bfb64dea4e78eaa78d8"; + sig_s = "27b8bf396047472550a06672e898c2774ead277f8086c8db97a936882087f7a523b55a52029c164619ca55494506a6d5f6d8777bb01cc9340da64ce24af07d5b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333135313136333833"_hex; + sig_r = "1defd83e9be1ce72f4cd3cb566e8430bdf75d43de90d380ea01b6f531d570bf9843e34a7678170d7eb334634ce32fd6e7dcfe2cfee91c4dd50739d1ffc68d2fb"; + sig_s = "16890f9c3b4855f28fd103c6a1a7aee24f4fb9bf423e9316ae6b84cdf83650e64ed2c1351551149538c4f9c2ccf35ea5e6ae5a8df75e5575e6f0ff8b0d45127e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333236333136383132"_hex; + sig_r = "4e3f1e9dd66378597808d03daa3979f7c3040ea6f5e8a25d400cd7af60d0886bca30094761f737b0e0685672642552939dd1476db7b2c00fcefd5d2263a999c5"; + sig_s = "9c07c7e2582d880e4a70e983c0bce74362051aa1b00838fcd3af95405f648039ded05a1a7e1509ce225f0b2e32d7e08d02a3b4743fecdaed0664e1b3515339dc"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34303239363837313336"_hex; + sig_r = "8eb49909880db8cbcf26a3c669e1c643217736a14b13b1cacbbcbc2c2695d5e3148fb57b3b212aa71a5611b8a4a66a2f5a615666eee48955a359679e142a65ec"; + sig_s = "0d53fd6be4ed3d925f83c74b9ed28ebd1f2c8ffc2990b36c2203f92efa39882c1ed6e3c9fdad2cec4ce872d50abe22c4f87c8e4dd660e9c36d2f106a17c9d8b2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36333230383831313931"_hex; + sig_r = "9e9e08b0c45891b3e3ee0b8b658c93bcc10ec8c48f79230c95076b272d184364d14e0e493d47d0a76f7fd4b90d666d954f442a33fa644019270f3d7bc1a2fb62"; + sig_s = "0c0973596b90e186765b1fd8cb8dbb425e7df694449c01b0d7e81ee5fdc713a1c25dee1bbca37358debf8df5994c8d17a074b53007c35abd640eeef363f579f9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35323235333930373830"_hex; + sig_r = "0f7c6749c2e7af5228507638ffa97bc92a9bab2f5795df309002245f3374499f21aa8ea67d023ac3ab866bf755f2340f434ed9f36e2bb56c379b4cae81a9d13f"; + sig_s = "619061ffeb95a0a9a0a91672a1d11342eea50ce6f671d2265cd3aed241c67198977448eb1d637fa4f43c57b87e9b94d4333b3432b95106baa3327e839a37ecac"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333439333933363934"_hex; + sig_r = "5a3eecda5efc81c1b5c7c6210f8a832285e80df795b3296b0339b8b7a18dece0567fd10b061fde2cfe154ab27bb7ec788eb9eec02a8c329fa369c178d7305135"; + sig_s = "5bfb901ee7124e3bc0595c85860df76306790c2772499156942a1e303d055b760a6e0e0d770a46335c844c37a63189e49f79970e29e7458ca7409d5966a57381"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130333937393630373631"_hex; + sig_r = "a2a416d5881c8368547184e6721687d6ee69433d4e40293eafc517fba3a5493d32ce500cb6d897ea47eb8261f022ab9614b0ca913f818d880c5f8047136444a4"; + sig_s = "a4e9b0baef4a3f290a1e85f0bdad9abf2a5ad2276d311745a15b0a7426cb5945801d911726effdafba7605ce0048a8f23d7ef16fd95712144f7d24ceae2e0bb9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7c3c4f31ba418f1eff00d64e1644467ecce8c01123b4202bfe27d008285d35a7052704fd7e2e39aa6c3745512e3a78543a23a1ddb416d6d4b3a02b6b4cb85d80", "69e6232d7de205e47b29b967be3508c7199f78191f8cf289af61ad00410aa694f1d291cf0f86ce52794ea814c9195cdeec744c0d48d97993bb4736b79cb6ce9a" ); + { + // k*G has a large x-coordinate + auto m = "313233343030"_hex; + bn_t sig_r = "01280f3ebf4f1d42296d47401166f7709f0ad02bae2524eba77322c9d3bb914889"; + bn_t sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90066"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r too large + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90066"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4e3f0eaabfad60ffaa8b9e1864e8af296a3d415f0bb7d18c3cfea5e605b86990b970f8488d37c08844dffadd4d1db721a38f3302db06e345a07a6c7329fa62da", "0171eb90881d70b136a6ca03392b27df6f8dd2ee2cd1ebe7cffa9f3b1088df4edc1210400837b12160b56b6c9519dabd747750b1103ee3a6a7b263941fa7896a" ); + { + // r,s are large + auto m = "313233343030"_hex; + bn_t sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90065"; + bn_t sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90064"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "349ba105dc50907a6c37534ccc9edab46376ed1843b5f666a56fb57ee1bbc123f69461e3e765b4d87f32e8f98a2d551d09c88db48b3eb53f5695c7aaefa5f66f", "5beab7a524adf349907926211853359e03ab05a646824de19f5e62df7b48ae0c1b514a5fb7e1fecdcd036dde0faa2535fd697e0e719e363306f64d42f249b745" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bn_t sig_s = "4338ed95ac0d09c51d7044d59f1bc26f8f3f11fc7bf2f81bdf0b21b5c0b9c89bea3cc6dd8b3692c8310b98117b508d130073e74b02b3ba482fb0a5ef1036a3fd"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "48f989b8f80bc1ce74cbeeab0841c5bce3f0eb5b2feffa315ef54219c13e7ef71c22a8412637b8656412251663d219e44a5408fe9c67de990acb78e1f5d7ee5e", "6124fc5eb3294b2e7df1dc5d782b8d32abd9eea95960bf0ae1c7ffc69dfb7b43114cbdd53faf3fa6c7ee94985ff8850ed8b5d97032f244e7b7ef0a93fb96b2e6" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bn_t sig_s = "39c982e2a4f560c509055888f60317e6b5bb61d594d7bd4f5897396bf3e81a09cf703d319f9b4a092d46d5f202ff5ddb776c57e8ede8454def7037b541c97436"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a8a4332448ab5412acd653dfe8ee86f62aef84e35ba943c10fbd48b5f742e967e6f87c3368fafc98b91c9666325beea447e3e183663c120357bcc7995872692b", "2eb3bda980cc49dd43dee93c36207a1c5a4f175bb68894c8580309dd53c52be93f83d8773021cbcc3997bed9bea31d59cff289a2eccd91d77729088a576df68e" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "03"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2108b578e269291f18e0ad4ffbf46b5fb70180cff3f8f1379dac8e0c5975c2f39df6d2a171c2fb0e74f9d901238f24ae49d10701c2b74aa9eb962f828b0041be", "33fb21fe717a0cfe6383cf1fe8ff97364a6d7c9bb3818c53b2ddee281f426e75209f5a383b94270c5a1b048ed0261d05a1e9588444aa67f2a673e79662b082a4" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "03"; + bn_t sig_s = "03"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "68f0f8e122502dffbf6771bcb0591608588bfecea43dc1a58b261d30a8270ad9d499600fdbb70c952f677dbef8c2be99edf623e72e361494a9b2bc82e5af390a", "39891d25ad7ef71f2fc3a988e12a062ec4cb46cb1e531aa088c59e0d67f1288182dfb36827875e313bbe55928711be4973a6b5679d84534def18174e8de73a6b" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "03"; + bn_t sig_s = "04"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009fcd237d81896bd8420c064174be7a7deea1cfd721b41e488cbc5f7e32f51dc6d21b12843dbdf617f71d7cd6b40ba95321abc51b527327fd2ba3ab51a820061f", "5dfc710e4f441ae605d43727552e61911f931c476e1f8cdb98838e5af15050c8831c756033da9054b1e7f9080642f931065d37d92960127dabc2331e19efa41a" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "04"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "431b9ded11b338dd6d7e3e3fc88296a528c4e8d4a1ec1855a17a343dc5e8741c96cd38d1335b345cb1c1927c314c74e6eb8ffcdb81eed1773addbbb78cf41192", "797ac0a765da003f24c6918121a94cf1df015e85db3013d1c966d135ee9ec6d971e21c528bee4d933628d2af1e5b00463829304c2dae6de3bf0629026691ccee" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "04"; + bn_t sig_s = "03"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "42563536538029a5a081c170e02eaf83947fe2ea40faf05c3a23d93f9b98da5bffaca67ca826ca3617a0d5f2357c5f60b4afc2ef6b4c8b9039aabb70b0860244", "1903cd547bfcdd0396b07231511bd91e610ae6874a424d3b3a3cde32bc758f675105d8dd1bbf9546c62ef8fd0a113e76c0bb8b7880a4bd96b5f173d3e5628094" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "04"; + bn_t sig_s = "04"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008a709f6146e9de549c4d59133a453ccde6679bb6c6a291758db4ee83fc89f315ac32dcfc3ae77cb39287511aa831ddcf664f1577dcde4f12d2556b4f7698beeb", "1d8aabf91a21a9ee025ba85f3a89a41067f4b1d0e09dc1b7844c9721dac810bc4beec1c4d0258946a6437cdf99fc383bb352414e468289137805f7a6022332ab" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "04"; + bn_t sig_s = "05"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r is larger than n + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006d"; + sig_s = "05"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "715b337b1812fa6b5a3173f964ac70a06e302424367213595eeea9d64c2e9811bc8b40c8477c663a3d12bf59af7a9ce93982cd1d97f483c70568fdda61e512e6", "27a24ef8671ec0744adac64d255292b94e1e3f92bef51746ca3aeefe2e6845054cd9a55ba09f4288073982eb5fc15c4ee43062a5445bfb542d554812447f40c4" ); + { + // s is larger than n + auto m = "313233343030"_hex; + bn_t sig_r = "04"; + bn_t sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829cbbd6f0"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "16836b70746ba1c6d721e75d530828adada3886af4fb3c798a982752d1118aadcbeeea6a5c90279feb69baf6680ce9027321007fb1939533d2dd1e896085047e", "1288d237ec4ac4f3585dfd3776bcccfde8590f885656f163e020fc757bb5ffab942e3d3a616c4f70f8ab6fa8fea479af87c53619e5209aabc0f0e8141b870d2c" ); + { + // small r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0100"; + bn_t sig_s = "12d5e9125cc71fbeb86c217e09bd92b646c6dd3a1be1d6a6ed4d80267127e4b5b4bc4aac7d5d3aa0033114c85aac2a1bff3def001d248d0a5483dc2ea66f5ac1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "391646a800d428f10082788537ba86d9647ed70ce01ca4c09b5de354d6a943750dd6a26e2eeb0e31f6506ef6fdafd4b79cc0da7f56c5be05175e7e3174aa2795", "34d3826c56a357373935a261655859b1046c871d96aecf713f4b141b6bd12501b4d1cfd7272d41e80a9f10ac77489afdc3cdc777f2d7025108128e79e3192499" ); + { + // smallish r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2d9b4d347952cc"; + bn_t sig_s = "76752ce289c38f22de7f75d0fa6da056f473c77194de931d97efd65421ff3ec82c57a6393a42702e14a2d831768865ab933281abf1bcf52a7ef6b73f2373c9ee"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "07ba599b5247925c0e5e15dc7c838202342587960050ab9d8d112571e6e711f3c1ba9f83d539cc686dac9b20b08a4321ee1d08ae63728ab2d409aefff0664344", "72fe2c52f57be9f02a0d22f1e94be05dce87c142d2f12967e6f9788076bb21dc22470c25c32a67fe9da038af50f40c8c4fd1f9d07618707e247820629d385d74" ); + { + // 100-bit r and small s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "1033e67e37b32b445580bf4efd"; + bn_t sig_s = "9ce766006a5130005e79caddba04302708487a27823bd1d3d9ca0a801f4fbc0b83126aa1911ad44afd6a770c753d619fef707e7c773f467de5738b35333893cd"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a0eb47a9c20d71c61da673163ed0223a0e096b66f6763d7b42585656523a832e930d0be222f816f1da71ceace27b1d36ca7c249fea61a47e457ccddfd3f0965a", "68987433391a708a51b7c78d892cb0bc7e705343ac177d47399068abeb84dafb730a19bfe13f7e574daceb19332263654cf5fb4ce5770b46b7642dd8b0327216" ); + { + // small r and 100 bit s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0100"; + bn_t sig_s = "029c0de2216bab72af9ec823411e7ee444482bc268ae1ba9064e04019609757d95b2e0c5a3fde377a87fcd38b32f8061bd3dc81cbbdb96ca626e6582ba61dc31"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "732aa5b5f14cbd50406f6982a1eb8cbabd0581260425d2cd969af633cb8560b6299c495ab6fa1dafeafe00689c12aabdacb963f36068cb3fa40ac35faea90e6b", "008ae1563457bfde7d84aaf4f084e7058bd085c6063e5b6b99aa599f3e6a11dc431c0f5485561d4a94dd852b102b4ff11fe2d02f6b6fa4b9807427ab495727d4d8" ); + { + // 100-bit r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "062522bbd3ecbe7c39e93e7c25"; + bn_t sig_s = "029c0de2216bab72af9ec823411e7ee444482bc268ae1ba9064e04019609757d95b2e0c5a3fde377a87fcd38b32f8061bd3dc81cbbdb96ca626e6582ba61dc31"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6ca94d867e1b94d0f30319dc9405106115c88af86d0d72dd9023b28c1ae76b69772c8302abef68064eb2c4789a6b5df92dcee1b34486b739d79dc8882a0d46ca", "1b96058d8e1cd1d3cf66ba127643ed4a47417ad6428d7288a04c02aa64930221b509ce4ab53d98161c95b0d761107301c78122c3b8cc2accc683aaba840229de" ); + { + // r and s^-1 are close to n + auto m = "313233343030"_hex; + bn_t sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca8ffe9"; + bn_t sig_s = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "499a272982a1edbefaea51d0ecce321c2ca7474e27360b2d03b8a2c0269eb368b7363f99390e106e9a5eb1ff9c641286fb3d2cccb043b24cf3cff96520c816e4", "17ce9c494a47550d32b6e474aa0879c6b3cc2d32cdc122d1651d979e2675d894c8fcc2b55a0a5e3b12b17867deb2528152cafec20957355419b539d7c984f5f0" ); + { + // r and s are 64-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "9c44febf31c3594e"; + bn_t sig_s = "839ed28247c2b06b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "75ca0c0a729212101eef9cc65fed0cf69d0f7d37cacf824c9417c2cb771814b6d73130f7430466de398cc8b0c94f4e5d03b7124e0ca963f54bdeea0161e7b5eb", "75c61b3e7945df56aeecf4676a9f5c45e666101f95dd4a5aa7828da1824b18f64d1285a97cc6a3f3573387fd4933ef16284f0225e215d2c889491b92f33bca2e" ); + { + // r and s are 100-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "09df8b682430beef6f5fd7c7cd"; + bn_t sig_s = "0fd0a62e13778f4222a0d61c8a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "32b4b24f4dbcad98a942be6e8467a5a5dcf9fd85a8e8f8437c542a3246d9eda2f8e49a777bcdaa7eb5ec899d120023db9105b17b4c5f0c21a9203e5adb794c13", "00976116e1d5bae1d444121504c15f45019d58a20ad30ae1e9a01ff68fc18dd4591dcd6b308623a492f68855692204452a70d54a46e64de0795342796969aa2e8c" ); + { + // r and s are 128-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "8a598e563a89f526c32ebec8de26367a"; + bn_t sig_s = "84f633e2042630e99dd0f1e16f7a04bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6d47c37b043570c2fea59820a1e2d0419494786296c8bd64984834684abeb9b56813fd621888591cbb8781d047e8316c5bf8290537a0afa20201993b55e8855a", "00962bced333bafe282dbdf34a58ae77a53c8d84b9a2c320d5561c234295726fb2702ff4864e0b7c9e801eda146f29b5f49bf896f4672818ab84dbf8214bef50fc" ); + { + // r and s are 160-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "aa6eeb5823f7fa31b466bb473797f0d0314c0be2"; + bn_t sig_s = "e2977c479e6d25703cebbc6bd561938cc9d1bfb9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0090e3ae71e1b2358fe478d0cb55b8e54b210af34ab028176b7797ab63e579b951d5f9a4e581c0f77971b7d9059a04a2cb03e7fc49913de3ba3a923c7d29455829", "2692ecfe7803347a9fe8d4eeca571f612607ec57964dd537c8239b77d2c74cc33ec7656a85a5000af9ce8b0083090dff7cb45095e99286072410feed32ea86ba" ); + { + // s == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // s == 0 + m = "313233343030"_hex; + sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + sig_s = "00"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0a12e44f907e383609d8be931c5f6035ed981a082551fb5def65fa6181e7c662ddfb7a5ada64659e07c5f600ce627681125610f815a54e5aec51f68a66e8d2dd", "693a63ec1662f9feca7febcb36debe96a4d287dab703ab7946dc88b235c941dddde87df28c13fc79788965b6b781ffe7803d228937716f8636f9102b1a74a99b" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "0cc5750ba98b8e7fe373e57797c29f424322828b5dc9a2f78ef8150cdf0266254ce9967b1197bac6caafdabaf5eb81635809ddad42495d1fcb934cc443dc941f"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "15ccb7ee9d1d18384ac0d7b707bdc8df6016e4401623a29f46648bce2482edfb52ae48d635e7d68edc28bba0301e1c422ccf8184d0010cae0cc1ff579d3f90e6", "252cbc1d76126f524c2837fe138747ae9cc55b887e51c0b92caebe0be60ca11b8139fb2d93ea49b7c6c3d9f3b12d5045aab4efac21b7fb24b9ff0aef59de85da" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "296bc6cef75ce87d064db7522f1a440b4df4a71e233cb176ad7b0514958b3cf97d3eb29930a87701e4ed00e96de9f0d5e4fc134995b44f08c4c30e667778865c"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5ec8bcbc925020376b025fdd739d5e299d38bec3703f68e213c29a7039d6b4fcbaa8a3fa40e5c645b61b1c757ac2ead75b78b5a64a520a5a14cb1075fb4ed316", "4f0b4b4250cd82ec2a0f7427a2ada3036ba4889e58e2cf9b074c5f75d78a4279672e3a8ac27bb1c7c462590cfe1338712263392095a72bf75f2ec48aab7b15e9" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "189799adf4d3362bc1ea2f7e331b2d80720506236ff2c692edf712dbd287712420afca0e56d43da8ae915767fd24836eb92730845ea132514d924daf2faa3139"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a128b6338e2802ff871139bcfad8b4f7fc20fe0a550cb42f7f32160fc8e6aa6200cea796497e8fe201a1b472d5d2e86eba2be0f5c73c06d29ff843817d69cd26", "3383dabdddf8cfc448b8b5ed8664b8b5b9ac08615b6b7b41564805e8f4145b35bff3bda870400f1a919249480c4b1236bab57cfb6646207b3ac944cd57a60cb9" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "392843478a101a81338d7d41071f557c9d4ec593a0698af9842c1cfb17ce21d7534a7c34c40217fe9271983a9f6304d906299055a791feea1c579ff1ca499b3d"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a3d7dabaaf4230212287cb854f8c95c12b86ba1aef6d44745e832709b54c333f10128a17f4989c36f41685ed329f229312e9a7fbc90fe35c87f0dd950b6d1170", "009bb32413f77bb23fb7fd2f5e9e51bafd7fb351c3e03ad1dbb30760de7eb3549593f027d7f1e116797a6f5f834b75da1fe70d995e6383a8442d18625de5dcadce" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "2887c685af0b7e900a0cf73e59ea4da1198f03f9d6bb8eab7419ab57913db4613af4f5a0fe2f56f2fe971a684051830cf86c1dc80811ccc9ac725847968dcc73"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6069fcc18df17fb063bab2e3e2ed1809da0b29cfc5c0a98f2154be0944a0c1adf8322ad0b8ff328f3ed72e02ac4c270517c135e57613110f1d4e58787b1e40f7", "164705c5af14057d78388f8d5e9ce90c6b08f34283e11af1dbed7eded88852b4a20082d2ae630ead02c5cd03c2836aabaee0a9f66c6a0f8f79b7c50bcd3cfcf6" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "4dbf43f5bd4ec65b0a2ed08d57a895af3f3256999cd1fa3590e01b525268a1d73a6d8e9b005f0dd1ba30696543e50ad6881e2ec16a90a3fb330799c0d33c309b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7df10fbd9bc07e3cbfa48ea84f1d774edafa270515dd51420ee755c6904f249b11fa05600c44139085fb625e4bfe786123ea598aaec7c74109b0e883e9820fe7", "197892d40e00a23ca5e317af480c3cc7ddaadb48a15981dce7ad3ec098fa03f63b00f8002fff3655a655a6e95132b88f133755e0e2791f412619a9fb98efae27" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "2f11c89465684e0fa7be9442d3fbb654f576d4007760ca2e01fc1292896fe32b859cc1c4ae229ada8d7a3a97714f71cddda1d6df6aaea3588cafb4d7fa2aa775"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2046c778a6cab5188f57ea5cd74977eaea31811f7865b13082bb4f8a4da7abb22de6c4ebfd8decbf0f1832e5a515ab8b2aec5947f19aea49f346e5e55f17fd21", "0098a63af50c03e693fd5cc9ed766731f1f85c3163fcbb34cfe9e0956031d9fbf9467c9b57b376c4b44699ceb0ea4fc38be3050b1b56338315bfcb5252a3716645" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "23454a8b6947300e1ec258c437e73c99a311842343a3adedf78c7c07e1a78940d9d384b3578e3a81f1e3b10c6497ac1678eb2b3d0f488eb633909befcd6a654c"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0790612b51d1a1a77eb739c6019db6dc3aabbaefd638f1668eb4ca4dcb20851e5b02e2f5ee0f032bdebe3d6da913e27d78e3f964fa2101cacabe41726189b4f0", "095ce7691c6e53ed25c0db4254638e2898638e070c9fc1d20ffae0f647e35c4dccb44b215d214d00332d10456e653b7f102f3c89643cb5a74d8c84b18fefd76a" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "240fe194ded1b3052326c2d494cdc1e188a0976b58469466db614fac8332c5a5969de23cc01d8a06adff67b70e53fc6321ec787688d6f4371fdd7a24ccc37472"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1d13c0bc4d1d0af5e1f604add1dd6c2338befa19caff0124f88a69dd7c1990172e144ac622008fcfd45f65379eb7f45da261de185e586fba8271406e5ecc8f37", "68f88b85d9b6cb67d4af8014bf17a8e7aaad3bea355850a5362176eba46da028e6487bdabc91e508b4fde4c53d8bc00b7ebf6a6e285b96798a186d2c4fc521fd" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "5398eff2db5e32e09b0a36e53c02cf2b859073e665ebb0dadb4d3af22e87dc2987f4ee0acccc174aaa057e3f48e67fa2d059b04f310c788bdd0b8992bb7eec8b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7968ad6f3e87af91a0f53b63f9b6c4b395bb798147e24ff9a84e597d906eca5906716ee773b5da79ebf2067779b1408dc2445ab39bd88763bd436a5483578bf3", "3834dce5407bbcf4ea5280824b5922f113aee634cd0d92e0c78b8bba62877a2d98fb370b62228824f1be16f1c2c9691597cdf92db2aa49725f8a0b00dbc6b21e" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "53cd7557416ef209fbc9ee0a01e16e6c99b6e49373d5d12d475db5f87729506b6fceac8998666c4f6d42f3da0127ed210e6c09da38f55c4a87cdd758ae1cc07a"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "415d75450016b370b90c69275ac6d7a758a23d93f5ea3fbdded5cd9044414d4938ab61fdfc6976d979d5ff7ee436453a7d70cde4ec0bf7917a6434999dba657d", "3e49c72e842ccbf3059f070b5904b1c0d9f467463f26ea4377b377e86786503e492d97a5f719e5d70c84c9e02898b56c6f6402f807e3f5fa22b053c2009d096b" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "431d863b08aebdbd2e7391372d74d61960e3e52c2c415d51a92875511e1b1abcb4283104f0cd5cc00c15d8ea8d61f155452de73032288972f24566f16707498f"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1b5a565fdb5a88d7d08fb42830ac143823bf3d99d16911ab4326b5d03150381b6fe110f38926e4f7005c548191235bd4058c0621a55643b945f56eeb5a3dea96", "26efaaa17a123b17daddbe540c28aaa0ece9fce58601a0f68996ec2c51928285ad261271212f55d66a2cfeb8367ed7ef252af69a66a8fddd7b1dbd857ead222c" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "258b4b91502c1ebed15fa6c5ea6159c8310fb182c42881f5ca0e402a62e2496e2a2e8cf25f3c6afaacfbf45264fe00531dcff0f09818a23f7162c1d1dc01e322"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5c1c7ee732cfed7f4e2fa6172c88ef8e5572b078d21cb556186f3d685c6259a46bfd057f54070b36ab10d91aa5cea5be8ec2e53f44dfd7cc5a2d528765c4d125", "41dc191acd2790993a02556f20305e90d6867967f48d97fa58b750cb6c964c0144a863026851ddccf903345eca4028c70cc0392ff8dfb70d72a85db16861f411" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "1a4332df67419f9d37cf337de521727b50ef133c0263aaf2b9e34cd2fc01b446930d4b8b4b3d5f626c5c14c5592b564bc8c2d8b93043022290ae36505b4f774c"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "294f046c3ad6b9db41cb578de051becda0458c4fc06bd5a44a8365b2b0ae55d6d1ee96e21361cb9f1b531cfada723781d669073aca667f557c30722f6810c2d5", "5dc5d4ed742c719bf006b04305081c0deb2464caf2c2d35f87ad7d6d243e94d4efac81b3f3ee88130246b36fe65cd390bcb03ae13cf9a4fe7f28065a22e01e84" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "0da99c942e117eaee5c4109d7dfbc571cfc4722696bb5a1b36dfd53f1b70ee797d895a2f7da21aef675f6cb366472f400061a2aaac587be49d1b1df49e79e786"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "43161d4ca58c37678adac8fb5db52f039483b8889fae0b9bbc4aac1968fe263a159c1bc41905e40fb2c232c39258579e5d4ef5746f7871d1b9b61cb6f4325082", "33b0355ae7186ad8adf060bfe3f77b8ed66161a552f6b3f92b92e8c7f44216bbe445fe159a529cefb870f6a1a0a18d1bcb4d9bfd83ee5e0ad27d6a07d79a564b" ); + { + // point at infinity during verify + auto m = "313233343030"_hex; + bn_t sig_r = "556ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548034"; + bn_t sig_s = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + auto r = false; // result = invalid - flags: ['PointDuplication', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3488b8706760ec990c2572cb421dbccb9d9d159d048cdcbd7f572aac75da5437794c50b4df3aed360ab7489e5e4d3e47866fcaf3d232b2ed522e65f0dbc37092", "010e8842bb39fd22a9fda6da380a0a47880cfee6b53065fd4c589215d0209922d4b279bfdfab90a0438bc8af54b8d96f87d1f008f9f6b6f2bd3bb8abf6891703" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "556ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548034"; + bn_t sig_s = "556ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548034"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "29ef741199293987cb60d30df8c1d415a558afb02f962b8d811dd76e0a2fd2301adbdbaafc4a82783ee46ad8c9eaa09401b4e3db7a90f15234ad5b65e040e185", "197fff50d36fd1d4fa45ab10bfe68fbd8e89878c066fbf81fb5258efa8b382d650d47b010fc4163706b835c859ffeb76bc1dc459bf170c9eebe8e4bec5d3f1f5" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "556ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548034"; + bn_t sig_s = "556ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548035"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5e773edd270d21b864d3812440ca86ab71a7198180d443947b4b114c44b9580ee8a956ecbb9eca6937cbf38ed58fa279320e28a6ba6af4881d97db981912871b", "7ce96273a3f4cb77e2180e9adbe450219c2a159fb2e6e2dea758dfb8a7b95caaec881244eb29c9dc8951d4baa6b9e8b73652de8f8825f831a0ffcb2577b4a727" ); + { + // u1 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "342dae751a63a3ca8189cf342b3b34eaaa2565e2c7e26121c1bfd5435447f1c3a56f87db98089d208c89e902bb50ed289995ee7ccf6d6e6b1cec4aaf832d3734"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "225dfebe3b9ec898043981fe213f78daf78620cd1406129a14b3a6c0bba972290a612f8d43bde707a977150d89dcaaea8d3f08afefbf609dfe68454fb50ba34b", "00879c098f7e4b7237c38ad574e09851ae672735a1943412c548b7e1d9418ed18a7b318b860814cec0d2ba2e620b864c0bc44bf15d043b9720f7ba68271aa3a334" ); + { + // u1 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "76afef43c18620c0be4b177a088ec71d210b27d0ebe770ed14a3c7871beb16acafced465b4a088f8b4fc7816c45b231e841be50438f06c72989b4bd3197bc935"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009bc821c3346dae289a3293209fa23df56c9dd912e88af5baaa9c9669f0f12b781af352da8fbdc1633aec700579c0c685c65b799de96933e8e76520b888b48cef", "008e5cd7368e76cb71f89e33a73e1ddcd8a3b9055962622305703465baa4ed2c1901ab8a4f1e654d4494032ffa81d70d9d4544e056f001a70fba1cb8791b20a15a" ); + { + // u2 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7b017ebe897989903d7cc3d349c8d0a027f8ca8ad9111cd6935dc549a9707a302867891ca82b5deea983ff3a2426f8265d77c39206a3fbfdc888f5d5e50272d1", "34b85c363f9d0f1a72eecc3036601eb2453435c8e4852ba69163015ec5fb6418f91e81667bda8f752287c37bbbc5613c540e678c3ad80232598e82b92e654597" ); + { + // u2 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "71e913d0929bd85cd53899c977dbfd5a8775b3cd22868c09e4426886f5775af58e2992d6331b6ebb810440bbaa72b584be768d00b03e91e923afb9ac6870aaf1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1f4de3fb7c9f984dabe0262a1cf2231fe5bff237985cb2aa2a93527de322a1f6ddb77517bd6afb517bf53d3c80f38f68dbd6248233e9a64bd95b2de7676600a6", "04b133d43a3d89fb1a55e445a97e2637e1b4c77f33d2490736db7afc5f5a84bf6a3ba5e208d3cbae6e79a50391700226fc925c79daa862dce8baa9932ee5b0a1" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "11648f7c5e213698d5d89a66b913bc4e38b721f642a0cb0b40954716716d50968c7a829e8802df0ad9834dab93c5a462dddca4d445247a23b44ec38fd66467bc"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008088d1a75da95c7d00cffc4d8d4bb0e15da4b2c38c4e1d85866549cda6af6089cba936176a61b4e0c495885b8b6f2bc9fa6d6141c40e84214d1ff276d96ca9ea", "0c8dc589509e70cef5c2bc8de480eac545b2d790c3bb10d65c07a41dbb7756122d12b69d5dd9b3a8b8e060e1c55f743fac1d4688f5f787406704da5432840950" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "496c71aefa8cdae82bd84e783f1f569d95e5bf053b9828189711de93499df9542f927eb5a8bd0b261430172369282f9a0b990bbf416c2f52cfe68ab789d3167a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "70db1300b5ab6c6d57ec4a631a10f8af6b14fc4dd9560ca0d75496b117e015065bf048eec072e41982020740fa75e24deaa3e1ed2d4f94342c7ab38e4842019c", "2fca27f209fb9274cdce5c4a8240d2cc25659ca9c1201f3401e60514f2e5a132b7418221a5be4b24e5ce65e74f7127b1147a86575405904caee62afcfba91533" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "95e33d9a46e40eeca7c6e7390139d2388f52a5f8382d102d2a3a407c39b21be3914581a55849a41527c1d7ff574c9a6d146895593dc0cadb1b54f2667c8acbe0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "50a8cb1c6920da9cf7aae8599581e5e52994548f39b7a82c1c563b1a50cb5285b3847af87cf12a95f768130d6bf4a61a9c5f8846371efd992ad27034a940ebec", "0aec1ee534d94013d6448573dffa141d3fea180c552274bdce9acc46b2e76b401b3770ff4aa04d24206c26dabda2e3d9221fe62459852b9a83b00d1e2041f2a3" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "4d3b6e932ddf57cd4d16a35e9f3f1572529b0fc7062b1a403139c78809a5e724737e021724c762519e681264547323a66cc3004d84570fe356522b246d8ea130"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009dfb96fc92c1e4c4e11f00d8b27bffbb3d19a8319c4274d247140c934cd3540d1c1dd98ac751c3ca87b7469e5c9cf01c0955e9c0ad726dfb2230c10620f1c1d4", "2fd3afc18ac368f3d26ed1f228422dad8effffddfd5f240d613904a309f47c3719c9d7ae0db588381ac2d9fce282e8d0cfcae92eb64297273f7f7c9a4f1f859d" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "4685cb3fe23cb9fae1d5fc637be5d8cf88ebde0dbd6231cb7a39d4e11d7442ff863c66272b1ea149ba8631e91120b4987b40924df260b45597550476301d08cd"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009e3adcbb4dbd820fb3fbaf1a17274d97ff08948ea7817cc7f72beb5a9fde3f2a44f5073601679f00774b8324be5eda847786d0686b932d3109708ae75bea383a", "0a60056d99747e33e381f318c74a91310835430dff40e92b561fe96fe362df392634d49354fd098a91324e0e0545a1d556de6b8bebfdaa1d2a786c440a68e11c" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "8d0b967fc47973f5c3abf8c6f7cbb19f11d7bc1b7ac46396f473a9c23ae885ff0c78cc4e563d4293750c63d222416930f681249be4c168ab2eaa08ec603a119a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "41703d23344835158cbf8fe91511470f06d893a99964e7ac55dfe5ea8592b85b5ccb5637af7af9366088124da3952d9d4e5f2401eddec72f3ed36b92585f8194", "23b6846b10ff47261391a52ce794c4b42c7b3bd28ac6bd51e9f36208d68ae8f8447a3f0929f9b1a6c41a9fb1b358065204519aa6f24d09d873ad276a5f799315" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "3e63d498f8dcc291e3f22d2099fb5eed77b6b4c43ee7e3d97032031f4d2800f817db0097b6a1336aa2eb5caa95f0f1724732b538e8f7027da874ed1f87b89a1e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0f6a4ab259cd311419b042c15c06bc5fbb8dbfab5598f31c9770af038a9c93bc963c242b2342fe434a19959d61e168bbd3726a81477b0d62b064f3b2c424b182", "0080d8fe3ecfeddf8db3e2bfd9c531f97605fb166ced247e13198cb02eb1057d6a47591b9b77795fce03d0fa760e02b15a1726614802292ea2641b05f5fcaacc3d" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "2402a9a013684e1f6f3bfb8e799f7dfc97c6f5a222bd36af037017e2326292d6f31bd3e27719742bbd46bc909d3f78d15c28f6b529d4ce920b0213f72fe68a05"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "425700671181ad2bca33fa9d71f8b54a3efa244a44f4121b22ec250ce8fb67b0ef8f1ad584125bc218db9fb820618b61c5fdde6e8f14634985da5d94e5715a27", "6956342b26e456467d00c2569f2b566ccb917daaee03cf2703f25e4953b694137f7a7cb58b4417232254813b9edf6ab11b68807986ddea90676689c9f5b2875c" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "5de916cefbc79b77f6a6abdfd15ce7aa8c86c9b1eabe95aaa386a5ca4c612a69129bab0357cdc167891e5db2f26ed3ca4f240c6563add09b9c85be62ab943326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008b6aba9b92f85dc3b29497622fe0870137141474ce6cb05832c790f566ecaa8dbf7d198bca92712a872fb5cd2dac62b35eca0bb649395a0e2620154c6dca98f9", "409440fc705e8daadda01ada8c3288b882f6f74416a85c9f80986fd51fb3e78ff2c7ceab5e543d13cc58e5fe0cd45688ccc10a01815e25790f00009f939af941" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "a22b55faacd9293ed4e8997ad7401de0aed4fcb892796c893618f93f377c60250f011af208a7b693d4c4ba43b5c93e15aec38116e5cb9dcbdb6034bab176cc8b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "392bfc61ab2fd22db9727769cdd5eddfe21f576782dc9b16915644482338b723e10f44492b4d1d3fca5c78bd88dbc4af9c0677d4caa40175ab2200a5c8bde328", "4a434a69e9508dadbf77d40841f27d244bbf07e8eaba153af0f6ee93507dc1d1c0ac9b551d6b563293003c480ec21b4275fa605692f9e78edac7f490975d021f" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "99790e3c7dc88df269fc4c477ab63fb992796bbd7129070395ce55b3fec5b7d9c8c3d9a2c4a6470e6803136debe66be43fd52eacc33960ba0138d2f2c64498ad"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1b0f56e9ab645420b813380530a81643b34ebff1f6fb41dcfab7a68d2efa9e2706632ce05d79745bb5e81a041339ea712503bcb17774a46cd25dfe8b8f31945b", "008a2fd86d337987f2ca92afe7035c720110935078db589252d1ebb65cfae5f9c2bbf0fb7e947300017ff3f2536ff9ea8be03b843fd506196fefae1bfb01ca8b89" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "90c6c67e4eb7f2a5ff0fff141e2c6192761ddac24fd8a17df583b228c60f0f8e8286985380a4d788fb416c98220399b2d0e6dc42a0a723a82711712adb1264cf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1e48b5906a33e435c7cc5c33350650b883bec5a6460af496be207c947402426c8f7bca8748960189701d0e58f88a49ef83fa7515fc884cef8c609f56a09c9c0f", "7dc1165038e113ae4a784bb7f3251f75636ab61885ec344bdf59dfd09e3ca33148b9071b83ad688005b85d7d7f1730697ea8dbc27ffde297bfb86ac5d62cb175" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "4af19ecd2372077653e3739c809ce91c47a952fc1c168816951d203e1cd90df1c8a2c0d2ac24d20a93e0ebffaba64d368a344aac9ee0656d8daa79333e4565f0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a096e63a5e622aea6d59d70a32078f083e5d27404e55987d928abb970cea043a44ace48b539c62566514bf19a99fda8f4a1f653da5d59eb366594334b59fe757", "0a91a26e0bc75cd2fa2ee79db9d557697f8ed30fda2b710cd354e943b4c95b061d2987ef964d47bfc272d6bd58709874799e0a065b053910e19b134d82e91e54" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3661b1fe37dbb7f4805590984e341a8996def8f0ca48aa10341fbb76ff6b3d3e63b9db4d4e0898bea0526fe862f185843080e37338933d48e251270f1f0af644", "00a6218f1233b1768da891330d22f855d6a4c5f45bd86b85618db440d93430c10f12c0135b5a77f35fc2280efaa2738db5de433faac4e1619e466c27a68ff7dc54" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "48d7851b079f620209e8ba05eb24ee515964d37577c7c3ae309ab2bddd7eee7101899d0c6c780111bede61ed1215ec42399409d605eccc9aac4c9548f87770df"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "47b0daf2a39ab562a2f6202be62449b2296efd76919497f02d7bac2a49d087c02cde4d8aecc2cda3ad43a11868984180c636148c1bb42a894701fae30082c68c", "00980852ea6eeefb381dc7d89c1d744349720fc66f583b8e3c831f00a0845faa7cb4c45d60de94e7d444b7a1477e07bd557461484b72ab6aa7b9bb876529e6de17" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "0e6cf68d5be5138253de290ec41bde7dcf96065c280d0a09d9a4888d5de04dbea75038fc061b653340696c62baaea92d5747e50249034c427f2f813e2b98c24b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00aac68d2a96e1ab96e0d645293c030ffebb157f8c09c20db4b36261499d29d6145859fdac25b11a38f3a11cf8be1e4d71b0232c602d2e9e196253aed5ecb92a18", "3930c332d20f4510e4fe4abe8a65dc70d9d8b5f016a630a4761f4a65b61d5863e5e368c97a9ebc67e91a06f2c555a64f50ef5dba271784f118bdc33888ecdf91" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "41b2af78294165d86f751cb82a80327a0eb4c0544a06d4a5719aea4a098f115973aff4c1a8cec2dcf0f5f0fa24190b474a25b9ab3baef7770f68ba9c7ef7f7ca"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "303995ba7f710be4437a20788cb715d5051fcf8102d781ebede6dcbffce53b689fb994da9ac73eae9ffca86d4ec489e83e8605892fbce53ab317719dde26d059", "0096f4e95ef3ff10b79c7edaeb2aff0e46402d1924fc711c2f9f6dec3ae62d474fed8045abec323b4b0580a5d42288338c35051dcc0bd28baacb4ad74c9735c2e4" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "9c5fc3fbf70f16ccdac92f95974408ffff7e05bd0268cfdf862e9beb174fb48ee1e0e10f942d8fc67ed69f7a94c85f61c84048617e67c1cc6c0260e048641a6a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "56071393be95e553a1f758423c222434c48dc09773be20a60f1b6a486af3172ea6d58f49804eeaa009f2a7c73609dab69f1d0c8b115ffe59bf731ebb6ba79ff6", "6d40994998e9fdcd7fc89b44688980e1ee801665cce687390df0b03a8f80c40cdadcbff1464ce4a26ebb26a8bec700a1c653b6e7b4efc0741df372bc8f795e0e" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "8de1ea3f1234690e75bd787cfabe15f833cb7dc65107cdb035f99b0bbe6c60ad6e8365dddbb1f973bc26dddba9e4ae7c72cebd41f471a8bb227d2b3df41f346b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5917cd44a83143aaabf081b2a3d2aa6219b82857c74c37790a06bf8ecb51335a4ae7b6dc9c3979ffc3512dfb1ba5146363c32353b3a699b370bf36a05a538d39", "03e1744dfa2e883bc6fff0332c96fe047203d2251dacf74b2f4575506d26702cc13d95b6663d5f80b19961ac5f9833481933471f682d26ae9c8ba9f5acde98ae" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "326a7e59c4bcf9ba52235a8e06d244557acf66885b64f9238cddb3be327b6205758b60f3203418cbe5b330e28a9d7a360edfb8ddf39d46340d5c2792824b7c6d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "25c8490876dc176dd0cc3c4b31b8d9d8b9d102bf4af91ab431f373ff6c6bb915421853603740148f8ecdc75ccaad96fdcaff313f2df7e94a8d9f380b74ec74ae", "409a723e6a4fe6fadb069b7a17f84afdf36eb0e17e9a9b3c1ec9de8affa5d17c0d38ec5d8c5a1e5f1142516b10053335ccf61cde4afee1357fc624c73b6fdad3" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "3c5d08339f2f6f97a2b86b83296678f7bff61e1b7487cda14f3b12fce6aeafa3f2fb385aea3e82f312a6880efd18a1d77fd7faafaf9d1ecc5ee9c2c0f71d10d9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7f3419e9f74ad96beeda5afbf31358bfeb480bc1f9c0d8719c4840eb68ac204ad72b2bcb02e574e88ebb176793946ee886eed7affd8711dce6b20857f6887c42", "24f058316d5b0650010fdca6ed7db83e16111650fab2c063bbb992c65638c6a034538cc3028472f31e81a4c1c0f3cb37525023332dde8fb5f82e07639cc5ffa6" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "9584a4bdf0c6c8ca72211f589dcdd7be181accb926f2430dc7135abbfa7887d606030c85c72f5a3c05fcc7e0d1fb33afc0251fd33ea04b3b96470bc26ce612ab"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "75d9eecfa706e682ea570ec305154c4de67c956472c219df227f19e48b9338255399fe887e74f927580eedea6063ddc43a9a27ed5558a1dc4e2a16586069c523", "23613fec086573e5aed522c317f6d0311349802b965bcac0f42b90db324cb28700d782278f971653714927310dc286bdf7ed3475281799a0e909408115f43901" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "40197987189f8cf04a951e01c48fa8ae9042f184848f93b215dc790fe2c42ee2d549d8cb50ff3db74b6ddb376a80b2ce3983946b2ed99819856e75ebf8ff2ae0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1121f3f6e92decc48190b516f0da402b8339835c1dcb22f5d79aa87267cfd63a6a855753b07d4544842009852d19f6b1c5fa1a207c1e53a5de419619781d8eb9", "3f43849eb28c4c07bac9118322df9536b0acfcab5eb6a8d7d8be69fbff664f85d3c9949393a06c589f0b3e3bc050d7307796d1909bcab7911b01fb465ab7a622" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "8032f30e313f19e0952a3c03891f515d2085e309091f27642bb8f21fc5885dc5aa93b196a1fe7b6e96dbb66ed501659c730728d65db330330adcebd7f1fe55c0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009eed5f5cacc0b1e1beebedc6e20805a612d53e9496b23ece2efae35efaedaf99e0e9682ee7669c3bd6f53a2ed44767588bbeadfe2075dc0b3b493b813c6758e1", "7c83287f63c98491a39217255700be076ab2210c5c246ae62c73cb978943717fd35a23d90795228f6dee180ad5a7705cc707b8e3996e859012d472296a404193" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "156ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548037"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "47726f17f60c8bf1ba0f8e2542a44514e3a79638db9587e923fc23b127e151ce4ad1271dda6a1514ef729759c32e34dfe9c301c376ed689911c5e6fcfb03f953", "479373f795fe7ebe83f6909e01bd6c9c3077dfe159b1c288b3fc1373c17c6dcaa4f834d0325efd569d980bfb1330f5e064ac6eb2a3929fcaa4d1171ce7d7bed6" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "5ca54a231be76c06c9d987de7bf2ed42cd634a07edeb6e0c580412abe709ab177e474a9ea96245a640f7e6be1d2d5cba3a7cdc41a8b093901a5b8be06420e15a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009d5e546d4811392fd2e2df1dcef201796594983ff33d7a6de9b757b46e20e41fb6af901a11c40d315f950d456877dbb7c938d5489a04c094c536d00bd7b09e6b", "58f2650fdbd597cba2cc1dfbef4ef55807273677e64cb79e9f7d275acfb06c1cefeef754c118bbeb8c4d13b64ae69489f63659892325fe20fa4df7873f528511" ); + { + // point duplication during verification + auto m = "313233343030"_hex; + bn_t sig_r = "1b8e8440bd94752dc603159728a346872cad48dfff819f181f9d53537a80868bff1280acfd2397a846d3259049352bc11f5fb739410c766d1344cbcbc03bf761"; + bn_t sig_s = "a476729284481201aea198dac1a8c53c0c52033b59f95f624355bb6c5e78f00ca023520f6af4e6a114f211779480c12d1e2b30aed4f7e735227fab558c01a480"; + auto r = true; // result = valid - flags: ['PointDuplication'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009d5e546d4811392fd2e2df1dcef201796594983ff33d7a6de9b757b46e20e41fb6af901a11c40d315f950d456877dbb7c938d5489a04c094c536d00bd7b09e6b", "51eb38a900142cbf9d08c8b2447b06afc409573bcd7d1a7036e6756fa0829c548d5ea3abdaadac5722808d749bbcec5c324ba5a60a5cc8642e5c68cf18e7c3e2" ); + { + // duplication bug + auto m = "313233343030"_hex; + bn_t sig_r = "1b8e8440bd94752dc603159728a346872cad48dfff819f181f9d53537a80868bff1280acfd2397a846d3259049352bc11f5fb739410c766d1344cbcbc03bf761"; + bn_t sig_s = "a476729284481201aea198dac1a8c53c0c52033b59f95f624355bb6c5e78f00ca023520f6af4e6a114f211779480c12d1e2b30aed4f7e735227fab558c01a480"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "14f407a71ce36307179845462cb54cd49b37f3742bae9b2d2a4184fa9075efa0f514ad596f2f8201a51736385034f63da07f33f60c55b52f6cb043898fd6e9b4", "6b1593d1bc66902cbea4aef71a1936db819097aeba373a05f1191e7db1fe0912a1d51ac99603c0bd97f6ebcd794ad5f4d73543369fc22da765093cf312e75b37" ); + { + // comparison with point at infinity + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "222c52be9261f41bd990faefa3f53267f5701c5723f52a02f7ad85c216709b49aaa6127375bb6e050d1ae0384cbc03416c56c3e69b45f892bde7eae6ec21cce1"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0096341d3992054acf1844642796dcfbc39e981ef86f02ffcd6aac44115eaefcdca299856e40e5d8f47542260fd1cf494d9f46afbe0491f06f89f7799a5d39e8e5", "57cc3e41c1bdfad20a7b3e87ca179795cb942c590e4ba493bf1e5e5a98ee6d90dcfe227ba2fae5c21e59c720b25398bad83c0d7fc43a225d4cbc465fb82797de" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "9f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850"; + bn_t sig_s = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6c8ffb4ab20f31a365cec80cdf91cd8b2e4f47752f26b245754de63fce3b15aed1666506121e22fd8b844e9c9fab170617b78ad3521069077c883c7758b9fb31", "00a0ced03e1472d31171137eca5a5427fe921cf16d713ea67f433531d66d0b8b63d6170740800f8ca66c9d45cce6d0ff7f4ff5bb209bcb420ba4f6e6c18ede865c" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "9f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850"; + bn_t sig_s = "7a0c02f1c1a6fa1a522a5ba1006bb4059122ae5bc9902853bdb4ddb52b922a996175af9c5b543fc8e5a920c9120d3032cc114dee73b0c0e781a9fdcb022f9294"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1b8f4ea522a9b71ad029fba418364990c9de9571f825d5e21ed70dcb6cd670e06be1304351ca738709237cd8333c867766a0873fe7f6ad88cd5ea1af14c17d90", "2f1f21aafc47a19d095fce0d6f32b469592d8a8b03a6e21df5d3a0364f242bf3fce6cc051514852c60cfdeb8e4faba7cec38212e364d27d24bba593ca8fbcee3" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "9f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850"; + bn_t sig_s = "88b14afa4987d06f6643ebbe8fd4c99fd5c0715c8fd4a80bdeb6170859c26d26aa9849cdd6edb814346b80e132f00d05b15b0f9a6d17e24af79fab9bb0873387"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a3196e7e4ad2e6c45c75103bb9268c78aa9b38f48c8c901120b11201d97b48da9481763b875ecc83d3bfa006c676876a46633fcbdbe920d35f69048229b89f2f", "71cf061f4316648721750c7a3733c1e9f82817b82ebde96e1411f9096c8d7f0839699062955c572fbc1c42bb5cdd5dd074883eaf311360b0da52d7a4b8f4a31e" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "9f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850"; + bn_t sig_s = "222c52be9261f41bd990faefa3f53267f5701c5723f52a02f7ad85c216709b49aaa6127375bb6e050d1ae0384cbc03416c56c3e69b45f892bde7eae6ec21cce2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00903135f5ac15522c5babc5a1e2933c4c561ee37a3e22f758f81a509ea37445877c92be06e5a108ad095c2fa293c281936ae2858fdda85bada01da46660c6207b", "5276c908313bcb1d49af978edb752540565bf268ff2b189f358184066da012523b13e3602e808fee2cd7508df2bb3b5a13bc053b6f31986eac6f5a9788bc8875" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "9f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850"; + bn_t sig_s = "30d19ac71a42ca70edaa8b0d335e48023a0ddf57ea39a9bb18aebf1544a0ddd6f3c8aca4f154e6505bdd40506d9ee01451a0859294ad19f633dd98b79a796dd5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "208b4294376fd0bd63b076a82dbba1aae25540aab0f82bd22dc441c9b9423ab77bbcd5cb520cbac91fd9a82bf09674bd3ed5dd77068c46e457f4f0c0b0060d61", "00907fae3d37db127df32aff0cd688f9b3976e877af472a2890fc358d889f2cfa62c5aeda0acff5f76ed5376e817834ea62ddd097556da74b8efd35c8a4af65dee" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "9f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850"; + bn_t sig_s = "10b989002855ffafbd8c23a661f3b93ccfff4fbe84a23d1a6c4aff4405bdb94c3f860224e205032fdc9a1dc80c7d6b21409f9632e0fb540021ccc42161b70f1c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00aa483ded217e380a5f27f9564a647b3e25d6b51030043420bf74feaca0215759ec39b6cae1246bc29165128f0339b197d92ef8b751e8f215f04d754467c98a1f", "0097145e356e04ccc05dd3adff07967cddc35afff6340045111e91695d7a3fda5e37d15e06f87cb2c49968beff1d03659502844ff47662727d3981100b31689ce8" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822"; + bn_t sig_s = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0b2905a02d1c567f6c08c1299ba811cd56532fecbab2fdf2be399c662deaccb97e3f8993e8833ebb9ac7ce34c866fc54c84ade4de829133063423ecddc681692", "5a07d4db1b5f3c105a9fdc88979bfd11ef4f2c5683b3bd0a2963a124ca9bc758ab7d4b3baa89bc0970547bc2d590339ab00d8b6631cb2e29cf5058e5c3a770df" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822"; + bn_t sig_s = "7a0c02f1c1a6fa1a522a5ba1006bb4059122ae5bc9902853bdb4ddb52b922a996175af9c5b543fc8e5a920c9120d3032cc114dee73b0c0e781a9fdcb022f9294"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00805d6de6dfa77c6b87631334669c839a0639d73ee5bb88f5fd0191ffa52caeb8b97e6fe1bfc6b2905a725ba3f807d59908f66cab666b5bb5f5f9c83451e3c7ff", "00958b3c307f2530ecc9800c491e18d70f9791e46d5877012333fac02c161685630a50559053b14276464777910aa4f77535e7be2794ab4d05d3a00f86fc653f7f" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822"; + bn_t sig_s = "88b14afa4987d06f6643ebbe8fd4c99fd5c0715c8fd4a80bdeb6170859c26d26aa9849cdd6edb814346b80e132f00d05b15b0f9a6d17e24af79fab9bb0873387"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "566f693e8a283584fa9b296ce8be603030deb85e70b6221584d2fb1bf734b12f2cd0baa99d8ebe0a15c50d430926e016b1bbb2b13b633e73ab9dafea50580226", "322ee5ea25de62712580a56ba90c6fff0f4ed941bb9551fc14a2381e7c35d7b1b62aff1af730edc5be994296bb61523f1abb48de1b2c0c428e73861841a2c3cd" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822"; + bn_t sig_s = "222c52be9261f41bd990faefa3f53267f5701c5723f52a02f7ad85c216709b49aaa6127375bb6e050d1ae0384cbc03416c56c3e69b45f892bde7eae6ec21cce2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3ca7d87d19a857a2d5bdfc96eba6d70f972404cf3186244c4921a1e2994f18eded0fc7fa3618478246c7227822739d1f96da3fbcbaae76d29eafb227241aa30b", "1dd667c1197bef0d96285d65a189e5060f57a4af74fc3edd7468684f75eb0996ed19317185012e9cb2115cdfbb44ab77ac65aeb14956c65cf80344750e7d767e" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822"; + bn_t sig_s = "30d19ac71a42ca70edaa8b0d335e48023a0ddf57ea39a9bb18aebf1544a0ddd6f3c8aca4f154e6505bdd40506d9ee01451a0859294ad19f633dd98b79a796dd5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "39d878769e7743e6e11999539989ca1c34eb802a88dd16db7ae28320c3adb34b5f25f0b003295096b7da32312d6426d05515f092059319f4318cd2b751452407", "7a3536dba71c37372a7f0a7e590bdd37d2725639d08e200a13b13830000ebf1813d3fac317942c7b4c54fd02db2376656e212e793669ac89b2bf29024e0c4d48" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822"; + bn_t sig_s = "10b989002855ffafbd8c23a661f3b93ccfff4fbe84a23d1a6c4aff4405bdb94c3f860224e205032fdc9a1dc80c7d6b21409f9632e0fb540021ccc42161b70f1c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0081aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822", "7dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "342dae751a63a3ca8189cf342b3b34eaaa2565e2c7e26121c1bfd5435447f1c3a56f87db98089d208c89e902bb50ed289995ee7ccf6d6e6b1cec4aaf832d3734"; + bn_t sig_s = "1868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "76afef43c18620c0be4b177a088ec71d210b27d0ebe770ed14a3c7871beb16acafced465b4a088f8b4fc7816c45b231e841be50438f06c72989b4bd3197bc935"; + sig_s = "1868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0081aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822", "2cff655b8586919e7eea27046451d909d92696b38f2456f43662d76ee813875fca70bcb751671fe4530355525c7c1d3756b7d3ff8492727eafdd42471d624061" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "342dae751a63a3ca8189cf342b3b34eaaa2565e2c7e26121c1bfd5435447f1c3a56f87db98089d208c89e902bb50ed289995ee7ccf6d6e6b1cec4aaf832d3734"; + bn_t sig_s = "1868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "76afef43c18620c0be4b177a088ec71d210b27d0ebe770ed14a3c7871beb16acafced465b4a088f8b4fc7816c45b231e841be50438f06c72989b4bd3197bc935"; + sig_s = "1868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "30a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1", "1a4b00c74a5a61ac196faf4dc39acd41bf354def0a27529964359132a76f28654248d1ac004d11d811aba0acb9c26d2f4a54012c5d8a9a1e7c8b4a52" ); + { + // y-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "21ccf03c30613238a86518016e8f256b2ed4bf1f621cc869f216ace7d3decedce2154f8baf3708d6b5721eb55d0be0507e9ac0906dca7b3a8b03961e734b7325"; + bn_t sig_s = "1aeb420cb2ac1eea951404e6f5687004a2cc5d371c88e06aa295bc0dbb328c342e343f3c89bf8ff41f6789e0b5401aae73c684ae5221c36d0f29312a28ff2e8d"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "2ca029e929f20f6efb694c6560f57b9e4ec5b492bbf5ddf95b346c63fd9aa4f6a5172eacddc80f21f8ebffbe7ff4a33919c9f6231e99337e9681448656646ef1"; + sig_s = "a3640e0f518d4affa4752e7215143609d6d7321d92ae07da0a684209bbda4264ff41239afd18adf5bc9e35dda17b56af510fa9521a855cd6ef5b4f51b10e8d32"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "09f92592cf37d01e272bf9d79b73fa59f3cd25a356853a50d98f05798ac0cd6146da84526c7476e528daed7d33231f569b5f57e06e951aece14142f4209c0eee"; + sig_s = "0f091d7ab9f6f0d846fb229f3d6938685ea0b0653588e01b8ebad56bb6cc35b61c59eb83cf6b1f3ee3fc443b1fa000270fe390bd2be60d03c79418b3a4a5a1b4"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "30a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1", "00aadd9db8c19ec3c3f57a85021a5a4cba0795c071f494841fcc3c4a310bfd773ed5de729b597d9696ae808f52d4f7e0396ebf91ffe32ec558cb1fc637dbaefea1" ); + { + // y-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "60ca11896c4609553b45a9e6ae462a49b752c85ae18bc317d60b0183d6de68e9f671d19494731d06932e9fad9d366fb2c3e281973441bbd1fba2f41eb3ccd5b0"; + bn_t sig_s = "1341db7a111879dbb638e673526db92303ad65877965acb365df60759281ed81fd56e35642ed04351c2a3ee91463ff2bf1a033ddc1045c57d7023b0941a4aed9"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "21a69fcbb4dd9644ce052c0d33f4a7fd6915a2088bf81764a6743265cedd5538c829e080b371f5ddb11787b4e90d3de7167c98c336a1c3e5bd1e1a7a41b45238"; + sig_s = "a79380a268494a3d249ba117425033ae07c1440fc360aa64d393cc33b09c2a9090bb099efd9be8edd8f7e05391fbc6cbbaddc1a88368d0b4a623c760f6b1c8b3"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "41a0fc30146c44f61e55a67de022532c74b6f798af4140a803700f2802a9556e41ae1168880dd0db4e2599f339351127d10440c402815570309a05bac246fa0f"; + sig_s = "9c96054269d230f674c116e45e1a9c3065744073ea163e38a407faacca3542f6a0e17a98a6cd48d67c1022f282ba47fe9a591a08c0bc16b2e93ae3a587c4d07f"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00aadd9db8bb4189a6d2ab7b5aae550fe8dc00be2e00f4b35b576d6f862c09869210fc82fbd15a54def1442979fa0da1c64408fd8437a60046930820748ecdfc66", "4a59a87eae338d22d0835523156f8f7d934710a747cf192d3e317bc45f0489d6979887c65ec17ab7b5e3da9f4cb110116ef0739849acc56d24e5a3365fcfb289" ); + { + // x-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "953125f87ea07e4cc2a3d2ac3177de2a5add49444f75d98abcee14ee5e1a2a2a0b0a30ddb5cd142185208bf353cd27e15fa3072985849419ee0f7780c60233d8"; + bn_t sig_s = "67affd3ba8c2054b5a21721b97953461b95021764c262a807c4d493efc1a973ea6473c20512d4b72415f59f1389b6c54905b11007b7ab014114ba11a524c5929"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "370f99213c05a38d7da1267bc261bb743bc6f208a0842dafebf182e9db4869bf54b2c43e8d47a59ce03ab40359cb293259044a6a2e5c3aaa8f10fd6110fe3c53"; + sig_s = "01ab8e479ab4a4f33e6c3c294486a68ec241b24ce02a927da6b609a88f9125cd3c4ba46455ae79759d92688649521ef3596fcf3f72551580d00fb889b720c577"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "798d1f0dff57170b5575d1bef0c80ea65cb02b1e739c34f0711f86324a2b3273674508d46705db5d7f790e1780bc7dcc31fefa5792e67f7cc4b96afc714af230"; + sig_s = "1548c3dcd990d435b4d981eb97168b970f7463033353f30fbb5e0327b696eed644e48896c5a587824c72f24db2ee03c8fb43b1d0386d3d220f685d66f735e65e"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "24c10440e37a15d7ec9a3a48965a9ce9380221fc51155f1e992716cd9933d09ce0a5424471877e8994494a4c2ade0a81ef52952e395655157f0b743b3b219e2d", "628fd5ba510f610ee693a1e0d39ef39d91a6248379c622a175a23a5330a88b2d5a60dbf6d249702cd1504561535ea17e1be1b70a41dc463e8e1a1af000000000" ); + { + // y-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "99b8f9d6457ca299b690a0fde913627ce347ee800306a85b38abec6fe45c16ef8d72269b8d68fdebeb345e0b0fe858c8fdfb5aa07061f8df9b5b38145d792de2"; + bn_t sig_s = "7061fd9fd19e1ceae952f6ae8460296d75171160b5165226d653278a79d0d46ce21863bc1617c13f7762c36b2fcbe40b3e19fac13b757883980fe1bd00df9e67"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "2226ad36e404dbb807454d85eba5b2af587bc66d0041e625da3202fb4dc8e21ba4c407f1e3f34f07e911435fa72a93ef83e77f440128903054042d2dcbac94cd"; + sig_s = "1772a3e35d5e8a72a4f59cc08a428ca610a76c511872a75e17d840f51055b51ee203e0dd9d49bb499332cc1f0171e2d17124dc8f24343f777894702b4b570a61"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "5efd45257768d1455b779d4184cc4e537c21907d16918d782122a295e04374c6ec708daf4cc1d7b0ecde364cbca89dd3dcfbe2d8c22b6080d25570305ece010a"; + sig_s = "4a794ac06b6c8cd73a73d8bf805111c4c6cd65b41e179311f811f9e6eef54c1b403be15280f74eb01bb05807ae9361d8ae6195f0305cb5bb7b23562e0b28ba15"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0ba18cc05572424a7a391f4b48258a871a0f6d8216c5cf82446c2d156d5586b4c196da0b2f3a23511b89eff31dd4f0c88dbb1a76c5e4b27c4276f8fbc74a1b9d", "00a28cc8c341ea2e3908ae6ab6825f956032c53e625697f80b7b4ee72dcc9f3cff730349e0d30de410917f3d0d1c8988562c1d55583b47f0dec234fda2ffffffff" ); + { + // y-coordinate of the public key has many trailing 1's + auto m = "4d657373616765"_hex; + bn_t sig_r = "1175b923d0a2a76a5a6f7ae0459a46e24333aa07eba2f8fcb2eaa5b52ac66ecff94bbea2b9b380ba6e94ceaa27e5672d3a19b2b99a8ec153e6a969a3c8598404"; + bn_t sig_s = "75cc576f2d5bbdb19f9e2b2db2f212a27cf315359cde310a1bd654e02568f9eaefc76469f18070a7c63cd1e49d8a6fd052b5d6a6f7dcdce2be07f8176b3a47f0"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "667139a304c529db10f8b3964fcd302b78c36cd923d7b4ba4c7c297749e24e9660be8ffb151f60482361adaa94f74ada0748d2cf2edcdd095e62835e4899946d"; + sig_s = "1db2b428a4e69b570c106d535c1e64fe6783b6fd3eac74159be1f414154555afa9c9c9568eeef65dd6bdc96d120eae03dfe19f8fbfc24f72a4a138c45eb86fb6"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "750e123464cfe1bec09840e97a0ba5e9bb36ab244455c80008aae917906a838d77fddf8362f8996047d4a12ed36b96e80a4f001c57393a094059b58029f08c27"; + sig_s = "2d036fd865f14874342aa2c8fcbc1875b7cd9003b09c9dd827f2ac75be1750546461234b909969275c95c8db1a430a55cc136b827310b22ea83fb72cc7bc612e"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7f3327e34662274aa147953a007f30c2ee1b06d7bb053e8ce1c9b683f0f46563dd38db071d87433b30380434c92e8cb76d603d1936fba1e9317a06e200000000", "52ca478f0367ab24857e788576f17bfcd05e62d20d0fbefd1b2d954b996eaba67819023635e31483f5b0257f89b46a1d2b9cb2420e1cdb940ceaff5429dd8013" ); + { + // x-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "2c178175aa6c06c27c489f607ad06eae9d4d753318ef30d9e31ad56a7d88ece3ef4772e2cbe6bab95b8786d075a9e402da628267abb223bb7a63fee0e8f52ef1"; + bn_t sig_s = "47c8c86c650074e0191ab5e11704b3aa70236029c7844a90f8ca397cad28b4822378e7f00af77760e74d684f5ea2f6775b4b46ec48b31e03a4f21c9e242300f9"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "33624e142ab7bb9699daf2cff761debc4455efd5fba9bccee38f5b1bfca56b4f986df50fc3b75f5e273956904c120211b13e499294da15947812bfa1dcdd5c4b"; + sig_s = "3640e8f89adfe6d911b76d4f15a28be09119391cf4b608786d88269896ce44b8d308a50ddb7f64d0b0a9bf7f7029eb81215dee3d62916771ad9d45fb5bfe4f67"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "4bca1b396468f4dbcf023b9aafdfe60c8c40dd6df8e4262d12b40a8af98f25473fc3ac2b3cc25293552403dae618ff01521c0bb1151423716c1e9dff5faad049"; + sig_s = "76565e9d4c7c6479dac5df1a56b307d76aa03e5a5daaf2536c65c3bbfb38b0e053f1d48b01ea45cf2085b459c274bad6a8a9efabba0dc8c37d6685197fc11d96"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "12482f158e62e83467297b4edad930ad319048283f0949300605a4a2d19f72f924d41e1cc3ad2c246574f4a0eb637cdd386c1ebf4a00707b71a646dcffffffff", "18d851ef92835f7be92a25b988ae8d5f7ed42f312f7c896850a589f7bb7500330d138cc20dc5630a7d525926e8f717635ee72937035736ace88f0c491f31930d" ); + { + // x-coordinate of the public key has many trailing 1's + auto m = "4d657373616765"_hex; + bn_t sig_r = "2891b5e4ce86661d6d4fd0834559a417dd88ce61462456ca245ce7a6b0da8b545e85af3ae34137a351de75d38b69c58895b62d1993d1c41b09056931df84a245"; + bn_t sig_s = "18475d26c83c44b67a720145953e605ab0bf8fc42d59a2ed26654f808f097ec09dd1c2f313018ca7983f75744fd4416054f77fc1c15a52e1e9d1cbb13b1c95e4"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "1663dd047beab782c1d27be3b3c8dac56ec24597a9953e5c8fbf3b0b426ffa5cb2cf5d2597111e2dfd20dec77b6467a0144b700ab90f14cf87c27a067353324c"; + sig_s = "3810269213b9abf636a6b0fd0b266f0e81374e0cf7e3f3a19f8703cfc31fb8a0dee4be308faf533e136392f01c0f1562a912b0cfbec35b61507320c54fce2b81"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "52b10bd0aca0cf4682ec9afb29ad33bd0df95565c33182ade5eef4bfbeb9048aaa561f69a7cba60ad7e805e37289322eb2548d064df68fb4056fcb1278e3c45c"; + sig_s = "7e5544a75f58e3dee93de6b7993eee4179ecfd1c9651952a0d0f7dcce5a4290ea2afd3d898fe6512c525aead31bee49297218be6bc08323ed4f6634759e85143"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d691218", "37f78918506ea9cc14f1492eb66c9e1c4e27f3cb00bb511d5dfdbea6f817a87bfd81de2955fa032f52873f799169cc445cb0391e46e57179ef84d50c85db5c97" ); + { + // y-coordinate of the public key is small on brainpoolP512t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "aa1e7972e1c66c0a9da57d785235733323a4ec87793d05ba8321c1d76217b72403ea7eb9ca8df015d56195916613492703355561e6ea5db6c3014beed7d7851c"; + bn_t sig_s = "9d7983c5b3cbbce9a1b642c644693c605fcc127df878ca35dab2c90eab3755a1a45349e164bad24e71d9f888a0680c4f5fb01db05350c88bbead6a548366124f"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "9255be316fff3202ffda038a193328be99c774a20946fd24908797696b44073f68f15f2d9b6cc28da55153849879dae332224d286ad186d0fcbc5ed7ecce6038"; + sig_s = "38b38835e763f5e3d3f0adfe0e5e1d846951fdda434ccd20d84b00fd3d667ee30d1f0cdd21f20384978cd0228e9d936cef6183fc3aca069bcb34d2e9140b69ad"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "06c16d74fe510d6f621ec845e95613b3b605b68acd5e9dfd0f73c19e2c54ff8a887df0336db80b385f3df3fde0ff7597ee8a73ee81c29d8fd935bb3d992166e5"; + sig_s = "31e1bd918d45e01824543bf42b25cba5eb7f7a39e8b8335753ed45a158dc65f921caf5616502547a5c3416396aeef6a77f851da1a3c98c277d60c9b377accfc2"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d691218", "72e614a08b7b1abf2ae39d7f7d5d5deb7d0899e8b30e80f17865de23781b5ff57fcbbcd745cc65135c4661b15539b4a1cbd1c610e69d550b39258b49d25eec5c" ); + { + // y-coordinate of the public key is large on brainpoolP512t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "52ffd56788027a6feebe9bb2ac8a337f640599a965b0e21f9ecd6ea5339dc6bfc5f87a1089a05d3850b6cfb5aaa865da4f84be5b94759b8c6640e5349b23a6b9"; + bn_t sig_s = "6d284ba24e2e8d3f75004324945a3b436d2edebf7646d1f65279767d2292aea4f6f1b208c1037844c9a5ed76b0d82fd51ae834553422b8d7d4a39727bf923273"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "58ac5cd9e16a0d35fe1fa365458e366cc0b08c4ee73ed4305b1f2b2277b034362a244f41f21bc17f99d0dbd704cb60c68242413a9d3931808103f723d88774ff"; + sig_s = "54586ef4cad8f9a4438a873e6874c3e039973d96c8be7790bbb8882873543bcd978380c6da4204bf1ec518365a69af8bcfd50e1996f2ea72d8316238ce3fe33f"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "73475e6127e457c71f0063f43d20ef66a6cf3474abd0e651fd1b295806da34bc687a19e72255cf651907214757d89240ca7a353ac6338a15455312dcbced3070"; + sig_s = "43b18232dcdeb85c8a66349f71f8a48629d7a1f395f033f210a9f6bb2c1e0642a5d8d0bce2c44e7c118e12e216ffeee8e25aef5d9b25490b30ac512687030b70"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0518ff14ba05188abed0a8c88db0f097b5660aac57e9a3cdbb9c833e2a7f9f613e49956b53a635952e29818e4a8015cb6a150cede636c2558f2d3602483963b9", "009ed9fe842f3ed418462c63e266944ca2747e15bd8f52844d6a1ce9815210421206805c6ed792356ec57d79fa3e36fff23e2fc6370c67bc51d3f8b555c9048d6d" ); + { + // x-coordinate of the public key has many trailing 1's on brainpoolP512t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "6492a8b0522069df794128a0e9a386285a28e2b916dd80a60d591420ca286084f12042ff91647211bd3f1411916b4ccccdd38feab145a1ba629c6c304bcb9460"; + bn_t sig_s = "6b3a53cc89ae3927e94c7ed47add89bda9774ad0322eb9a8963ba4abcb9ee230ab21c34fcc66d08b089b1da29a29a293c5cd2ae4d9ef7378e88a142b1bb298e2"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "91753b4cf3e5c1905a28d61d8ec2a54e8258bc30b6744e8139e2e45b6ccdf35a8a28741b7d36d34383f7c10067730b2bab86d651ecaf4e9af42a1c957224af4b"; + sig_s = "3fb9e0dadacb932a60bc962039e0857bde3efef3a4f85587c733e998ff44f94b54cd7c923b158df27b13f4c2d45791de9a67e7c9c74a9a5148f4bd886f777620"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "082bbcee682526e5c2607206f3b671f9a59047a744b3e76b45a218da6a2821384f53f9081a3791b3895afcfcc3a95bda91ba9a08310f8d6e9969839e0808fda6"; + sig_s = "1686a56b7996d747ef380a623a7d39355b4afe82846a0f31aeff74c67369afaeade1019278b73a1df96984a0f78e2a93d1dfa963c8ff5998f8418010c9c8bb90"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3f89e787b4d5d2599624513530e750ab3c5957dc9aa0e7b08a3e25356818e2037d062f336d4eed417c91bcb11b54b57d54a4f02a72fb74262f742cc6f3404401", "3a448b8e2d0d5a7c5b4f1b9f5b701a9d21ff55e3678ca119b6d7c511ba0aef89f31aeb195db00f248359aee924e7c860b76845f6512a2a4aadc1287a15095220" ); + { + // y-coordinate of the public key has many trailing 0's on brainpoolP512t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "61afa0a615778deb6bff828dab23bacb1579956d03a67d3668ba423614385774224a52c0ea4fe6280e2da16a9edd682eefc1138b9db66980bc4e2128099b7e7c"; + bn_t sig_s = "1165718671968ac217e622df5cad999fa13b84ab499ba6bf6eee73793952272526fcab42259b0b79bc5fbef21d8a905ab204e061c7165a566747ab126db25500"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "28d0f64e58b5a8eceb0137789938a91f8f1d67a827b78517771aaa2bfa2637c89dcb52c55b6d314b98d79f094944c7cb39b87528731d25956c6a1fbe2e1a444e"; + sig_s = "8f9ac999387a212ea1013af5506efdf82bc48c2546fe3b3c981ee92dddbd9d6a270999751a08304e3993cfd94e95362c6a309d4efb23a4cfd5ec74c8bd1ef360"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "83ac5018d2d61f498d6476b79a0d34302d617d8e599b77f01b59427f16ef16bb2122f2c311340258c4214c04d3a9fab263dab78293690e6d20bd80dc23d26ab3"; + sig_s = "75c3c9761a876f288fb882763d30e5fef5a6f78d51055ba3e6409d68b9773c0691303edb0b54eb612c701a80dcece8e789b18316a24ec24d269fa763f2bba7f4"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7860a4743bb48e7793c7f1416fbac6ca0b538210d743f24976af3efda97f28bc95913401ec4ca5e744a23d1a552653ff110ec8421b3de531f3bacda07bfb09d6", "03662f2f2475bbf5e20da48b50169d289c89c54ed0f97bbbc7f38016f1a955cb74c52727ef802055ea090fe1a49be58ddc6083bca3f7c02ff644775cd0027f06" ); + { + // y-coordinate of the public key has many trailing 1's on brainpoolP512t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "0521fe837de37d3693cb79b6fffa29fc56d19ef8a6006acaaad20a6be426dc7e54ce2d73c9a92309bd0cc90de50e38fad692d4d25b676bb72dbd0722b2b239ef"; + bn_t sig_s = "9648e29cb30732bf04591989adf1ec4952bee64336994c39633b07af09c691b9c21c9f66b0d6d1919678d5b95626a20037b53a795712b2fc98419d196d5d4679"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "aa4574e2c4e0ad717ccf41911bdecb0c6d828ce4354fd3ffc374c77e70b40fa7e761c26af250642a1e6433ec8794335fc455249c3b252968748f6cc2ef055824"; + sig_s = "08f1e9a509ebcd609518d9b6ba20dcb39447f9a4773be27b12777c3a22732be27cbcf500555e1d20943f9111a315594be55c9df1d2a7eccf7e3cf12de1f46f5f"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "6d33308ec4b9c24a16087c9787c638ad940f8573e8a3b43efa34cdf8ebd16bc32bc96738c993004a6ac4041277e80c2182745dad23355c1f3a9084d1e1ffd885"; + sig_s = "4bdf5d90681327fbcc38d8e15c699e6928b36bae1c19a13879e9224177e013fa1e8794e609065c48ffc5d722c031d643864fc80d6343a9018fc85d5c4bd47e78"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } // End of Google's Wycheproof tests ecdsa_brainpoolP512r1_sha3_512_test + + // Test vectors from Google's Wycheproof RSA signature verification tests. + // Generated from: 'ecdsa_brainpoolP512r1_sha512_p1363_test.json' + // URL: 'https://raw.githubusercontent.com/google/wycheproof/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_brainpoolP512r1_sha512_p1363_test.json' + // Note: + // Test vectors with flag(s) 'BER', 'BerEncodedSignature', 'SignatureSize', 'MissingZero', 'InvalidEncoding' were not included. + // All test(s) with BER/DER decoding related errors were not included because they're not part of this test scope. + // + // Algorithm: ECDSA + // GeneratorVersion: 0.9rc5 + // Header: Test vectors of type EcdsaVerify are meant for the verification of IEEE P1363 encoded ECDSA signatures. + // Notes: ArithmeticError - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.', 'cves': ['CVE-2017-18146']} + // EdgeCasePublicKey - {'bugType': 'EDGE_CASE', 'description': 'The test vector uses a special case public key. '} + // EdgeCaseShamirMultiplication - {'bugType': 'EDGE_CASE', 'description': "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used."} + // GroupIsomorphism - {'bugType': 'EDGE_CASE', 'description': 'Some EC groups have isomorphic groups that allow an efficient implementation. This is a test vector that contains values that are edge cases on an isomorphic group.'} + // IntegerOverflow - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449', 'CVE-2021-43572', 'CVE-2022-24884']} + // ModifiedInteger - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModularInverse - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where computing the modular inverse of s hits an edge case.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['CVE-2019-0865']} + // PointDuplication - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.', 'cves': ['2020-12607', 'CVE-2015-2730']} + // RangeCheck - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // SignatureSize - {'bugType': 'LEGACY', 'description': 'This test vector contains valid values for r and s. But the values are encoded using a smaller number of bytes. The size of an IEEE P1363 encoded signature should always be twice the number of bytes of the size of the order. Some libraries accept signatures with less bytes. To our knowledge no standard (i.e., IEEE P1363 or RFC 7515) requires any explicit checks of the signature size during signature verification.'} + // SmallRandS - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['2020-13895']} + // SpecialCaseHash - {'bugType': 'EDGE_CASE', 'description': 'The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits.'} + // ValidSignature - {'bugType': 'BASIC', 'description': 'The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported.'} + { + auto pubkey = curve.make_point( "67cea1bedf84cbdcba69a05bb2ce3a2d1c9d911d236c480929a16ad697b45a6ca127079fe8d7868671e28ef33bdf9319e2e51c84b190ac5c91b51baf0a980ba5", "00a7e79006194b5378f65cbe625ef2c47c64e56040d873b995b5b1ebaa4a6ce971da164391ff619af3bcfc71c5e1ad27ee0e859c2943e2de8ef7c43d3c976e9b" ); + { + // signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7"; + bn_t sig_s = "44b42304e693796618d090dbcb2a2551c3cb78534611e61fd9d1a5c0938b5b8ec6ed53d2d28999eabbd8e7792d167fcf582492403a6a0f7cc94c73a28fb76b71"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + n + m = "313233343030"_hex; + sig_r = "b6aff6ed23b6308e0ace840e7557d0366549da44c23127fbe2d3f6771c987375223c7ac494ef54fd71ece3546ddbfdc3bdc4bd0a1659446423027f0e01affa30"; + sig_s = "66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 256 * n + m = "313233343030"_hex; + sig_r = "aae97012103190f7429fe04b940b89dbf9caa70044d83964c3700d241cdf6ddb5a0b5a5fcff16c4825b6c79bba9a40349a51e66a916bd6473bf5116b280e0762c7"; + sig_s = "0066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by n - r + m = "313233343030"_hex; + sig_r = "9f0b4484941d588874db494df23c27d931174122a5627c21c9f3431dc3cd9d6b88403dbe0462f735111fdede917c22ca7d9ee9f7fa627157480cadf737a206a2"; + sig_s = "66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**512 + m = "313233343030"_hex; + sig_r = "010bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7"; + sig_s = "0066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**576 + m = "313233343030"_hex; + sig_r = "0100000000000000000bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7"; + sig_s = "00000000000000000066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + n + m = "313233343030"_hex; + sig_r = "011107186cd1400fb066d93c809c69d2bdd295a3142181bdfdd2f593d44cdab551e38f64afc6c8b247c733dab9d241a0bee33f14c1d651a63ea1c2b962a99a9561"; + sig_s = "0066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 256 * n + m = "313233343030"_hex; + sig_r = "ab43c7338fdf1ad664fbeb0406329bde8137f2c9143789fac5602ec17a0fb01d36ccad49bb2345a5700c0e931ffea5d7957760c2492bcea91673d1a57cb5f1fdf8"; + sig_s = "0066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**512 + m = "313233343030"_hex; + sig_r = "0166297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8"; + sig_s = "0066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**576 + m = "313233343030"_hex; + sig_r = "01000000000000000066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8"; + sig_s = "00000000000000000066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=0 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n - 1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + 1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + 1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=0 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=0 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n - 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=0 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=0 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=0 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n - 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=0 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Edge case for Shamir multiplication + m = "31313138"_hex; + sig_r = "7da11e5b4bb7932135cd91accef8892c4286654a7be7c9d384b600d97900ee12a23ff1f9ae9a4fe74cca185d0dc9f59dc24be03d0223d8feb55b6dde1777475f"; + sig_s = "0686bc313aa5c1923ab0543331398190ca5f22a3a97e963a13cedf688da1dfe4a348945497b21c01c8a17c23252b3e8eac1f9a92d6320eaa324b44807c326175"; + r = true; // result = valid - flags: ['EdgeCaseShamirMultiplication'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33393439313934313732"_hex; + sig_r = "6d87be05958ca5c70c5d296291605021402deba1772f31bbba09dc65a837b09a78d332b6162a3201ca1a30d4162d8f186b2bffca5302333aca14894d5f093fe7"; + sig_s = "10b8b3c90b4609ccbddded275d4249857d882749e4b836d017dbaae05e3a19cf7810632329a02580dae44136cadcf06ca57dfe560e1c1122e2ec00ff04d7881e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35333637363431383737"_hex; + sig_r = "23e9bac3f14d56679bda0bb2f4f19eecaf6dd503649c81149227880f14376d0224193d2b1bda4b08f87e46687dd9141278a399f0a3cd0d002f236d0e7d7382b7"; + sig_s = "9c24fb2128d62e5ddf59bb86b3a6b787b10cc75865e5aeab41a84f878ab3a947a2f6b4b0871af494c130f58bb3957ce03d61373f3fb5cbe97ebedc1b3aca174d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35363731343831303935"_hex; + sig_r = "2d07d8bb6277b78fa448d52e3e1d901ccbdd682930fca9d86959a63b5a792a8aa82ff9bd7da3e4057f402a76e82836aa3da34b6ff6bb8b2189ac242baea2b0ee"; + sig_s = "58ebef50ea30d15ac26fa03e2b065c7ba50f331a5cf240175ff3a6a1d8db400e1597ce675eb32f269b4367011acf3276580602eed7c2938439772e1be1b938be"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131323037313732393039"_hex; + sig_r = "0d6743a7bc904a21d731205fcaa7fcd0018ead446ecc9bafc4532bd0ce6bfa6960159f59b5eb37c750d423c4fbcfb20a718e5655d517b74fff8986c9638f4f29"; + sig_s = "0399d7941fe5f3f308afb8a8a4ff8f2bec1bfe6b910c8399d831eb6221684875f67fe6a2576c86feadf3cd2af147297830113611fcfffacd8a8c8c52cf957ff8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131323938303334323336"_hex; + sig_r = "aabc4bdcc44ceacfe03a96a7939bf08c407d300de446514fc964de4dabf29ebda0608c1709c72244f8d888cb0e556d75828756d11c11be7787603bffc6718ac5"; + sig_s = "81eb84c8743ad6ab78a021a6f55b3ae0845f18307ea18e771e3c4e11b312eb8e530002c95cdb517855b17ea9726ec9602f347e789fab42055e688a558e3fc98f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39383736303239363833"_hex; + sig_r = "4e7f75681dd7cb2eea022e5b86329b25307c21b828c7416916cf1f5938071519cb7da668ec6bc219e72d358732f1c77abfcc61065aa3239419089fabefe396df"; + sig_s = "4f9ec196a71c5c8ed88d7fe1d0038f372ac60bfa180cee2498aa9c0248166f17382368fa2b3b8ce29d50d7a21e91a83ca88db5d4efd073f821a8c5aa4d26675b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3230323034323936353139"_hex; + sig_r = "a0e1c2bb33200254beab5e735c1a2c590fc118540301add7e5491701d22c71293adfeddf4308940fd8a066222ccfb3802eafffe03b2156c8e79c3260d180b3b8"; + sig_s = "9d8482127f22eca10b2792747d6016ba719965603ee8e71f2a39500a2f211dcb2da582d5dbd0c6a407155e1b01085b759c80971cf185fd0a26e3889263a7f2c0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343531363639313830"_hex; + sig_r = "2ee9ca54e2df79d6e06f130189faca801ccb081c43472d4f888aed892df878d12ca14c8e800fb7a75c2290a028fb7d12936499c3010bc5c7c07b2f738924766e"; + sig_s = "558c02bcd13290ff34e039a199384385a44f97ef9a7dcdaa0faca66357ec7b9c1b40ea7a3529f4bb796fbddadfbe64d3e6abfc54c2946f5b1f548fa0877f3ae6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303933363835393531"_hex; + sig_r = "54f45f0bc30a889a4fae7eaa047ea02ca0b9e387d6367801f8bccec2ec7c0ff89d6603d70f7c8e055e59fa69905b185faab437779d62c4d2eef4b12a90c20ab4"; + sig_s = "43c2ca3205a7f8b61f64661d0fe746bd23fd0f264999310a56b398048ad46fbab8a5e3b3e2e16c4b2f03f101573e2f6593b64accf319dc9e2e2e847b06fcdd31"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36323139353630323031"_hex; + sig_r = "8a030fd4ba48d3f5998010c764e869211a4ce33122a7fdc7b8df26763be180f25e068db6c92820be641b8afd178a803360bd197a86cc8ef76ca008443ec4ad63"; + sig_s = "8037c3a2c1cac26e6ff89894a07b3e25f513680fc2e46ed693df96d0ee85b9400cd62d723fc98adca2a679fafec9db5fe078f25f9804e0d0ce16d1a432d194ff"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35363832343734333033"_hex; + sig_r = "3bbd1997802b5fc5d4f2b87b6cddb97529cac1ba29dd29cfff7315b787116d9d3dabddd1b4414995c2269906a7bc1959a06de5bcd4d563042e1741af009cba9f"; + sig_s = "51b3d435efe79573aca8efd3cc1c8a227ecd94eb4079675459b6f4f168b6111c07c633e64e60d43a5f3b0d0b2f4371f68c7cdeb6bd8fbbf3bed2effa2542b0ae"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33373336353331373836"_hex; + sig_r = "8293a545974430b3d7f7e314ab0ef48731715a5f79c2f34b94f120fc0170397130298803778b532ff10020db060d19d931d74856fbf330a75b28416d45af54b6"; + sig_s = "2b8db48308c0b1f621e22c7dc1e762b08508be1a8eb4355f6f9ccb842085a1f664d7b68b1a24bd88f17b16d141b0c1c3a5d7f1a7ef4d533b900d1853bc5a6f6e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34373935393033373932"_hex; + sig_r = "525940c217986b7ef0e18c81fe10063d65dbe1809d726c8a1aa0b617f334891e94c5df14f7b944a1639950a43e98eb6f1c349121d107f91ca7142b7ff62ec776"; + sig_s = "6b3567e4965f2d766fd07280f31f8c77921265f00e719c7c0055e51c85e1f3d46ac93967816130a6532c902543a530e27b4197cfd1478c90ce1fc74124636b73"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39333939363131303037"_hex; + sig_r = "205caef78b7f0300266108ddf4e28b6ec1a2198b857f92b2df58a6d968d3db3ef6469f7afc20c632219ac43139ea08476e1658ad145ce8e3973c674ba8173efc"; + sig_s = "4a7a5320e5e249c3ff54cf903bace86f39b620acc19007413cd13a2df0a1f5984e7a4d18cd8d1297560295d4183af1857bd8e6e338aa3799ca1550635e4ae006"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303837343931313835"_hex; + sig_r = "89f6e2f342b4bc2f004fdc1d0e24a7d1d4cb6b0032b8fa2f50e3f90f3880918f31aafd5022ff74bbe1cc64febabb3bf33a8e714f597ddb0be8067d8a0964dfe1"; + sig_s = "3ad67dd55364c29d4a5b446c646f30bc5e648a889ac7b1bee49b71918c32554d0d95d5a57ef5e7f4b267042fa3025f1323bd7dbd1d60c44e325d4f78c65a4adf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323336363738353030"_hex; + sig_r = "2f3052550c595ed8920a7994b4adb78b8f7502fc066ac47ab4ffbe010d4a5e3e54545279a747d29c61c7d2856b8e47d0040e0713bde50e42e038dfd5af61e891"; + sig_s = "54f8c58893f19fbcf010d227017b88a49cb6fd1ee6ab883d21cb58fc0869c37ed73c7312c67f5ac19bf5bf0abe4bc836ee35b2a2c805c3953c48e79ab8665aa0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343438393937373033"_hex; + sig_r = "8e366955ffb2a7fbc836441492f74cae4552fb0d2496cfe7d8c44b9420290947e29bf8a88265e2c6cfc37d29d2bbbd3d10513e0895e73551e2d7fa80d0697106"; + sig_s = "6311528152bcf6121733867b61fc523e7f01bd15009984ea30b17ec15b8240c13f1ad137df37de4a32f6e3b93bc190959de17a1ba3fe71b03e97541c90a84939"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35373134363332383037"_hex; + sig_r = "38a49f5f88f99e64074f0281ecfab9b8bf02092dbc11b87041bfb561b4b3cf29945ab5d9dc45f1edf41606ef6d2204badb67611584b892993de27e8f6402cd9a"; + sig_s = "97e2da758a8e377a7d682f50b0e30f695a6f6c53e6714243aa9d533b4a9b9877d5d50af3e7a4f1fe6077c7ea704b918c599500afb84d0ba016828aa2e6fd132f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323236343837343932"_hex; + sig_r = "6de29d0b50950a6409d29d2583e6c2d77389740ed0be4ebbd4571e82b5303ca27087ce1327832e9991cbf73308a1baedf97d1f3af9edf35e27c15a0cc003d6aa"; + sig_s = "9a19f33ff3a88ed303fff90535aa1605bbdc006b803a804eb1df092b5aeb9db1be0cb9b676694503e36d2cd3868db0c34896c94cddabd54ec95ffeb6988a7fc3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35333533343439343739"_hex; + sig_r = "170f01e92b69cbf0d3d9e4a5740163d7ebafa7bb8d3835039f140d075e950dd57dfdf1b7b8d1678548446410468cf2898e130c745e07ddff921c5542191caefa"; + sig_s = "a7b5d928be42799a55b05e15758a1aff02775af9edc214214ca89f73ad12017d672e59cd6aa54f18f270e01ab4dbbb2f748c87cbc2ac9081df2e76524da17711"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34373837333033383830"_hex; + sig_r = "8bc089bccdd8843c06d5a79e386c513af51931660db8b888bce5b5bddbbe4c73956a9acbc32e1ceaa5053fc39308dd6451e6e403ca574310667093c6d789b980"; + sig_s = "417c966dc36dba5c13d96701946c86a0683805692f24c012b1a7d571405efd850a997065b19d35621bb4b39c764933849ff7d8b8f7df9fc5048b598ec1faeeb0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323332313935383233"_hex; + sig_r = "8fabc939e7a6c13ac69cdd47f996248bfebe3f8e80deaf9c35e5a5cdca086f9f81661a1a41f69e3595b055a514d57efb2eaf5c1525dccf21736d2bbe89a5668c"; + sig_s = "a8f9b171b3d33898cf7eace35dad6c3fdb998fc409fdb708338f20c9e4b8297b375485a5e87eae6fe68b1139b1fb4a3bfa250f47045f12a5fae945a2abe70c50"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130373339333931393137"_hex; + sig_r = "26f405c9cf5afb29e3f60de672e25016d39666f6b34af54b74562d4ca9e03dd87e2bf020189e5d2faea5bfbae21adece9f210bcb02a7558dad1b73d78b0532f8"; + sig_s = "2b4b0c35057b9524e866625e7df820e15c86c2efdc1cd6c4c3cd4e6eff5d5758bd7f95b8f77e10163ff65b380eff970caaa7ed3bd0a121d3bbff3b6e7a261b75"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31383831303237333135"_hex; + sig_r = "36c5c4720d10a455f4952a95872cc69e5c48e9689a6ea6e3e282c9cba58b01fa3cf64c9c99a6003d424895b996e26072ab6e76b29d1cf1dabc2b276802358ad6"; + sig_s = "81a9e6b79f8055e2bde4365eac153df4003d487b589ad3306d4a49387d244abcdaa09c1b63f0877b15468fe3e14dcf4cb63400a99fae7dce5fe946548e64abd0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36303631363933393037"_hex; + sig_r = "6e684611327cfcd9d40e5252abd3d48fb735885970e9b3ba3f55a10b3878985c548f0c5244619676a0e5c44b4c9b1ccc1a20acce42e50d4d1aeecb4aa6d87ae5"; + sig_s = "7749fd228293ae527e3d30de8f6fae99151e38329a1094c92b347209a4f7b69474ac90f21d56c625f1c76ab91b4c3d12a2bf4ba2826cf00adfba75368ef50c24"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38383935323237303934"_hex; + sig_r = "887fe53394545f107a27867df02fbc1f5986585a42b52195243a0fb7d1e700bcabed301caff3ad8c2af23497b2ac027fc186b8aaf4e6512bf5bea5a357ad83fa"; + sig_s = "a923a3b4afe30eae49b018766da2913c6647d7384178f656d40d010fe1147d786ee50932286c813ea40e5c11555f6b8d8a6f8275145cb94cc041f1cdfcdfddc1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353830323334303934"_hex; + sig_r = "68d9fb181a8450ae377dc750f3bfbf82cbc39347cf5d2526bcb6c3f6343a7451065cb4a7b2c0ed3d68ce320d9a9c35c966c05bbf45b1acd2cfeab33b7bbf176d"; + sig_s = "8538469e631960f5e13f6a3cdbd5cf6e893d0b154f43032b1bdcdbe2c5ff5338cff5223a1f0eae7ca3ed39232219c848fa75b0aa18e318c06abe474730e26edb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33393635393931353132"_hex; + sig_r = "0d0d1eb2125eafaaa47d2e30e0650bc7e5c99f4fb5be1473708d19a991f4cfd1fe319ca73ed1a8b59d4c00b22ee0cda9bb2f00e78f13bcbf372efc0a003d2d1e"; + sig_s = "878e71c2f5d53ac07b2ea1349110ffac6dfdfa2152d3b9fb662f6f9ef4e760dfabdf81ed690e85d80db3213481dabef6dae14b20c25f6f56a360ec9762114bda"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323838373332313938"_hex; + sig_r = "1c75cfcca11661bc91289b25990a2c836869a2fb5bb61a5530cf248918db45883273d8d9d24a492dccc429480eb9d843544dfb8bf96ea75f06e4caee91fc3c5e"; + sig_s = "457a98f6870b4d131f9f769229cbe93e9761432cf4e22ae0f4b35c55123770336784060b747c34bcd3bad3f8970718fa88777b2b565da3f32498286ad00153df"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323330383837333139"_hex; + sig_r = "96bc9787cc6d512a2fda9b3498b04b53f9c03f4060ab0382be7cb7077855196e60e0d150eaaae6099acb9341a15d06c9478afc445021a5ef298f1498bffebd9c"; + sig_s = "8db26e51fbf0d7a5eabc67a7f7dd698d16a97643784d49c7f292481114a01c581fdfc6f779b1cbccf5e8ea595c98b760c3c5a10ffe1e6e2cb101e1a5c8a14a44"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313239303536393337"_hex; + sig_r = "06e20f468d6fce4b5571d6e188f10cea05541d82c9f81791d7e7b2716d92dc57494053712b0b01b346e5797243326db92028e80f1d8e0382b1e63c4d96daa9d9"; + sig_s = "2155eb2364926fc34797923125503cdada9983e6251273e5fe1e0298e61e26857dc412190c7e677760569500f85ab2665b6e88901be861cfce3fa4e2bda55429"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373438363536343338"_hex; + sig_r = "1e2480c56be72a52fe00945fd7c2feefdd03bd713bc3e3d6e6d434d5a2a7a2c8e1b47cb1428b96f4d8589d6ee5fb32dd7d0a767790f8209b5fd3412c0d562579"; + sig_s = "3c0500f7531dc5f0040f0bb0f533bc5bf344fd1f325a80c420435f93d3ca7eeeb15b1a4f4391408f166971c9ddb79bfb68f23c6997c2ae40d66cd0f4fa711217"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37353833353032363034"_hex; + sig_r = "774d852a1df9f3b530db4d0345c3f7c413c8dc4df1c18f4289cbdf39de2d9eb8bd90ca7803c2b3fe8a8eb9d804dfcf0d0bc79211ac199da1c09abd80b0f220f4"; + sig_s = "70fd03a6fb63582bc64128758cc8bffcf5ba0bf154ed421b37e95987d4647ed7a3ede5159ac175f7370a2e23fff645105c4e0d99ddd1486ad6ac5a832903d55e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333237373534323739"_hex; + sig_r = "2e7f63da657a65105287c644cba07b0f986b4b2f3a18c0809dcf8d8ac2169450b2067cc5e0ac3d65e1eac67f3cea3a62c723eee062d30757dcaa9e926ebfbd00"; + sig_s = "61b262a4aa850ba12e31761dcbde8cc7c9abd48852a734b38b26cbb153a80289c4788389b16baf101f6c5da8eec6d584d0ba883e53b6d7d2afe36db83ea951a5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373735353038353834"_hex; + sig_r = "9b0be1eff11d16b6c480a0e17c5f3471eae4fcaeff92487209f0f23c57a7dfabede9756698efc625c77935667a519e42062e9d087842c83e08b976d3b96ea6dc"; + sig_s = "9c9ef5e7760a036bc40ec710ba88e9ad6f8e06948dfa77a26cb8fd6c3b87112dc0d0f6ccafe08fa5b636f429a097af39d569433c933f902516e85871bec30107"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3137393832363438333832"_hex; + sig_r = "7396b49696311d10da5c85a3324bc07b855aded9f556fcef6b3a157ccdeecedfafebfec27e9b764acc84f0ab137ee3016dba85f4564eb9b220641e73671f8509"; + sig_s = "34d85eae9bfd43890fcd2b0511aeaa7534a470d4a610fd592acd0e01784dc6be4ab0fae5ea6faeb6c17a5c2a84dc75b91a05173594f6212f2aa2160f229bd096"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333936373737333635"_hex; + sig_r = "24dc7d0aa89ca22dcec20248f6706b6209583236dba3bc326f29321c5bef77ddf4968e27ab2dbf1882de2985e4901c03dce539d0df1716097ea207fae6b61140"; + sig_s = "6168c1277b7c881766b767083de4f4df82af8ac407122295ece58fa49cc051308848dc380675800a4a4dfd6b813207d8d0e422c232f30bdff7df7d89f427c194"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35393938313035383031"_hex; + sig_r = "2d47ca2c03adbff284031e2c6315836397ba34b7605057526b159e6975ee660ec809ea15f552087b2ab5bd3f718f8f82f9e9ee47f10c7e96cb06a5a7b4b0247a"; + sig_s = "3cb1f5681e4ba1b05b5c9a2c03f0d6bd839ad5bccf4be2ea085b6db5516037cc5d36faa83c67a17cf73f8f75e50ca33fb7591cf24f9508a7eed61314a47d9e54"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3136363737383237303537"_hex; + sig_r = "0af3273b4119624979eab305a0f83e5136ef6a56597c5353d8d76723529403995c45f3a24bb13ae85d3872dc811e008eaa2c5842f49a7c2ec68dc7cb4f33ccc3"; + sig_s = "61f5b236334964eb3ee2c6c6bceb9f2f8ecf0644ce9ca723d598e39472e3d39a993481d27c8df5df2b781d6a022ac489a9199475620d4bab390a3fcb6bf44941"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323036323134333632"_hex; + sig_r = "9d54ccdcdde1b7b11fa6a70fd75da9a2387aeef94882506eb898d7256da4d0ae2ea0cf54f966ed350ce474c74f00aeff42cc16064b069b8a68820ba557b534d0"; + sig_s = "9912c602994781606f987213b4e1e056f3ae17935da059341bba17484ac62e32f2d04b3973275e738876ebb16fa1465f8e6bd26019d96aaa28ccfe94ab7ea94f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36383432343936303435"_hex; + sig_r = "7f7b14c2502a2bbf3f7d1829012637a1e46311efb1b87db41304318250d0d1b2552d2425378dad4bfda6ef1197d7b9846384acfdbfae036a5f732e9497c8584a"; + sig_s = "50693eee71ae5d706105d819089ac948b3d7b4151b0af55436899854d9cc8b7526aed896ae1f3dddfe301962043f4f3ba140864ef8d1bb6d45d5add1325d848a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323639383937333231"_hex; + sig_r = "8c33b1623e10e2f51edc0b96862cd2eaf5faee8ea6ccc985ccdb94bfb141d63db251faf1e7d69ed390a2beb71185db4029f07f03af4ac4aaeaf48af01e6f2420"; + sig_s = "55b0365b12f7d640f758e5af6e2d6a41fc5c56c80598f7bba0990b0d899f22cb634c22f64d7a1e970856b3b31bb013d39f761d588ba14a9583f8387d91d058b5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333837333234363932"_hex; + sig_r = "a34ac9c077538c21f92ab4bf0dd40d9fabee1f409e81cce71bed23d06ba72eb15b7b7a96fbe256bd0c41a0d5e3f0748996c16d742705d9a06c544a4e573c3597"; + sig_s = "4500ed995c2608dc62ecc920ee560590648100e5b89e7f109a2c15a851708953e699499c987c1e9523f9d8985e6061cb9a84e58e2c26579bbb084b9d5d71f3aa"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34313138383837353336"_hex; + sig_r = "639a6cc0c3e50f2457f843c40f1714096e61637c78ba9d847adf0f6b2ece78adea98dd156a91638eeac743971f5d469506fd19e11555fc55fee3f82ae7b05b8f"; + sig_s = "2427b3fa238430e0cd794f28b4e0f2c1d3c83ab6fd00d47a4c630f5f072f961523cd5316b0f8e7a1387727e330fef692890a472495c69cf216727fba3771ad8e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393838363036353435"_hex; + sig_r = "61949220d668cd59009b0069607afac3a3be3866f50b0c3bdbd98e9eb306082b23136fbe6173dcb6b8d34e81a9e038e8a78071635b7bc4c787efb7bf8a8ba12a"; + sig_s = "8426f68e8c7fc3e8bea84d7b56aa2e6bbb2b063e320ecd520d365a066d9240f5daa533daea28d99ca1ffae9c3b9b0e7cd28d7421ba35c305c891034867768b1f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343739313135383435"_hex; + sig_r = "47ffc9cdf40e5580a4a938c3727acf8c37ad638b11c235d05e44bfb0a680a3c6eff57901541be0c60246749f1f0071a8594ed6eba43ea1f92668d54d938c98d3"; + sig_s = "1521ecb3eb408c9860b83bb748afe306c35b93ee6b9e1e584c98d788d04d013de691cafcd0f5d71fe3dc6c8c77ed03488d8b92ab2c2e007ee35ad02c4ddd0563"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35303736383837333637"_hex; + sig_r = "64638c51af9269fb24d8e0974102be6e94bceadfe9cea1a9c89fd778010891845d26e5dc7a0fe7f0a6ea9ea0c1dd7c905e8ce43be648609eaf8494f06050b550"; + sig_s = "9ff2abd8319159bf51c6f3307198d3c0500ad8674f42a91678317342e82ec0781d4310d618694bd8d074650ae64910a24a03598f00168120e530aa60317ad470"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393838353036393637"_hex; + sig_r = "253d7aff8171372196dd152ce3536e65ff00ac3feefc32d790b6ddc85b0cef074a1736bb473331b3814b2f69d20e90050ed2d3ca125735336d15f9c012e289cb"; + sig_s = "3850573a859b7f9b153fe0d95f48ed30877eeb34ffd30e9980f4c42c26e9538f7edfe50d52f8e453af03d4554bca7ab2b3b98d794a317dda123fd31e4ea706da"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373231333036313331"_hex; + sig_r = "7482b5e6bc84f289be96ff9c01ea2df632cc1d23b988f953264100e8a212e77c836fc3f66071d9ec6254341cecfcd8aaa940cc0cc1e26077f3c0a1a855e30c51"; + sig_s = "328e8a1fc140c8791b9d17e1e2dfdceb969a21d2b0245b1cc20766b6b41a2d6cdf9609dda1b1d2c2c6c385986e6c6facbfd68a674860f48fb8d113f577ef231d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323034313031363535"_hex; + sig_r = "6599441c0ed9e2a82f5f09cfa9627b25d50195750723ac18907edea3b588b736deedcdcd0aee44df73f5f364e484b9949b7d7b698fde043e6102cfeed69db469"; + sig_s = "40049f8dd6ee0bbb4b9a29f2eded3c8bf0b10c8bd3be6bf5e4f97f074d716865fa824f51fa79ccfe791d5df6ad7fee6bad96ac5bff21a502f90ab80e211253db"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33313530363830393530"_hex; + sig_r = "74e11c74d4139eb9e532e583cf3edd0b9e0e7b6e82a3b79d8200e8e581deb71b153b961646a76320339f4c1a5f75a638ba2b0c3f065ed856ad0a158e3235c70e"; + sig_s = "6ff940339c0449d6e2403730b58d0dfc8de79bca0df06c5a6d437cc2c1266a468a8aca2a2903c29979d7f4d4f7871a106b31ec485c28cab62eb2100198871b83"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373237343630313033"_hex; + sig_r = "5548020c2a0764524ca543d08e1526ce1476ba976af8d6150d8d2ae47495e5fe68cce98493b50304131df71c1a3d4776a77d5ceb74e47b2a8e650108ebab1428"; + sig_s = "620e2dbf67215f95fbbc92a992f20a4e7f301a2c3c3880b7e891ad484647a97aa00aecdefd03155207a9e459ef745a9d29a54b08f47b81cadbe4bea457eac6d4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3134353731343631323235"_hex; + sig_r = "83de9122ab462722939d851d456b9b022937be85b15eb65d2ec1a48410a2f234e98140f208ed595de2fb5073b2ea494acade8dc5a44ed7162cfe7a70182479dd"; + sig_s = "2e0c938f56533857956e56d79c78fd101ddecb1a9695a56f18f6a89b94c0d3db47429afdde6b682832bf4c0fb849ec7faf729cb59d8e219dad70b7c8e257ff14"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34313739353136303930"_hex; + sig_r = "8d42b3bed0202593ad44a93b43ebac7ee0d9ec1dbc5c546619d5a9bfb5c9cee744a445873f10539b51545ea787648dbc44ba2d27f91eeec59de92f2d71601553"; + sig_s = "985ac4972c7b1223656dfec796cd3352d91d6c83ce330e1dcb1ec9817399340d7ca97457af51c19c6fd0787e6965d4f85ede5c7f507598b8bdd5c808db459e73"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35383932373133303534"_hex; + sig_r = "5b826d16040e448dfb70195de16e97454b133aeb1051373d5111f10814b7f4ad1714b25c0c5661efee43fa9329a4af09607eb66c72b2be2e21bb4d0229e3a1af"; + sig_s = "07f00f3935566f4ca16e346ef5ac47b2953fc8b5cc8870ae638c55fade1b586b37a119015fd7be3a33fd39165564f6117435bc1a20bfd57406608b3b27a91be3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33383936313832323937"_hex; + sig_r = "8f89db5a6d6dc6fe96ec5f95960c2f03a6a072e644d158247d5b8b66e2346834ee11e5ede6bf9e8e0234a7f75ce8644914c585e0953d371c363e2f21feaa2763"; + sig_s = "6601d228f4b53dab1546ebf7673360dba5dc3d59c953bf867c754325c0cfde85b64505fc995941929b53c5566b42f034ba1a09ed96e113961a1a7357a22793a8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38323833333436373332"_hex; + sig_r = "7e6107bc6e5f0d0958789e4b91201ca19d93c12bc4194c8316c2224451f5748bb6fb46497106c613b07efaac954e2ccb21062005b9ef4ea72ce4471daa5a3ea3"; + sig_s = "7f1837827727685de8c8868d9425db06e33f6778b3b4d1e08e5f73e26804a142723a3d68a7d75fdf826e79f791f7a6b0f89a36e579cda9196fdd9f6419f71ccb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333636393734383931"_hex; + sig_r = "3539944e52d0db1fe5e9ca3d4c8d93139a2d5c85e51960ed68e8fb5f29cb108fa184fd66864fed2bd90e0017925c5d543d618e287de43d22f7a94f17514f85aa"; + sig_s = "060a37da2753925c18ba4b97c95d16ce574ce9542e918b4ea2e7f3890e723a375b0c7ccd497cda6c24111503ff948ee1b0975b90b21c0747f0b4bfd354e2ea36"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313939313533323239"_hex; + sig_r = "1339cc85b910c82c7d5a0604427150e325c458cb2de1cf27194546db13cab056c021f6a78f5505e8bf6865f29b36bf67a3c23000617e35f92c8736854c5d72a1"; + sig_s = "8018936e27847ee6819b10458522d78991cde9d08b5e85f2e339bac6ba9afdba19a5c99e2117752345bdaa7a71be57f00e4a2d8db088f350721853f6ea1440a0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35363030333136383232"_hex; + sig_r = "0b62b76886412a3e92180ada31e86c28e288659ee71251b5fcab69fbe3a3ea7a9ecbe513ef2f7e0900738250d2818d255b838dc092f045fe5f90e99a6fc48c20"; + sig_s = "75255debf55318a265511e3f7bdf647c88dbce185ae139050c437154fc4dee2786c440b4f67528a1a343c8f42057e9bd223df64ce757081dff7f16a784ef5868"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383639363531363935"_hex; + sig_r = "02517cfdd22c2be4c62ff72f0242f844cf137f230b41bd1b968426d75fd01f2b467a3d3dbae156d19ee33498070a672794129965064514337596d1bc66481a1a"; + sig_s = "1e40509a671fbf9638d1d2b242f3041096d6b59d1eb71072068620fdf31953b20a4bdebfb08d248f0d7e34f053e634f43aa42a3863d753147de7368b28a74d84"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36353833393236333732"_hex; + sig_r = "8fef6b52c4d643fd9d5f28fd5204fc5b5b6a3e57e6db9c8eef7514068933377a7f16a069a95bb6f649dd3310922a982211f242093a23ab44df810eb4d744b054"; + sig_s = "5e3862a42fe8a560432d5de042f980613e68f6b3444d7d53526600a505992371f6f72dd1aa775e58e24212a0c26439d2eb717340fd536d38f9148d2136850a7e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3133323035303135373235"_hex; + sig_r = "14be636d9aa0aacb84f1d7d0b88372c0322687767d45239d7b8837d747d60fc6cb0fa7e897bbdb19194c82debddb46ddd094cb001ddb7e025923835d7e0eeda4"; + sig_s = "090d62997fb4ff82896d2e8a0ae22cef6dacf1889bef71805dba0f701d41ac219820e15e915e10513d491b6aa308b35906dc5d45191928f5025683be8a3a9f1b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35303835333330373931"_hex; + sig_r = "9af98bee9911640fb5d58fa0803e5393b772fb0c862ee9f8545d9dadbafb1a6c73c85b79f39d1185f4b2c4bb54e51317e2633d50fc8f75888504268b84f40e24"; + sig_s = "87fb7c8a2d81f7226debff31b4f0a29a08f1f9a4c50e5615b570555ef2cca1df2b704e92e9b8adb44189e69553ed79effe315bd401d0b2328cb065cf10e130cb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37383636383133313139"_hex; + sig_r = "a64a9dadf5b6a57028044e08d788784e07ac98dfa1ed238348e45e95d44f631d9f14abb94643f87d1cf3f9fec5dc2720e429646c0ec7151fb89924cd431c3073"; + sig_s = "115f653a3d327d93118cdd24ffff039da516afa27f37c78735c985973cfe55275b610d7be24969eb531721a0a486194b6b8823d0d70b0dc1fd4c7611c32861e0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303832353339343239"_hex; + sig_r = "95d081c0728fee3f5b11a593395869aa342c260dfa05e5575317150236482d00ee80a6f0a3a25c0c8e3a6790014c6747d8b5ddb081328bd53e4c6422c623d795"; + sig_s = "98334ddc2a1ed887b26fa23599012b31fbd5fa384db5c0902233c1efe61f85fcce09a9e7fc13fb0253c8cfceb8762360ee5d20e17debbe84a1c8eb68db7ffd4c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130303635393536363937"_hex; + sig_r = "9ddd4ac392e9b8391d766b6f5d26f164ef6f4552d73f1ee9d096b77e3dcc3a42023573156c5954187ebecb2f60ed7a01439809dd8eba286e5340eeb7e184593d"; + sig_s = "166a4a2b9e0ceeab82783c1a7d622dcf7bffc69b85ae41e5ad9b552bf3b687a228cff644d5497ba0a1644c039162ecdfb095d23dda25efe14f48032c6d09caa4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303234313831363034"_hex; + sig_r = "7db0fbddcf437e25804bfa6d476007bb2e49138527ff27d759d05c0b1a3dada2327c49813200cc24fd81f0deefb6061314d06829024f4464591f520d5cbd9dae"; + sig_s = "1753cbe7f6d18e8fc226a950385a43858ddddfba4b57c5c07d581f51cbf5c8f93781b48ccc887c039fcdecd6e65e3e594894c67875ed89e86c44e52d656c346a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37373637383532383734"_hex; + sig_r = "8986b0ea9c57e037960e76d8b539afc714cc3adc90394b96bcfa3f7fbead4fc585133e4f61b7ce3edff093b98c257dbbb497f86dbf467f1aed8d7a7dbfb44632"; + sig_s = "9e7d1fa09ccb4b4d49a2463f12a9f760d3cc0be38e409a3521723e6f48398001901153e141c121500c8ba689896e2c3c883767378920375cb52f0cbe5ae98161"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353434313939393734"_hex; + sig_r = "75dff0fc67964d57ff013e4eb8a7d356b9f408be6f5aed818546b064102270a8147f3ab78b94327b60232fe086222f7ee7c027c6a2f856467922156cd00c5246"; + sig_s = "5972544117567221cd67575428c5c61edfb228b131464927657e45ae8e55625c874c46978c7dd481d2db8ee9cabd1a61bc2447ced2ff9a72ede122dabc6d9c31"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35383433343830333931"_hex; + sig_r = "a2ce4a9661c71f7ede80c167c675860cf68d7ef5400312f2ae050c412ddddd8869ce093b2e11e38495245d04252e44129e994536435210e3b7d1ebb0c015bac5"; + sig_s = "6932855efecc41215d2caf8bbed6f0a2d806d2be3485760dfa8c8817958147e26f6f6bfd91f0874e1449c9745653488c068ab80fd99227b5a79c17fd266b7bfb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373138383932363239"_hex; + sig_r = "1b60263f05e2e818f67941b1b5f5e8668dbba51aafc4dfdf9b49979a80ae0c51f2b1b28824fd9d4b0a2d32b7e6f6e3eac580590752e171bf1ded04da5417ae29"; + sig_s = "7aaff63685f50e01fbb2d727aca66355c7f524b3b0b7c52301cb9b5aeaa2b62385427cc6aac126e1652fe0e62ccb1479b1a48ac7dd8173d754d06f505dd443c1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373433323233343433"_hex; + sig_r = "86039c7f139431e6648bebeb5eaca3dac07ce807b51c68e7590120faaee7fae4280b33b1a4dc979201823b31f150ef2d0285a4588662b7c87e50155d406274a7"; + sig_s = "5ed7cbcb6ba08d0a20514f801503ca84b4a409ce8f55651643013999f8d3ff65a9b0bf2a7c52f84dd2945d22677fa46227a64c7359180fbb4b15033ee8a8abe5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343036303035393336"_hex; + sig_r = "7016468a36f855abbbb4d4d859937f5fae56a4da2c4d2719fa77e111a56cd3a21e9267120127db5a67afe2b32c7b4c3bfe15d0ad44c60c4089a4fe4fa53cdca9"; + sig_s = "7fcb61da561cb7cb8aba8c07e7417423bed2e99784b5f646990014e6872552a07e1034d80e69b319b7cd2c7b157546323df4a2ab8433c623eb0c77d4159f014e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363134303336393838"_hex; + sig_r = "43acf84a076d740e997bcaa35dec9e75df3c0c4f25b2075daf077de60b5b9fb7f784a6027699a216a047a2135a3b530fd8fa0077338d4dc85fbbaaceb6641022"; + sig_s = "807a3cdfc0f33bbe7a5a52f7e4787c67340d958baf0d957d015c73c9c8d0b60f87a426bfd2c9209fa7f5fab1b05a8860857171400714081b6f6e733f380c3963"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303935343235363835"_hex; + sig_r = "851fa88595498dd5a5fb5a0710e02fee1a023e4b4aacfeba03f7c4c14a8fb433934ea233e5d27de155daca4d4e3843f0f2cd586170728a2d4ce65223580cec66"; + sig_s = "1731b6c00200f4474d4ea2046775d9350e45f2abd45bbcc1163c77deaeafc94210985b7466cf61bc78d59bdd2439aa1c7ddac71e0072d73d876a14f3261af77b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303038303938393833"_hex; + sig_r = "78456d3583b93fba209d6faf7363f8e87866cce8f1a8f756520d5fc7d22d369408753373a999c8e5ba5817c61ff9a3a0a9804121a00104c7c15dda9b60bd744d"; + sig_s = "67e149ae6a206d3deeeeaf78f90fc5fc69c0c101273512ad42d5fd3993babc671de9c4aac015310be8eb6d83121b9709b93cd43763bfba9dd83976a91a75f567"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353734313437393237"_hex; + sig_r = "5ffc31a2e8168748c629e0690161cc6249680c03de5cbad44b121aa856f557cf9a84983e493f40e2c0f598738b0f6ec8575b66e4c4e59b6b63996058e4aca2aa"; + sig_s = "41e0857e6e959c55bd807629361ac41dde640feacdc212d7cd2e1dcb9a3a9a4e933cf8e91fc7b1257b7a4f9696283e06e32f976987df86da2c87978b34cc5eb4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383636373731353232"_hex; + sig_r = "31492b0888f6fff52d247bee1734c8425c35606c9d8cc63df382dce5224c8d55ff2ba6cfa29d09500124e8576abbd0d710baeb099efef02fe810d4a19dc2ca44"; + sig_s = "24d3b320def3943ac856680e00891c28da011840af29f4f2c8884a022463a1da9dbccb11bd4b720e72b9afa8b6b871a86f12f875cc1c09077fcc15a90f402acf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363934323830373837"_hex; + sig_r = "8ee3ad5b61de2a1e3a10aaa2b5b7c1f9f790ebcd110afdcc08ac9b70fe7530fda9ce94e44058740e17b7308331ddb0ceb0bc69b949442122713582e4941aecd3"; + sig_s = "325dfefb8f462d5e7dc4124ef0719fef7649d470f3f1555172484b0304e75ba122802d1a8597b462b345f34e17df4a3c25eaea269ea11ef5b042440b5cabb714"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39393231363932353638"_hex; + sig_r = "556b513902291450e9a2b126b858e1e2bb0a23e2ee904677d9e5eac88a25f01408b8f512d91352c43c519d9d74570b3d78366df437a4298b311a39a63c442abd"; + sig_s = "7b8426258789971c56c53d997dcfa1270543bc9f7c42ca2ea2fac08852c472bb2b284aab59a4baaf0f2c986a2c68fd3e6fc91f1d28be9b7577f7784c587f3714"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131363039343339373938"_hex; + sig_r = "60557b793efc6fd8e22f6fb880b9b24f4ce95b090f694fab2866bc18dd85ed5f479fa896d84092dadcb4b9686ad8074d69be8429eaad63d03c63c6217fd7cc71"; + sig_s = "7819879f5105f30ce8efd87c044279ae9eac3255327d9a8b083e9dcdbbda1e01ecbc9ea690bfab771b63318a964942f4577847f571b679363311ce1bd20a2ae0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37313836313632313030"_hex; + sig_r = "96a8b736b4d1c2e40132b0c1dc351c700b62db81e8bb39aa717a1ec0258eb92da819df0117a7047e6c33549d3848d6eea3f725aa39b03222463ff246e8966421"; + sig_s = "6bb7c1e5fde98b5eab976193682cea8648df80a649c2ad68e0b2eda5e2bee9aa9b773f4d62486edbb09ecf434c1ae0dba273f68bfa0f985ced5d7b0120ed88e7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323934333437313737"_hex; + sig_r = "4d9d07d3a45f1c913634713d7ba74ffbd3cd114ae75f178fe7ac7defce7314818b6167760cb6e7d0a24f427d8eee6012b52c683883bd97e351405c937e4f6eda"; + sig_s = "27bcb629e31066dd6a4c65432d39c25add00bfa369d48b0e4820a19f081e9eda977875636a8cf9840122d5e1bb3cea5fefe0203f601616d6aec820a1580590fa"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3138353134343535313230"_hex; + sig_r = "9151eb1014557b00c8f28892a2911f5d67d59396a93da4327d0059fba767b97dedd52e0cc85e0bf8988c7eec231008a0f972d51139a2fe12b75591c071fce9ec"; + sig_s = "aa89b592fd309327e6c911e2df0d95fe99bf01de326a9ff06648a321a363a79e7bd5b051e0160fef18ab814031a07601a6783cc4efc68c681d2df648fbc5477e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343736303433393330"_hex; + sig_r = "374e3d3bff57b2a0f924aa19ed2c8d44429f8f8a62934ada5c0bd83c2ca9ef2538f186f2863680183c51324ef4cac5a945dcb908ac40f4dbcb1d2045cac65854"; + sig_s = "2ba1c3960386177723809dddab3f806a10da5e74c67c9c460b6c4163f37230c355cd4b098aad23da524e1e7040363f4d728fafe4d952ad5ff1370c1010efbf09"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32353637333738373431"_hex; + sig_r = "60f1a5bc4a35f001114e5d7105c21d6e5161adeb5d1d88251791fd08e0192a6fc94ede2109288389b3ea9d00575b66ec0cee5f1e531c05c0885427a3bd65d647"; + sig_s = "5f62c35cfbaa2aefdec113335fc5f5646ed858da0be4852177135d7ee62c1220ce447cb6ab26cbf543215b2c15af42d95a515b7250fb5ed79204a57cb04f6567"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35373339393334393935"_hex; + sig_r = "4becd657fd4c9866fbdda4cc07c4cd528964b120b4137afe1c142758d0480398a1fe6e203b564657c99ef03a044f89c4a5bcfb3cfa6659671fcfa1d8384b82d9"; + sig_s = "a1649256d0c43f7f6c19267741738903d82976cc3a678b480c50b52aea3d493a80c20ffde7b57f9291b22be5b4130dcefc82fee70bc3f1f308ab0a8403828ede"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33343738333636313339"_hex; + sig_r = "6b3f1533f53fda7448a710a4d0e3d8278c96d656635a8ec9c86085ed2337b73368f5c5934a46d59dc79ee6c3349fc78874c05f5e5ef859eab03dd858d2c28e85"; + sig_s = "25cf5a2f2638ebf2e76238bb54dab1e96e9de0d67d5579151e2256c9527ebd4d3857731fae84ab3b56b74bc89c4a99639b0c687b2a133bf77029d5abe4a5fdf9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363439303532363032"_hex; + sig_r = "6ff4be5df3f12cf2cb7816985e9ba0099cf589a2a22367abe019328789ad5092107d12dfed8352a1dd4ad975e861ab9f9c64cb6b5bc98c5786247bdb4ea4829d"; + sig_s = "5eff29e6e20e9ebf1ac602589c5ba64b2020d1f2fee83e6d0c9cdda1af8d7c0ab8e5ff059ea457b903d2fdd48ff84a32e338f0270515fb0ba44c009524ab7880"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34373633383837343936"_hex; + sig_r = "56b91ce37f560c1c6557f7fe0029754f87c8f10d92dc525dfcb4cd5a966be0e8d99fc00851e85b85827d31c861034c20d2acb49e4f1eebd8e0d0215d54db2b11"; + sig_s = "7cec2970fe9f293c9d3a672d3777ff0edf728545bcbe005c178e0b405fe4223aab60dd44521be321672e81445892911130e602a4b8359bb3632f909918e02a58"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353739303230303830"_hex; + sig_r = "49cd57e25cfb68043705184969e309066986057d9c0b7a2f87766aadcf76eda8028d4eceaceced9153ac9760f47514dddd33473af09ff0dfc000d53130a2010e"; + sig_s = "73d534bd76522681e71109c07cb17b09e661c11c519b20fe6db80d47756f844840b7be6b95c5db497e706c5f58c78a350a8e802effbd55b5967bdf87ce75f064"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35333434373837383438"_hex; + sig_r = "680d7c82bbff291bb71f2da532f1a931eb39a222336d5e40657cc2fb126b2247cf2dae233555564ea4424ec37912b37e8866d45c393c6a91ce132dbc9f46635d"; + sig_s = "1f0c515856a62af68f0f23145aad92a77d7107d8d8aa46cabcc72b2c082185db1d75d1546a4e6cf527c69fe52cb76ee15eaa620444b6f272b4027635ebe83676"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3139323636343130393230"_hex; + sig_r = "59fff5ae9729b21c389a12702360aca2575ed4a44922e17de57ce93979f19556de0e25581cfc98c1a68ef001a7f8d157e7591baea44e003c454e941bbf9e5f7e"; + sig_s = "109196a80b32a0a57a7bcd3a6ce7f925d14f51c6152ad866d3373008d650b5af7a25e2bfbd59b6371fffecfde116d2a36a8d1fe9178ba3b3f37c09b271a5b050"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33373033393135373035"_hex; + sig_r = "66ef246c7b80b56e0ea783ac737151c73610218d00c936f4c18d5a6c44f35ee19d8aa15765dffdfe51aaa331123ee4c5c8d67263f695561e7cf7e648efb7a4f7"; + sig_s = "2a0ac49a984cbdf66c59c65dee9a3cc5816b7882af45341e9dc514aefaecd2468cd5b967a53654880046e18e1adc991fe1b7bc0e5379179ba3dc84bcee12c61b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3831353435373730"_hex; + sig_r = "7469767e7512c7d294d83290871b5cb7ec5d6ebf05b2d7651839729b8727818e9e530875e901b759e92c798610d4473591b2cfb87428a2f0b1afb25d25f9868c"; + sig_s = "13aa65ad34388ee102ce4fe0f3801db5f1be38b8f591946ae55be7159a2e047d037618ce45a0980c9f686a7bee7fe8c7882262c4f7c6608596e12900cea620a3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313935353330333737"_hex; + sig_r = "2dde8dae883b5f5b8222b261ff198b0d4615b223735380031e37603d9766c3a660ccbae350d40994ebb49a09d8c902beacf8f0de1ca2b0a4a31d00b56bd845a4"; + sig_s = "6604fde70ac761420133624def5c44b5d5a5795d4412dd73983aef629080ae47636497018cd5d31c8b85b2b03d72171488429eaf4b8247aa6b01044c0ae461f9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31323637383130393033"_hex; + sig_r = "245dbf6c53a2d7881b8d157a6200d9ba3243e4d9c12d3edebd8ff9e103c6158f896ed5bcab43383cf6becdbcf081604a595508172bbf43f152b669c4f41d21e5"; + sig_s = "a1dfaf17a6e551fe0bc0cc24cac5a8214dbd750860a60300210ae9dc4aa160f788dd58b82f9688407551b0a20e367083a1a0f99c35715228c2252f0f0ddb2585"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131313830373230383135"_hex; + sig_r = "4550b986fb04cc7fde0dc85a95a1581794b2521020532dc00fb5ed4b0ebd6834f183f3c62a5756bf5bd0b9a516bc3d6c7e81efe551164b9de0c152938295e2fb"; + sig_s = "485976253d58032d27ed6156ec15cf853440ddecdf63bdb304e1e74d139c1319674664c5aaed9bb3043a6e8aab1ca2e15afdb45d3320042750f9ea8296fcd5e4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333831383639323930"_hex; + sig_r = "539183dadea6630bd4416a49a8d6e7792303e1e44d2028726f84697c496c26daccac5fc4a4ad34866e718e9067c4af1bc9e22c70b94e74f2822fef929e7bad56"; + sig_s = "4abb755192a18efb2e72a2fb4ee51e47db6d3bb21be2ddefb8fcff5e084a2d8c8c7a1f44d04c54b6bcbb957c14a62d7547feccb5d3f20ed20093136d97dcb689"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33313331323837323737"_hex; + sig_r = "208250a2a662f8536b5cdcffa137b83c525512d9e3cdfed020760c1b05b55fc9f66c6d7a8c25bfa475b107831153738d55a4dd07a78192d041692bf535e1ac04"; + sig_s = "3d857ddd8cb246ac6ed21e1dc5368190daa99bf8c36449edd318b27827a24c9ab0314c592617249a1da9fde135bc85e4c4805d05179b40c8cf4edbc0adf19f46"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3134333331393236353338"_hex; + sig_r = "65c639aa06868153b7763ff68bce97c7d9fe2f028d9bea623285214ec5572f641274e419a8335dec43fff2234ded00bb0123411dea843e970bfb8fed4a514ee4"; + sig_s = "3fd4eab53713231e9191906ef0cba9c4cb50fc24628c8f2db1914d6ccec491c780c96cdb1b9be6a63cd379a8463939aa8a6eca6357237fa8e829fa4a38448f7f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333434393038323336"_hex; + sig_r = "4a110cc6aba129603a617f0f83c8d7e9a661df8b571fed8498322d5e448b466f7942e39a56a085303ddb922db59c7dcaee44de094a7853e717a3e928179fbc76"; + sig_s = "2e5484867e70cf9e3bfcff309e89ee1d909904f4b94022ae91177554706122e5c45f9a72aee76410bb844f09f8e66e0eede287d6c365244e7632f478a7530a11"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36383239383335393239"_hex; + sig_r = "39c896c0409967f9be11fdfff9e8f7b08b7f2cf44be471d4ea1e256932344436663a4da8fe28ffe79d277458e9ea2f597a7db847414bb2ad2438037cb6c4a6cd"; + sig_s = "910d53ab2c5c56bf05837429e5e3d08a02d0e602272830297922bc91e29f4f988271fdd60f070eb0aa1e57d742ca75965638274f3cfb2b7b28d1a1462a384fa3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33343435313538303233"_hex; + sig_r = "431701fe9a41c1cda0a23b6c4fffb7128b536bc9c0fa1455d7263af04a1a1d409a96a2e04a56e1912838d4ad45ae9d66db7d9347e160495b4be77122852a281d"; + sig_s = "824cb138a29f22435d401880556e16c5859349bd19f53c5c20516ace4d84c5c600bf61114e05697cde121686921b9774b83b84d00c2cd6b78cc5920c6321878e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132363937393837363434"_hex; + sig_r = "684e6e41e2588506b6ec29b458301a7981c1093300675a9cfec0f195696d35a16068c4e25424fc9b276d84f7afeb39af096effecff09a6ac67327095e2e25c2a"; + sig_s = "1c3080b7f70cebd1930a2b8bf60731e8380fae8a08f0311a27abc15d1105e4aa626260cee865d2cf224ac7a925c4eb5babce2fecb5e20d61f7a5dbbbe33a0193"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333939323432353533"_hex; + sig_r = "4c56b13a81a39cb7f2767b115fb409b9cb9988aac5885b632712b133f23bec54c6fd53318e265fbcb18476717339ea901259fe629a396267741ef44e4475a7bb"; + sig_s = "24fca68064bbf8bee1551c2d00b54a16b50b4821c299e2aa1a73dfe2f81c73c40993166ab8ed9bd8489cfe523e41cf6e35ef7a7a331bd8d2a4db77dff40d113b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363031393737393737"_hex; + sig_r = "682afc3b9259dbc9160119014619375a7d4916bd08a931cf7877875fc777d18a3caaf253c605c1197399ef9372b9f585a5841498565fb577018160f62f9f3b6b"; + sig_s = "56a7e2dc08f6fb561b620f09e830ce6fd52b49da815f9c3e89959b0d2fcc79adfb6dd9f9ddf0ed9e295b728c305effcb4d97efde40d93dc2b6377e9d4f72be15"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130383738373535313435"_hex; + sig_r = "8a6854acf4c80327def8e3ec1046de4f35498df798a916edc84431674d4eb45d20559ccdb8c1a14754de6ef404b5e8a66c3628abacd07e8ca406ddc0d97560e6"; + sig_s = "1e5a07f82bf320b774a460f3ebf53496ef632f7a33d51fa2847f63931fef1311b53c213840ea3c6e70d2846a576599026ac16690258e4fc8edbb1211816fc11b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37303034323532393939"_hex; + sig_r = "1b0605be20e4374b17e4eac26bd2bb957020e1e05108279bd26960de64d39ef2d19cc8ccbe8fd72e122412c2c620cd2c4640268b38df93193b8ac7e0d8382ca5"; + sig_s = "289927ed08ef4e0e5a41728775a10dde8c6cc6e08f9eaba51077c880c5aad647bc2f35def592d0ddd1d3e140b6e756c46be36013cc5a6e5bb9870b5c4dcaf2ac"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353635333235323833"_hex; + sig_r = "373844063323beb4e6a4d282193592df39dc5767519a8031b62d8aabd5ded695407bc4687ac09de93fa38a89412cfe6acb5c09975779a9e41702e18157b84457"; + sig_s = "9262014ccacb90a4b8333b9743f25b89825f3f7d2171e6f3afd82c048a9805745b7812b46c2c5447fe100e3beea0ec3bb4fded3744531eb00c4df1e05d39c573"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3233383236333432333530"_hex; + sig_r = "798f3008a628ad65c7f83ab51f2e7b9e1d1b74cad864334cde339ba3d2d73f13549a18c6bc8f8272d5a036570f45a1cff2051cbc48e8a990c3303bd6df887ed9"; + sig_s = "60a1a0ef92d5c28b6d6afeb2718decb57661253ac5fd2e13639b04fe6d417eeb40d753146fdb804937ac6ba92c8f8bf96a9e0c81532ef03910bf4ce0483bf39d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343437383437303635"_hex; + sig_r = "9582bfa8a212ba8d0852a4690bff7c937bafddd2f8447d850ae518389f20182bf83b00052c3b3dc65b1a70cf216cdfa62dcd17a5adf331a2a732baaeeec0ad9d"; + sig_s = "a4a1e41f5fdbb9000d0f3bbe311995a28af86b9b0334de549882964c5311aa52d87de9626706bb2514c1cf409e9907f4e91e9a49d65524b4dfcba52092025506"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3134323630323035353434"_hex; + sig_r = "4d6790c49c82a7ac06ce84215394c86c7011b1b5f714738b1ad4d7b010d8546763f602c9af1e6748a27d297bed04ebead4bf629043e4deb398a27d4f86f3d795"; + sig_s = "6a6dcf9c898c07d24f13e76366fdfb76eddd4157ef2befa910524934a8d4109c12e01ec45d9fd4978fb2910681e5460371bbfc76528703e8b8a8bcbe8a6c8a39"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393933383335323835"_hex; + sig_r = "65b49ebf5198da395aa182ba31d473129acc2fd65fdc0df2cd59a1c68a527882c922f73993396355bd6cdf4e4fe9c42e1716f66eaf3e0e73253d5f618c300639"; + sig_s = "8deb03cc4640194ce230da1d77aacb007427557f70d4a0ee814812c560865f14f24a8f79393cef1a159d2834d9fdee0a16a85bcd5cd50e0f7c26323036335ffd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34323932313533353233"_hex; + sig_r = "873e39e7f6b7dde5e40ca7fd4b8e85f3cdeeae4671d63218b9f7195445661da0d1f54607599ae7531202ebbae9b5a1a58d37c4a1fd3fff8e96547fdd3f76f883"; + sig_s = "74bf6db093260eff6cac9f06db1646c083e4bc09c8f1755aa302ecf7916979019cad8bed739007970c2cee87d0252cc68f056f710330c65fc56551297312b220"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34343539393031343936"_hex; + sig_r = "0127ada33ff4c6441e79f6014651df82d4d10cf4601ac567d44142b0dcfc933f7c8a2e231d0d290cbf042df6112d6fe16ddd2c1e96f798205cbf595268a94157"; + sig_s = "2235411c90cc9ac1872d238e7c7d8deb0755b3662cd9f249bf3c844e750cf58f90fe908f28b138676ef9cb24efbbafab8d3bebc177a5b32a32d17b91fc49b0dd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333933393731313731"_hex; + sig_r = "8244c73317b53e37473d7beef9f8e5bd31ed801f9bbdb9639b7f0f24e0329c7914959bf0cd2006986fa81f7f4b4002503343aec0465d8f1ed17c97746ed6caed"; + sig_s = "14bc6cc4d155377175ea95c359c69624afe18579014421b66a140e87c1439f7d78f5645d4bd8c027549526865855fff0fc527f493623c3647b5c901d8de4b829"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333930363936343935"_hex; + sig_r = "0011ddcc69dda56764afdbeacd615b3c2950587943716ed6dac7658679a21b2b4cdbe85a5e4094def253ede57f31ef7588ee3124d805abc12ecbf7f55a7cb55d"; + sig_s = "119d722bc372a4e6c5b4e39fdf25816f2387d00ef040d0ad75bda27970001ce5cdf5a2d4dd8bc804219fe8e9715296adb53303b90f2c5c1f3f94b3f5f2fda8c2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131343436303536323634"_hex; + sig_r = "12e59cd484adba7d0fc2e402d6caf0e44a0ed252a891623d2687902b518376efd734a7b7533d797ce8f145028b428c18f5f20443c53f04e604aa311315e9266d"; + sig_s = "47736e60345f1cb9bf7bd117d8cb82c941179f0893a4b7d8762f7bc9322025a564acbd7b3bb47de384a4582f337b809e84c48b08610a3dfd0c875dfe9b8885f3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363835303034373530"_hex; + sig_r = "009a5f640cdaaf26f1c15cfc5c27498a8231571f22053154cc2f52877cbe5cf289c553d7bdf86b1973263604d594e529ab2d1df1066d885fd5a061f638e7a346"; + sig_s = "91fe33e050748bd7d76883a03d5f2976487a0326a3a3c5ef276c38a9ca09962570ecc8b89f931a145497b77a482a731289c2f79c4a7b871928b39e94a1488c83"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3232323035333630363139"_hex; + sig_r = "68c001ac8c8804c0a9c38f18109e26b4e8a1ba18d0fba8547f70e3989f3c510871e80f8a7b314fc521b7c79c3bb3b691560ab9d699a24915fc682fdac1f01c6f"; + sig_s = "8c2fa0a4d960d2688442dbd663e85f46d858faaaff91b7ba9ae96ba6619663780f05950d0ad89b79cd695d14dee57f27bca99f0165f1d4bb123d17b1a46bda32"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36323135363635313234"_hex; + sig_r = "4b1e61394e6c262b1e4a63ea7cf41e660020b247358d1b15aaec9533d587d82425a860dc9f7a8e2b1761393d3fc2a9d1ac433a0662a1e2ee2555fc9c3849ad4b"; + sig_s = "86daeb1961ef422a09f53bfa0e5ffc7f52a3b55e76f0c2ebb7f8b034b3cfaff08c527a15a9f97e8d09da812e395d5c611680b7f651d41694f0b58fe9eb310b6b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6b6763a186aa5159049f2ea5c8a232dcbe6337b0d92e969da52af32524f61da3097fa314ac792234e59867af320478774bd4c785a0330624c0b4babe257f6597", "2e4063e45e13d505e14db6f5fef3538db181cc1a6e0a9381fa3f0321be47f40dc05ab80e9caa3b7559c67535e83d984f3b9557118dde29c5e7a5a4a18d0c9d43" ); + { + // k*G has a large x-coordinate + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000001280f3ebf4f1d42296d47401166f7709f0ad02bae2524eba77322c9d3bb914889"; + bn_t sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90066"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r too large + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2"; + sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90066"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008f676959bfda02d373977a80528b61d4148f8eabc2027fb5b5db5827677d147a728661fd5c546b6ad5f0a89a347449aa2f32112e3bbda8035089547929b56a55", "78c45ce0a688aea390d4e4db4d48d2cdb21865bc8cefd15f2bbae4270ab765a76f049449f17ce1ac7f513977ce0a5237e5bd63b4af92a6cf4918d91bccd0f279" ); + { + // r,s are large + auto m = "313233343030"_hex; + bn_t sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90065"; + bn_t sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90064"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "14f38afbc8d6be59ee7075bdfd2616a44b86535687d05c2347553173cd14df8abd0a4c102c62e8141127dc66d2dcaae38c9324980ede204688bb9f916ba9f1a8", "23f358139316ca27b8874e68b93388f9780d9ba7e23b8421bfad38a19ed161477e0a05380bebd7a1156dc32f69047679fa2b977fadc0c29ebc1ebcea6cc1894c" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bn_t sig_s = "4338ed95ac0d09c51d7044d59f1bc26f8f3f11fc7bf2f81bdf0b21b5c0b9c89bea3cc6dd8b3692c8310b98117b508d130073e74b02b3ba482fb0a5ef1036a3fd"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3df9e586410ba633b9f165d29b073b67a167297cb4086889e52b925a9cb25acc4c85e5b8112221ba49ecc99a0cb7fb3385352a7140072f79c2f44396ee8b6786", "22c7b6185e4b667a5cc427c99ca53fe54f03dfeeca92ba2c1ae1f2b3feebedeaba62ee3ba065ac5303c2d56969f0b341486f29f3b2a06df32830f25999c42f88" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bn_t sig_s = "39c982e2a4f560c509055888f60317e6b5bb61d594d7bd4f5897396bf3e81a09cf703d319f9b4a092d46d5f202ff5ddb776c57e8ede8454def7037b541c97436"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0ad66abdba9fbee1fdd1b9e0db9a7460f460de3916efd16d7d9c6cc7a6cc9fa5cc03020d9f8c9094c0cb52fe1babd63c69ab20f04a116ecee3a009d5acb5729d", "5b4765858f696b61bf6b3a1812d057bee93b143836a764927971fb746141b5422fc077f73caa000f62ce00103502d1ecb0954f2cad60b224ec6fe1033009d64c" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009741c2634e42f1865625a9d97ebc549ac8c67eb6d03cd2a7c5987f0f5164c9be9775e32c5d59d3175de468e243591021ab623f6b09b31a4028639b041684f359", "470ddff173c67c71055f5f715b7b74993800305938bbda89d24b187f4819c30575d5e2275f08cbf3ba86b1a11f12671d2eb009d02516f3d1da0aafcd1d81a0c1" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008b06a77616ea21f14093d3a373a8f57106a71939f25415f6a9aa001640b5ed0adf39fc2f5e58d4233c2eefe4f170499da57e9dceb7f8cd5f38c4181fa7d2f768", "074a91e99eabced1bda358653e09b51eb8b1a9526f5a1b32c7edd3b701f5af4103314971d5c082c5f20053c3b66d39a1cb6c4d310dbe895546892d4296d96eff" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00868406e64e4e37672a23017cb578a24d1c85294304537f8cdb6ea38509843e754ea44a21973132ca70962861b0725b3ccc1979dd608b66023b70e95b0923d023", "5a959fb5bc9469ab5d55fe5392933cba8b413acec2e8235c36d10438d24bcd89370bd4e6ae3cca53a48a1771c5d0d00ecfea7385d2b4bbbf180c50bc45fb27a8" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1922b96f38799a34a2a0d224066af4e9c807b4daf9f26cea3898f133f5e1d170f27b9342cbc78d1ecbce1d928378b30c907d933b694a613dbb9fc2a9c2a786fb", "2d014013a6cf05f66c47c27f62a26496755e8d348ac2241ed557db81a333575897b5b28d9b9ddebe1037e373b9a15786a6baf8c3451c4ee7375a34edac3fe0b8" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "14b0aa4450b941337e7f946739697149c68aac733c86a124e1becccac1f032854192d878c4e7d61602dd3d080671c6f9d1ac473ef73bd6d8b284dc66c1b2eb37", "769f521f4e6322d3e7d59eeb9fc9e130575c358986614e8e6a44ce4d57c7715e13b958a743548c938a3384c6ffe32d3ea51b98a81e5b81918c4a720ea2252eda" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0091dc47e9e1088e3e373dd96bffb4754cb4dd62bd6ee59fb3dda4022e9e49683d02c4606f2e3402008b22110fcfcaa4f06d9e0bb921d495c158edd89889d5cb0e", "06f7da53bdf6589ced48d8f6af92240018f859e3c29c461eeccbdf6ef9b9fc122636237cb48621df6d15a07a43028c7a5e4a99de939d844b61aee2b67acebccd" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r is larger than n + m = "313233343030"_hex; + sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006d"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008bd6529fe910f129d6d6efbbde7a025bb7efc799ce3eaca21dd1e10717e2d8a393265e1fa87b73d92747bce3c3506e9472d07f831e9e3e2df88ad9009ea52b3b", "0b3d56c4b39d73dcd13266292833a402e6948351b85260aec58f82f2e936d53dfa01d21441dd8aa4d5f606d94a99b7db583cc890ce4f6cc685e14738cdc4a5de" ); + { + // s is larger than n + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"; + bn_t sig_s = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829cbbd6f0"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0081b42adaac02a5fd87a04a16ddc2333075778f133ea0af66049c72a06721e3924979249e04291e4b99d4ecf448b3fdc5e56ea23381d6d06e23011965d1653816", "244327f9d59ca6787575bb7707ef2672f113ba7a302d69c29fea6ff66f449dcd3b273b3398481776c2f2a685cb6dde31e176be8f2b785fed313be5730c6624ed" ); + { + // small r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100"; + bn_t sig_s = "12d5e9125cc71fbeb86c217e09bd92b646c6dd3a1be1d6a6ed4d80267127e4b5b4bc4aac7d5d3aa0033114c85aac2a1bff3def001d248d0a5483dc2ea66f5ac1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01a0e00bb4a669f10f594489a42f1babd3a028b5ea75757a986c55f6159469752b88bbe9f52f2422d503a4d9a849c3dad410a6dc4e4e32b95469e09386063401", "574c501128906459a23af93b9830e297f3e73d3173df7807679b713ce6b34f64b1ee7547b927e43105118c496b9a3c1e0264e84b5b0fb459582af98edf0c117f" ); + { + // smallish r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d9b4d347952cc"; + bn_t sig_s = "76752ce289c38f22de7f75d0fa6da056f473c77194de931d97efd65421ff3ec82c57a6393a42702e14a2d831768865ab933281abf1bcf52a7ef6b73f2373c9ee"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0dc4c5639b7690157c210b75e7a006d9cfdf80f9d0b2bbd643036890a8168a88947b197aa9a60047cd8f6e77c0777bb9e09da737dbbe57a977a6ae0707983564", "60b0a49d4f9578273f6e5ab3873194292e893e06c5a39bb1f8a0551f4e01ca460a03a77c35cff8d7d6e0f33b8a88acdc36eae5a83a129bfeecc2a68936883d91" ); + { + // 100-bit r and small s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001033e67e37b32b445580bf4efd"; + bn_t sig_s = "9ce766006a5130005e79caddba04302708487a27823bd1d3d9ca0a801f4fbc0b83126aa1911ad44afd6a770c753d619fef707e7c773f467de5738b35333893cd"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00867dfdd726cee931256dd9aae0c1a660a12b1dfd6baf180b35e39c0f93cbf9800c5cf11b29f18678d325121fb286545a512dd8f6c2cb81e598d05fc40cfcf9dc", "0091d4d2153f667593e25fee42e39dafd1811974943e875dfcc6badc0ea22db4212637be71c6b74375c43cfbf719088691aec70e691e46edfe8ccdb4cefcb1351e" ); + { + // small r and 100 bit s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100"; + bn_t sig_s = "029c0de2216bab72af9ec823411e7ee444482bc268ae1ba9064e04019609757d95b2e0c5a3fde377a87fcd38b32f8061bd3dc81cbbdb96ca626e6582ba61dc31"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "34308c7d6eaa1bd7d8edc02fc6277c5271ca847428ff210d6078ec968df4e8730e21bc7715a7ee85a7352802466c0ab23560929bab49296509937fe7cd6edc02", "36491a29b86ea0e6124f4b72101f48230bdc1f5b36d2e6500c3ffd4ba9818b435046335a2da15a89bc51117204d330832abc0f7b09a59d82bbb01d71762d8df5" ); + { + // 100-bit r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062522bbd3ecbe7c39e93e7c25"; + bn_t sig_s = "029c0de2216bab72af9ec823411e7ee444482bc268ae1ba9064e04019609757d95b2e0c5a3fde377a87fcd38b32f8061bd3dc81cbbdb96ca626e6582ba61dc31"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "78d35a1c8a83997300a02eb477916e7095b001bfc47341528f75c6cebefd2d59c5d5efaeae9c5bd8ad4bdbad76da1cbcd3547a95d392dff53ce85bc4e4b23ff9", "4bb3427e6074138fc0e438320a314e20367137133b4fee63d80ecfb5931666b0873dcd456a36994edfda75b0f3ea81732277e77adc43a481ff0f0ed4d2f37ff0" ); + { + // r and s^-1 are close to n + auto m = "313233343030"_hex; + bn_t sig_r = "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca8ffe9"; + bn_t sig_s = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7656a55ab37b38afec6e6a80eafff691c2b8031cc860a17a7ba07e3ae2f6aa0cae51cc5de2b36f17143fb7ee34dd1db97e522f84dadc6c2a27a7283e551f5758", "308df3b71ca6953d18fad0952dec4d73fac8d91b47d05ef3a74121072e1dc3bade11544116abc8cb0ad80ee0c58036ffcf710529a28c475cbe708ccf8819c7f9" ); + { + // r and s are 64-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c44febf31c3594e"; + bn_t sig_s = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000839ed28247c2b06b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4f4f975357749aca4f64741f72bcf20acfc783d15c3b54c973d8981f7a028bff5f5817814276ba1b4baa90b3accd1ca8eb7acb6ae9264a34f801a62e34738db6", "1b9560c2652d95756fabd4ca0668ad2c2df84f6498ee683a8b4e5122d6324f3c731c8ddf82a6d663ab87da69732758680290ef433ca514c16be2175efb02740d" ); + { + // r and s are 100-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009df8b682430beef6f5fd7c7cd"; + bn_t sig_s = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd0a62e13778f4222a0d61c8a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "44d4ea4738f3214b0fe7d36172c7134d04a1b547f595a54625c4fb0973192aa4faa7743f042b1ef162fd8ea2a5e71cd5456e565cf278eec0321cb828fb13435d", "0088d2fbfb90ada22f40deab1abf0f6496da14e18947212281358789ff8ade72b48bd99287cf69eb0b0935430d4a179b97f809e5222b0e295afb28d773cd59e1fc" ); + { + // r and s are 128-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a598e563a89f526c32ebec8de26367a"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084f633e2042630e99dd0f1e16f7a04bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00808af7ea25b2321eacf98049e8fd410366d2bc5e702808272a899f85a17e6441b4ad1ecedf94a33932a65973d5a45b898466e1c09ee9012ac3d5fac3c766ec6d", "71729acce4c49c99a1584cb3f85d4146f1669e504bfeb1c0554cabcd86aaff254d66783c8a5a19f2291dcaeee6d053fe379a72cd3518db05fe381c2b478e8057" ); + { + // r and s are 160-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa6eeb5823f7fa31b466bb473797f0d0314c0be2"; + bn_t sig_s = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e2977c479e6d25703cebbc6bd561938cc9d1bfb9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009019be20f640ecb2b7c3311bcda870954938a780686c063fe0ab26f57ba60511ff3cee3286d8d90487eb8014788a1f134ed59a774fdb8b0d24770bf2301b2d18", "08fe934dc911d15c44e59b9026811e7cd8fdd874410d51a56f5aea137bfc4a8e85b7eba7528949cdabc4d33aef16157d14e3f5f68bde5de1c5196917a56dab29" ); + { + // s == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // s == 0 + m = "313233343030"_hex; + sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6a4c6c879b23ca5aa34248d48628ca12e4f2279aefddae460361d68e6ce290461182f674d18a8ee5a2c5bcab910d83dd618d29eda613f609081cd34d9d1fd9e2", "415f6649b18b2b1decc9a50203ae86a8689592a9aaaa35303296aefc2d582bcbedbde6a91f0b8a237a2bc2639e59c6579d7a76790ba29cbd90f22352f733e067" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "0cc5750ba98b8e7fe373e57797c29f424322828b5dc9a2f78ef8150cdf0266254ce9967b1197bac6caafdabaf5eb81635809ddad42495d1fcb934cc443dc941f"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6327eaa44d4da78ee17ddfb4ccfda599357ad6b20d487db31ff40e453e1a7b4eb587d889988bb6dc1ee169143e0a0b27919f176e489747fe19bd5571f3b45cd5", "4420d79011792653fd17c4230f3b7e69ecf5cfcddc837e042651104b955795ec701576cf228113a1db2ba158614654222f6a90850c5e3abe64e51a84404e7234" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "296bc6cef75ce87d064db7522f1a440b4df4a71e233cb176ad7b0514958b3cf97d3eb29930a87701e4ed00e96de9f0d5e4fc134995b44f08c4c30e667778865c"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a97fe60e1303df60cff6e107eed6430eedd90e4af6609aaea70a7d33620f2602af2be8d64d998a47114f04568a5ed6d9c41fa836958ba2dd63353ccd1c5e8598", "009868b313ed367999c54507ab7eabf3be54be1b9deaf43ddf3d2ac04e80e5cc0cbd9f323bfc7d3244b6bf39570282f22854c41792ea4861d478bbd7b089be0051" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "189799adf4d3362bc1ea2f7e331b2d80720506236ff2c692edf712dbd287712420afca0e56d43da8ae915767fd24836eb92730845ea132514d924daf2faa3139"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "33278003231172bb924dc1090cc8060a1ec95cea39074860699d64539079b569897d4e754bff02e36917db76cc14b14ca3997f6e5eda006b49ac3453ffee9ce6", "1b8f30c2bef7fbd0de37a3e146b8456296d8678465f7717f50e005c26532d7498ee864fd75c7de68830ef37e83b742bcae60cda9a4a3a649de0da2ed5987cfa3" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "392843478a101a81338d7d41071f557c9d4ec593a0698af9842c1cfb17ce21d7534a7c34c40217fe9271983a9f6304d906299055a791feea1c579ff1ca499b3d"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "29f97430d99b8d83ceefffcba675421408f5fa14031f6d155221605a81e501568e27262aa0db953aef23d81271f213de830dc1e23a5b1420f2bb3948161ef437", "3ddc2efd449bf28027869e4c80a8aa0b306299d614e2714a2ce95d1f3b5370a2fb633662e3c8b8bbec10bd3a4e0d9541d8aba256739eae5bbbfad102ff6105f8" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "2887c685af0b7e900a0cf73e59ea4da1198f03f9d6bb8eab7419ab57913db4613af4f5a0fe2f56f2fe971a684051830cf86c1dc80811ccc9ac725847968dcc73"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7c48d58691a6feb3896b37bf2c3f043f28b86958eaf33306f878ad36e3c5bf0e31b7bb9014d90eb87de9b3a3fa80fca12b4b179c5dc5be0759b043537e3b89fb", "4ae9f9b8850d59adbfa2816481461dd33c6edc3ede7254f259fea1e13c818af80d2db25c578b370516057c796fbb25ee30f6c5e6ad5796e0ea4f19d75e9223d3" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "4dbf43f5bd4ec65b0a2ed08d57a895af3f3256999cd1fa3590e01b525268a1d73a6d8e9b005f0dd1ba30696543e50ad6881e2ec16a90a3fb330799c0d33c309b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "52a245adbdba1fb8ebc134e335e31eed7945b0a80e98338d9504f95301659e3ab9ac06be0fc8b617c9e728badca75b312bfe6c47717ee72c0c406291c075339c", "0b2b670aaf3bab09ab9ff57cfca9813d2f1c2cd33d7eaf4c2c820bd41346cee851dd456eb5391ed7f68cbe207acaee57966acbc3bfcee86bab216e7e99a8dc6c" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "2f11c89465684e0fa7be9442d3fbb654f576d4007760ca2e01fc1292896fe32b859cc1c4ae229ada8d7a3a97714f71cddda1d6df6aaea3588cafb4d7fa2aa775"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4b8ec1fc5f47d9bb1b3093ee9a362bb55fe1866df0ddc1df985ed1c4b8cf2e7309093633270d50c56b65d6ae9162cec891c7c7253642c7be3e0d5a744fd8b093", "00914f0a09325788cfc22c7520a93bb10c28938474ccf40f70d97dee97b720371b2c2d68a2ce539fae02510dd500e3afdc27bc288b85776acb02579dab7742f61e" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "23454a8b6947300e1ec258c437e73c99a311842343a3adedf78c7c07e1a78940d9d384b3578e3a81f1e3b10c6497ac1678eb2b3d0f488eb633909befcd6a654c"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a8a4784dd8ecf04a038102acaba7741a45ca351b2bbd053343bba336da9f8276a8b624fefcb79fa703ff59fcee49ba016934b18f40d03d72382edfe2f08c4904", "22e46cf4df5ee9473ffe860c4d1ea26c4577f30656853746926ed87247f0d684de11d12a25e36ded85fa9fe5cf96393749eb392e7857e2cf12e7ce5343b4e51d" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "240fe194ded1b3052326c2d494cdc1e188a0976b58469466db614fac8332c5a5969de23cc01d8a06adff67b70e53fc6321ec787688d6f4371fdd7a24ccc37472"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "79dfc2a4d98bf5e4dde41b6ebcb2b2a83923392c42148726b702f76db5654cf8d210da714fd9a6add863d59a60ad3e098001ee91801ace759a7adf546e740dc4", "009e1d3db77f8eb0469e85efcc71fed2cba9fc2da05373dba07a76b68c18f85c454730a546a215a606f195a98d442e52137d1a8533bae7937ccf8a4c3ae4f7bf86" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "5398eff2db5e32e09b0a36e53c02cf2b859073e665ebb0dadb4d3af22e87dc2987f4ee0acccc174aaa057e3f48e67fa2d059b04f310c788bdd0b8992bb7eec8b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0096ead5f90bc2e698a34fb04666218d801894e97efe8e656a33ed2a9c3055b460ca03cca9139d3c3466a757f9a5d20d31205a50c16a5319185a1e1fa6f2f4476a", "3e33a0d50eb6efea22cfbf9498337adb7e767016f2c392aabae1dcd1e165f99e78c47a991b158a9ddbd909c75df3b74745a91b18b8972d5fb70d93eda1c69614" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "53cd7557416ef209fbc9ee0a01e16e6c99b6e49373d5d12d475db5f87729506b6fceac8998666c4f6d42f3da0127ed210e6c09da38f55c4a87cdd758ae1cc07a"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2e59cc4375d1105f014493e0498d28a68f74f119891d6c4d75972101059407b57f2019772cbece06e45e858ee1d081e8a608ed8aff578540a468082a01fdd08c", "1fa24f6cad49b77710f1a1f5bd4a90440f857cde44947f4a1a5276fb847359405ace19e317adffe40ce15b5304bd1b6ea6773b10a59b9052006cc397944f93ae" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "431d863b08aebdbd2e7391372d74d61960e3e52c2c415d51a92875511e1b1abcb4283104f0cd5cc00c15d8ea8d61f155452de73032288972f24566f16707498f"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5132b247407f75889e0732954c367f74c11b0bbac0aaee34b885f1f0119fb183087f3845c13f872b4fa7ef7e989a83eec039e6e1fa7fbd340817ec6d62991c7c", "79acdb13801995a4d12943f5f70afd3cb72f6485a6dadd6480b467826c980881fe7656454c37d588ea6b716dbc74f6395c0a7557ec6679015382bd62d4ee10e2" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "258b4b91502c1ebed15fa6c5ea6159c8310fb182c42881f5ca0e402a62e2496e2a2e8cf25f3c6afaacfbf45264fe00531dcff0f09818a23f7162c1d1dc01e322"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1654013d5abe7f52eaf8e8876b36f0dc255e5ad7655334abc31d816b9c9f15ec3ec1fdb7652666c044d93fbb85ee577357011854117cee4733c5163d3b09fee7", "4d9cf5f0e654d37270ea72b8bb8b1bacdcc2a4455023b097a2691d47399b71785af639d4f5590358a18a999565ebaaeb52c1a0b53cda9b97de3d51c4645c4de8" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "1a4332df67419f9d37cf337de521727b50ef133c0263aaf2b9e34cd2fc01b446930d4b8b4b3d5f626c5c14c5592b564bc8c2d8b93043022290ae36505b4f774c"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "627e1f72fe43c73375275757c0916a9df1c10f777f50baae6dbd85237ed802fe43896cee6e96edac4111905822c3465b04f3adbc4cfd2a70267edbe6b19df08e", "17e2045b1110b128ef049b707dda2bb6b7537b4f2860d71bd5394b7b8a4969d46613d1c090ea48020a4ce1e8c0e57a2fe66c4360a65a37c211a9f4987baf3394" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "0da99c942e117eaee5c4109d7dfbc571cfc4722696bb5a1b36dfd53f1b70ee797d895a2f7da21aef675f6cb366472f400061a2aaac587be49d1b1df49e79e786"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "417db8e95f89131457983e75379009905d2d8008b790519d65e650d3b60a32563c18c5afd06ca314bc3a17746087a578ce78cbb60cb599cf0dd9cff22acb84cf", "0b86f2e57ce298c85bc28f3d0274cf3140ea5fc6015f4b636fb271da09445e15adcb60ae1f6d001ad4e25e6d69767236cc16e725f5d7b2af449939017a8c8c85" ); + { + // point at infinity during verify + auto m = "313233343030"_hex; + bn_t sig_r = "556ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548034"; + bn_t sig_s = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + auto r = false; // result = invalid - flags: ['PointDuplication', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009a8e0c2aa4955203df866d44ea320d62fa43f1baeabccd34ec0849b3fa19be2900ca10677c036da9dbb51ca60381cd58dfab9b2a1f6f776b712a22d6575785d5", "1bed652cf775d91bff11f988654ade8dd28415b7c0de7d2c7424256c3fd71e9c4fabf1eff380fde6f8a8fe0d1560d121ba65618451ef60f935d292ac2a26729c" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "556ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548034"; + bn_t sig_s = "556ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548034"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "23face62062ced95c7888fcf7d4c5af3d2a2a1cbf08693264969621882738ad798476fac70361bbf2cc79c249fc50271c1bfdc3f5bca20ebccea8c3658f8d4e3", "073c1a74b3c46a205d97077833dca1f363f76f67b68ee176438528aa76abbc36b6f0a988fb225fe7a33ee8851ff24e37138243e2b21da852a334dbd036cf1039" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "556ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548034"; + bn_t sig_s = "556ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548035"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "38597c68eabfbe648bca0b3e8d235f9082cf15d694e14e686b1e0a89b73e3dbc346ebbde38da2c602fe975c21a1fbc8f363b592903d02d4434fae52ee8cc3b3a", "572b82084747ea5af0633936b570354365ee2d7fba4c404bd69458eb825007ed89067effec6b2e67c32d197e8c28ecfefa7ee79cea09d7eb248925c543c30ba5" ); + { + // u1 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009d60ec91976a8fc7f8422876ccb22870eca8d39b8cdfc30193e3bb22a10e37c537a092dbb0124c8c4b26655ad96127d3140bc1f9556ebabf477fd95951b4b0dd", "2bc1fcd7d6840fd83a5e982361c304a34ed10e873aa4637ecac29f555c0526b519c238ce0b002d7e2f98225dec884c95d742e86fa68ce6e81f6542fe81730cfb" ); + { + // u1 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "66e59cbcf0f0a0fee7256d52661cf74b816308a77a7c9e8c4130461a4d1205eedfc32b5fba90829c8425409283eab77c74fcf1d45571da5a372a026368794c9d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a911df350e95c0da4d56c3c44a84aad88ee85e628ccc44c5e131dfad8a3fc69eed9c620ed8c821c84de2c2113c1d6c10aaea5544903b1d59678d39b052e0f1b3", "00a2c16d1e74ae6fd993b986234665eda14ff678e58c414ae55de8aa1eda26242d616b267e6fdb7491efb5a3c179b84903127070e5e2597d2f0b2af333b6349857" ); + { + // u2 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01823db8fd2ba4a34bacc4f64283909f4d01d02b8db66f9cb9bd77806b890ba31a6915b93dcbdd72c83338eb6029f22c31795712b1ac7a1fb81a304e3c58d8d5", "4ec267bad3984a3e2fd87defbe863d73885872488bdda9d6e3da8ecf8eabfd4674d201278ffc63cbc1ffa0f99eb5e85c9b20ae10a226e1e5594ca78fc0d531d8" ); + { + // u2 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "71e913d0929bd85cd53899c977dbfd5a8775b3cd22868c09e4426886f5775af58e2992d6331b6ebb810440bbaa72b584be768d00b03e91e923afb9ac6870aaf1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009fa44401db098e9f28579aaf02adff61faf1e6f7039cf1b3134b83dfba962b13a4397dcdd6feef4b64fc32eb3dfba3f596f5f75beabd3dade484089310b65822", "008bb1897c75da51e56db19d8df13623754a0db9d6da5002ffc8a73be21b80eeecca35ec541e81831b3fec4cc3193dc5929f12c4c463a4107911bbb0f15ae390ef" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "4f9c8a3c424ba2b2882c200355d25596b1aa063ff9b2573079325128dbc6ae5098e88460f4eb4331ffa2808ad3cf2305eccce70f3e6df3cb114c638b459d9167"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0fe7f7ca44453560e1ba38b34ec8dfbc745edefc58878255452f614fee561a8a620b4d8624e159bd483db08c9a62100fd2ea69ef7381f520abe651b2ea226eea", "156e75af465b22d226408314536d4238a739fd2f4003bac552ae34bfa27e9be460fe40a5468cedd3221048cd1b8d796bc27494565f88aaf7fccc4c0fc36b78b1" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "2820c603534f430db8e49727244a316acd6ea30733070dc4fdd24e2211dded80597a9cb6bd866f37b255057ab771925eb439293319a9a2c12dc0b7cb1dbf4fa7"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0099e5c3ad1ef53ad780c3c4d90c27cc1986496a215b25829a88de200a9c2146aec8f182dc6dec6611c7ffda1a55b0ccb2045b1ed5c9231b9eb3cb232417e2fcfa", "35e8b3f604f5d793d135ce06e23fc6ac82c0997de9e3f4d2dc3636ba0b521c785776dbc8d48da5d59a86fb3e90fb00bccb017d25100be8e35db1dfb5b44967ef" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "6e5d2dd1e3d278ebc6f73409651ebc46b65c6c3efe1165b74b5164356783251e3bb666804faa7bf389b5ff285b66b912c51c478c58cd2dbe5293d95735ab9436"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "423fc7aa8d6d77fae60bebce7757e15689426cbabd2c3fa6ff71da7765ab887a93c93cb8e1008892c0d8f1e03e48555c81dfc433d42f4890b71177b848aab9cc", "1ff6abd7c7f953de797480e292b987ddf47570d88dc5e51c7a47c357d71978190931976f55cc84c3a4cd4635ed5ba4920efa8219c7aa1685bf1a9bc7129fa2cb" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "2bd0ea22df17e2f0854094002df56a63da80713274b5192327b1d86c256437bd10f7a21e1c7480836dea40f56ee9b5810c68f2a06e728a802d01b5a514db6914"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "415e9d50af5da71189607811680dc16d3da9a0e339a53d166b9b226806a6ffdae01eb40295cf5e00f47ddf0b4afa6729a8f7d18a437d157df4d99c19181ef524", "00907efdc15b338664e911b62f9ac015d9e36bb7be0cccdf330517d52970dab18848bce0bfdfc0bd39c675753666036e4c4c5eb0c62321b22bd1cb1fa352670fbc" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "3da945bb815ee5303a05dc5eec3285b0a1edf43be7caa19fc8f5ac06122b3451d85b7df2da41f347e2e51458f39d4d16c3cc87aad7b451758d3afd9729659156"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2c65b61fa1f4d3c86c829d15d4de5b47c5b789f53a4355661f09eef3b97b21a3b93fae0f035bf347a315594785059b37ccf8062a391ace30e69a984d8417ca2c", "341a8019653ad617da57c9997c2debfaf340a6780bd8371aee2c668b7dcc70fe06789b8f36f8f13f40822f0401102e03742c8ffaa1dcf0baf981c7ecc1a7e278" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "7b528b7702bdca60740bb8bdd8650b6143dbe877cf95433f91eb580c245668a3b0b6fbe5b483e68fc5ca28b1e73a9a2d87990f55af68a2eb1a75fb2e52cb22ac"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6a8222da632550f85a0d59fa8e8f327e16274b6397d5a42aa1bf6f1a1b5cedd3a1182dd0f22fca690c5ef5a261e6e5d8bae34f2e1ae294b50a287c882574ee7c", "0082d86218782338757b9bab359e63516ce3dbf5e7fdbd5baa4ae99713fe5dd85bb61ea12a178cfb50a25eef41a085dcd5e5b88f148badf4c8f4031e03d49aec6b" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "2d17048ee57e45b66057acfab9c3b2a4939e81b1eb0f8972a8c2b5aa6b04c15584894e168e15dc5cf889fa09f7934d1084def351042c2b97cde3c100b894bad3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00aa17b5bd2bbfce1ae133e2479fe1f87e64e6165897ee457391bc2daee9fd7686b8d4bec8ecfa8a5693f39b4ef9b4163cdbc5c4546fadba0cfe3e1532ea2aadd4", "73fa93039717f9dfd49a9c2884dc2d1012d71d6054ea0f391685bde5e8c0d5d611b40bd1fbe35dc5bd7e916ddc9a66ba54ae8949776f2f21d4cf54b2f6c757c5" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "2b18986d87bd21cdcbf0f13103794735979354290c43aa8c298dbd473de5a389cb55f00c2184a235f6b7347305926c0e25785eca6d98eb2bd921562164f365f0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a72de8d4d2896f9bc6d72a68f8b2588fa2ecb4992e8e3616fd58a1a12f0327db1fc3740ed384022078156fe66712bf092cabbc43659cddc9cf3dbf807bcf3635", "008819319aef0e23b142e75d9c4c139812e55e1c419d96084a68b950356c46eb2357512f208bb1dbe970d1900c8dfda77d2f477760db63d228dbf8b342265bcbde" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "445f8caaf2093f6882bc6c7af537ebacbf8620f0b6ac68a19a5de1935225cc949c24365504222938c56982b824bbee59253f4a866485149ec4c5b5ec9ad74ec3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "37d8519f0c7492ff443bad34cbd54eee9ba120e41fbb9fd604cdd6d41b762bf2bba392d4f4646978730f6556662b99768dcb2754c180c0fbd8ad707636d8f8b1", "43b17d728ffeac454019530d2bb0f69a58535a2e8e609ff69596d53d11a00e6f650d49d9a5f211204b4e5a421c757f8e1738955df96bad5bfdd71e155a932d1f" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "2da089be4ccf10ec5bd463556efbd3388cc343b9dd0bbd6f2e98a5d0ca362d0fde2aebf02bdef173a0f1f04755ee76a098727638e4f7f389521d997bab85b781"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2afb786d246b43a53df6841d04d4c7705357939697714ed4681dc595188191877a46f3c6bbc63170406e0c6db7dd6789a644738f7d0acb7c9e5959c01e39e975", "20327e6e5c925198b74af0beb51a83ea662efbc3f85bba8924046b97dacb0717d6b7f422d8426625ea7f6b4ce865dfab264ba5247b4dad3e2ca5614bff4c0d5f" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "5b41137c999e21d8b7a8c6aaddf7a67119868773ba177ade5d314ba1946c5a1fbc55d7e057bde2e741e3e08eabdced4130e4ec71c9efe712a43b32f7570b6f02"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1b419aa39d3e3125ae705f77885c3b11387bc422fadbba7eb0a66ac14ae26c0f978333dce64e4fe0d3bdbc6d52adcee3b51493a26d21376bef764e0628dfbb12", "73ee3ef2eae04a27e798323d50e0f4fefbc43fc4613677311da858f83e5d9b3b9e41af6c5582908a3ef2948e4b5dc8c5b8a590b3ceda18e4c4cc05ddc268dcfe" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "88e19d3ae66d32c5137d2a004cf379a9a649cb2d9723384d8bc9f1725ea2872f9a80c3d0839cd45ae2d5d0d601cb63e1c95762aaaee7da9bf658cc7302912683"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "327a6e5e4ef2bec0631e13354094cca4df5bc4018a0572c00873543d98100ac09d76d27bd6e0bc2dc96bd8cbbe19aec0c141320ffd64aedba5c17a1be4bd2960", "78dccc453c2aa7e92a7734823306c6c1ae3e52131edbfa5fddb719c8d5d00ba3d38baa8fb727bb941e21baff375503c27eed7046fa6d00c70ef136e01d36efd5" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "372e96e8f1e93c75e37b9a04b28f5e235b2e361f7f08b2dba5a8b21ab3c1928f1ddb334027d53df9c4daff942db35c89628e23c62c6696df2949ecab9ad5ca1b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009aa189b5b1e5b66641c7ec3fa7d0dbb6a72d874d18c7927cac8470a70969f35705bc73182abc10b5a16955889619bcba6ff310209473c3120e44a2e1bf9fc9c7", "2e5de74749a05227509a2b3d0322a8f9020709cb8e5da67dfee28e96e0ab8a1c3208055d1f08f38fa1cc79c119ff704592a8eef58bf66204b81ad0b0abdd0390" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "439a859d7aaf99f57205f210c93ab89c317bd2fa215e7903a67976d336d83b1bf9719067077420078f837514d607ae3981185dc7b02627b05ac66e491a2b94c5", "4c3fa47a926dbd6945aca6d404f85f46e070d04e7dabf6fa9cb88c3428dd02fd01a9b190bb61dfb7b2439e42d0b689aef968356b011cf3054ab929c85777e652" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "48d7851b079f620209e8ba05eb24ee515964d37577c7c3ae309ab2bddd7eee7101899d0c6c780111bede61ed1215ec42399409d605eccc9aac4c9548f87770df"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "66fa158c51d3a9421cbb133799ab90a12387ec7875a2b354b8487673495bb1879ef1672f4928a2034095a02c7d083f27e0eac0a40b87d837f52e7648200c5666", "278037cd7e5e8bc6821027b21a2ca7ae9c694ae809966b79d441dcdc9d3b444f8793122f30956ae0a7aadfbe431a342dcd857095bd058a742ba58af18b1a519b" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "0e6cf68d5be5138253de290ec41bde7dcf96065c280d0a09d9a4888d5de04dbea75038fc061b653340696c62baaea92d5747e50249034c427f2f813e2b98c24b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "29bdf2feb76740763f5098cfd5efaca5fa2b19654bd4e8d5d75978b90520e7483875bfbe2ac0e57adf90cc140af59821786724e5eab9111445a2de4b3768774c", "32ae3979b352dcfb0c72e8f6799ab76415428a9956ca5d2b14d74b9a1be189bcd3032f742ec94744c33a3cdca10dff4d5b07929660d6e78729ada6e5be9ae101" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "41b2af78294165d86f751cb82a80327a0eb4c0544a06d4a5719aea4a098f115973aff4c1a8cec2dcf0f5f0fa24190b474a25b9ab3baef7770f68ba9c7ef7f7ca"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0080af1bb9dfce00963799e01aecbf8bf5a659b6bbfa4689f0674a6115bcdf996d155d9a75c5295141e2cc3e611b32c589e6ae76aef190dc8a363ba9f9c3cc5727", "038cd95bcd34420e63ae435afed09f70e4ebc3501b42f35ebbecd8b0a165c61616090b118ef05a43c31f3b710907c745264b1f537c28596a403c25195e87545e" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "9c5fc3fbf70f16ccdac92f95974408ffff7e05bd0268cfdf862e9beb174fb48ee1e0e10f942d8fc67ed69f7a94c85f61c84048617e67c1cc6c0260e048641a6a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6eeb4735286c2c094dda29710a774eccdb6ca5fa8991f9adbc769b448d3899943c860e3fb50cff34825adaee82aab5a533adaf74fbfe7e8b032e2642fa5fc86f", "5ef74aa61a26823bc2ed70f08b64a6906db981564d5e0c15a076a582da8fee20b773ef591f9054da34d90a1f1317294610a81d3e0f1adce4f6d2fd6ba4b93501" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "8de1ea3f1234690e75bd787cfabe15f833cb7dc65107cdb035f99b0bbe6c60ad6e8365dddbb1f973bc26dddba9e4ae7c72cebd41f471a8bb227d2b3df41f346b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00938841937550134c5a4bade19a5021c73cffc774fdca875413a7d541e65145fb77dad4a7c7eb3a966c184d73cdcf3f1bea984ad25dd4fb7f47239faa5b539f6d", "3275cde53c18f3bb537a7f06c7ea1b4f355025919002bae9a3a3c1dcf150c1b53bc8dfe53f60cc785e44051c95b735552ba622897d5bf7556fd7b9e38b6531be" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "326a7e59c4bcf9ba52235a8e06d244557acf66885b64f9238cddb3be327b6205758b60f3203418cbe5b330e28a9d7a360edfb8ddf39d46340d5c2792824b7c6d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "78fbd1e762019602ff7187cf06a886d2ed2cb5d06481b06c3c4be4f7f3746cd0151d57f4d6aebd6048895cabfe9500adf3daec59ffa6ee9621c8b584ed6dad1a", "6f3c2070e01421a1ebb969607d44f76778748bcb559a8b5eed83b04760ab53556b0039e8765ab85a92950c10ca6bbdcc9d6e2f03d88b6d7bbdcd53c8b1ff86cc" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "3c5d08339f2f6f97a2b86b83296678f7bff61e1b7487cda14f3b12fce6aeafa3f2fb385aea3e82f312a6880efd18a1d77fd7faafaf9d1ecc5ee9c2c0f71d10d9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4c9ada2fa2acf8d01fba2b015f7badc322785c85f2199b6c4ac490da8e1ec973387f4abe26d526a056dc7195fb1c9c0ca7612cb65f15f106380d8c5dece529f3", "2172c8b9b3b6fb0bbe9f2273d9a218bd512479dd27605b2a6e8b44f58d176178390c2bdd1ccf60c1e823a23e8b0fce7dab2f197913b1fe30f699e3bf366bf1bf" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "9584a4bdf0c6c8ca72211f589dcdd7be181accb926f2430dc7135abbfa7887d606030c85c72f5a3c05fcc7e0d1fb33afc0251fd33ea04b3b96470bc26ce612ab"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00854cf9601010be20633f5d17214cab687dab3aa54a38a02c55ed003615ec8efada2ac0d62d923d0e1df9aa382d512706cadf5539858a62a5ec62fd8248e63277", "6a783303285206018cbb9fc1e98cdf94ac6f2fecbdc7d8428ff485e59b00b2bfa45a06aaa93e6b51b7ad1b8ac0dbe135455d8d2875231357060990abcde563de" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "40197987189f8cf04a951e01c48fa8ae9042f184848f93b215dc790fe2c42ee2d549d8cb50ff3db74b6ddb376a80b2ce3983946b2ed99819856e75ebf8ff2ae0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5e3de509f7585c0f6d05c387a6d07a061c9f98c6adc8b3c36efbdefcbff2e6ad4678960524d116154f5b17332204e3a1867082d2e518504f433e2726ad58e9d7", "00a0b32e9d3c523bac3c1ccdd75f82b909a8306c74be899f13228abf87db76b9115c0b293d7d30f3c86230461b28a45a6cc88b8fe079143103c5b01016ba95bcd5" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "8032f30e313f19e0952a3c03891f515d2085e309091f27642bb8f21fc5885dc5aa93b196a1fe7b6e96dbb66ed501659c730728d65db330330adcebd7f1fe55c0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "15d2ffcd4617eb1b400610cba8d738c76c8e15ad72b34e576772ae19cd8345294644d13ac62a293788de2a92dd547c2ac3a98aba72952d3ea2d491d7eea5b9cb", "00a3ec2c79a2cf7ba0083933b2c534fd4b51587c4ebc3cbaaa28d92b95e3c8e90142effac27bbab215ac0b39d1c5f332feb779351a66c294e4ed62f5cd3229a923" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "156ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548037"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00974df3e7a61283830e544ba9023479cb8d7559524df76fb38d23c55d29923e72ec5cb48717fab859f2f3111585bbee004595c5fed64411fbbf9f6351bf5f69e8", "4e1fdd691b30b0b4c2590a881ce458053349356da747cd93ba931eee6ae88cae827007105c3b1633a48e1c9db5272ac01145aee6132ba73af83d6e6c4106b290" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"; + bn_t sig_s = "5ca54a231be76c06c9d987de7bf2ed42cd634a07edeb6e0c580412abe709ab177e474a9ea96245a640f7e6be1d2d5cba3a7cdc41a8b093901a5b8be06420e15a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2cb7364ccec9148a3242eee17ce01d82a56d037cb01746fdd24b893f35e072827ce463adafca6282d93cf666a740ee88adbef241f17955d2bf5f9f95958a38a6", "0096da5643e5fe057f1c3b931e36d33f0e2f5fba680932a35987b79855b6c1f0ead64cbe9c72959ece2184ee65a768410df1dad81c4dba853340a2396abf82e36a" ); + { + // point duplication during verification + auto m = "313233343030"_hex; + bn_t sig_r = "1b8e8440bd94752dc603159728a346872cad48dfff819f181f9d53537a80868bff1280acfd2397a846d3259049352bc11f5fb739410c766d1344cbcbc03bf761"; + bn_t sig_s = "21610740799a83a13b49aa45dd854d85b058bd955a4105d749cba74b8f2a38cf7c33ed56921d029e7493894ad3d8f28f4431dceb89cd56316de93dc09777ca10"; + auto r = true; // result = valid - flags: ['PointDuplication'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2cb7364ccec9148a3242eee17ce01d82a56d037cb01746fdd24b893f35e072827ce463adafca6282d93cf666a740ee88adbef241f17955d2bf5f9f95958a38a6", "14034774f5ebbf0c2399538ffcf6bcf99bd0d34baa972eb54eac0474b9711786a700dc642930c9748d48b2c53f3b3fd836a72712dfc84151e80826eb98b76589" ); + { + // duplication bug + auto m = "313233343030"_hex; + bn_t sig_r = "1b8e8440bd94752dc603159728a346872cad48dfff819f181f9d53537a80868bff1280acfd2397a846d3259049352bc11f5fb739410c766d1344cbcbc03bf761"; + bn_t sig_s = "21610740799a83a13b49aa45dd854d85b058bd955a4105d749cba74b8f2a38cf7c33ed56921d029e7493894ad3d8f28f4431dceb89cd56316de93dc09777ca10"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "063d566fa93ee219482ec947e7be4694f9c073b2bb786db849e1f3973c5122394cf68edd9947b58e61fe42c98d3640844ed2775b0c36b5f4c0c9605d028bc0c5", "07521b29889632bb0756fec98e8e956cb7ac515a3fc9082b871861548e9702786f591e9a222391014725167a6c22aaf8c2c4be9425248b4d5f94f31cbd8bd352" ); + { + // comparison with point at infinity + auto m = "313233343030"_hex; + bn_t sig_r = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + bn_t sig_s = "222c52be9261f41bd990faefa3f53267f5701c5723f52a02f7ad85c216709b49aaa6127375bb6e050d1ae0384cbc03416c56c3e69b45f892bde7eae6ec21cce1"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "13b9a0273b3b283cc8a25aaaf2a8508a745db022e7f4ddc06acdf06eb7770fd95ba68b047b030419aec366bd187eb840a43df7d9439419e2639614d5b4eb22d2", "3ba9a5c0301708dc50ab9e4ad4ed48ad0f701cf387f210e57b6d06fb69cd58dfb0685f89d9ed1a319f00151d9082663046cc27101b692ca22a6b3e083dd0ff7f" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "9f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850"; + bn_t sig_s = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "45d4d4ad6b3aaf94b6d739a072f31b1e744f13876304ea11113fe8123a155e1a921be46cde2f2412e02a0fa5c1865db8a6dbd44eeac165b0f7fa73c04783802d", "1cb951cc65c9056480695bc467dca577964cee048a14c81716ce9558b450981cf3a0f0059d581b076afb69efe0a505357b8060e02d6b9f13a031a1dae5f1ce3c" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "9f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850"; + bn_t sig_s = "7a0c02f1c1a6fa1a522a5ba1006bb4059122ae5bc9902853bdb4ddb52b922a996175af9c5b543fc8e5a920c9120d3032cc114dee73b0c0e781a9fdcb022f9294"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009060430c4439c352cbc08cd0906f91464ce37a7974de996525758628b9d3580540afe9be74ba1050d03acbb0ac29e60aca9b96295a6b5e49707410257fb7639d", "59f888ad8a62becde0661defeee48135d36167f9e8580f2714bcd5b67ec70ae3deae5d80b1e9d10c13f21ce7c59c79ac2cf705aee890adf434f29aa841a05b0f" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "9f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850"; + bn_t sig_s = "88b14afa4987d06f6643ebbe8fd4c99fd5c0715c8fd4a80bdeb6170859c26d26aa9849cdd6edb814346b80e132f00d05b15b0f9a6d17e24af79fab9bb0873387"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7326137c699e6b1d2bf313c04c34b86e63293d7e2054e47187ef843fb42674f65b7e0136ecdaf8e411c6e2dbbf5ac5007401743ec7244e7dac0379516bb92f39", "0092e546d01c1655cf68549391d8582035ee471e58f433ea89f38f8cc1edc1928225b3f5a376e015cee6ae9e1eaae609be2e69537e596b06b77e4b6b7482fab60b" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "9f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850"; + bn_t sig_s = "222c52be9261f41bd990faefa3f53267f5701c5723f52a02f7ad85c216709b49aaa6127375bb6e050d1ae0384cbc03416c56c3e69b45f892bde7eae6ec21cce2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "56bd4e3ca322f65c29b611f79f3f950f21638e026fccf673b08cffc73cc39495ced5b88e26419ebde75c85fdff1460947ef7afe99aca5878b1af79688181e323", "69e646bb9d01a10cc4931259dc8f597d95e85ebd56729098cfab1443165e558f053698b0bb4f44222ea245ac4c21717eb22aaff650a329eee24203841c59d13f" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "9f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850"; + bn_t sig_s = "30d19ac71a42ca70edaa8b0d335e48023a0ddf57ea39a9bb18aebf1544a0ddd6f3c8aca4f154e6505bdd40506d9ee01451a0859294ad19f633dd98b79a796dd5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "688d0f394acb16119e0b29b56e780f295a24dcba1615a23e59e67b1dc9549bff8791a62130d4b0d8d75739f06dfc08cf6b5cb1e31a63bc72b1fad6f058b1cd59", "009f9446ae8a7f41bdfbac1ddbcdd6e6490193260dcdada072079cbf139b666cf5934f11abf572a33e7f1235cdf70820a5475d14eced67ad6a4a8578f9b6e4093c" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "9f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850"; + bn_t sig_s = "10b989002855ffafbd8c23a661f3b93ccfff4fbe84a23d1a6c4aff4405bdb94c3f860224e205032fdc9a1dc80c7d6b21409f9632e0fb540021ccc42161b70f1c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0083672d9b61f73f1a0b2e066bc3d009749d28d4e584a1afea28dcffd78b6b2d659dbb0c5cf7bed61f3b03c3c129e31d4b49ca8da3813cf25b6f025d84ee82d561", "379be7f5c837fd23e0acd749167549e8703dbad3bc7add9d3a9ff01abd34b55342f532428d95cc1f0c9bae7f458d9411919a2816009658224218851b0f8d5720" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822"; + bn_t sig_s = "38f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7386a10991c1475c6c53f05867e69a35219bc5cad4405c960322843a56bb07bbaa317d20a0bc98786ab7b4c0cf6deadf093bb07d5bd563c0d56b380f880e7ad1", "009819e9e897c76405dafbe1d785b3bff2e6e48770ada1f452ec2b4a347bdaba7b6d7122002d5f6ec4cabc585b4ef830e52c624641fe038297805ef0b7e8e82bdd" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822"; + bn_t sig_s = "7a0c02f1c1a6fa1a522a5ba1006bb4059122ae5bc9902853bdb4ddb52b922a996175af9c5b543fc8e5a920c9120d3032cc114dee73b0c0e781a9fdcb022f9294"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7d76f09db5fc7ed767dfad2af9af5470a43e062f21492499af5fc719f6be17881957ef476688fa3049b13d48c51f259e5d60434465d84445d359b89f66c88bac", "420661699273b23838827c69908978064b7c98f4195ad5e2ec709a036ead56e34a3e999e8c37ddea5b00490a011d9d116676e9022c124b3c0818bcc3488f78d3" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822"; + bn_t sig_s = "88b14afa4987d06f6643ebbe8fd4c99fd5c0715c8fd4a80bdeb6170859c26d26aa9849cdd6edb814346b80e132f00d05b15b0f9a6d17e24af79fab9bb0873387"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2a3a7f8815983c9251df9220cb5f424f4d8eb9cfce3d96de725bbea6dbfefe226d789fef8533194787668b66f8fb640d135a25a30f5a25111ddcfc5c9c7eb22d", "009ba35f3054ac439e0f558ead8d0979a0fab046a47aa0339ef16c0e1d37e4d1d6f29fb7f674dd51ed57233409ac9e505e29d40378897194cf5fbc92595fd774be" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822"; + bn_t sig_s = "222c52be9261f41bd990faefa3f53267f5701c5723f52a02f7ad85c216709b49aaa6127375bb6e050d1ae0384cbc03416c56c3e69b45f892bde7eae6ec21cce2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "03f498f2ea6e36b498ac66463a06708fb931ac59a2a1dfa6ebb4973cf01a06ceef58b344b85e89fc78351211f71fd1f11818f7ef96e296466b0d3b70c2da6920", "64aa78285439f17d69a98cae8a1379bdac05ced930a18f44939bd91f8669a37fe8fb1e9ab1ead4db0b337ac594fd21d9e0d4325ab7ee07208f1c07601bb91320" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822"; + bn_t sig_s = "30d19ac71a42ca70edaa8b0d335e48023a0ddf57ea39a9bb18aebf1544a0ddd6f3c8aca4f154e6505bdd40506d9ee01451a0859294ad19f633dd98b79a796dd5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7bb5f9efbcc260b08120c7c4193566133322ce47e666047edfb462fbc310bb06503e8d62d0cf6055e271a8187be22dc5a1d6b09704a3b99065edb87b46c2ae32", "401f0040048f947fa02017bca61ab6d6353fc58807bba2f0a46521e20f2066824ec84bae1b545a414a296adee22315fd48573a7c5b3bd4c5398b27d7f2824f2c" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822"; + bn_t sig_s = "10b989002855ffafbd8c23a661f3b93ccfff4fbe84a23d1a6c4aff4405bdb94c3f860224e205032fdc9a1dc80c7d6b21409f9632e0fb540021ccc42161b70f1c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0081aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822", "7dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc"; + bn_t sig_s = "1868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "66e59cbcf0f0a0fee7256d52661cf74b816308a77a7c9e8c4130461a4d1205eedfc32b5fba90829c8425409283eab77c74fcf1d45571da5a372a026368794c9d"; + sig_s = "1868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0081aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822", "2cff655b8586919e7eea27046451d909d92696b38f2456f43662d76ee813875fca70bcb751671fe4530355525c7c1d3756b7d3ff8492727eafdd42471d624061" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc"; + bn_t sig_s = "1868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "66e59cbcf0f0a0fee7256d52661cf74b816308a77a7c9e8c4130461a4d1205eedfc32b5fba90829c8425409283eab77c74fcf1d45571da5a372a026368794c9d"; + sig_s = "1868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1ec7fe2275860c3bc0e4e6e459af7e16985d37adba7351ac357a7c397e07522ea41bcca8e89777fe05b8f0d9dc8c614004fcaf30a97001a5011a159f46fcd544", "3cbc1ddfc7ac89a1a2f8eef77bf9bba8ade73da2100cb6a371546b495fb5ea885eb631645e79591db659c49266d263d5cbd3403081cb407536efe9a5bec69955" ); + { + // pseudorandom signature + auto m = ""_hex; + bn_t sig_r = "89edf75e6e986305d8181386c16db44ba0d7ff40f4335569754a481f5cd48c6211a63de7bdaa485e9fa79858a4eabf111fed2959f031de2a132ba709412683a9"; + bn_t sig_s = "7a8c08564f51534128bb52fe36dffaae89079011256ef8069e64d64c5610d3e611c0ba8b19027388fccc212523b22c44e85a789e16cb1bbd3240c86b43480fde"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "4d7367"_hex; + sig_r = "225dc2310177ce6267efde9937eff898fb0bad12b0dbeb4fa9c6be6e20f88563e6d2991d47a648b0ba5a7039842dbf883bbd735df793cce0d136023fbfc9be95"; + sig_s = "00d59783d8bd050cf728b3506c16ee4a78ac26c12fd33dadb6ee8146372e4fb2a880ef77eb20ac90f3a4275c1718a033a7c0b2df538eb35827330154191153cb"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "313233343030"_hex; + sig_r = "61483c729369413144a6be0dd05c1ac29bc440bbdaf87e572aa987e9ca423639f339bcaaad99cb1fa80b7c35416a1834ec04bcf0fe7812c712eb1f06a16daca3"; + sig_s = "41bb956c339ebcf5e4e403c7d8928d5eb4fdf7d3f53a2c06d6c9fac347f603ac3209a2af37516f807b50363b5328bc98b94354af7d59966d160f68e80c6b2dc0"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "0000000000000000000000000000000000000000"_hex; + sig_r = "a620880bb7fab1180e3d8f393e4b3343dd4eb1c374f9d61252f8a201d9096ba836721f8e2d8b56cbf406960aae0e50325adfca6b1b529f06a81260bd8b15ff68"; + sig_s = "76537febbc0e24ab4992b576abf8bc0201cacf5ccf674ad3c3b1552c98ca64642eff5401afecab167ec0be195fe5ffa178f14567ef171b4827964a559d079b7a"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "30a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1", "1a4b00c74a5a61ac196faf4dc39acd41bf354def0a27529964359132a76f28654248d1ac004d11d811aba0acb9c26d2f4a54012c5d8a9a1e7c8b4a52" ); + { + // y-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "479ce8458b04b2dc127b46971e6c79831bf788f65ddc770620daaa15583f8d506f2a6652d82b38560ec1977586e11929b666f6d7012d816fd356d41e9304d60f"; + bn_t sig_s = "a750f73ccaeff5d994067e66e45c200892c607b329be5e64db5c383c7be711c97b5dd425a52250bc862477e28b3afa4ef3d831066a7b143432a5d15403021457"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "685b8b2929c9a0a9b0deb6baefd00e26f50d4c1fc3fed47d7ef812c52b66ec6f6d09f54e9bdb7202016570f75bb9912aab3a572bfb97ea589ace294ff0fe6662"; + sig_s = "4c286267cb87a6be56f4cd0080398c23e569f2ebda71d2cd1682080290deb4143bdc61e75b42abefbcbbddf4c794545a05378656a1858658e0a4595833fc40f6"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "811112d27ca1e434b00c0293320284b1c5369fd007f90e7a99d44c9c02013688d16e5e0a2fc3a077064a995c4244195c04f00323e33adea6b37701ad5cb36216"; + sig_s = "82dd5c3e3642fc43e5c4c652e3b2d00f6d137207be8c9b2125561c08703e4a84d2a82785f775abd18aab24e52f12c5f8cb56b28b915f9c0b1110c542ba92b313"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "30a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1", "00aadd9db8c19ec3c3f57a85021a5a4cba0795c071f494841fcc3c4a310bfd773ed5de729b597d9696ae808f52d4f7e0396ebf91ffe32ec558cb1fc637dbaefea1" ); + { + // y-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "39d0c5c4e48ca14064b2e9b3600deb0ec2fb3e0c65b3be5ce3f206166d76dfc5a5f6ea8702da3aecb13e7b55a87b1263c4884611e5de440f6c89ed12f88ae50f"; + bn_t sig_s = "6ae78398e7f942b35e7d87ef27ce830690f7327ad2a83df56e9d0288b51999454bd90f895e7849f35b2a652a3af97bf55795b4698e0b014ea6ff021a00878f3c"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "7c3ab2e3deafb823ee591dc53c97b389c6d18a8ca9a6ae20c74328606db2d7c7d2bb3ce26894e3f30785237b9e874350d615786381b0c8c420224d2f5e359468"; + sig_s = "34e703dd939b2b1a200872334e2f864dbf26688f8475c9e38a384102e08a18c27d4e30d802095fff3edda6dc1e03aa81aed96719cb49612471fa118875a15c18"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "4cd8a5f1977a3cf8e847a1377359cca7046c793ada0665f2c06908fdcec24e6cd55a1750ca576421b8a65aa99aed863cdaaa77d7f7cf84448ea58e95c57a133c"; + sig_s = "a340572d5d9683e72e157e683ab16d0e2a35030ff3e1641d1b4f801d80732c32b9fbb53fdcaea933f131136f8ab25311018b871f53753782989a87ef231a38ac"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00aadd9db8bb4189a6d2ab7b5aae550fe8dc00be2e00f4b35b576d6f862c09869210fc82fbd15a54def1442979fa0da1c64408fd8437a60046930820748ecdfc66", "4a59a87eae338d22d0835523156f8f7d934710a747cf192d3e317bc45f0489d6979887c65ec17ab7b5e3da9f4cb110116ef0739849acc56d24e5a3365fcfb289" ); + { + // x-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "53192c28820ec266639fee09e214a55cc0efb07b22dc0d3f293bda2072fcf9b462da93ec9e7169ae1f1148705189f7f15d2cbec46d224197a3a7a924b0c00a32"; + bn_t sig_s = "1b664536aedbdc97bed4dee23eb94a49f23de3bd84a78f299e81edfe017a7d3ca3a7c8aace8d13b6b2eb477b922c439839eacdff2783070757754863582f715d"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "969058c15d675b1b262152a4520f7e803ab465a9e1eeef7b8a5d0fb3e88032b8e8f1be9f37c80f9c7b950f4da950baae9b216ecd6c793ddb1459cfdf49776bae"; + sig_s = "20e0d078a5a113e92facdfe5cb39243247254aa0a656b83e7baa343d36f7b14b86f15e54b71ba7506d5119ff52c47e0ee549927a008cbf2bbfe1916d1cc274b2"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "1de5df621364436bed5cacf8dbe420e4e4e5d1b0434fcf9dc335645dd0aa07cc1d1ea30a8cafe2531cd4035dd972c0d6c3720f160e24264fd6c41521e44eb0cb"; + sig_s = "72e9abd54561bac89b234bf9e51a3f6003590af177098e25f0053a3ae18a6c74b389674a6eb80378ffd255cfe52323645cdfe9a10a965341b4e47fc0dd082e1e"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "24c10440e37a15d7ec9a3a48965a9ce9380221fc51155f1e992716cd9933d09ce0a5424471877e8994494a4c2ade0a81ef52952e395655157f0b743b3b219e2d", "628fd5ba510f610ee693a1e0d39ef39d91a6248379c622a175a23a5330a88b2d5a60dbf6d249702cd1504561535ea17e1be1b70a41dc463e8e1a1af000000000" ); + { + // y-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "422fb18cdec966937145b0f160b8ce222b0ba16fab075e16f1dac839b8d7772fee27a283ad722225bebe83db2d5a8b25cb2cbe45248b3aa876554c6a37f81375"; + bn_t sig_s = "7a3889d53bb42a6d41f393eb00c43623937029d4cc1d367469f6ea4ec16658619d2935de0a655adae4cbb624f2ffe3ce41f024269d9149dbd83cb1c97aed41b8"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "9836ee7ae0447ec07a6a216633e0a97de831fa04fcd760abe39e8f457796fdfce9c69ed13c827de0ca6b60d849ed6976ac091b7d90ce3e98d3c9144afe638d42"; + sig_s = "1c9d8e142baee857d6adec8eff84ea1d23b05f5482cc2950451586cf5de0cbf9e3a727a4a4e93e15b6cc0125e5fcd1910636898064a63813a0c75fee28041b88"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "0877d7a3ffacf4ef36cbedfd44e4cc0237bdeede8ce0bdfb330bb73b317b7d161c45bd1496e1233ced8f7dcfd05e0e1cc665fb1dc92b54fcbe9b0e55d9ba1be4"; + sig_s = "0f7ab871742ebf22e0b7674614d71569d5084ccc0c98c2e40d088ae88eab37820a89a2dbe49e1b67ec55ae1a34fe4822d691bbf5490fcc2c47e7c1ba4dc56e7a"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0ba18cc05572424a7a391f4b48258a871a0f6d8216c5cf82446c2d156d5586b4c196da0b2f3a23511b89eff31dd4f0c88dbb1a76c5e4b27c4276f8fbc74a1b9d", "00a28cc8c341ea2e3908ae6ab6825f956032c53e625697f80b7b4ee72dcc9f3cff730349e0d30de410917f3d0d1c8988562c1d55583b47f0dec234fda2ffffffff" ); + { + // y-coordinate of the public key has many trailing 1's + auto m = "4d657373616765"_hex; + bn_t sig_r = "a7322046ba7473716d35742d961ac5f2fe2e1dd574ece7bd15da8c66a262b2e79b0d1df27619fdebbb41da1b27ba7c9a0370ef962ee8a45105f4416d16ebf13e"; + bn_t sig_s = "8418e445db45cfbdc8458055386d65e9bc07b497b8d4bef5f515e7947050d9ab9799fb520f322bf00fae4fae03c1269510ebb3e1dc8cca59298e26945862e9e6"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "1bb460ac42bb3640bfc739a0186ef3362ed27b254f548c073935caa211a1aa302e79a9466d7fece774d250c1aeaef9641b9a2f25e61ca37fada8ee07f49fd51e"; + sig_s = "3d918a07a36f578da8b0d42d30bad60ecfbd603a45d0c1a71bb01447ead81a5313265cc9b5860aba03f1c93a9cb9f3bdd9a85f270dd3691465941d2b8098f93c"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "5b44e4fd4996f27a7dcf306bc9fff4a9c36e3fe09026fa72122b64a4ff65f861a5954ce8a41f69a3915c84a63db0c57c6dfecbac4fde99ea5fcb104d6967d613"; + sig_s = "088e7b846d6c5e093a7ba17427bcba0e925acb826e4e9b972b2d8a6d232f635cbe96bf6f163174db646c2f6623c89dc6e4a828d4e2e2fcf3c427c42bdb72efb7"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7f3327e34662274aa147953a007f30c2ee1b06d7bb053e8ce1c9b683f0f46563dd38db071d87433b30380434c92e8cb76d603d1936fba1e9317a06e200000000", "52ca478f0367ab24857e788576f17bfcd05e62d20d0fbefd1b2d954b996eaba67819023635e31483f5b0257f89b46a1d2b9cb2420e1cdb940ceaff5429dd8013" ); + { + // x-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "73967eb24e20f0d4ba58895a49f812c28d24e5f0fd5e35f1075810a478d93717c8aa2605ac84226dd3d53c39c0d8c52eeac8e998bad931f5efdd664b57cee555"; + bn_t sig_s = "05b0031fb10dfc7c36ed89aafe66444835cd9c53e1c850af5f055e2b263d3e737a4e6a83cadb9d76dde535e809f447455324d4aee6f036485d4167a6e60eeda5"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "633f456914707923f4b0086ea318b8cebdba5fa14352e3d9c606bd8dabf032835bbda76aa514c1a6dde1b321803d27f253dfe1cae532a5bdcd9e93e5f94596d1"; + sig_s = "9b9c8ba074deeb03745d8ae37c73e02273071a35dcfe0f65e463e208bd11c6ccb3aded6be7313d7a656d5e871b8ea4d1d51b778467b6dde6578e105d56b617d4"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "40891a57b9b8f0bc6a8761d2424cb60b3f39de4e601bc8daf15ab3216c2c56ebcc760de30907e89294af5818f5a72a2df409bb6918f3d6e506ce5314602e50c1"; + sig_s = "68620756ee2a600a1467f29608ead019d0d516b79c8a756fc537a9fc734616bfec133839beb4778fdffd3fb4226e51ce4bc09627331c8daef1f711648a30fb06"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "12482f158e62e83467297b4edad930ad319048283f0949300605a4a2d19f72f924d41e1cc3ad2c246574f4a0eb637cdd386c1ebf4a00707b71a646dcffffffff", "18d851ef92835f7be92a25b988ae8d5f7ed42f312f7c896850a589f7bb7500330d138cc20dc5630a7d525926e8f717635ee72937035736ace88f0c491f31930d" ); + { + // x-coordinate of the public key has many trailing 1's + auto m = "4d657373616765"_hex; + bn_t sig_r = "4debd0683028f2335b233c49531b6096e7c5521f75fcb4b5f5e32241be081f3c2b8549b57f31217be9b7aa1a4687a72ec9a5d376307252ca7c1b9b610d25b4d0"; + bn_t sig_s = "04d1303f6b91ac01c91411a983f3abb04f3698b169f8a39ffd1931c061e66f43482fec795dfd0d0abe879fa8db885b618aca2ae013e693f154bb9d0a77adef4f"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "34ac9a4e6fb171f424bb592d1b845bee55173b42422fd5b5132f859a27ddcda5532fd38116e6277d9375639fb25b0f66f1e8a1accaa7800c91c87e7439987d58"; + sig_s = "75892be8e11d9bf3e81e8370af02d88bda83ce0ae9c21aeb487eef4c4c5458e51a99e4d788db84064cfbc48240f56612078769fde0e3b706125f46e2f26a3508"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "36b68b5cad7428803f606615505857aa7cfb683d1e9ce856d499fa6e13ee6a4f235edd00403429ff14bc578dd121fd256004794add4fb8195b43a9e1eefbd3a1"; + sig_s = "45c6affd607f5424a0e49c0f1a72ebf7948a80b482ef171ee161dc36515679e32fa9edaa92c57403e6e102643b77391aedeec2b054964315dedd4cc369f23f03"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d691218", "37f78918506ea9cc14f1492eb66c9e1c4e27f3cb00bb511d5dfdbea6f817a87bfd81de2955fa032f52873f799169cc445cb0391e46e57179ef84d50c85db5c97" ); + { + // y-coordinate of the public key is small on brainpoolP512t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "5e1bf4b1debacba4725fc3cc8214534de5f6e592645b60f4c4a1dd2260d3357d8fb2ada7f72a48346a7e34395a6a181c694048ae8258f1cb3b6f63f4932829eb"; + bn_t sig_s = "5e3df0beee22fa96d4655833862f73b52f12e4c4c7d818b21846effb39d6f09fc35b2d0fac8f5cb3c4051ff45f5305e93b24138a0f95fad2fef1c10cd1dcf2cb"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "80400bee9a342f3afba2dbb029235ad511aedb30960c53bad670460b38304d7cbd706ff98f1296cb7e746f8ca3a43937a5cd035a00c63868001fa429b491bd8e"; + sig_s = "5c66941edcda56228edce77373a7b9dcdd464ed18075e7da1427911778784f8017bef6f18751cba12355bd90ba63b8d31ea373387f36494e3642008082d349d1"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "4768dfddae4cb83566f2c3a9340091c2608e0e270a4b3f48ded7c75b4aa15ab65cb050cfdb312c32bfaa7759869c9c0ce27f6cdf1fb584379f6398c95ebf8644"; + sig_s = "7e1a3aacd8d603faecf87902147b67435d992ee9e543f934dd4c40d8a12cd1e10366d0743d7862b9c8ba8b6816639c3509b5caa2a91533c0af50ece2fd2c530c"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d691218", "72e614a08b7b1abf2ae39d7f7d5d5deb7d0899e8b30e80f17865de23781b5ff57fcbbcd745cc65135c4661b15539b4a1cbd1c610e69d550b39258b49d25eec5c" ); + { + // y-coordinate of the public key is large on brainpoolP512t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "27d9c6c4db31aff288fa4e40159d6ee18c98139427484796f1f8745c9827dfc08d393abe144df6b7c12d48971fdd284b81e6e10860359ef71473b9e6bb84cb1e"; + bn_t sig_s = "07a0420c8a9b26911b63626540a85f60aa277afdef9990fc8dc1d3f1f2c5a927e1e4a29d81a701b48b366f000f962614899cbf193826ca8de4a425538de5ac62"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "49542eec3b96c476b59b2b94d5fc7ee08fd2a1b1e732e6609098ab2a7f250452fbc1057a6d3feccbcaeb00468b26222eb48065fcaad7647681823860451e1e91"; + sig_s = "37db336dee1e45d9ace550053511c9c3755657e78eca108d3dfd1e68fe83da626b8dacbb19f0ee232b0f8bfe8ddbe7d5e98b7a2eccd03f375d164ce828631896"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "4f90ceb76bc72f0cca10705d3badab6caa6019ef6bfe7de1b75951d517d2b16168515bf305f0006292e4900598256141e45c19077fa447dd5f32daa62c250815"; + sig_s = "6712a784102802821e9708e349d03a88297b374ef81a4edc35016524cd2a22afea7b8b3171de60ac1b3882533650586dcad338ea48231486e10e3120ce3d2a59"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0518ff14ba05188abed0a8c88db0f097b5660aac57e9a3cdbb9c833e2a7f9f613e49956b53a635952e29818e4a8015cb6a150cede636c2558f2d3602483963b9", "009ed9fe842f3ed418462c63e266944ca2747e15bd8f52844d6a1ce9815210421206805c6ed792356ec57d79fa3e36fff23e2fc6370c67bc51d3f8b555c9048d6d" ); + { + // x-coordinate of the public key has many trailing 1's on brainpoolP512t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "459e3e6e671a6c342d585db689043d32a494ce0039ee71ac67ed6ec0861908ebae6b2d6e4a67caa7a8f0576a49889a4a63d4b0b8aa8845c9cf785b49412a7071"; + bn_t sig_s = "a5edd7abfce9d4413b22289397785b3d84b2c0d3719409255bb7128268e0bcd37d928bea5486bf56ffe259c7ec9f50b878e0155d73e3bde5cffe55e612f8d7b8"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "1b2f7ea40960e37e28b556b7e446c4641e2f3d8a829dcc4a349553e42cf9ce6272dc9cdcda013e3981cb73b10d46321c80501d6a34ad7fd959a0c78f891f33f0"; + sig_s = "7f195b7696edfc7687ff0126eaba13dad1e19563e8d395af32db3d6a7b4e82f28004501d92b7537da397845b7aa398a11051052e52264bd8cbcba9987ec6742b"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 1's on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "1b5c1d2b2b06591a1fa516cffa9c8a57cf1fffc22cecb7249281670bc23883a68553e0caf1edd9f1703a25b74e0000a37e32e6cc3576939f458c3dd5c4dbcc9c"; + sig_s = "4b23d7ed7f8a6b7ba7d22aefa8fde030ecb3f2fed4a5f26f12d59a29d63cdd0ec03fae557d141c7b0e8712c306b0eebbd0cab27696012062622bb180043034ba"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3f89e787b4d5d2599624513530e750ab3c5957dc9aa0e7b08a3e25356818e2037d062f336d4eed417c91bcb11b54b57d54a4f02a72fb74262f742cc6f3404401", "3a448b8e2d0d5a7c5b4f1b9f5b701a9d21ff55e3678ca119b6d7c511ba0aef89f31aeb195db00f248359aee924e7c860b76845f6512a2a4aadc1287a15095220" ); + { + // y-coordinate of the public key has many trailing 0's on brainpoolP512t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "a952847acf213c86e231316d8f9130f7cbdf7f3952307a577076342d13939b4ab5a1313b34abb89204d3fd1f873885fffa683c5a493e5461c7f1400af86ae7fe"; + bn_t sig_s = "9a65a8a4150de593b29642b988b2ec2e23e15e156ecf0af5fde2fbd73208f69f2506d141e0b47c0e1f2fa09ef26b389a6bd2b0230930a16fd119767e382724b5"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "51bfb80aae30262a67bf0771a6b8d195e59aa04e87bd060fe5a9bd56d35385a5fc3da5dfc3ae8c67dbd408184482855e3563dedee72a21b60fafd73819aa837c"; + sig_s = "807f0d69385467ad6cd8a44d482ca3b6e18f7b352ef19a2bc980500b6d59045f0d6f7ab7e414c50d2b68d7f6e6c01d3e8353cdfd475f249b31842fe59955f414"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "4e8711b00de355f14c8eb91959c13c77f9155754765f10f2aaa8fdad6a14c6a4e62c5ed48a9d8ca403c902db0c2c0735426b33e67828ac32ae19b84e65986819"; + sig_s = "7d104ae5e5d0da26cb427d7951d40df429b4205086e633b800d7d7b8bde48a9bec4e43ddeb4226192b5c9b30ffa3efa7d2385ab28a190c165fb2a2c58572c2a2"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7860a4743bb48e7793c7f1416fbac6ca0b538210d743f24976af3efda97f28bc95913401ec4ca5e744a23d1a552653ff110ec8421b3de531f3bacda07bfb09d6", "03662f2f2475bbf5e20da48b50169d289c89c54ed0f97bbbc7f38016f1a955cb74c52727ef802055ea090fe1a49be58ddc6083bca3f7c02ff644775cd0027f06" ); + { + // y-coordinate of the public key has many trailing 1's on brainpoolP512t1 + auto m = "4d657373616765"_hex; + bn_t sig_r = "4cd61754211d222371e552578ff705cc819a2f9fb2729f05d848caabf44a31fda1bd038f1b87efd28a8ce53222fdfec18d5929df926df27c2c7e7360bc5c0c70"; + bn_t sig_s = "5ce94c851db1807dc79dcc087c0830d70a0069cf52baffaf347aefa1ddba77f6f770c1483fdde38f5d74bdb32372e12fee843efff0f2dc9344ca1e3b26b9b051"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "48b4bde7befb1b1cad50cee6233cbf32812860c81d7ad5b0e9d6377202bcd34827c534da0ac9646ae0154689e38c608894bb3126e1025f69c824c69ab821274a"; + sig_s = "8369f5840f776668ebb435b33be05dce4adfabb8860ccc900d07db006a50195fd4de98632192fbe7319cedff26aa8682cf7bf5f1c02e58b9c163236103d9b314"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's on brainpoolP512t1 + m = "4d657373616765"_hex; + sig_r = "19524b15cf4ecb400b938ef5f752b86ec8f07c5903da5dba9c91ab7965b1223a8e262bef8cca8973ed98797f37a35e1c5999cf203e610ef773c6aa2786bba064"; + sig_s = "98cf7526f5a24a0e2f22f909f8190b13130451b15dd6774bdea9d929342d924bc7eba1df89919c1b9aee8d09203606d10cebff89904cb7e71a82d8972d755306"; + r = true; // result = valid - flags: ['EdgeCasePublicKey', 'GroupIsomorphism'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } // End of Google's Wycheproof tests ecdsa_brainpoolP512r1_sha512_p1363_test + } + EOSIO_TEST_END // ecdsa_brainpoolP512r1_test +} diff --git a/tests/include/ack/tests/ecdsa_secp384r1_test.hpp b/tests/include/ack/tests/ecdsa_secp384r1_test.hpp new file mode 100644 index 0000000..2a4c8a3 --- /dev/null +++ b/tests/include/ack/tests/ecdsa_secp384r1_test.hpp @@ -0,0 +1,10852 @@ +// Copyright © 2023 ZeroPass +// Author: Crt Vavros +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace ack::tests { + EOSIO_TEST_BEGIN(ecdsa_secp384r1_test) + { + using namespace ec_curve; + using bn_t = ec_fixed_bigint<384>; + constexpr auto& curve = secp384r1; + + // Verify that the curve parameters are correct + REQUIRE_EQUAL( secp384r1.p , "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff" ) + REQUIRE_EQUAL( secp384r1.a , "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc" ) + REQUIRE_EQUAL( secp384r1.b , "b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef" ) + REQUIRE_EQUAL( secp384r1.g.x, "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7" ) + REQUIRE_EQUAL( secp384r1.g.y, "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f" ) + REQUIRE_EQUAL( secp384r1.n , "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973" ) + REQUIRE_EQUAL( secp384r1.h , 1 ) + REQUIRE_EQUAL( secp384r1.verify(), true ) + + // NIST FIPS 186-4 test vectors + // https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program/digital-signatures + // CAVS 11.0 + // "SigVer" information + // Curves/SHAs selected: P-384,SHA-1 P-384,SHA-256 P-384,SHA-512 + // Generated on Wed Mar 16 16:16:55 2011 + { + // [P-384,SHA-1] + { + auto pubkey = curve.make_point( "6881154cfe3f09affbee04cd387b27b7854326faf8906c4b9c9e6ac2c632e0d59717b3f33f6d747d7b7cbb4e4dc01fb8", "ba295ae0966f06ad9d84b3bb4da7f99b56044c99f88d71082cfea6964ea3c63bb79806a6a41fcc314b55b3f64f82b68a" ); + auto m = "222638def3abc9e846fa506fa6e05ca6bf35a13947147fbfaa20bd0c3c7fa836bac8a0c257573d32f05b6387eb3913af4d14d421f8b3ab6eb182542a48be0fef76466c7fe4acf7de2af7ccb82caa1a37f8be08db46f455f9b3ed7d006b0cda1f0a99e9a09e4caa00d11b143fd645cdcd402af41536eb89c9a77b0ff47d46baab"_hex; + bn_t sig_r = "2112385a75d4edda89ae2bc3c74524dc792544a3a52fdb588da3f0feaee6a11623db275e2ab8abdd998cc42a29c60856"; + bn_t sig_s = "8d308a3987b81c595f8cec19898b1a42da8eda97496af280033b0f915283f171fed7e2a221fa9c78927962189333f437"; + auto r = false; // Result = F (4 - Q changed) + auto d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "2f2f43f244ae027c3d2ec5c900393f80a8ad0e9b9a12a047195d29a39f2b7026b071688dd9a6764379d02a5ed8035ec1", "e43d45851bc76c37d34dbed996a65ffcfbbaf0e2cbfbc9f62d2116bdf3b330bbef5acdbcd0aa6d949f771daa17cda1e3" ); + m = "7fda17a3d3bdaa614f5a180211867fc08cf4a6de1fa407498b990e6730589e6eee8bcce705b15a67be22df10d58e62199e6480efca7878516a92020b0544bd04bdfa05f74ec61c43ba392f933a9dca5490927532b775d300ae4171ca9a842f15973ba98a4edd2211340d6c9409649329599f38123c02441340959fc1b5d73173"_hex; + sig_r = "c011c52e9cb02048957a233704ff9a2c1d4c56e08ebb083aa8ba351f041a23a7d0da19088ac6c60ea2ca117531c7cf35"; + sig_s = "a66ca9bf06c35d129a8253a0f793acf681e482d9994868b275a230b215286e03a66a0de77c7a53174375137fd4688556"; + r = false; // Result = F (4 - Q changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "9a5e1932d318bfa7986f0dac4489c6f55775427bb60fb24bac7646b9994bbc3a9b5cd15e818cc4e832afc1c3fca9abae", "64c89e7c3399c136b2718ab675944207157f0bf23d9e2a807ae7ac3bef81da7ec3c56c2d2c08afc53301af2a3cc71861" ); + m = "053329a0b61466a6198e05d23c287a9f8b4cef88bcb5916da9a50b89b67a659430f46183d28463d397b1f10056a911debf00acc99df49451e146458332517ed7b862fe41f008dd381d7ee2c8e78942c56a147dacccb966ab803725e6d423505e027786baa13fc0c7cd5efb268e3dd8b0464629eebf88e487b8901d22c0b28863"_hex; + sig_r = "4cf6c63fea6c80efc105cd99afe2b53da05ae16566ddb20b9d40a076575ffac419b6807fa336fc6e7c7416c59775ef09"; + sig_s = "aec2d96054b4b23c49faaf9903ccf63bc96281fb7c1b9d14daa54bba51bb2b2f4d3a901f3b0b9cb2b62976459219350c"; + r = false; // Result = F (4 - Q changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "b3aeff27b65540c6da10a88008404b1d49239c87fbf47932518fb87a9bb132403d1f310f531d086340bb4a68c3e64b9b", "567e75f442fcd81017b8adc4cce634f5ffa3cd497d38221d34dc1f43aef99133131ff1b197f7b9f37beecae5c438849a" ); + m = "33602a6ec9d3807a3bc3bac1a4429865d64d1c1d3715d62cb5f22cdc46770dc991b70075691fe4243cb6a8633b517635b08ec442b1c6ecac08efbe54e7c1e7911852a5189833b0bc7be99c2ea94337f86cc295f2c9c83d0b50e494908e6e4519052f7aa1d905a1867a1b6dffa62760b6bbe26e3cb88878b50a17ed5fa8e1ad1e"_hex; + sig_r = "3b94a2514eb915b71e18c867ad7f508a35375c5bcd4b797b86054798569870b2477e2ac14406628017d829400efc63b2"; + sig_s = "179a10441a0beea3b375248e697e0d19e24bb68184c373fe4302839b97dd7353a5a25929c2733796b0c0d8211bd67c51"; + r = false; // Result = F (3 - S changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0874a2e0b8ff448f0e54321e27f4f1e64d064cdeb7d26f458c32e930120f4e57dc85c2693f977eed4a8ecc8db981b4d9", "1f69446df4f4c6f5de19003f45f891d0ebcd2fffdb5c81c040e8d6994c43c7feedb98a4a31edfb35e89a30013c3b9267" ); + m = "3f0783a58e66f3d2c0ccfb5fac3f09db6f8609d0592bc77fdffed9cf0e137d26a867057665f3ad81beebbbdb723d5a47c580828f10f7347ab8a9c24d195f736dfae6eae37d88fe3b4735e7c669a80ac1913e5c24c8c1d5cdb15f994f3ec2f1c774752e14f596b38c2fbf037616d608244d3da7d4badf351330f947e04cc350e7"_hex; + sig_r = "8d9d3e3d0b2b2871ea2f03f27ba8699f214be8d875c0d770b0fff1c4ce341f0c834ac11f9ec12bfdb8320b1724c8c220"; + sig_s = "62150dfba8e65c0c7be7ef81c87241d2c37a83c27eb31ccc2b3c3957670a744c81be6d741340b5189cc0c547df81b0d2"; + r = true; // Result = P (0 ) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "b4b92211edbd41c5468d2ba70810bc37b5e7c954c7bd0db80c4fa89ccba10bf07cdab953828a068bc0104d28e4040c14", "93ed318efce3dff98fc782b788d78658ea5ecde4f716e2d5d0ec2d87a2e761daa1f1658cfb857762caa567baaccf9924" ); + m = "66ae60b818e65b19c0efab7223a38dd7b8ed1888494bb01dee42d0f0c913ff9f2e16e146a5533956e28af9e8c46faaa0041cc74469e639257b971ddfb17100ab78363439ff2b3883bd17d54adb48a58b75202b4cd5aa82493417bf230436b65cfc3ac64a8e1e874b7b64ca68bcac1cf30e6f363fb2f736502d3e41940ae248af"_hex; + sig_r = "aa3978eabd196ddf9cab2815cc9cbab0b61cd639deaf70e093a10a58ddf9f410ee1ab965ff8fbb98efbe812421a613d3"; + sig_s = "02761a2947e1855806b8a25b9ebb0762be9f5517461a371e5783f34b184f32c4ea684b362119b1a2d8a3ff439f10291f"; + r = true; // Result = P (0 ) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "63b4cc14f9efd3b8f29e65806591d1e9c54f34a3f5231339bcdbfa4109c42d946a59cdd7bbd2591fd1b2383a0819772f", "55ab3d208109da6ef039c23cddd52a5af619266d8fe066dcabb1af885ad5501401a78c44ed3b5fff2892fdcb2a3ac8b2" ); + m = "11bfe43227da93f9ef79a85c243da7e5893a720724f12f9a64da942ae1ad232e158847c6817983e70325dc4ad7a9ec5e3780d4f376a7cec331f33a8b4171e1ee4b613f8de1608cf9b72fd5621ca36fb7aecb27bb432d21845d8b05e3a4099ad2e458409e8de176d5187af0d06f9f2fe2b9ac9d609ba1206f49a88b2d11e3adee"_hex; + sig_r = "a3f9b840fd7201356f35b5dde39027410aad26ac61919c14fe7b0535bb74e7218cb3312bfa60aac63f14166f32ceff26"; + sig_s = "1b1bcbcb0237fad4e406c8d4e3e39b55642d8535afa9ccbc9c601cb4e01891df79f1bc792687cb3a5ee7703565c4a13b"; + r = false; // Result = F (2 - R changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "f82f82f8f7454ce7a94a040ec0bbb52d49e3b9f8ddd095704973c760ee6067a5c28369656f22d70d8bb1cd70ef9bfea0", "0e36e256d02870ee5646a17aac4b280c9d1d2e1d4803eb3cb32e7f754cc889522120efd7c4d8a82e509a4d8f266d3ce4" ); + m = "766c86593bd80ece725a75108a2fa8bb9ee5d13d4d89d0e95ca3105816280d2a82c4f8bc6d2977a34699b37bd7ec4fd5237ddd09ee894ef5311128487ec1cd8387ac24dffd62515bd1fe46087c6f0fc1c37f84aa822fcff167af5c93a2c6e2811c9375a940735d639f856061fdbd28bc400302112b9ce7ed45f2045d9a03ff9e"_hex; + sig_r = "27a2332f3c59464f5dfe7bb1201a3936248d375bde603724c048eb8f7c0c2be3ed4b56c14b51d7d68bd2554526b36d9e"; + sig_s = "e1f90367b0cc530c545f95163d9ffb1208c943685d5ae221052b83ee40953397be581e5979c9855b20246e9d26d57acc"; + r = false; // Result = F (2 - R changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "7d40b51127cb1642dd8538d4124138a2f49c41b4d12f702c1b0cec8deba50c3712e01c2e1e693e00438af0e86025da33", "e734b5939b673c45dd32baf20d234f01b7124b391d14beea231e9c604e813fc83b3a77b0cb1f2ce4873a69b0165e369d" ); + m = "1eae9b93f81846153ba466ce52b83c1ee8f2589f88c50b01552cacf14a6bf825b081a3f558005c35f65171b730f33efd38d33dbd898dab5315e9c8005e8d8ad6c026b37b480d04245b3030fbe3fd44141f8a015d45e9772b327cf9f3f3836a9bdede73a1ba0f8236dc17727bc7f26c32d6328531df081fceeea80aa573524f35"_hex; + sig_r = "abf16821b6657e0005071f78c679cbbb130bee6e7ca63526eef0f747fb721feefe6258dae1aa02064a700e963bd9dedf"; + sig_s = "3f7e61c34a30cc5ff7a8be375fcc9c38a76dbc0c30a4356843421ca37a7bcf24edcd41d8235903bb522fb6e5a8033885"; + r = false; // Result = F (3 - S changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "a5b59d59599c105e39f61354da99c7c9135c749cf996cc2252eb83b008299cdafbcb44227d2d2c4a5ffa44823922893b", "0399fb0edcbfd0b76b524f22b7b87ddbb4fa02f510661615312a4492eb3f2001e0fc0e479f77c33a88f9a7e20757373c" ); + m = "8e25d2238f24f2b9c3600eb6ac8de5f8c42accbd27939c0039430a2b656d5af7d287f83f139b367cc0d1fff2269ab3912199a70a6af4236e0079d2f22c3a22594a030b40445663c787a5ad0e2107b8280538e02267ea4e36d1f3a93df06302572b93eb0d5928d842cb2cc30a4f5bb319ba274d3abe905a0596a655d76e839feb"_hex; + sig_r = "a4c9cac2409a9bfea1ebe28fec4e19545f08cd18fdd31048f52a3f2d32b2ed859dcae4dc12fb2fecabe542c4f03191ba"; + sig_s = "b4d83f927ad1980d96cbb0ccc36aa640f786293b8b19e4dd97a797d192b420f630a5e42ac42d8736e7d42008f445dbc1"; + r = false; // Result = F (2 - R changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "29178ce9127e1048ea70c7d435439e9ff9915387e51b7e5ca10bfdafe53565978eb3784d9a4226f443d4834f4d451685", "5cc2970589a453488649711bdf3cdac9a200519aae65b1c6bd54fed0d965755b36b74d978d674275bd71a03e8f054b0e" ); + m = "9b128ae06a780515c734a7f98e4c17adac89bdcd60fcb0a1d079d856c69440d6cad4952d73f0b3fc399638af1e9eb3944fce8dea9d3de7f91730e11b0662287616dec1137c191a06e628dbec01a99eacc494db055edc54ebff99f7161d8d04aa5afa9244a1adbc87d8d7de67681310a42c9c232aa51632562b0bcd52b6dcd0e1"_hex; + sig_r = "5d6f5e9a94d9c92a0890c558bc0408b3405cd04e33f663df16701e80520e4394f1c54d3c8225d36f4753a799aaf6ff90"; + sig_s = "d895b1cc522ceec6a7867867b8f603245c6e4d48945dfc43af721ebae4683d40a3c21b905ca3bd4b974d36806825b2cd"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "9f03569f8c6ca2c16d707f0ca36a8a8cf214a9d5c14034829d709e283cd675eb4e3090c6b973429efdf476c0782e0a7c", "e1b842536731e91596782787d57af17db85dc92fd2fb95ac65339174aee66775ce0a4721d1faeb29da968ea5eb705e59" ); + m = "8d94d7b6b6e16b863be09b9217ae9488d8cf1f76aa344dfe12cd32a702c2ee7f2f5802f97c041aa377a365193aacf05c8aecb505414fae1c88a2954545134d78a7fdec43893ec98ba7584a018815c869c22219a816c4dd70a48e24e78d08a3681fe63548810b5f0c31415f6d2b16a141de875c262b81ba95872dde37bb21c75b"_hex; + sig_r = "31ccbe22a360b1786dac89394c6ef4ed6604943e50837395f96052821f6182914840096e90f2ad650917bd91d7bd4cfd"; + sig_s = "d97199a6b952dcaefb1defe23def92bf2ee236ad18046a2ccf8924d42ee10a62e70ffe7f3c909b11112278f160d98b7a"; + r = true; // Result = P (0 ) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "b85e78a935d169dd5ba8f558f964b21c07804464816f9231233184675f557463a8b00470ac0ca8278cd008f4642e7962", "8edf7be8584c5f207939d479e65173e2e69673090a8538fa93efb4432127895d92b4e4cf13b7632a830e9a33b37f75e1" ); + m = "c3221ec7fa1ad3f33665614e9e2512b853c7b9f515ffa78a2405f1b29f91e87acc2a69564d25977411dd3441120c6c14fa5d479b1526de21667c696e692112563d9a8ab7146dcfb042a33bd5184deb581ed80ad22e059b7b5ed8c5fb51789b82b2e87915b947b8ed452c2d8b0c62f80e15791a7f7cc3d7f47d2437412a6d4c1e"_hex; + sig_r = "fd2876b250a94ced71734aa7a0d32423b2c6f039c926c557e748f38e23bbdb46e17d1204832c6f76c3ea854e1da23979"; + sig_s = "76409e381799502c81194ba87540aec0b89fc4680dd683780d49f82a46a7191b40f5f06ccb02e45e704c31fcd59382b9"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0c74aaa0527524cb6171ab741896b405a6ac4615e474cdc09c9457b18bed33c6383e1b92f2fa1306e8e5dcd1667e45fe", "7b00d934dfd876f6e07dc0582b20ed650be104fa603a5a1255c62b6059d2685aa9773f1ba31254d213c815d0efc8ed93" ); + m = "6485b69626904d88f55350dfcc3dbb46bf71e1c59a40be5b8c9e52c491097839d5849dba67920d866d8494231d67b36b0cec035ced20a47e679ffdad4918e566bfbae52ff34f2c74a0c79aa82a62e0bbee8c8a10fcaf915d864c8febb905ea2e0bd1e671e0d365667143f8a564828b975f3d797c65f1811a487833006876701c"_hex; + sig_r = "832c62b0f34986eda9d1ace5068a0c5318051b0d0166d3dacf137ac072cc359f109ad6e17059e700bb1958bcf4101246"; + sig_s = "6bb56f4eb550688ea66e5dd09aebe7e0b39e2716b4697ebb68f113e080f0ff26fd0fc947a34f3c5a8a2f10e07dc1405e"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "4104de08b4108ee26ee239e0a5d340c1b1aa48b1b3b40717debd6ed3ff0d777923c106f857a3830ce7f3d08d0d6d7908", "00498c38393e6393edcf254804558f86e461df1f5a6557bc5144f8d2f3806413d372b6ce417d531c08a52d1e38e8b949" ); + m = "83170d2ea8cab8ca6da17af60d596c59af3dd9d8ed319930c0c328fad7a7a12a8127fcbd6a19f64e5bb2e26f1ce3ca1848df3a5b20d220b21410c010dff89f271b816942bc7fcd63c3de218775c46b9090a67fd4c64e2e8447aa755e68db28084f99a1393092ade8f72ed00e61c28e9a262093fce6f75b8e28341687b1aa4162"_hex; + sig_r = "9924a3273248db20db007309560a0e616572ac799d773529a5215786cf4a6e03cc73bea81d4810c1eee4b5e975652eee"; + sig_s = "6cc8ea4c4c56da87c25946a198e86917227bcb90da7be1dcde7b6547bc45a98e8175dd54af15bb6ef955b4cb48b7bb0a"; + r = false; // Result = F (3 - S changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + + } + + // [P-384,SHA-256] + { + auto pubkey = curve.make_point( "97c3f446803a61a7014f61cb7f8b3f36486c7ea96d90ee1767f5c7e1d896dd5114255abb36c74be218c1f0a4e7ebba3d", "553ed1fed72c62851e042f0171454f120029adba4ee26855ab881d9470355f1947aa1d2e806a7ff2583660fedbd037a0" ); + auto m = "a444216c9072caf87fa57c1f04aff9cb83dc2ede9968bda41c9d918825e526c2397cb7d771a7e120582424bbea8ecd56a69bb468cd61437f5a65f04953f9d4018c599afd9edbd4d26e861f86829b9496f829f2b601df73e931fff96559e091417c0d8b8c8129443f7efb985d286c7167b66d2b4d5903583a928db3ed6a883117"_hex; + bn_t sig_r = "7b06d6c2b63f1cc3bfdaa897d07dc15a83bdf35d979f70c34578332b3f4920422bb24867c51bde10831324df424e04ec"; + bn_t sig_s = "4bef715161f400dc98d4b63bd13ff4ad4a6c981ead44bfc662fe9bca4b56cd790698e4deddf9a4bd69327f26bfe801e6"; + auto r = false; // Result = F (4 - Q changed) + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "08bd5c6cdc1f8c611df96485090e20e9188df6abb766bff3c1ba341ed209ad5dfd78b628ec60998ddfdd0dd029352fbd", "d9831d75dec760e9f405d1aa5e23aac506dc019fb64d44bd57f6c570d017e6609f8fdbb2dc7b28ca9e00e37cd32a3b73" ); + m = "43c5ffcdf6f9e21aba1b065596745e8738f7b39e1db486a6ae52218d66ce8125fdb155ee281e01b27fa20d0e37d6468a2daedc5fd30573e44b256c5af13df27dea56fd81aef689aad7c022cea77ac3c40a1d64b8c0cf7fb5a128d6a1799da7b8d95308613ceb2260e10b37530edd42925fa5abcdad5d0646ba5bc78c330346eb"_hex; + sig_r = "8b372c86ed1eec2163d6f7152e53696b4a10958948d863eb622873b471702ac5b2e75ff852149a499e61510905f98e4c"; + sig_s = "b2ed728e8b30787a28f2a6d3740872e47348686c7cb426411379411310241d25f08a026b853789b1157f1fc1a7f6ff49"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "10a784abb3c549444a62c28df1c926b8aabb20c8d9aa4b1f7ca830258857cbe9718dbc9845fa9cbb78587a373baee80d", "a1ad0c10b5ab6780cad49c8cd3eebd27de8f1b382ddd7a604458cef8e76ca632a7e44e1c63141a742426cec598029e2e" ); + m = "5edd325885296a829b50b16b17e3c4fc3491f1d53384103f1c09a21a169329e07b3758d55c52e9d578fb9e35e8754bfab9fa5e319d0c7fdb45444eda6a2a0a9aaeaa9b7702cce742047146228f9f687e7684d9b4aaa3be03813c004f0418c1a2fe3aa8ddb3658137d7e954e3683a08e0eaad26c0cc3ae0031b191909a3ebade5"_hex; + sig_r = "d9e52be2a3f7f566899cf6daaa38116d092473066f3a1bf91f3df44d81bca1deb438d9d25ce1632599c1d3576a30f128"; + sig_s = "0cad30bce4b3d7f40b3eef762a21bb1a3bad77439838b13024b7b2c70316875a99e80723a74a9e7a404715ca06a5d673"; + r = false; // Result = F (3 - S changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "8760182393132d69011edfa127e36f92eeac8272641c27f52f3337ef8af7451e6d14f4e4590c7eb9fafb76e8c92865cf", "ebc2b123ed871ca570ead40ae8f6f32335393c569b21b38f626d09c064a3c8668e9fb10a4667e0f0c68bf25ca98fd6dc" ); + m = "4fb73e9e8cbc3e829f99472671ee8719f796dbed096b3cbdf1080ad7f5c410a4541e3526de816fe35ab9e664bb1c1d1e9add2522b9a91eb461b45ae4426e1dfbab7dad03a1392706b9314c03104ea7b40f3632577b0b7c991d2b92460638707572b3387add6ab0f05f6f553fa1fcc50fefe74783cd8b781a35de5ae0e7fc5a58"_hex; + sig_r = "1db957e5c2d294035d7f476a0cbc28a4aac2614d8212de5017076cd836bf04ffe237dce8fec91f2fb5ef82449ff1c65d"; + sig_s = "3e3b9058d0a9c5b417f9c6f86557b9d50e7a902694a7012a1be6bb70708497e4d39fc1f6d6bc60dfa52d23cab173385f"; + r = false; // Result = F (4 - Q changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "2b1f98d2acdda8347b9a68c75174408eae7de3d6b9c08c26e73ce9ed2ac147b8d90cd82e30ab43909d63f6b457de2071", "33f5e6f5f5793201991e014cce0045d04adc352298e32f45f4e374450111c8456b5c2efaec43d157949b5c191b2bc934" ); + m = "b66ca1d77adf6b2b20c6ef68e50d353a9f5cd0be422f5f6fff8f74506280a55d7923cf047dfdb9147b916f6df6cad8c52257360f746b77edb9949ed4ae9a63d08a7da07c4cf32836574a34f316292b8cc5a6b057129a6baa1182be8a5be1c43739e7d9b0abe07801c2d4343a235037b9aaff14694c051fde4b545931ff9e9a3b"_hex; + sig_r = "23d046402cbce807d232bcf0dc96d53c72992e0ba1ffce0d79050c0f4c5ad9bfbbdc1c96c730d67ff3aa3edaa3845da9"; + sig_s = "2cd46a4fe5d120b3af3a6d9ea63cc78f4079e8b5520a8fa96828334a4f182ff4d5e3d79470019e4eb8afc4f598b6becb"; + r = false; // Result = F (4 - Q changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "86ac12dd0a7fe5b81fdae86b12435d316ef9392a3f50b307ab65d9c6079dd0d2d819dc09e22861459c2ed99fbab66fae", "ac8444077aaed6d6ccacbe67a4caacee0b5a094a3575ca12ea4b4774c030fe1c870c9249023f5dc4d9ad6e333668cc38" ); + m = "862cf14c65ff85f4fdd8a39302056355c89c6ea1789c056262b077dab33abbfda0070fce188c6330de84dfc512744e9fa0f7b03ce0c14858db1952750d7bbe6bd9c8726c0eae61e6cf2877c655b1f0e0ce825430a9796e7420e5c174eab7a50459e291510bc515141738900d390217c5a522e4bde547e57287d8139dc916504e"_hex; + sig_r = "798065f1d1cbd3a1897794f4a025ed47565df773843f4fa74c85fe4d30e3a394783ec5723b530fc5f57906f946ce15e8"; + sig_s = "b57166044c57c7d9582066805b5885abc06e0bfc02433850c2b74973205ca357a2da94a65172086f5a1580baa697400b"; + r = true; // Result = P (0 ) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "9e7553eab8cc7e2e7396128f42ab260c6dbb5457cbff2070ea7c0db21def1537939e3f02699e5dd460eca3798d08bd6d", "892c0c8e47dddf858e89099a8fc1026e8b8333532b22f561f7647f63f9c79dbf5e8dd18fbfe6ff34902233119c5d5aa3" ); + m = "cc0aac1010fad8555f81423ac25203720853dbe6a465c244388df90839113d59ea3d3521a8a9cbef649f8abe8d6ff8b0cf17ffc199dddb2997511c4b50e944d41cbcdf5d2102dc98d6f9355b211f130d4e89983f63e5dfe6e1b4ffb3caabd1ad96563fb5c0e5905dcb738a59ec2e5d47684707191ff32746a0cbc65b02be7841"_hex; + sig_r = "2452da6a48c3749b66e576e0f1f768d51728be17aea149164c4e1654c5ce27f625a4610c4a2eeddb3a0626d3abc6c37c"; + sig_s = "499504fb58c9db24a7ff5f7921e1312f8aa583c08a308e080f5ef1acf5cdae7927c4101573db069ab0b6de7f4f1cab38"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0cf4dc51e71185a29c0c6fa3c075d9da5bd7ede085053344dce5dbbe8329e8ac9045f7246c9d0efed393b8e113c71429", "fdb7917b73974b355cf9f3bef6a0a460c2d39fdf1fe32a7744be0a54ddd1cfa8d03914cff4b5ca536b40707ff2629aa4" ); + m = "b9d8d5d47edaa2dca7d7d687f98264b6e21a8e1eeb20083efedb71c116d13150d95f62a369a79f0f45233d2751a4b36432c7c12e19c8bef37568fa1a347929398b7ee69046e11911e3db472c3bccbd68653d99e461b4e5cfa617f94d59798f333ccf13abf426ca8be0f6587a453632a50c159d96695ad03dbaac716e811a3586"_hex; + sig_r = "3812c2dc2881d7ef7f621993b161672329b261ff100bbd19fb5826c9face09aec2017b6843d69336b813b673c5402527"; + sig_s = "5dc102fab9d6325131c556ec00309c2959d1031a63fbc1e2d5d04996d3234ed33875c0ab98e5878e9bc72742519ed398"; + r = false; // Result = F (2 - R changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "6c590434988155236b43147389c6dbfdd27dcd3387e9b4c2587ece670753a542a13a736579887791cf53d31e5ce99994", "35a20194ff3f1b55f7ffb2758ddd4b98dd0d9e0cc213e10ed25e8e0430fe861066c1d4423c67f0c93f7ebd87fd3c561e" ); + m = "6d9cf30d59cc9d6e560e9c52f8be325d19eb3cea592e43bd9584411d76064729c03ad54feb4dce435fb662ff069ca3e19bd16c312567f05018feb8f913caf7553ac728ac787ea3ca073a328633441d7c5cc4d30ec194f248c0701119f7dd80c99e44f469f37cc6726601c97e7d94dc8e549261b46d219a7ea36bee650ccd15cf"_hex; + sig_r = "89ff866889245e797926509e563b1746920b78c9370a6cdae52663730d131e558e327d1f5fef8faf9e6c802fa29504ed"; + sig_s = "8dd68e2de2f788e598b3e5a60c18d81849a0cc14b3b0e3c931910639f3125e5d6045f00330b1fa989252a80f95419b04"; + r = false; // Result = F (2 - R changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "499cbdf18ec4e69b88051543c7da80845fa2de8be2b9d9045fee7f104a8b5b7d04e69142de9955c5ab18c5a34ebff075", "a29cb8d28836b201a389922b6f8f93870f09c80a00242d00d32656a43ac1440fc55bcb123551a73290f603c3469be9ed" ); + m = "2de0c0671213bd4326ffa5a1070ca605733961b11e9f939f805d2d6974d5286e1b1c00adac360f32bd58432629f8c932e241ffaae742c9336f4c95782d4b73255cac0644c8c2d7099c2ba1fd0cf4243344dd8dc0f77004730f5078479955c385959e06303ef2fda8df81e7237251e3e84a03515505e448aa1330a9a1cd4822a5"_hex; + sig_r = "25d4d243da6fd9b439a9242c3656fade7acb7a306e8cf23ea89e3ff4f9330be19c61aaa42d7b426d12c8e0f96b80dae5"; + sig_s = "e7a99cf4b269bb4a6210d185e9654602523b5cfa1cddc94b1db92018aa557ecb6adda44c816975f5ec1756b6df3c44fd"; + r = false; // Result = F (3 - S changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "9a74ea00203c571bd91ae873ce0ed517f8f0a929c1854d68abd3b83a5051c0b686bb37d12958a54940cfa2de23902da7", "6f20ccf8fa360a9ec03d7bb79ff17ad885f714757ef62995f824908561dc0c3dffc49d873627936a2fff018b82879ced" ); + m = "69de70edec5001b0f69ee0b0f1dab6fb22a930dee9a12373fe671f9a5c6804ee1cd027872867c9a4e0bdfed523eb14600cfed64fca415188d56eb651d31731cd3e0efec7251c7defde922cf435ba41454a58d2abf5f29ce5b418a836cab1671d8cdc60aa239a17a42072137cfdc0628715c06b19a2ea2e55005701c220c0924f"_hex; + sig_r = "acc1fcac98c593fb0a0765fce35a601c2e9570d63ea1e612fff8bc99ac2d4d877750bb44cfb1014e52e00b9235e350af"; + sig_s = "7f53de3afa4146b1447e829ebac8f5645e948cc99e871c07280cc631613cfdaf52ccaeccbe93588a3fd12170a7ec79fa"; + r = true; // Result = P (0 ) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "e22f221809fb7a054ac799a70b3d24744eb7c5096c8671770399527c88ccf9ddaea0257a0ae9430d927ff5d9f109c533", "af4101d60df9b306ae92da7592f4faf3df422a3e33f1c2ed2973b2b900eefc346b4cf024de650abf537cecd12ac77618" ); + m = "383ab0251157e645e678100ad3431b9ad96c6279e237ada71d85db0ce3a96fcd4805b2e7676e9a395f1d2f14f24535b77160b22d3d1c7d2e02ec4bbd82058f397db468f4d9ff0ab8306f9becd234f7a7b9c5a4ed44b7474913fe984b5b9e995fae9a951e6e8f2975df67a0180cea81fd4c97eea60a25c15e2ba21092ab0eebd5"_hex; + sig_r = "c39a8e79f0560b9f26504469a470c7b2230c0d25de07c206e87dfbde9aff0a5d85322f56dfb50d4c1fc67c67d615dad7"; + sig_s = "2ad94dd13a39cf4f4cb24c2c81d4c1181652363addd856dc9ba7455458e40ed047cd113129bc87f43949d5a98a0d5205"; + r = false; // Result = F (3 - S changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "fa8ebc3682d90ac7356f0b75b9e3376e76518676e0bedd176cfa7fa57fea4b3a399dbb2bf735ec90b9c1705cf9fa6f57", "18c3fbca0150ec10696b3851f31fb3ba62c0b6be509d249e0d4b374c7a08e49338e0922e2a8a9319999e6569ab8d292e" ); + m = "b23e83d372422cad7bf633ff84468b5ca0f1902eea801bb2e6e89b45d2f75ef9e08c47e010decdd2cfbd9280b01511164e00bd8323fd06a019e83d3dd23c8aa0313ad5196925b5b7d5c25ff8fd198ac2a234dbe0a13fbd04c4002ea89856e91e789e07e25d56690e0481cdb776a3035a64f4bd571097ef07bd49994f95d8323f"_hex; + sig_r = "fb58ab09b8a7ef7a6ec05b854eae11af9b713f7c7540e25115f609846e636ad4f88dcf4dd61e311273df23ccda474f03"; + sig_s = "485be4c21b7c3a9c6b39ffc9f0c39f4050f76d2a6b3fae203d016318c541c1b4ad6cfc0d0950636ff6883895dd49e4e9"; + r = true; // Result = P (0 ) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "e5f331536a2940cd67234bedf813c12e15aefa9a1a68429f8754bf2769a47c9c2efb5c42135e7b01a110d7302e097eac", "63b2398612c863febd482184e834d3acb51408c49aacbbd35d8719746f37cb13e013c9505ce034cd815aacd10d2f7a0d" ); + m = "eeef70ae23d95330a71bdde1feb196d599481e057bdbd5ef519ce445a9b5acb46ede325a9caad720e4fc49c198ff5f0910c56a06d0cf76f450da1ad35fecccdb4442f64daa6149ee6b67ab1307ffb5c4b6ca3e72a644d36d9e71c4dd3283d12041e73e6d20ec19b3b20654593a4cca4b2fd9aa12f17d5b00b7ed43df74548010"_hex; + sig_r = "96c35f22d036785a392dc6abf9b3cfb0ad37b5c59caefcc0b5212e94e86739a2674020ff79258094d90d7d59f09d47a1"; + sig_s = "373cbc865384734c56952f7a35a1fdecd88e8b343ee3aa073d30f5f25b73506f1e5f5857f668b0080dec6edeb5e1be96"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "c53ad865beb1e2b92764065f1a6bb465ee94aacabe43426a93c277d02e00fe36be1c859ba08a031fc518a0d007668979", "6728d42bae9bc097151748ffa0982964bdd16076fa0e7cc15837c1f773b08d02c3dbc57339091ccc34105b84781150b4" ); + m = "7875194a0c3261cf414652cd9970219e3bf8185ad978affebd92ffd40c209a0d17dda0d5b79fefaeba3400088720598cc757aea1fb31ce976fb936726fd4b48d396a35cf4b78d16ddda56067ddc64728dc80b874c5286128b7b5da88808c7df5c3323791720e7ead8b50144dedc15590530b89cd022fd7291c97a4b9889d0568"_hex; + sig_r = "d4f0dd94fc3b657dbd234767949207624082ff946de9ce0aeb0d9993b8c7d7935760e1bf9d8b233bc7d6cd34928f5218"; + sig_s = "0941df05062aa8849610f4b37d184db77ed1bc19ad2bb42f9a12c123017592bf4086bf424b3caad9a404b260a0f69efb"; + r = false; // Result = F (2 - R changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + + } + + // [P-384,SHA-384] + { + auto pubkey = curve.make_point( "1f94eb6f439a3806f8054dd79124847d138d14d4f52bac93b042f2ee3cdb7dc9e09925c2a5fee70d4ce08c61e3b19160", "1c4fd111f6e33303069421deb31e873126be35eeb436fe2034856a3ed1e897f26c846ee3233cd16240989a7990c19d8c" ); + auto m = "4132833a525aecc8a1a6dea9f4075f44feefce810c4668423b38580417f7bdca5b21061a45eaa3cbe2a7035ed189523af8002d65c2899e65735e4d93a16503c145059f365c32b3acc6270e29a09131299181c98b3c76769a18faf21f6b4a8f271e6bf908e238afe8002e27c63417bda758f846e1e3b8e62d7f05ebd98f1f9154"_hex; + bn_t sig_r = "3c15c3cedf2a6fbff2f906e661f5932f2542f0ce68e2a8182e5ed3858f33bd3c5666f17ac39e52cb004b80a0d4ba73cd"; + bn_t sig_s = "9de879083cbb0a97973c94f1963d84f581e4c6541b7d000f9850deb25154b23a37dd72267bdd72665cc7027f88164fab"; + auto r = false; // Result = F (2 - R changed) + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "cb908b1fd516a57b8ee1e14383579b33cb154fece20c5035e2b3765195d1951d75bd78fb23e00fef37d7d064fd9af144", "cd99c46b5857401ddcff2cf7cf822121faf1cbad9a011bed8c551f6f59b2c360f79bfbe32adbcaa09583bdfdf7c374bb" ); + m = "9dd789ea25c04745d57a381f22de01fb0abd3c72dbdefd44e43213c189583eef85ba662044da3de2dd8670e6325154480155bbeebb702c75781ac32e13941860cb576fe37a05b757da5b5b418f6dd7c30b042e40f4395a342ae4dce05634c33625e2bc524345481f7e253d9551266823771b251705b4a85166022a37ac28f1bd"_hex; + sig_r = "33f64fb65cd6a8918523f23aea0bbcf56bba1daca7aff817c8791dc92428d605ac629de2e847d43cee55ba9e4a0e83ba"; + sig_s = "4428bb478a43ac73ecd6de51ddf7c28ff3c2441625a081714337dd44fea8011bae71959a10947b6ea33f77e128d3c6ae"; + r = true; // Result = P (0 ) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "9b3c48d924194146eca4172b6d7d618423682686f43e1dbc54ed909053d075ca53b68ae12f0f16a1633d5d9cb17011ec", "695039f837b68e59330ee95d11d5315a8fb5602a7b60c15142dbba6e93b5e4aba8ae4469eac39fa6436323eccc60dcb6" ); + m = "9c4479977ed377e75f5cc047edfa689ef232799513a2e70280e9b124b6c8d166e107f5494b406853aec4cff0f2ca00c6f89f0f4a2d4ab0267f44512dfff110d1b1b2e5e78832022c14ac06a493ab789e696f7f0f060877029c27157ce40f81258729caa4d9778bae489d3ab0259f673308ae1ec1b1948ad2845f863b36aedffb"_hex; + sig_r = "202da4e4e9632bcb6bf0f6dafb7e348528d0b469d77e46b9f939e2fa946a608dd1f166bcbcde96cfad551701da69f6c2"; + sig_s = "db595b49983882c48df8a396884cd98893a469c4d590e56c6a59b6150d9a0acdf142cf92151052644702ed857a5b7981"; + r = false; // Result = F (3 - S changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "5140108b93b52d9ad572d6129ed6564766f8df3755e49fa53eba41a5a0d6c1d24a483c90070583a66e3cfa52b6fb1f31", "ff52498446a40c61e60c97554256472625633eda0c1a8b4061481fecfbe9c4503e99dfc69e86c9e85c8cc53dca6b8dc4" ); + m = "21eb31f2b34e4dde8d6c701e976d3fbbf4de6a3384329118d4ddb49adb2bb44465598abf6df25858b450c7767e282ccaca494088274e37353674eef58f583937d3d184ef727317d3672397a74c8fe327919a3df8fd65af0bc8cebbc40095adf89f1bf2c5e6dc6ba44633fd8433b25f065f5e3eb4840af23cc534415406745a31"_hex; + sig_r = "b2726b2ba9da02de35e9953fc283d1e78700860d4c33dce8db04dd41499d904866c1b8debb377f6c0dfcb0704252174f"; + sig_s = "0775b027068d7ad55121a278a819f52099ace750d5e996eaec9dee7be72758736cf769650148fbd5c411beb9b88f979e"; + r = false; // Result = F (4 - Q changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "31f4fc2fac3a163a5796f5e414af6f8107ab5e4a98c755d81efa9d5a83c10128c16c863190112fc29d3d5f3057a2edf1", "fe208743f3e96c3a34b5fff78c9716c074a1ce3dc01c3f0e471ddfae91cd88e7dda38dd0e5e1f91b00b8539da3cc10bc" ); + m = "58ea3b1e82f97708053d0b41441d0aa9619050e86ac6c4f7781164e5da3019c47a839366509fa95812e4f64afdc62b627c7a98f633dd05db45c1d8954fc83bdb5042679378bb7e4c7863aacf2026360ca58314983e6c726cf02bb347706b844ddc66aee4177c309cb700769553480cdd6b1cd77341c9a81c05fbb80819bc623f"_hex; + sig_r = "706911812ec9e7370234efd57b2855975eab81e9c2fe783aa8e442dc6e7d681dab2dc0dfc6765f87ab67001108e3facf"; + sig_s = "42c89efa22d853d32f619c9fe13e9852889ac98a9fed5d4fa47fed238e1cbe70d7970af9f7bdf84e51176af4885f2490"; + r = false; // Result = F (4 - Q changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "1f7911dcfe63a6f270cf75b8584d9b1b4a00afc1fa43543c945945b8a821ebeb37fbc705a000f9cc7c35f7d27027b7bb", "f11835ec80c4ac06d99247e73bf72522109ac255e6109262de4dfbf9619244f74fb6c9ee57694537d7e79c248db34dc4" ); + m = "188cd53097ef3e64b78b9260bf461708c836f25f2bcc98b534af98b96ee4b324e2203a7e62dbc396966f56419fb5135cb124369aaa025f396eac72f05ab45950d9e02cd5a2357eafab9f816117b7f1de192468895327802ec79f5d6b5a3d44d7afbed7b4a308e365655b8db2bde75e143062ee48b7c51688ac5db0bc7c83ec9c"_hex; + sig_r = "3587c9c6885adf3be1086825f9a41ccd2edfa0bd95e7fc4dba5a9710f41d539132de7772f14c18e318f8992b66d2a86c"; + sig_s = "73a844d729599d4e3e3c1b63e9c4bf5a73d1f69e0160857fe63a56c381c051f5c37ea6b4cc4caacb6ff26ef9699efe30"; + r = false; // Result = F (4 - Q changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "2039661db813d494a9ecb2c4e0cdd7b54068aae8a5d0597009f67f4f36f32c8ee939abe03716e94970bba69f595fead6", "e2d5236e7e357744514e66a3fb111073336de929598eb79fb4368c5bf80814e7584a3b94118faac9321df37452a846fc" ); + m = "6462bc8c0181db7d596a35aa25d5d323dd3b2798054c2af6c22e841b1ccf3dc3ee514f86d4a0cef7a6f7f566ae448b24dcc8d11eb7a585d44923ea1a06c774a2b3eb7409ab17a0065d5834ab00309ad44312a7317259219543e80ddb0cc2a4381bf6e53cd1bb357eba82e11c59f82e446c4b79314119182c0de96a1b5bae0b08"_hex; + sig_r = "164b8ac2b34c4c499b9d6727e130b5ef37c296bd22c306d1396c6aa54ca661f729aa6353b55d7cf1793b80b5a485115f"; + sig_s = "4e7187f8f735b7272f2c0985315b5602bb9b1a09f32233aa10570c82d1ccedef6e725800336511e47f88ddbbbdc08f54"; + r = false; // Result = F (1 - Message changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "46dcf8ee848c6459fa66d1cae91ccd471401a5782cb2d3b9b9264189f0e9ddf7197b05c694931bde3306240cf9d24b7e", "79d9508f82c5ead05c3f9392f3b1458f6d6c02f44420b9021d656e59402e2645bf3ba1a6b244ddb12edbb69516d5873b" ); + m = "13c63a3cb61f15c659720658a77869145ae8a176c6d93d3a8aa9946236d9fb0463db9e48c667cba731afaa814ba0d58357524f8de28d4c4bbe2691dac9b32632a7dd0f99fd4cb240290878305011f7d3e37ecc410cc1fed601e7901e8be6414ea44317584843a2d2ca2e15103e1ea49365bc384355b3c6fa6ccdd452543e9769"_hex; + sig_r = "5ffba3b5bd7c3a89ec40b47884b0b3464e8abb78608c6d61e1e62c2ca98d44fcdf61825d69dffee8408d0849d0623bac"; + sig_s = "0d2597b5fc3842ffce1957172253a8c9c0e4dbe770ce54f70f139e0545dc34ec639d609e14175bdb2b812ccfda00c9d4"; + r = false; // Result = F (1 - Message changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "097cea75f685cf4d54324ad2124ce3f77b1e490bbaa1ffacde40dd988f7591e1c5d158e6f232500d958762831914af7f", "716d8bc056daf69ca2edd21b89a6ae9923cfcae87bfda5f9a6e514dd4b9d28d164fcc613ca2afb9660adfece59f09b66" ); + m = "6939a9118adc307107aa6b0057c280d10fa44a64700c7bd23e1f33a478ad2cfe596c05f72b540cbdb696aac6ab98d9ca8c62f33e182657130b8317a76275a5996333a5d3547e2293b401d0adf60f91e91d2137e34f3336e017c3c6dba6bf5b13dd0de288f9b20a896a92c48e984fbc09f920fab82f3f915d6524b0c11236aca4"_hex; + sig_r = "1c5d4561d2a3af8835839b543098c101c715c545eb7d00300c5cb05bb08dac29e732ffdc31c50915e691999ad505104c"; + sig_s = "c3442f2fb1498fd47c2f959edff37a19783e3ccee80dc6955ca64db087fd188e67358e7b9223535bbb858d21ba6a978c"; + r = false; // Result = F (2 - R changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "d2e2b3d262bb1105d914c32c007ea23d15a98197f0ed90b46a17f3d403e406a76c8f752be1a8cd01a94fd45157f6511a", "e585fba180017b9983b4c853ad3a5dd52e079c5f0ef792d1a0213b6085e390b073de1a4b01749ceab27806e5604980fe" ); + m = "c82071e42c45ac3597f255ba27766afe366e31a553a4d2191360b88a2a349ee077291454bf7b323cb3c9d7fec5533e4e4bf4fb5bc2eb16c6319e9378a3d8a444b2d758123438dbb457b26b14b654b3c88d66838adfa673067c0552d1b8a3ade3a9cb777986c00f65cace53f852c1121acf19516a7cf0ba3820b5f51f31c539a2"_hex; + sig_r = "49c001c47bbcee10c81c0cdfdb84c86e5b388510801e9c9dc7f81bf667e43f74b6a6769c4ac0a38863dc4f21c558f286"; + sig_s = "1fb4ff67340cc44f212404ba60f39a2cb8dcd3f354c81b7219289d32e849d4915e9d2f91969ba71e3dd4414f1e8f18f7"; + r = false; // Result = F (3 - S changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "cd887c65c01a1f0880bf58611bf360a8435573bc6704bfb249f1192793f6d3283637cd50f3911e5134b0d6130a1db60e", "f2b3cbf4fe475fd15a7897561e5c898f10caa6d9d73fef10d4345917b527ce30caeaef138e21ac6d0a49ef2fef14bee6" ); + m = "137b215c0150ee95e8494b79173d7ae3c3e71efcc7c75ad92f75659ce1b2d7eb555aad8026277ae3709f46e896963964486946b9fe269df444a6ea289ec2285e7946db57ff18f722a583194a9644e863ae452d1457dc5db72ee20c486475f358dc575c621b5ab865c662e483258c7191b4cc218e1f9afeeb3e1cb978ce9657dc"_hex; + sig_r = "addfa475b998f391144156c418561d323bdfd0c4f416a2f71a946712c349bb79ba1334c3de5b86c2567b8657fe4ca1f1"; + sig_s = "1c314b1339f73545ff457323470695e0474c4b6860b35d703784fbf66e9c665de6ca3acb60283df61413e0740906f19e"; + r = false; // Result = F (2 - R changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "a370cdbef95d1df5bf68ec487122514a107db87df3f8852068fd4694abcadb9b14302c72491a76a64442fc07bd99f02c", "d397c25dc1a5781573d039f2520cf329bf65120fdbe964b6b80101160e533d5570e62125b9f3276c49244b8d0f3e44ec" ); + m = "93e7e75cfaf3fa4e71df80f7f8c0ef6672a630d2dbeba1d61349acbaaa476f5f0e34dccbd85b9a815d908203313a22fe3e919504cb222d623ad95662ea4a90099742c048341fe3a7a51110d30ad3a48a777c6347ea8b71749316e0dd1902facb304a76324b71f3882e6e70319e13fc2bb9f3f5dbb9bd2cc7265f52dfc0a3bb91"_hex; + sig_r = "c6c7bb516cc3f37a304328d136b2f44bb89d3dac78f1f5bcd36b412a8b4d879f6cdb75175292c696b58bfa9c91fe6391"; + sig_s = "6b711425e1b14f7224cd4b96717a84d65a60ec9951a30152ea1dd3b6ea66a0088d1fd3e9a1ef069804b7d969148c37a0"; + r = true; // Result = P (0 ) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "d1cf635ca04f09b58879d29012f2025479a002bda590020e6a238bccc764478131cac7e6980c67027d92ece947fea5a6", "21f7675c2be60c0a5b7d6df2bcc89b56212a2849ec0210c59316200c59864fd86b9a19e1641d206fd8b29af7768b61d3" ); + m = "15493aa10cfb804b3d80703ca02af7e2cfdc671447d9a171b418ecf6ca48b450414a28e7a058a78ab0946186ad2fe297e1b7e20e40547c74f94887a00f27dde7f78a3c15eb1115d704972b35a27caf8f7cdcce02b96f8a72d77f36a20d3f829e915cd3bb81f9c2997787a73616ed5cb0e864231959e0b623f12a18f779599d65"_hex; + sig_r = "6101d26e76690634b7294b6b162dcc1a5e6233813ba09edf8567fb57a8f707e024abe0eb3ce948675cd518bb3bfd4383"; + sig_s = "4e2a30f71c8f18b74184837f981a90485cd5943c7a184aba9ac787d179f170114a96ddbb8720860a213cc289ae340f1f"; + r = false; // Result = F (1 - Message changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "d15ca4b2d944d5539658a19be8ef85874f0c363b870f1cd1f2dc9cb68b2a43a10d37064697c84543e60982ab62bb32c8", "062fb7dfc379fc6465302ac5d8d11d3b957b594c9ef445cfe856765dd59e6f10f11809e115ac64969baa23543f2e5661" ); + m = "bc5582967888a425fb757bd4965900f01e6695d1547ed967c1d4f67b1b1de365d203f407698761699fec5f5a614c21e36a9f57a8aaf852e95538f5615785534568811a9a9ccc349843f6c16dc90a4ac96a8f72c33d9589a860f4981d7b4ee7173d1db5d49c4361368504c9a6cbbaedc2c9bff2b12884379ba90433698ceb881d"_hex; + sig_r = "e2cf123ce15ca4edad5f087778d483d9536e4a37d2d55599541c06f878e60354aa31df250b2fc4ed252b80219552c958"; + sig_s = "696707a7e3f9a4b918e7c994e7332103d8e816bbe6d0d1cf72877318e087ed0e230b0d1269902f369acb432b9e97a389"; + r = true; // Result = P (0 ) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "c83d30de9c4e18167cb41c990781b34b9fceb52793b4627e696796c5803515dbc4d142977d914bc04c153261cc5b537f", "42318e5c15d65c3f545189781619267d899250d80acc611fe7ed0943a0f5bfc9d4328ff7ccf675ae0aac069ccb4b4d6e" ); + m = "4f31331e20a3273da8fce6b03f2a86712ed5df41120a81e994d2b2f370e98ef35b847f3047d3cf57e88350e27b9ac3f02073ac1838db25b5ad477aee68930882304fc052f273821056df7500dc9eab037ed3ac3c75396e313bf0f4b89b26675af55f3378cf099d9d9a25a4887c1cfd2448f5b2188c41d6fa26045c5e974bf3e4"_hex; + sig_r = "b567c37f7c84107ef72639e52065486c2e5bf4125b861d37ea3b44fc0b75bcd96dcea3e4dbb9e8f4f45923240b2b9e44"; + sig_s = "d06266e0f27cfe4be1c6210734a8fa689a6cd1d63240cb19127961365e35890a5f1b464dcb4305f3e8295c6f842ef344"; + r = false; // Result = F (3 - S changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + + } + + // [P-384,SHA-512] + { + auto pubkey = curve.make_point( "d4e93c4bafb54c06814011309e9f3d8e68b76a5452e364ef05ccc3b44b271e576c9028106b1584f09271c886d467f41d", "db730ccfdeb6644362f4fb510d5254bfe6f23e891e936132f90f1913e93baa8b1f8c0613a0f0c61a760ce659f22babc6" ); + auto m = "a594969c379cb9e26a7f8db462d2382699b2a6212bc7aab15e768093b2c3158ad5c725c3680ae1f8099e3045a77e744a5a3fc9c15f118ec5a04e186b4b6ca46027737305fcef397257c46cf219d7a1612a93bca36b1e97148caffe0b21fd5d69e572f823f995c0fb8784c8920b6d0353eefb31abbe578f5b5c0b503dde205049"_hex; + bn_t sig_r = "8d0fd14a59c24b0c2a34b438e162f1f536fe09a698cacfe0760d026d1593265d02f2668d2a5e49ac0b21e93807aa9c18"; + bn_t sig_s = "3162ffd2adc9dd5ec1bb1d97d2b0c27b8ae234235ffb374878d0b76382002ea505e885c178d56a2d7809bd1d83117ef1"; + auto r = false; // Result = F (4 - Q changed) + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "c665feccf51e6bca31593087df60f65b9fe14a12022814615deb892eedb99d86069a82aa91319310b66588185282dad6", "1e6e25bb8ae7714415b94f89def0f75dcb81d4af6b78d61f277b74b990c11aff51bd12fc88d691c99f2afde7fbd13e51" ); + m = "d497dfe02aa5e4fa13178dc1ebda8807f9ef1656c1abc448619f2e22a809d05551526a0e9706febd9e0f7ec9b791bdabc5989cb1957377110cc53006bece1a025c5bc7e9e64eb1517a6fbfff058e0ae85d67adee20fe536caaaa9928bf7afc52fe8cc662037dcafcdae4e57630b0c15aa1552372b5bf22f500cacfdaf52e7b89"_hex; + sig_r = "0e18c4063137468fe864fdc405ad4e120176eb91b4538b28ce43a22ae1a310cc22a2f7a2b3a0f3d15e0f82038b4a4301"; + sig_s = "5a1620e42041ce4357daf824befbb2ed65596bcd8214e88726149b26b1f416b9472a8877413f1c3705fc2edf4731943b"; + r = true; // Result = P (0 ) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "a6bbf85e8068151482ce855ccf0ed22988fcf4b162c4b811cb7243b849299e3390a083147fbd68683203ba33588b13ae", "5c837ec9f2eda225c83ab2d5f10b1aa5bfb56387deebf27ecda779f6254a17968260247c75dd813ea0e1926887d46f86" ); + m = "047bb55e59e957f9a8d038a8160fc9e078d73d1cbea39297b8028245b23734b05a6a5f231b729f3697fa3e4d19f6d1c5274ab56c4319dbd4bce742b65d31dbe25425c1c382f48681a243b85a725ec5d9fb1f6cb3d74284de0e8fecd7fe3abbaf2e1cdbefe07893f54e7685eceef8f827ab705ce47d728befbbda5809008adfb9"_hex; + sig_r = "9c11879e59659848274fc1ef5a6a181af813d23708b09a24dc06c089b93b918828dd938a75a34d5a681b0af362dc19a0"; + sig_s = "9c362231962ba7579c4a874e87bdc60dc15cb2e0677149c8ea31162963e05a6614616f67a5269616071cf095be7ff44b"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "9c1eb5cdb1a873e4c275b7ded8712b9058ee0d9ded06c96a2a8d7c652b82e894e2f918dd8e18138e5c34821744b97952", "dd474c93619f02b5d4fe30ea7805c1a13fb80008a81bb5f3eeb95cd11f38841b8e34d64f2c6cc2d6cc2587365eed6b6e" ); + m = "67caf5a42a7150b0e4905067aaf2828ded4aa245f195dd793984b9feb76c9e2fcffc2326b0af42450b9e0ea13481aa4dc979bed8633dccbf40e1a3b821a674408dd80d14d8aa411080619b7536c72a4685fb93273428aafe490915f0734387c2a956d7d20a1d93c28c64fe3913cf367705366bca6693d2d22f6c6fbaeba86be3"_hex; + sig_r = "f17b2f2fa3b5c8e9c62a633e5d417139ddf3dafba75b464fa156c99b3948a0aca532c7fd3e14a266eb17e7fa80881da2"; + sig_s = "01c246866983fa74d6dff38b1ea091f8afd218b5a42467761b147c19a3bb20cd24be8ed1f95f1e61863a709d2d0148e2"; + r = false; // Result = F (2 - R changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "20622a293edc96d83fee77cf1ee8077c61d6f8ed0073d53cfb5ee9c68e764c553fa4fc35fe42dade3a7307179d6fc9c2", "710fa24383f78cc4568fe0f4ecbbe6b11f0dce5434f4483712a6d2befae975a2efb554907aa46356f29bf7c6c2707c65" ); + m = "ef353a0ff016e6618ee11a09203ef5a8c1eb6089478ba3042c5002acae01a2f4d99abe37b10f35c1bb03de8b8a6a443cb0d8140f86e64a905f72ad7371f6c3e20a4962531b8dea2a34764909e743885659a9998aaa0db5830913d22697a54c5313af9115c3a66bebe2909b110fdae6fcd4181b6b414e53816504c35d99a367ea"_hex; + sig_r = "45a6cf5cef06256139caa709292d1e0f963d176add188572e9c7be29af21a95853a98e23aef0a0850e58d44d60b6d780"; + sig_s = "df8d71cd5ab22fc718070078103483e5258734872ab935435f21ea199018e49a69c064a63801beb0759fde6e2c4a85b8"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "83a4fecc0bf0a353b0acf6f54094b822f2b12564e172b296f3461cafa7315d7d31d0089b1b4c18ad3c86bd18f539774a", "e4fd57c5b2937e6fba1e7d72fc3f02352bd79c13611931935f4dfd073b9379f862f2277585137e996e212b5b6533dcba" ); + m = "2fc5392afee78db70368ab391d7d765ea656f13b1f71e5f7550d77443d1091b0df7efc9f4e4fd568827040e3fa7a4b07b6f8eaacaa640711c7d65b04122f7dfc4deba77736382e47a36dda3f379cdde3773a2c7f101825988f13a6b6b64259615c5b6897ba2866d0a0924b4626a0e8db1a97696dd506273a2fb0914283b3d8af"_hex; + sig_r = "fb02804010a570d702ebfbcf3d6cc9d55ddac2bd4b4de56d325e9790571b1737f91d3fa1d4caeec6eea806195aed3187"; + sig_s = "1fd20fe383e907e77639c05594642798619b2742090919bedeefb672c5700881baf0df19b9529d64bc7bb02683226103"; + r = true; // Result = P (0 ) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "208a8c5a6b59458160c5b680116c8b23799c54a7ee8954a4869425a717739facfe4fe24540505cdc133fde8c74bfca78", "22aa7aba797bde1e8389c3c3f8d8d9aa2a914f4d2d7aaf7187ebed9b2761975718ef97660ba0b8a71dee17f2b982e2cf" ); + m = "9a6e7e81429fcdf0cff8343d31f4db2a3d9c44457e6935d30e72d7f5d4d9d1bb6a68311db4fe3eeace1274fea67d81e066f6a4e7bd78699d25c7a89d7ad65b02fb994b265c8f52a182c1df8fdc2822fbd265b362df886d72bec90b78bfd8f73fa74dc615e6e026b9fee64672af86aa3df458159b6d6bbfd6c74dd2849104a24b"_hex; + sig_r = "0b4e835ed83151d2bde96e201c54544ba5f301aca853957d3c538c9858fcce796b60fc50f5600a48dcdf13e5bc029827"; + sig_s = "0270adf02d31d5428d523e13d7d315c1929a1d89bbd0f61eec0b1186abe1c307cbba6b1067a68bc3947e6196d49719a0"; + r = false; // Result = F (4 - Q changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "80ae47e99107d6148b1088c6694df5c1273ff336b66e45b68a7c65fed735129dadcaf2b900e9f8ec50eff70a5ba89ea3", "47450efb5669bfacd7cbff1f801aafa0812ff88a6ae7b5a1f85e88e19129ed995f509fbf8dec15ce42bbbbd33814c09e" ); + m = "0b1c2410d8b0cb48defe7f363d163c6de740dd81c9995ce689b22c4276aa2de84d17ed5604b41aca0a9b65a1c00ca2db5cbd49898dde92a52bd8c370c9fce268aca4a1d0ec130cbd7d20f9d2aff8e9e9f24c4a7c48211609427a5177e001e75fab90de23ede74f974dbdef1b04233b9eb0a71baaab7c864a6b46db00eae4cecb"_hex; + sig_r = "bae6fba7b1485ecdca48219ead3c39295fa9c196b1f0941445b1ac768e33962f68d37f1f1749eaad7200064aa202fb41"; + sig_s = "b411a38d02deb42d1015a7837b033c89d2f37d92c70fa8bb1f592223f7750520b950f30277abfb4155a3ab194b3beca0"; + r = false; // Result = F (2 - R changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "45cb6dcca8d2e80ac04536a22f9d68ea2313245550108ddcd32799d154c0a55492e49463e826275bd9bf0d5e380205c1", "6fd124f5a6c745751ccfb3ba4dd9144ea8fd41a4d9a4b34820434da66aa7385e73ffe71e6c11ed1beb6c7af22ce00edf" ); + m = "869ca9414de82de07f22f7844d8677f62a92a5bd236173ddc3b2b91f927de15cc64f87694c02b0e212267d70cc65c21d02ebd202366d7e88b292785f0ab49436df50f8d631fa0f0969009ab28c98af2a6d4ce79b7ad42228958d772ae693a4304704b695e82c7b905fd97a484a18a2e32f61e961508389936d7b984e2d6b2e54"_hex; + sig_r = "2c782c4263eeee63657fbf20fa287a1a81fcd14b1d3bae333928ba4fc31abb20edebc130714380608e38ea74309eca9d"; + sig_s = "716113d95bc9dba532bfb470112b0d43d9cd6560ad15e0de2e514994801ff339bcf19ad4ee2b8af573f57c038fbd70f0"; + r = true; // Result = P (0 ) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "36c1459d9e9f7b6c1598778c784cbf94661a2b11370c02ee092f6ea0ca20acf81f1ed5048a28a1466a91689df26bc291", "d1367418c7b216bd32c6dafc8b2be99d02cab68df990758b2ddd543b7eb6ff6e285b649ffe588b1811b549cfb5f0289b" ); + m = "6c702f33dc562b5771abe12fd776e766f2328402538b99ee2059fc0c561622c5b9171b753e5dec6a6b5de0f2b8e8edc573293ef21344fb03acedb7047737e2b2284738bba243aafae8af1c8b6827fce77013b80c71990fcd517f0c19c65e7a501d4495e1bdd2c7fbbcd38aabe8a2db205b6fcf70331930551bd925e7e00c26a8"_hex; + sig_r = "40c338adeb504193444bdb95336177362031aaadc5b7e151e42030df9dd8687f3cb8fe2292fd4f9206989c089d966dae"; + sig_s = "be4b2ba251094c24de006c89af2b5c77e6937f36d7bb703b4f8edcfe65d45f4b2fd2486222163ae0ed9e215c0a96f488"; + r = false; // Result = F (3 - S changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "b5eb6670bb0b0d3aef10e533d3660756b7372a2a081d9d920130034f48202cd43b9e2d1e5893d0cfb322db65ab839716", "e28444770396041b489b302786a57fca9a98f19685cb4b455d219151e64645ad30dd3149ec96f3bc90879834b65e58aa" ); + m = "75fc1d1be05faddbb5bbdd05bb5efa45fc8967b62af04f77bae1e737f0ea5fd84407b299a774cdd38f3697be8d9fc241ff4878856765dda9891a47cebeaf5eff6df79ca9e61c5624775dbbd7643fca27c1ec9cd537063f2b778d1302c4428898e06dd647acaf6d091394db9c629847850ce2bada79eb741c89dc1e38c7829d9c"_hex; + sig_r = "0887a13df940907864b425ec0d8f91ac719abcc62b276fa08c5122b38831c8930abd3c8454e98182bb588fc72843717a"; + sig_s = "a380284eacaa36a34e35f04fbf6e28ffb59176f41ea52d9c9bc1362eccd8e0d699c2e08111d93e9dc2785637b1f4f09e"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "700e8f65e052e918a63a96fa57f4eda849f9f9faca3302d6ead66ebf85838f8145a6d6718a681b7bef73170d7254958f", "9e9e10357658913007803859165926cd1e5e92c3a644d834098cb1cbfab466349bf4238a5154cf50ed77c77a78263e81" ); + m = "141723104f09367f4b02c187ce292861d445d462d3adc5eb67649633d3c24f132149d12db67e498b98da8d7d7b0cbed2f67459bf40ccd6f629d98d30bd7b414d3b8502b08237f867e013d7369fc9b7f505f67e6a14f1e57ee0170391007c30e4892acb0e8d1490f0e6c20b4721000f08060fb86580a339691e45d140e2d704c5"_hex; + sig_r = "59be870e0fd684b000cce95c616d9f34674354e9d20db15d204b8a6285ff55258e4eeb49da1573ef1030cd6b2626dcfb"; + sig_s = "c0bbbf71d87479d82575458be9f4d686921db7ea458d620271f51ec3f4d1afe3bf25ef9c0c400eb7b92cd7058fb17346"; + r = false; // Result = F (3 - S changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "a9de6f029445fffcf16349b44095cc83b11e3d0d9f08654b158014803b1cc31b8dfe00b1a8167c6f704d69cdd62c6512", "27336a503a669ba1d1f3619f51dc8aa2a44b2075c682a36f071be486e7dafba9adfac2ce74be0442b7251e99304ffc05" ); + m = "e4622318a8a04eea5288cd81100e60b224f16a2f4344f77bfdb40a1c4c263d1b73da80c1fbf30d13aa0c05be31267c77c802162a7be7488b5d9fcafde3cfe073fdd5c7a05208e10cf9ede811effb8bb72cffb0c59335ebce348b805a7ddb431911d6991a5a914172d6b8088e8dfec2cee36a52b7e12a63c6732abb476b5a2bda"_hex; + sig_r = "f93a4d2eb94d087f28572847e0099ae2ee944efacdad392ec268c9c1e632e6ccd670c36584e58aba52a4c2b07127d55a"; + sig_s = "941ee89cea6e7ed20213a95482fae134707ddf4d292ab1952ed5464f1f1138669dedbfc9998b696eaf469be5fb240c80"; + r = false; // Result = F (2 - R changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "e63500d6d13069c01fafc4518f1d429661c5bb6ad1ff0383037ca6a469a5c20c453dce03bf6e4164f7e26f849016b3d0", "83b7b731c2531c3ac61b194cf3db6dc02ccdfa16d9eb49f97bc4ec3fe6c8bd865ea27f1538531ad07dc44fc5107af8e6" ); + m = "c2c34889861d29db3742763a00e42bfbf4e160537ccafe3d2f1d64557835d35c155c19fa2924f735dcf848cf35eb2880dafc2e8b6980717112f11533bd072ec1e4665aa934b56012eb6cde0f6af3d6d012c4ddb10344f2e08254835fae6ea8555f6c9ab7c451b93d816255dc2911d0275719b4187a1e9cecd435ce85b5165d91"_hex; + sig_r = "eb78733e73fd64a6a1f23eba5311af23d26816fb8847671e01fdbd8dc7d5fce1a0823b080ee99e8d75edb3f100e16077"; + sig_s = "bcaedfe599f98b51542c0f94ae1010611c6767ac3abb2bd887399d62fd0f1b3a0e97deb24c95a76de44521bf24c8645e"; + r = false; // Result = F (3 - S changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "3ebd869be687f82d844416e6816d698d82e1e22a1f451d50b6c146134deb07f05204c0b04e7dc07ebdcfd916531dc7c3", "6e4d7bde063edb7254a82b9d9249d2a2b9ad8988c37a84ac9f7c09daed42b1fd28f7cca1ea8b4f91a66e878224800bdc" ); + m = "17aa6d371c82c58cd209a96d374733e53d41eecba295f4d5e9c4ec0ea0d7a6d268947999ec64b39957153cea7549595e177ce530d60e7613075a378b2012a16485e7ce7fd0f8e9560ad3490c6be17c13edeb60f3f7391a54353f7ddd615e4db831763d645101a60d2bf208982c4af2d082a95e42a2ebe436c0ec5b9de80a61a5"_hex; + sig_r = "575f87a8a7980555a198cfdec279cbb2f89551b5271d242397c29f6bc4bf413dc30312a7e626ef7fc77a9124a79bf9be"; + sig_s = "f0b7d759246ad36ba8240c537b1eeb5d148c38d324f48028c598eaef6e49d79ff3f6cfe3a32fbbf6f3ed3aaaec31d572"; + r = false; // Result = F (4 - Q changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } + + // Test vectors from Google's Wycheproof RSA signature verification tests. + // Generated from: 'ecdsa_secp384r1_sha256_test.json' + // URL: 'https://raw.githubusercontent.com/google/wycheproof/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_secp384r1_sha256_test.json' + // Note: + // Test vectors with flag(s) 'BER', 'BerEncodedSignature', 'SignatureSize', 'MissingZero', 'InvalidEncoding' were not included. + // All test(s) with BER/DER decoding related errors were not included because they're not part of this test scope. + // + // Algorithm: ECDSA + // GeneratorVersion: 0.9rc5 + // Header: Test vectors of type EcdsaVerify are meant for the verification of ASN encoded ECDSA signatures. + // Notes: ArithmeticError - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.', 'cves': ['CVE-2017-18146']} + // BerEncodedSignature - {'bugType': 'BER_ENCODING', 'description': 'ECDSA signatures are usually DER encoded. This signature contains valid values for r and s, but it uses alternative BER encoding.', 'effect': 'Accepting alternative BER encodings may be benign in some cases, or be an issue if protocol requires signature malleability.', 'cves': ['CVE-2020-14966', 'CVE-2020-13822', 'CVE-2019-14859', 'CVE-2016-1000342']} + // EdgeCasePublicKey - {'bugType': 'EDGE_CASE', 'description': 'The test vector uses a special case public key. '} + // EdgeCaseShamirMultiplication - {'bugType': 'EDGE_CASE', 'description': "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used."} + // IntegerOverflow - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidEncoding - {'bugType': 'CAN_OF_WORMS', 'description': 'ECDSA signatures are encoded using ASN.1. This test vector contains an incorrectly encoded signature. The test vector itself was generated from a valid signature by modifying its encoding.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449', 'CVE-2021-43572', 'CVE-2022-24884']} + // InvalidTypesInSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains invalid types. Dynamic typed languages sometime coerce such values of different types into integers. If an implementation is careless and has additional bugs, such as not checking integer boundaries then it may be possible that such signatures are accepted.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449']} + // MissingZero - {'bugType': 'LEGACY', 'description': 'Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.', 'effect': 'While signatures are more malleable if such signatures are accepted, this typically leads to no vulnerability, since a badly encoded signature can be reencoded correctly.'} + // ModifiedInteger - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModifiedSignature - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an invalid signature that was generated from a valid signature by modifying it.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModularInverse - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where computing the modular inverse of s hits an edge case.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['CVE-2019-0865']} + // PointDuplication - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.', 'cves': ['2020-12607', 'CVE-2015-2730']} + // RangeCheck - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // SmallRandS - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['2020-13895']} + // SpecialCaseHash - {'bugType': 'EDGE_CASE', 'description': 'The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits.'} + // ValidSignature - {'bugType': 'BASIC', 'description': 'The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported.'} + { + auto pubkey = curve.make_point( "29bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc", "009a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3" ); + { + // pseudorandom signature + auto m = ""_hex; + bn_t sig_r = "d670d637fcb2da85a22f74ac92939ee2ee5e7d1bb8d6d0afd6f1ef0f883a43872ba285430d4df43f93784e1cd6e6f637"; + bn_t sig_s = "3774da5d699f6bd62b329376e3b6d3612abc67cb945a109d506d3fde45f4c33893c4428250ef6ccfd6e417400344eabb"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "4d7367"_hex; + sig_r = "857f3cd339be8d0a67a5e6cacd5fd267e666b610b660fcd6ac053f04d8e4606777b825327a00796de9d7d77ed846f0b5"; + sig_s = "6fa2b6853764d17480de64c271f2f8b2d22da6289cfda991f12fbea2b177903cdb3e9bdec99cbfce079f6b3a381595e5"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "313233343030"_hex; + sig_r = "a95f66dadda96af63a18d8cd32cb6c1178a4a50e64dcd1ef29e6e10d4fc6f58923b66f9d93f424bfc5d0da8ac546b07e"; + sig_s = "c8fcd88a1d86ee74774031bc938d8607a9993e9c4c3c2d77066a1a929857a8a71b711a98942bbda1e17e93ce2f10cdcf"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "0000000000000000000000000000000000000000"_hex; + sig_r = "d51fc2851f3f304d75fbfcbf153a8203f48751403abb50d0f5d55e0a6eed96adbf14a68dce9e38d45a163e24a7c7249e"; + sig_s = "960d4e0f9e19e5a069e359622bb01a9ea2d5eaed385b2d1db114a0c3b3372d3083abd2a648e9cf65a209c26b22cfb329"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa", "4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f" ); + { + // signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb199"; + bn_t sig_s = "c1f76a498ed0346f9408ed7c781c375dcad7dd1a1e31ed9db8cf6e9ef629f3245cab89992728e8a222cdeaf035059adf"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // valid + m = "313233343030"_hex; + sig_r = "a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb199"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending 0's to r + m = "313233343030"_hex; + sig_r = "a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb1990000"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending null value to r + m = "313233343030"_hex; + sig_r = "a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb1990500"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying first byte of r + m = "313233343030"_hex; + sig_r = "02a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb199"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying last byte of r + m = "313233343030"_hex; + sig_r = "a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb119"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated r + m = "313233343030"_hex; + sig_r = "a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb1"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // leading ff in r + m = "313233343030"_hex; + sig_r = "ff00a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb199"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replacing r with zero + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending 0's to s + m = "313233343030"_hex; + sig_r = "a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb199"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e940000"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending null value to s + m = "313233343030"_hex; + sig_r = "a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb199"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e940500"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying first byte of s + m = "313233343030"_hex; + sig_r = "a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb199"; + sig_s = "3c0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying last byte of s + m = "313233343030"_hex; + sig_r = "a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb199"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e14"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated s + m = "313233343030"_hex; + sig_r = "a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb199"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated s + m = "313233343030"_hex; + sig_r = "a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb199"; + sig_s = "0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // leading ff in s + m = "313233343030"_hex; + sig_r = "a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb199"; + sig_s = "ff3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replacing s with zero + m = "313233343030"_hex; + sig_r = "a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb199"; + sig_s = "00"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + n + m = "313233343030"_hex; + sig_r = "01a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad42b7370a52226a14223d0c093c1ed1cc62325717fb333db0c"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r - n + m = "313233343030"_hex; + sig_r = "a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad49cacd5a139b84583739ca52f308bcdd0494d3eaa19a98826"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 256 * n + m = "313233343030"_hex; + sig_r = "0100a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599a9bc75da517651d52bae5c4652a29e3f0382252c2e1ab982499"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by -r + m = "313233343030"_hex; + sig_r = "ff5647cf40422f70d0e02a4bc4ba3c4daf42e3afaa67a6652b9befdcdcd2108c9d34494d1e86c38ab4c9c6a7eb19914e67"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by n - r + m = "313233343030"_hex; + sig_r = "5647cf40422f70d0e02a4bc4ba3c4daf42e3afaa67a6652b63532a5ec647ba7c8c635ad0cf74322fb6b2c155e65677da"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by -n - r + m = "313233343030"_hex; + sig_r = "fe5647cf40422f70d0e02a4bc4ba3c4daf42e3afaa67a6652bd48c8f5addd95ebddc2f3f6c3e12e339dcda8e804ccc24f4"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**384 + m = "313233343030"_hex; + sig_r = "01a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb199"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**448 + m = "313233343030"_hex; + sig_r = "010000000000000000a9b830bfbdd08f2f1fd5b43b45c3b250bd1c505598599ad4641023232def7362cbb6b2e1793c754b36395814e66eb199"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + n + m = "313233343030"_hex; + sig_r = "013e0895b6712fcb906bf7128387e3c8a2352822e5e1ce1261d5f72c64f244689a538891cb6a386653b70a47e56484b807"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s - n + m = "313233343030"_hex; + sig_r = "ff3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12624730916109d60cdba3547666d8d7175ddd32150fcafa6521"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 256 * n + m = "313233343030"_hex; + sig_r = "01003e0895b6712fcb906bf7128387e3c8a2352822e5e1ce122971e160d7353b1a13157c3661d22f39c5b63799475ce90194"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by -s + m = "313233343030"_hex; + sig_r = "c1f76a498ed0346f9408ed7c781c375dcad7dd1a1e31ed9df16c211d01f2c54504917be6de78412735e1d1856840716c"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by -n - s + m = "313233343030"_hex; + sig_r = "fec1f76a498ed0346f9408ed7c781c375dcad7dd1a1e31ed9e2a08d39b0dbb9765ac776e3495c799ac48f5b81a9b7b47f9"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**384 + m = "313233343030"_hex; + sig_r = "013e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s - 2**384 + m = "313233343030"_hex; + sig_r = "ff3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**448 + m = "313233343030"_hex; + sig_r = "0100000000000000003e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + sig_s = "3e0895b6712fcb906bf7128387e3c8a2352822e5e1ce12620e93dee2fe0d3abafb6e84192187bed8ca1e2e7a97bf8e94"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=0 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=-1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n - 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=0 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=-1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=0 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=-1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=p + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=0 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=-1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n - 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=0 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=-1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=0 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=-1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=0 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=-1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n - 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=0 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=-1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Edge case for Shamir multiplication + m = "3130343938"_hex; + sig_r = "ac042e13ab83394692019170707bc21dd3d7b8d233d11b651757085bdd5767eabbb85322984f14437335de0cdf565684"; + sig_s = "eb4fdca338493686d519df6a7457abb18f48d0249cb9b7d539049b8c021e6cc1ce45c4594f18c210ceb030025f6cdbf4"; + r = true; // result = valid - flags: ['EdgeCaseShamirMultiplication'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343236343739373234"_hex; + sig_r = "975929c1c18f6535b6b21e355b7280775e46be07126af04de8e39086840fd66fa3e0628df5e86636cf24ff88156a8aaa"; + sig_s = "5169223a02ab84d89f29687397069f93a69595085c2ad8928695bbf409fc0fac803eb563c3b5afd16350928296b6e2a1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37313338363834383931"_hex; + sig_r = "ec749d0d9f1c4397caee8bdf13fe15609c01e3bf7013c0fec61de8b8105a91b50fa5517dc85579cf814530a8d0075353"; + sig_s = "95d0ab006017d3aff436f45f6334ce812a8706f0d15073afda9cb3ac0a617dbed1e67e8f8a1942ccbb1335f2a73fb8da"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130333539333331363638"_hex; + sig_r = "7b55d88ee033ad9f5ed40eb04c2be01ec132b2f0142f458b000266d0933cfe89b02230b23bac8cbbda51e131811261f7"; + sig_s = "6aff261cf15f0d16bc45b7a9c45c6c64bcc81439476f83a884cbdd03144cd1664b9c2f0864dda4d743b5b0e2040b6401"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33393439343031323135"_hex; + sig_r = "735143f5c366cfcab3538d90bfdcb030867fd14da07fa769b19bb83d21cabb1d3b57effc608f0e829b56f962cd8d3a8a"; + sig_s = "71da9bf0ab8032f3364a35c4c76497ac152eb2088f31e330d124f39195e99dc52b9173ab0167ea7ec50196e968898d5f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333434323933303739"_hex; + sig_r = "57c8e3316af46afbcd92e9328edf23aac8a39eee1f389e8092b7c0a44af82c98b3f82dd7196d0b6a5f0e8cf825d77b9a"; + sig_s = "295e9b5ed2d0772be013206b642595cc6c54742121477327244c342f794aaa6f5c49eaa2647820ff0177ab06c933fc15"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33373036323131373132"_hex; + sig_r = "0986511c8d8fb8eabf38ee9db774f25a4ec6855f90db689127bbd300adbb5fccea23776b1c9d16f5a001338841344ce7"; + sig_s = "3c2462e7e78b087d57be5b1d350142b57199b10f2162201bfbc7b2c87444eb7fdb6bec97c2a81eaea9b4bdefb095a60b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333433363838373132"_hex; + sig_r = "e6cc1eba338d1129ef0323e275ec178c64add92bb1a6eb4b1a6772dd4d21f9c392f78ccc870b5404f9c7c37e54ef0a1b"; + sig_s = "c2c310e2233c06e0661e08f02abad4c08de5ad44934ae2c82aafbd2e4ebe76bc73be3757e9006fd21d31f991341e1b44"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333531353330333730"_hex; + sig_r = "97f981449d986522566b9ca9d9eed191b0826090227801ff2551d86dd70ea5d43fb7d69fb3dd5e619221fd48f9fe790d"; + sig_s = "14fc61201682a3c7fd9f1e0567e32aa5a81bd5b06424bdcaaabc554b45e9ad6e96b566477994f5bb1a4d6f2cc7eedad4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36353533323033313236"_hex; + sig_r = "7381be0f0ebdc1e7103e928468501aec1a2781497471d4a01451a4374ec754d888d03c21e4724e62e218b8662e645441"; + sig_s = "43bc6698e0853b0c3af0c4d3247e2668bd14b5d1efc0af47783a6347a07336c8c9e7ddaef59371c45949ad923a77c127"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353634333436363033"_hex; + sig_r = "b0c84f4153134f38d5223ff689adafa8be0187b6f996b3a7e73bfba2cdf0c20a174bb8b53f636006de4530dbe6c955fa"; + sig_s = "64e07297c907d9e1d2af55460e791fc088ba9130be9547021087daafde1bf743472c3e1698510fdb921980c244d27722"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34343239353339313137"_hex; + sig_r = "f555cfa9c4af250e0d9738418588d0eb3419facb96040e8bb9270b2ee85affd50b5e9cc24dfa97699dd0c9ed54fa6f67"; + sig_s = "f4221d01cb61e15476a0706c7d7e6a8ed6dd42d09979a728dd8c74cb56d8019dd9991ce4d9ac2c5d4c39947b7ed24941"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130393533323631333531"_hex; + sig_r = "5ac7fef863284650e2e2364b3f3084d5dd6660142719eacf512b2b0691597ffa55efd9b10ca9ce16503a381de08018c1"; + sig_s = "d1e95c9b3391c0c6c65f290ee4bd536b7f76c1d38a10bf79f37bbcc313a0fda2ce6e21195572cff19c72fe014cd27d29"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35393837333530303431"_hex; + sig_r = "23af8731c5917a151967941f4789e824aa29f134a1d489ccdb42d56adbd2cd6ea40063fa8c3130d02434afedd4563da4"; + sig_s = "11984e2cd8e02e3a91e04776dad088bbec2e5a42236a1eff29482932e3f79f1d6ba1ad28eba984c340d961f33a5d94b2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33343633303036383738"_hex; + sig_r = "828c2d20976e45f148c7db7d1d60f7f37e077a4032fa8a616ba507d4affc02f9eea6833d0dd68fc99644d68478967871"; + sig_s = "30fdebcf6efbc0f2844e59344a42e3397c006cd384781c2a63f8e878227cf276bb088376370119bafe2d8918cd2af5f9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39383137333230323837"_hex; + sig_r = "bae5e2b56187ddcc6040a9ac133181c93a0bde87cd2fe55c83898cc600ed0d28a2ebfe0d6cd6f56396ad7b105cb03b29"; + sig_s = "6dcb1b4604a334a60c7b31e4156ce8f0a5ff64b75c6d247bceb4c2dc303d6d1b26f38bd54b5e5ec92ba98909f4b1afdb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323232303431303436"_hex; + sig_r = "df27ad7f85d6d4844462d9888ea3944375d3e22cf25e38de58c8f20324c104ddf006fff2c9276f09efae862cf3591cc9"; + sig_s = "cd87ee40f38b4defabf1a214e4dbeb009d2eab199d44aca7893cfa810d816484c1be562fcfb1993fd5cda00a119f5bb1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363636333037313034"_hex; + sig_r = "8559ddc69f03c1d163fbba98e10a51f169c988a0aebeeca86694c396a478d98c3f2618aa06993aeb9dc646df8136ff52"; + sig_s = "baa7939ec4bd412d3958e50ed2d201678d34b2a368f58cd84882647f881ffb907cbac5ef868da1b5dae5e54bee33d2bd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303335393531383938"_hex; + sig_r = "4536c3f6281e6286170084587d1d70654792c3a48aaa5138882634248cd2221939f8ee7fff0da299cbb329ed26de3b2b"; + sig_s = "33874deb77fa1c35ee217024130c853c71468fa44a0558b07d2c03cf3047280cca7752e80f44287144c1fcb7222c1659"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31383436353937313935"_hex; + sig_r = "81e29b73bccb4c0af067ba7093970300a1db40a822ab830f47898ae2506707aa3523cb73eb753d3ed64e33164819c4d9"; + sig_s = "8f09293b9099bb08ccf46710ff00269a1285e87c12c3bbc3b94c3256d5dab415c5e53a1f6c96d85779fe7306605635ee"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33313336303436313839"_hex; + sig_r = "86c6bc10ebbc30f550d70b4a5a728b07c4aff11a2210e03fb9149663065561fbdc7b343faf8333331762e6f91c8d61d8"; + sig_s = "95626bd31fffacc404ce0d25af14047fe13dfdfdd7b6cdaf3a7ad3f1bea88db11faa8022e6f645f8bf26b66ff5fb6067"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32363633373834323534"_hex; + sig_r = "8ed8c97cfd78079f422711225c866943d10dd72c62fe3fb89000bc3f3f16ccda78943d27b5f2dfffde6b04880329c1e8"; + sig_s = "cb62a92979aba5af7fc47d076f3c7913f579e84a419074bebbaf9b4f92aa0e7f24d6e7fae53f38a7bf06f3e3e1e4d533"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363532313030353234"_hex; + sig_r = "e0c042b064728daadc7c51b703876f368543dc2bdc31473c3e76a84518954e01f34b3035ffaa73f30ba5008e5656d4b2"; + sig_s = "ce862b3a290614d70a84f77e6f62ae583fc8de5739677072455e29216b8f4324a754617678ad84dd58c7cefc2048527f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35373438303831363936"_hex; + sig_r = "48a511fdf410b2cf3f1f8bf86d8a91a30771887fe72aa44eb726436f0c8e7dc27b66f5cac3f7b51ecff7c54f9d6f9c6a"; + sig_s = "c2cf9a4af2f989c533e222b3b67c96a39aaeffb7d86cf0ea71e837b517eee76fca502d7feade878a49732aee75b71580"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36333433393133343638"_hex; + sig_r = "0dac46dae950896cc689b348c031ad9d776a4b9022d44b2225f02124c8ce2558dbae399c8d5e5d3a09eb3ea0c4f24ce1"; + sig_s = "d057338639b25aa835a9889febe4e795967a22f9f6841ea973b892725778c443446e398441d2319210be996c1c5aa7e0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353431313033353938"_hex; + sig_r = "8eab1877a7fefc207bd036be18306d6f05c55c3e164e0f5eec869304e72707e35a2fc1ab4cb9c85bbb34197c19beb31d"; + sig_s = "8af62763f64f46abce9124ad211b13f8104e0034d205db50c1491c99eb478fefe4c3b590f2bb63173441548210a6cadb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130343738353830313238"_hex; + sig_r = "e3f7ff3ce02eb4e0f05b64dbd206c73c016a675d83ca0fb4db2e5036015f9082a2c798d64d2a58ad831cf892b880ae95"; + sig_s = "5a8252381bbedb9f30c50560579c21e388bc02960ba5a891f9e28886c4f14d5fbe6549018793da91581d808a26e0faa1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130353336323835353638"_hex; + sig_r = "206aecd410ac6934780bcc8741ad0bc9970f0edf0485012c115c04e8a6eb9cb949106df4086d08e06d91de4110d3c106"; + sig_s = "26c1e68862189ce6bd1a065359efd2fd7381a81f113bdcfee743ff8eb9b4e9f19292be250b7971b8a8fe5d2bc512e51e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393533393034313035"_hex; + sig_r = "30b3c484de8b08ba08923045777f4c7b980bafacba605e97dcf140ed1bc71601f4124d9c145d173d719ca73505bebd6e"; + sig_s = "afe66045b7f7ce02b86603420ffcc168812d10f7531b300f6de6de3ac43543fe0df748441a62e6ec947f2efd2deac35f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393738383438303339"_hex; + sig_r = "530461b01e1f9098f2a85624193b50b41c14df312f6747580cb6ef9475799898a105b7c8e582d2de562b501977fc5c88"; + sig_s = "875a323c291eb8a8a7197772a90dd6a9668e8392e507399968ae25a026ad0085277602b65deff5a386cd615641a89604"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33363130363732343432"_hex; + sig_r = "e0e498bcaea54c4fcd021e03e73fa11dde5065a7f6fb0c6a1218a8ddd79228de06d0c261be7dca047a30a092d03d10e3"; + sig_s = "4e2dd4d03653313b3ba7fd140a09f7e3c59e2042b0d902700e63ca53c73d11a103d9efc987ef87d75586bc7e1a035136"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303534323430373035"_hex; + sig_r = "3409654af038b6d1a9c09fceda39a3155fbf28a57e1df4c9e35064876455c2534af075b0e4d7960cacd23a0df9f42e27"; + sig_s = "5b8a3ccd8d4f97135ecf8b5d09423c6b72bc045dcb31d1640e50001464208ce23daee21049dfd1f9b3ced26172f6ee7b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35313734343438313937"_hex; + sig_r = "031a7190173c2b5af9bbe16b91d5d12640a7fbfbad118237049f7b7b975ed918c91fe78e22cc0bcf58528e3bd87bbb38"; + sig_s = "6357706f71db16d524e1efe7bb2b43277f59e77cdce8fc71a631a84913e333ac1bab3a16f8655a4223a8681e2f3436a9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393637353631323531"_hex; + sig_r = "346cc96a4f931181737c18932f73a364eda5c3cb7972b5e0446e83cbae8a25e0e7948652b2c9dd3de2f5eaa6ea00c830"; + sig_s = "2ec44b5a7ac35229af089437205b987cbf2beb1cc7b757eb47c8383ebd6d1ea7db169515437ada08f2f68a51d5d1230f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33343437323533333433"_hex; + sig_r = "6973eef723464352e96f58a5eb3b176ea350b4cc51734fcd2fb50d24a2e24447eec760d410ed93cddf1a50524fafbb97"; + sig_s = "d74f45b20b662986e555d396421ef8258001e538929feea9fa5a9e44e3e647031516b8db95f33fc3c63106e3aa8bc6b0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333638323634333138"_hex; + sig_r = "69839151e3b3fd33caa7a00cb8d18a1b4427d1c83712a50daf4ba25b9465d5c301fc37cc046815ee5ad89d3788f6ed81"; + sig_s = "9059a83d790ffd68e262eae802cc0723a0a2903d19e45516c34a9fa922eca27a3528fb4f8161d2f65c36dd90014e0a0e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323631313938363038"_hex; + sig_r = "8d415cada3039cf8ceaec19b75bd97bdfad4336e4affb856fda544e46e0447b6a737eb780c7ab2997c3ad35207758b8b"; + sig_s = "2263661e4ec79487f279c9eccd507319c185c3cca77b2dabe900237b424df2db82bb275ead03a0c7e1452f4b235ed635"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39363738373831303934"_hex; + sig_r = "c4d368ea98589f828edba7362e083d052e286e683db1af2a8b14529c59214aeb55b8080abf6ef025c59ed2c11d8142d0"; + sig_s = "46557571e457adba970327dcc5fede7604b5f7a4c5bedcada8f745e8ebc44b5b074c9905134cdd644164eb85bcdc30eb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34393538383233383233"_hex; + sig_r = "fdc4a9e63ee8a2437d0446ecbebe6d9567aa07768dff1f86a629180525b13c0116777e0aa0d82b8711cbb4cdde1f3d58"; + sig_s = "55db077a644062bfad52aa5344945977ae8ce1ec5e69c39a6a883129dd49b622dc63ad168a11f985992ddc9274971ec2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383234363337383337"_hex; + sig_r = "0eb8aa22ec8b935c8bb3fc4f15d0d476dbbff689fae373b71ef8b1677692115bcd2ca0f3d9884f47ee4e8b9b61ffb0cd"; + sig_s = "fce80bb7ecdb612b92f9a4b75453aacb7a6b66db3663ce983eb9d42d08deb083a169996f635691fda31170cc40451078"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131303230383333373736"_hex; + sig_r = "54d90579d215219f5a129c24be7b8be7415040d952af17848cf720421f5112e0ecda24b9f9f8657a8eccbcd47404348b"; + sig_s = "88cb28669566a92d70f9249171453391224eb3a6cde2c8d1092f1dfa099556d775e925bdca1de18fbb6281ae9e8f8139"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313333383731363438"_hex; + sig_r = "524d01afc5c2017bf6903e4ed032999202976c4217f77b4c106904d774bf724edcd648de9729f97101b03c5589b804c0"; + sig_s = "c22be2008aa068663862ded1619c52f7c1c1b9da105295bfb23c79478adc79d133ac1ee3ddfb41f125dc890153b53b90"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333232313434313632"_hex; + sig_r = "d7d854c08b768c994f435d155ea9969823b364e326ddfc98d769df83b4d2ed2154f09c3e8007a9be6d000f1cfae7ed17"; + sig_s = "15bf0f7d89206d5e90398f62e63917de6b6fda4df13566852b62f61ae3181e20fc2fd297001e90a40ff8042e4a2c4889"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130363836363535353436"_hex; + sig_r = "abf3a5f3c46686df96a328bfcffce36911e79ade8e36eda9925a641d55330d1b4cd8adc5f7b4b05679b047ee70876900"; + sig_s = "0f97f0063c6997d601ad2f2827b1c9324d79a2d7695b372be8fd55b583f2e0b0159c83ce3b2cfb5b5211993bb861af9d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3632313535323436"_hex; + sig_r = "554ed95d83fce6e0e49b4b68236aa6c9755a9242b6143d414c13bcd8a765cc156982bd7693bdd24cf2154fabe74ef345"; + sig_s = "e4e29bbb96ae1ea94f826a735d2599271903cc295182fdb1f0052810c01c8385d01ad9ffa443d2dad13c1c6e948d7b4a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37303330383138373734"_hex; + sig_r = "a31b42c8760587f68042048b9b2ac99ea55d5d2898dd2c565971bc5f038da313ad098e14fc996b2bb7e3b1f5485c6783"; + sig_s = "ccfc345706e0eec6c02f9eebc0cac90cc5807a6505dfe4cbeee837f4b6763afdf067cb1f97a5fe686c3b955b83d81f45"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35393234353233373434"_hex; + sig_r = "318c147e4dac1e9513f0b9dea9f33e2e08d222d613ef08210d62f4427599a94c16468610ea16738974e3f69361dd35a6"; + sig_s = "f26e2bd9da86f570f865bac5f3ed10dba45e83c2854b6361251b0ea4d504303868aad33fa68780241f9e42a1bc4c8875"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343935353836363231"_hex; + sig_r = "3522d0d163a4ddf96ab3de77c3bce47437ab27d11f0cf744578e53e5043b42d1b606c80ac47655d94d5750928b8a7734"; + sig_s = "5a49186d3b7c44aeceb66f1346dd5efb7d7f6869a48d93e4a0a1b495d2c42ecaf37e50e443d6999ea0b06d417958bc12"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34303035333134343036"_hex; + sig_r = "33232fc4a1252216f81fa75ba0582f8bbd3677e31ec41386e5c1d335d078a5e35ae3795e4f6e116825b6d704b9133e65"; + sig_s = "cb4104bab332b7fca97c832c9169295987fd4dfc5f4b3390e78a68955e7a05881edb653da4729ce8afe8dc9c93a12bd6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303936343537353132"_hex; + sig_r = "1db7492dfe34dc9072b3a8e5b46c60f4b6c349948f17e804181069e3614fd76f99f992a27f4ac4c4a4bba9b4255f73ff"; + sig_s = "8b9849be56d77b1d9762ac74e367497e0655f2170a36671fb989f00a778adb854aedf6c02bfa1a87d57df76a1b63545d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373834303235363230"_hex; + sig_r = "2a10831254b51ee0fef4da0a76c9d069c495865fff2293314f8a82e27c674db73c5c64ec9451447df990a3e165fcb599"; + sig_s = "e043fbffe24e82cd416e06bf18dc1009c24551772f4f718fbc35e2ecefe91656e4f338364b67d0592deaba7032dd59e6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32363138373837343138"_hex; + sig_r = "58d0938b3330d1a3c33968803f0132b03a7706f5b6ec15044e266a863bc388d0b64d55d6fa5e136f5576bae0131c1d23"; + sig_s = "3a148453c83bdd1b1ce1b194bc2a2c3e6f969372e2d4363d360b095c9afe03b11244d67942ba30d90d796a0c8992d5a6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363432363235323632"_hex; + sig_r = "6b0ed94b24a40760f803d0728c9f88fc4ced9ae66c81ae96c47c23299fee5f180b168041f129e267ec2a20c9304755d3"; + sig_s = "be555ce7cbed2b4aa19dfea7c38b782994cc6945fd1bf27b96045e4dda5b2d90209ace7fb3dcd12fad93e2b406a68397"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36383234313839343336"_hex; + sig_r = "b6f56623da31ae12bbfa074491e10c30b3352f7fd70ede8270971cbe760bb7b83583d0268f4918fb491fbaf49f75604d"; + sig_s = "93326ad817f2c0c24bd24c55f96a0f9fe2d714aebe5cfeef5c612cb27780c27d5325b2974bce3bab12f200c92c084632"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343834323435343235"_hex; + sig_r = "b17e28636fbf91410820a4f0f699639f66fa91cbaaec6e5ced4b99671c7319f3eda33f9a870636ddc08d881e7425ff39"; + sig_s = "4fb90b8736458b693b5bf9319a3a06bf78e296e700e7c76b4bc25686763d79b54d4ac5b0535668f18ef36046dbaf83f1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00dfa721784921f3697f45769245087c8997e82ca4f5692605cc7dff7235091bd53ba451e2252572818056fbd14228aa27", "7ac54ad5c36344bc092a370f7e149f55d19e4fd9df5022d89d761960911efcbbf6e3b8f3e29114a3ba0729d27e226faf" ); + { + // k*G has a large x-coordinate + auto m = "313233343030"_hex; + bn_t sig_r = "389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68b"; + bn_t sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r too large + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00de9829daa1eca6573644b003ef87d6a390be7ad5b69f97f6e74337faa19958642936e272f4048976578573d0238e5627", "29989c988f81b05bf4918dfd9b2c2b444f305e4a851e26baad31d2091f9e917a7081f479632c5cb16407c9e2033834bb" ); + { + // r,s are large + auto m = "313233343030"_hex; + bn_t sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + bn_t sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b6d8c17908d4a6fedb44f1d0fd6a552763069be2c997660447ce4cb2b2cd47657d9337267cecc42d89842d05b8313625", "00a6be94cceb6a9ad74fd2841cfc46fc12188289d724d41b24b07520441cb6c002957b5d2e9ff7fb12fbf8a245d68ed1b7" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "d1aee55fdc2a716ba2fabcb57020b72e539bf05c7902f98e105bf83d4cc10c2a159a3cf7e01d749d2205f4da6bd8fcf1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c1fb7338c0b11b7d0522f7b34b8ee2f1ddf8319c6cde532a138077062bd8c299f287aee32d8c7b5596837ed0c174690f", "00c48dc9933947e4288799ff45344ae0c2dda6bf22d5e0bd167daaa13949ddcf7762f47858bf5c418b2d7a1ca12e7e2406" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "b6b681dc484f4f020fd3f7e626d88edc6ded1b382ef3e143d60887b51394260832d4d8f2ef70458f9fa90e38c2e19e4f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009fdd44cd61f939e15533c7ea1dc439f35ab5920c9b51a0110c494af15ef08efd01c75e70c6ba4ea514bdcf3f146bf7ef", "008b4d04f4c3848d5f5aa32d94278993bb72cf66fea4de1a873b3ae175b45cd7ce98775d2523920f7f33398c89529ff9ce" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00dbe8c22e6c4bb95778b4fc8974fef8a7a2ba0e56951d25fb18a8855e26bc6a3afa8af2c7d1e504a2859be29e20201527", "00b2fe83a33bc386658e144caa05e36c07ac0bfd2bf73aaca2107c79c5548334fdc6372e24cee0460b11eea6737b2ba0ce" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "02"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "529865605596bdfa993e838049cfea67915da278dffdaa258266b32718df0b5d9e8c9d1035a3ac08980849bf7d934ca5", "1214b858d31f75b6f73d8a0b546f84eb328b1eded40a0b33e4fa97b06ea4b7cde46d152ced80b6423558dcec7b2116c9" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "03"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c09d55452bb9376b730f5dd7a187fff0145cf7d26bf4872df7c1d7cfcfa5af8a1ecb6c9fa3bac3361f0c503db6f0b834", "00c7993183f29419412f5b9fc0639c7ca691fee2a8b6d340ae520e4595dc4685a730cba58b840639cab6bbaf31a4fa64e5" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "03"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "20f3d7826045052262df3330fbfdb96a98ed587298ba67774f484ef036d371be7e0fa974a1e3c5a0d72dcaeb8375395f", "0094608a72e9ba34ff09d478fc6cf8833077d00696ffc008b4756f628c4e3e4733546fe04a785ae46eee810c1db0ea2c5c" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "03"; + bn_t sig_s = "03"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "325338f677836e8c523b0c014fa7e0d68ffaed360c35eda0d87304ef5ed9bf7eb81564b2c381ef76dfa823220001e672", "00ae72772695f6bc153613fefd9c5ea340cc623012a26508c7b55a6829ed99beaa8ce97b18865db43a1fa071bdcb812723" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "03"; + bn_t sig_s = "04"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r is larger than n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52976"; + sig_s = "04"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008d65f327bf1f60df97f174122343c41dfc4d4ea02b4759cfed7a5e8c4c387e08a1d5dfb94e3da6c540213ca8f2f627df", "00ed9d52419e1ad73ad3c528a54627278ee921d2fd61d94928e61feb8b3a36b29c4df354f86ecbaa5b5216e4bc42362b98" ); + { + // s is larger than n + auto m = "313233343030"_hex; + bn_t sig_r = "03"; + bn_t sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accd7fffa"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "568eaf1f63c840c7b45ddbdf6079c7830e4dd12c9a9489522a0afcdaa4ba5cadf3627978fca641f7b526c0a9a770b086", "00c41c73d93c35413978a7544d58c010a0b00e1eb0de2c7b58b30b6cc31853f73c030c2c4b0276b2c4e749907beb600dc8" ); + { + // small r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0100"; + bn_t sig_s = "489122448912244891224489122448912244891224489122347ce79bc437f4d071aaa92c7d6c882ae8734dc18cb0d553"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00f0a5c7f9a60eaa827127a060a8464d1e86aa2af9e8e7b5a1d391b4e5e99664cf7e54953fcc87820f94b14af58b1ce172", "560e0a01d632e5529af97362fb884f6aa28c3077030adda9d62bfcca112c469cbca1bc89e1c3037f7bda5a7824b66d00" ); + { + // smallish r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2d9b4d347952cd"; + bn_t sig_s = "ce751512561b6f57c75342848a3ff98ccf9c3f0219b6b68d00449e6c971a85d2e2ce73554b59219d54d2083b46327351"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009517e58ea80dd51f878ef6ca5d5129c292ac5ee9f0742f2d01bcc7e57d8277e13dfb86e5737a883647175e2f9034d6a4", "00c04490cf98f55501023eb511bfd9172ce6e2d3bf2fb50332a153f5b18306258581d3008efa149a509afe2334f417fcea" ); + { + // 100-bit r and small s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "1033e67e37b32b445580bf4efb"; + bn_t sig_s = "2ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad5215c51b320e460542f9cc38968ccdf4263684004eb79a452"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0092763643d11b8dd390fb00e7067660966d141920264f26d36ae3ddc5965d5b0b7ab9047f3a7b6df2dc50fb34b45f83f9", "00e530a3b00f81d4e7db16323b42a1e37a20b4e61a4084884266c2a2c9a13fac5b1b45c435b9954dd471bc29b4faf35dbf" ); + { + // small r and 100 bit s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0100"; + bn_t sig_s = "77a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6e29be8bf01240c48654bd9cb9e6e4b721c8c5026645bd8c87c660efaaabd10b4b62151b8a3bd1b51eaf1593ca466af1", "1f711cee8397ff42b2824363bc96b03af8d700b507d33193c3690b53c85a4428d4f05d9a714a59068d741601eb2a7183" ); + { + // 100-bit r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "062522bbd3ecbe7c39e93e7c24"; + bn_t sig_s = "77a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "207308e6f1fd1bf539d8c506863b002683e03d8b16c5942472a1a260d88905e15b28ea254147d8574ba8be5f2c9cfd09", "02f3dfd62e0a357709e086ff0fcfd87d1cc2b7232356735a98ba099f2aaf78f264ab4598e162dec425619a6e906daa88" ); + { + // r and s^-1 are close to n + auto m = "313233343030"_hex; + bn_t sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f3"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "61e88253d94efe976c07076ebbd97a4a823442d823bf8461d00cfb44a3133b4e174e3a0fac8893387498432934c0cb7c", "00ecd3b9bcf204fd736ee21d4accdcbc4b692312e1769225632fcd7bec206e74259cc40a3c2609e8d2cbdfcd8f4f26be04" ); + { + // r and s are 64-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "9c44febf31c3594d"; + bn_t sig_s = "839ed28247c2b06b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ba8bd967967e3083343efaee44b67b6f257faef887fb3c2988b1b09721af48c242ad1abe168a123c30c4b7ba544dde15", "2578d88b9b1727e422ea165862288260a9928213afc72afbcdfe0e6350cbac77f12b1f1e3b8848052506c558abfc3762" ); + { + // r and s are 100-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "09df8b682430beef6f5fd7c7d0"; + bn_t sig_s = "0fd0a62e13778f4222a0d61c8a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "18fa3b1ac43ce85701eb590e100f7b7a901d2dbcee747c5a756c8107e09d919c8c8e34e6c64381c3c146d3c0ff67325a", "008a318fad68c9bbbee72e14560891a38009f58954da86a903e48478d66762fcc7ee320087cdb54ede30fdb2a3e928db4b" ); + { + // r and s are 128-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "8a598e563a89f526c32ebec8de26367a"; + bn_t sig_s = "84f633e2042630e99dd0f1e16f7a04bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "56f40bdf5d5c725986cad1c52b407f2977e2495f600c9d4ef335efc82843fe63093541d1acf3147bbb689c0ab728d695", "00870fb2b7fd5a61263bc953a94ec8a9a4152d386970acdc0e4f943e5eb42c18ef4840bf6017a38afa67f8d988a7bc8b60" ); + { + // r and s are 160-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "aa6eeb5823f7fa31b466bb473797f0d0314c0be0"; + bn_t sig_s = "e2977c479e6d25703cebbc6bd561938cc9d1bfb9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00dc24f59eba985876596d7e48ed8207bd0c4f4212f7efbe57feee0617c7060d736f211ae1698070ac0b74304aac5e1aa5", "00a6612e2df4d99aa40a7e1918d43716a22513edcb9670d86fc2a2ede769ee56bfb283de1544a95eeef1fc02df07072b3c" ); + { + // s == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // s == 0 + m = "313233343030"_hex; + sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + sig_s = "00"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4e97e504c56febe883186525474379d14680f26a62f421952aae89c4721d00ae537ea63f816d1caeb3c811da90118f17", "00a284c40e24fe0ea83c2bccb2be5aa6a5941d176acbe3a2b32699c176c2db1db710bcc662e3a9d6c06dff6f2b2420dde3" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "427f8227a67d9422557647d27945a90ae1d2ec2931f90113cd5b407099e3d8f5a889d62069e64c0e1c4efe29690b0992"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "128ac2ef6db923f724cf47f7d68aa74d2ce31a810a5486adde77ff230feec3036e5a4424f82cb52b02acfdcdd0de6f76", "35fc030ef2afef3ff465d9c53771737d105cec6a49edffa018a3cccd31d6b9ef92c09364f4002fedbfd5a31056ab24f0" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "369cf68bb2919c11d0f82315e1ee68a7ee8c17858bd334bf84536b2b74756a77e4eee10ecc5a6416a8263b5429afcba4"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d8d2aeac3f162e1619b3b6512707ef9af5b8235c53e3e11c0b75fb2703f007b2c7e0fde988a766eae82f2b5226604fc8", "008e84a47531577ab03589d64bf9f9f05bf5b8b95d24884e0534fe992000b35950bb7db043afe3be07b312f0fe452d9a2a" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "2111832a45fc5967f7bf78ccdfe98d4e707484aad43f67cf5ac8aa2afbde0d1d8b7fe5cfc5012feb033dffdec623dfbf"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1cb88451fa09e467dfedf7c37d8485c01351dedd65ee6206e4e8c64bec8d54934a5be20f6f95db5904617cc88ac6f80e", "00d801e633cd3a5ba198fdceea5542242e6c7f1711d31f4884c31a483bcd0b1df862f56085a3856607246b510baa91b254" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "20cd002ab7dca06b798fecef3f06a222c2d2a65e9ec92f74659a8d82fe7d75e9af739f0b532e17d6c5f622c4b591442b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00cec5c5216b1ebb2fb3cfc5b78be8e04048ce5c9d727f93c1c92f761217f3bc0fbda7a2dac5b175a92ed0f04dd9904867", "292b4fda8028a749ce72d7d62f0315da96e3b4295014a4a94b414e40491f58c333b881666d444f487a2cba015d91cc4b" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "3276fe55314e426a8ed83c4c38dc27c8fe8cbba0b39bad7cfc35e963adf10ab37251ea6829b8d255a77dd0b655cf9ff8"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "55f0df11cc1fa0c15643f118765246eabf5a492e83cbce0072ca36e810e043995a680fb3b17125901c365658e1b05672", "6b5f85375b44979c2088453d21d74317022c8ecd3b957c74d2479c99141969f46b34d3e87cf33b0762517182f591b26a" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "1a80b4a3d6c88775821e26784463080eb7de510762ab0d98223e532364c7089b07af73746ae4cf076c5277dcc80cf8c2"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00fa081fa00728982fa13e216a50b52dc2eaf84f458ad52c81d5f607a1fdc2562b97617fe07e6c3d6dea6cac20b78d8cc7", "00ffdbd588c54fa20f6f7d9a6c8d7601382dfc39ee83d25f96cb842d4fd8f940e02d369edb37df28b54bc59752a95062eb" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "74e780e38b3a7cd6cfe17d5c9ac615895bd97dd4076b5f8218ae758b83d195fba64eb9aead39a790ca0f8b8387376265"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009dff849ecc2c3af8433c6a9493663ea4a930d98734b99bfc9eed5cea462735eb1a03d3e23711735d64565cf20324ea4a", "0092cc11ecf2b41aae833f96d3f0679a4baa2017d156115658cfbf5f13b6a9a89fd6c3e96af2a59670300de8d4d1fb6112" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "6ee5f8daae12c862e1f7f8b59294ac90448c4461e29b36ed623a719dd69bb17b3a4b7c29b9eb5c39ca6168bf6b597c6a"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b107a43b4ac4ffb8f7b55f06679e2204d377ad2ee635e7a0b48ff46911a733b2b3084ce6042bf7ce279686f0703c7eaa", "069b7bf6419d9cb63c479da1c098e477ae88e3c167616721c108a5a813ec6f03157837311646b0733b350e224bb76b7a" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "5426ca20a25b0cfb1ef230c62f91e98005f346e229233f1803e8944bf421fef150a4a109e48cefaa4ea23eea627fca41"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00dd63d35451728237f16085f3feed8d5a1923cb67597f72a66413456260ab9619dcc33f959627a7e503e9f358b8eff3ae", "00b6354b52b1081e4b172eb847e03a9a940bb840603bd305e826b48cb7895934e3f77577403ec8488636d7a8ffc069bf17" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "39fd1a0ae3964735554c61daf085c66bcc2e9e5350131086023aa99549fc5f9057c848e75a1b8e58069fe0b9b23fa3c9"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "61980b43979e2a4b03e904b046f8797446b51836baaa64bff51fbf24bd0b31f3a0a022c14da8e94c3e7a23979f731aa8", "00a1e5f7efe41546846af368fd63391638d632cd99541ef83f3150b3c1d56e553e8afb44d72c98dc0016f66a7b5fba5204" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "707a37cfb7367c2e551ea1f0caeac6c0fdd2b562e1bd8f1c7c51a5dd78f21da8cb179bd832cac3d3aee21fda54729e66"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008c03a059fb8643d5fb8574bd166f7360f8243fa0e40a7e17fbb35b680111ef2a7f9b23cdc42f7a66f10a16dd2c40432b", "00a6dca1075c8396b7ae772732851ec2b53b3599aca001850665a6bc1db8bb24966af7dba572ad3ec9dba65ba9418b78a7" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "15c99e2ae11f429e74fe2e758bc53ffea26eb6368dd60d10daf860f9c79fa8cc6cb98fee9b87dd38353e970539a50a9e"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00cc17b0a942599b5e4f24b674f4b31bdebb9568365052a5666f71268234ae517ca804fb257e0317c641ef090d06e08e18", "03643985acd19af4a665976436cb1305af99691cc9d162060800beec9b8fc9f986844ef85311a21b35da41076e3da8e1" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "148c732596feaabb01be1be3a220740e84bbfabe6d82ad0db1c396fa047603beeb95a1cd37fc708a9451d3cc29a45b32"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b8033e58411dc0a379ebae87a1e8c2339e4a4d1903ee96c64a6895178a09e6b8058cb9218832d8656c594b2c74b77415", "0d0b55352982f22998363646ef74dda98d869a3e3a330e8e6b80f35fa78344b6ed681c5d9819e6a1f226861595de1993" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "6b3cc62a449ae5ef68bec8672f186d5418cc18d039af91b45f8a8fae4210ef06d3f0d226f89945b314d9df72e01a02bb"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "46dedd90f787db11f13b1a0441b819b23a4613d3083b50dd1833f604c1cc3946bd7b6390827e34c4c5e4ed169cc2087f", "0353a343489639d9f6fb8a483cde06e97ae1df63428aa0736e150ddf3036dd1175de86edb104418b486982e05eb721a0" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "7db7901f053b9cefacfda88dd7791c01fd569ed9a5243385eccae12ba992af55832a2e5dc8065e018399a70730035bd8"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ee131cfe177bde1f414ae7b1b0767afbb1fdbaf3a21525e2544cdc153ae1cc60048520de09288328081545686dc63a30", "4077fa824ef65642af4bc0f2e80faecc1e4df0a771a69db47d8228fd7bd8248c0b30838f92e22dff34f2bac0ea561e63" ); + { + // point at infinity during verify + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = false; // result = invalid - flags: ['PointDuplication', 'ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b7ee6be7e79ba7a1e3c866b45b5a24bf6d07239718c7ed2fb79af878fc6c3cfd8194de0a31055991699fd6c2ef82bc8c", "00f848e8773f53a727c9f17690aacf42e27ab0a5bc3b3521571174d8b3e73dbfe4479cf644a69fc337751b93de5e8f5eb1" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e15615779199fd5ba364d8faf22884737e9d4606710c73a274c0b3d2a9a5f9599578482d8eb0103403b4114b21593476", "544ff1972b88e63e31f38822c25965b06700a45b37001faf828f30ec8417b1c8dfb064392432efc5e2f924bb5e791dde" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294ba"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008d5a8b35e8b996f816bf2d1f3730ca44445b32eb063cb329de526a7b160d947febb1e9f3985e4404a6b1c5aeee2b32c0", "00a05b85287fbb013a771a4269d1d63088800a5eaa8e12de51de1996b88a0531c743b2c36d1ad1c5455e8ec0d4ca7105ad" ); + { + // u1 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "29fef69d4aab0125e270cffa43b94c5466b7d4ca1efdc852c1f456d03de085408baa191f65a6c05483dcbee4d840467a", "2441185832a99f5145ed73ea54774e814dbe15018e705f8aad95eea9e22160e94541e8df64c1baccd3df749e6b7af611" ); + { + // u1 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "ffffffffffffffffffffffffffffffff44a5ad0bd0636d9dda1feb8c60148bfc57e325ef1d899af2e547ff6c0264d950"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009b3d7bb633c34a4318062fc0e1a63bca8346efbfe6bd4ff33d9190385a5c5c77503603aa41b1f5d65cbcde08fc91bc43", "00933964a01e00a0937785ea34c60bb41a310c94e03a2ad2eb44d4b4ca1d651d264f4b0a62ac529bccad8de076e3f8b92a" ); + { + // u2 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1cee4d3d2cdb64d4c9d0279aec92ca9471391b79cdde4686226386a1e3f89b42650846a0b1609d584be5932b4a608725", "595252558241530a6aaacc3dc3ac83e1a4c82fa3402269b3497c771ba00d9bf402a3183fb8b8f7644408b9eb0ceea504" ); + { + // u2 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa84ecde56a2cf73ea3abc092185cb1a51f34810f1ddd8c64d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ae0577be20fb0dcd34c5a7b61d3cbc5188b714c12c7ab06df756f7d3b4f776314718b07988b1d3d9452a36f126b6e5df", "00c966159f0f5681c81b3403dd0c1218dabf642fd52d74cbb04c5f044800cbd1967d39504f4207c99c072eef41ea3ea471" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaae91e1ba6ba8986207eadfefdd430548b3ace5662942d73d4a07ec446cbf8e103"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6aae5918f9923bd4164a49488fc522bab02a6e6ae51f85ff757ed18c90570287aa1c22fe073d827d3c07ef6ab915539a", "00fde40d804a046c26ec949b25f4376158b5187add82c2eb612600d0490294a08c218827a779b046b00f3bec158f30f89a" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "bfe534e980897d2679cd9a3780bd3dfaf493984eb534f6570fd459354c0da4dafdf7d438eb989f74910d762c1a607fcd"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1f37c46517738db2f6954ed3920e220e89e30b0ec2b6657342fc84cb797208c97d0ae5f2cb64d9d54a401db0f1f8fec8", "00c9aa908ef1d282749a4ac27a9a8889479c7a7a8f778e85d682f4189eafa00bda4a16a162348cd33184e8776ee31a43cf" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "e11190e4512e6cd9a3fca9a9cd73aa99a855f7a7102eae214b8ce295399c2d2c07dda100541da32154c7a72f65961f31"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3f73521f225c5a2a1fc554ee9ddfd4e14e71958f20d0519eaabd567086f6764cf39beb89d733c247ab356025702d5e97", "78db565bd8801439a596783b4ee0a48e9386716cf1110dfcbdc3e27797da11e0e30084d125ae9a3f4f1db90e526feb88" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "ab1fb141339f5290ffffffffffffffffffffffffffffffff1ecdffa53ea3f0a5becbf535894f588941ef362ce95529f2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4b18cab482e99d1cd059794ba0bb516779ad6a432282b7d115e9aab13bb077cb8057b41eadffc8467b3eddb1dd9ce21b", "18cb56fe71341001076b84096b9ef35a1765c7cab761186a768a73a4eefdae10b27d9dd8561000d99ce4802f7be5c366" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "fb141339f5290ffffffffffffffffffffffffffffffff44a234aa9863d18eb0fd0c6e979ccd9fadfeb270fbe0aaef97d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008f49c7984fd20e1264e04afa91d536daffb8cbdd9c3f2deaf56fd9137d16830d01fe29d03d6a63f096061cbeabad7d0e", "4304531294ff633b09f51be4b26df3284bdfb76671a0945935dbe4a282ef830416c4deed3cf6f6204a7402de803de17e" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "f6282673ea521fffffffffffffffffffffffffffffffe8947f32058a85faa8404973c54151034e44e96206114898c987"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "53854575481f84e621f46c8190b9a351c592b62c5758dd3b54c5bc6392397acfb59217470b496c9d08ae7f0bbb61308a", "6b62b7e71148440f36117fd8d6770d9d54357cbe52b8a92ad006b706da71b67b197b9d338c77575b4d6994a863601a0b" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "339f5290ffffffffffffffffffffffffffffffff44a5ad0bc4f8fa79d82cd1486814ccbf45244c9619195fafda5af6cd"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0099777fe147e7d56eefe190d6663a834fb241234355cf25acd61d3313f8aaf86c2751f5a83d5c2d60fcf57b85842e48e2", "00847b062abf370e5065896a76d8046c48606fb9b21222837a7c4b120ba778832ebb517bee2f63830e447dde58dc780254" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a76276276276276276276276276276275b4172f69bb50e0fc803429a4b367061ead3d8a82405b1f286ecad2856b84940"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c7bfef909a8abaaf6f684807dabeb66119415ecd8b330c6cd1abc7a817f581bf045b23487e0b2a8fc5b42f70ed3777a2", "28c16340b107bf486049da3308dd443eb44080423134bf37187386a205dfcbc5e39ad5b3e423d847617fb0410d80fd27" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "1999999999999999999999999999999986dd5e1ac809f15c95cffdf470020dffa26383cb1c8dc2b1e3ba665799d6e288"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d293cca4e69ef23fee051fadd8d752bdb0640e1c0ad69a9efba80f7156d7c7b4d1b34d5372b55f3b8b7bd6a9abfa61c8", "2b7aabb1cf818485ff1853e10d1a095fa86af694a97cfc92d0eb14a249b73536ef1f371c3cf83758af0f7a677e7320c7" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "5555555555555555555555555555555516e1e459457679df48b54e842006d9541d4bb74fb48333a64c6d552400cc4870"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "69e6a54921a0f3d9f0c28b72fd37803ed0b25189417b52a7ec9e70bc17d128edfa5328d1f39cce22fcaf75a51037656a", "028b82fe82d9a5c5f1a529cdcb7dc6f8b25924993ecccccfaecb63f9aa0918c18575d4f51512e04bb3f10a65811fc7b6" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffa252d685e831b6ceed0ff5c6300a45fe2bf192f78ec4cd7972a3ffb601326ca8"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a76bcfdec3e35782bb6748d1e5618a57dd3d077f00f8d9bdd3fa2b5d13f8281d46debcda0704da00d7ad1fbaa758d72f", "0096f210ae33e995fccb11772c256b15cbf1ddb0744e6640acd9a7ea0c628e93ade4fedc368184ca9fa06c11bcc50c5fdd" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "f088c8722897366cd1fe54d4e6b9d54cd42afbd3881757108978180b96e9ad85affbd7594e67254e20d9e04d192da452"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6608ea63d56c6bb7f5fc56688a2fb5ce3f06ef67c1f3c357f30bcdbe32bc5fad3e58edb340ab5417bab5b331a8c4f7f4", "00a83f1cf80687d5cee7729c02a7b62aacc14e829d29b46f9ff08626d3e3014e98a1f3a5dd88d92b005f3b6f8b4775fcdb" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffed2119d5fc12649fc808af3b6d9037d3a44eb32399970dd0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b2f4923dcf54ddf300d90f82b646c82b9395b2255048b9327a73e598cb2a0ac71807270ece0ce3a9172ff63ab2a4b579", "2db76185037c879f4188a794892a07739ed15a6eaaaa94ec37aa82cb092e39934ad68cc4b390efc979c55cd9e69d88d4" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "79b95c013b0472de04d8faeec3b779c39fe729ea84fb554cd091c7178c2f054eabbc62c3e1cfbac2c2e69d7aa45d9072"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00cb814875d6d40960dea00196d1a9156db9ad46d636a798e80ecdb27ff070e41f286a7c0acc35de6272980928ecbf39a9", "00c1d2e9fae5462024d7671459d20b8711a5d3bada784eb95c44179bb036f60cd1940561ea4dc14c3161ad3c26925feb19" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "bfd40d0caa4d9d42381f3d72a25683f52b03a1ed96fb72d03f08dcb9a8bc8f23c1a459deab03bcd39396c0d1e9053c81"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0dbd9ccca18e9edbb0d2ca8c7b33de0ce5e2ce4b641af2a4e8e4e105705ad2c04043e22f7bc9f32474a9ce05a2772f38", "00ffb8419e769afd848df80677f632cc6c292cf73f74505a043bdc224553dff4f6d1d4d2a94f6d74a7893bd37dd199463f" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "4c7d219db9af94ce7fffffffffffffffffffffffffffffffef15cf1058c8d8ba1e634c4122db95ec1facd4bb13ebf09a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00dd259071ca02a423555760f7712c51eb25c6ebe52408cd91c7463283d45a6318cbffbcc37389cdf1926233bc60b79ae3", "25c0e41d49d876b7bcd08da82ac29674b346d09185f1ee9552b03eee982f493ce0b03169fc421c42325e2160fdaf651f" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "d219db9af94ce7ffffffffffffffffffffffffffffffffffd189bdb6d9ef7be8504ca374756ea5b8f15e44067d209b9b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "576571c8489bc8f1f17c3a5e692ffa15e87501fce3544f6ec51a4fd5c9c84f33e95dd47645c61e70a53840243ba55f60", "00e4b2f7d1815179c60c1d9ad6fd4dddf856569bd33986d3412b1030f8dedc48a2309bce01e324483f95257069a48773cd" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a433b735f299cfffffffffffffffffffffffffffffffffffdbb02debbfa7c9f1487f3936a22ca3f6f5d06ea22d7c0dc3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "536c24359a4d7a6c9d1366a8a9ac4702332af87117db4d8ad3e941932d938dc17f1869f95621f22ce9f66a86100cc57b", "00dfe809d5c1875807f42510af20e0d6ddc169422090192df9741a0d9b6de9ce608ad9ad72adbf7a17269f5dceec7b6f17" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "b9af94ce7fffffffffffffffffffffffffffffffffffffffd6efeefc876c9f23217b443c80637ef939e911219f96c179"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00f7ad2994d5e2d45e8013495b67ead9033eb89d0a7bf795f443cca19e4bc4b62fb141505e0b45f4c353f139d7693848aa", "2998c1024fd34cfa167ec75ecedf967497a9a3b1d3f7a30915a9b8ada601aa1706d7c4c99f52628519775e4243d84b3c" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a276276276276276276276276276276276276276276276273d7228d4f84b769be0fd57b97e4c1ebcae9a5f635e80e9df"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3a591e4e71d27b46678a3459361afa394f991ea553b8c06e337960dc424762c5cf2489864d323aa2ab53933fdc93f71d", "00d21330465eaa43aa2e6572fe087fd192e39bc53f8356dc7c5bbcaa693ee5a2e56b952079a0a49ecad45903c937e2b94b" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "73333333333333333333333333333333333333333333333316e4d9f42d4eca22df403a0c578b86f0a9a93fe89995c7ed"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3379e51b7535d0abf2bdb1d96fd98105193f9fd248439233fa003133083b424d6a9da59ed9b1f13f2e73b427c7c45ae1", "297dc5a37442429e16879236c3fa309aed2cdb1ed288f7f39d6284aa09da0b961c9f4d242f89c8741af1faab3c90c4" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffda4233abf824c93f90115e76db206fa7489d6647332e1ba3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5d47c565466e38dbcb22e83198f8499bae2c3de0696330b3bf64a59b9cbf614e727892b2cbc6114b48009d4172489a49", "00d535292a338ee880368cb829a49170ceb86767dc07df68dc2da8eac3b4ddbea6366447d05423b0097a9c86a04b88995b" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "3fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294bb"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c05afbde4722ac351cbc7fbed85be84cccf9748a89bd834a05946cca51b5845a4e1d27b3affd57f80a34bc0e84720a35", "00ecc37a2f4b1a01cbbe918cc9df54b87bd52255868d0f918e0c5f5332d18532caf4e30458ab69a303022fdcc43931d6ed" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "dfea06865526cea11c0f9eb9512b41fa9581d0f6cb7db9680336151dce79de818cdf33c879da322740416d1e5ae532fa"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3c246b196629148260d8453f2f54006b32d098bb7dbeb2efe9216a745decc80434bf28e4cc4167ca461ad2434c244abb", "00ae83351bb64b8681dfcafb3d52495f947039a0923903856407b005a5bfdcb6e952fc867433c6947864453a7db0db9db2" ); + { + // point duplication during verification + auto m = "313233343030"_hex; + bn_t sig_r = "b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60"; + bn_t sig_s = "08f8607b46952a98fbb62768cda34643a5ba7ba37e3b0e6470e660502dce358a819d965dd882555b8d139835c06d4a7f"; + auto r = true; // result = valid - flags: ['PointDuplication'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3c246b196629148260d8453f2f54006b32d098bb7dbeb2efe9216a745decc80434bf28e4cc4167ca461ad2434c244abb", "517ccae449b4797e203504c2adb6a06b8fc65f6dc6fc7a9bf84ffa5a40234915ad03798acc396b879bbac5834f24624d" ); + { + // duplication bug + auto m = "313233343030"_hex; + bn_t sig_r = "b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60"; + bn_t sig_s = "08f8607b46952a98fbb62768cda34643a5ba7ba37e3b0e6470e660502dce358a819d965dd882555b8d139835c06d4a7f"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "665aea8c7150c125dfc978cf39d93372b822b9bd503f43f659981c9af6813b13479d895ffee6ce7e5b424e5b8a4567aa", "00bb36fabb598230f5deabfda1b8bb364b4e29a7ed04d1ec45bdc602098c9a1330755e7c4c7739c4dcb898476783242c9f" ); + { + // point with x-coordinate 0 + auto m = "313233343030"_hex; + bn_t sig_r = "01"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a295709e20608372fa22e764be8eb29302f5a89af22e947ca3fcbdf7c4992a5675a9c5a60d65e3b8acf8e291c67d5b17", "10cb799efdfddeaa04e2426f2c6a08f2df7e4160f8618925355947c159aaf406ef90056414093c42a213b7cc9d006a09" ); + { + // point with x-coordinate 0 + auto m = "313233343030"_hex; + bn_t sig_r = "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + bn_t sig_s = "33333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00accca75348f7e5ac63f8dbd2c8f05be5f3c245cae8f0b029fb1ce6362f3c5c14181bea69cfab5da4dc0a8a53396760b5", "4d0a19e7be066654d27ca925a92f67a75fedabd414db72e6177d142267c365b42a3b304dc7aefb90276801018bcd661b" ); + { + // comparison with point at infinity + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "33333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7875a539f14452b88b6d7bd04fc9f20840cb58881a5337fbdd673579f6e18a08e23e4099c7e2a29418fadcb33e248392", "00c2d17f5866099e6c1e9a244dac48994201dbb6cb7bc0940572d1f05c8d8865d215f58bbdff43591872834d0d473b95f6" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "52828bf33158db6b6df5afd25d567b8318176ea946410396d123e1c05114ed1bcebe0eb86c6e5a2161e67be8e73606d1", "7571de1a0d4af076ff0b659648c4421fe9209943c26c59f37d51c5c08ab7af62b0db021d41891b4775cf6d590788c1e4" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00acc56e53377950c865db422481b8d6a23b85797a6196cbcb85ca49ad2f0d2a7846d78d178b816951c8d63c20cc1a09de", "4bb0eb484864b8bce2eef0133efc8ccb2ed6e81b00461971528e8ae463318de16c668cc4e5c536f173f21acb84f01e89" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "6666666666666666666666666666666666666666666666664fc15233fb49458c89a4057a8379dc9791f80a2ab84edd61"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b75eeccd7fb25e5f541c103a9f4f5949a75106ba37a37777ec91101fd8941c0ebe33bbdb9c456a5fadd046b8ebea32b1", "70e5ac6fc398b0719633cd9bdcdb4603f56f896f8c673d52dcf80cc59db81e1c4603dd5bda1179dccc0c466863cf7188" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "99999999999999999999999999999999999999999999999977a1fb4df8ede852ce760837c536cae35af40f4014764c12"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "537dfac2315c48a04624cfd8a8b168879f6888f96c67803f8ae7a31082a0185b8925a74a99bebe543d113d6e46fe189c", "009b449167c921fa8d02f373f5ce9baee5e70f556608af997e59dac9e23f589be5972aef1313bbc7f4c40e718d49c0cba8" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6aae76701acc1950894a89e068772d8b281eef136f8a8fef5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6640e0650d9025b936f2785e41516dd451092e2251eabfe9b32fae26702b7b89e8b3fd726d182b107b95dd3952a3776a", "19e24468c2d120789dccb27aad379e205d54f9dfd3a7229b9f82c9398130e8fc210ae424f939d7e079afd7198388e75d" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "0eb10e5ab95f2f26a40700b1300fb8c3e754d5c453d9384ecce1daa38135a48a0a96c24efc2a76d00bde1d7aeedf7f6a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "145e3f8e547067310c512997302aaa4eab971a72288a9b6e4ba846e39a619d0e1ae4f136015ac975fc5283b8e61cef40", "0099c2ad9913e61dcce2fd3cece6e989755e5aa6bba0ecb070b5d176f47222eb9ee655b8843e413cce14ac219ed79a5c70" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00decf587c31d7df83446f2da47c5158ad7794af76fcc726c201b150ccbc8e41bb218ccb9ab0a9fda741c8173f98e3f4b2", "3b9fd5db1b326b12820dab5a8da938af2a23cd82467b69af7e8ab8bcfd79d12ab0acfc443b709af02fa160245c5ad50a" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2b020240aeafc23c2d50341e46c35c569e3edb36bc6c54014c8d57a29eddda6e9b866490f2ed2aa1e24292b7fb5b45b5", "00cc98cd746ffb5f67575d07c81434c0cbca096ccdb49aa7aeeb56f00919d6cd365aa29a01bd85d834d450bae4aa7afd1e" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "6666666666666666666666666666666666666666666666664fc15233fb49458c89a4057a8379dc9791f80a2ab84edd61"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "240130e45f786d74cdd9b5575ca87a036079ef81ecff8acdebc283d0d0d846ede13bf64c4dee83eb154370d32bc9d6bd", "564a1039c819a9c4eefd97a0906cbc29f986ac4fb48bab4a44f426fd187f71694407391c8c953487436e6d1296601ea8" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "99999999999999999999999999999999999999999999999977a1fb4df8ede852ce760837c536cae35af40f4014764c12"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a964e60fc4a8f1e305f5c31486fd216f59cbf69181492782022b2ad3583e6c073b039d92f53546f6aef6caac99e43c17", "00acc34410e90c177e1935a521285b402d69b08abe49ba09292b57dc04d04a7155891862f932652f3478c7a0ba28a51328" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6aae76701acc1950894a89e068772d8b281eef136f8a8fef5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00dcfc5eb16c7a60e4b1ad10a23b76279e59c5e81420801fc836e83d108ace75d866583650789152ee2b711b343da6bf13", "009275225f1477b593a4814d27056a40f629523051c6b339042ac609b5c8a1fdeebc63ee48b45f18bffff503cdacf72bc2" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "0eb10e5ab95f2f26a40700b1300fb8c3e754d5c453d9384ecce1daa38135a48a0a96c24efc2a76d00bde1d7aeedf7f6a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7", "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffff44a5ad0bd0636d9dda1feb8c60148bfc57e325ef1d899af2e547ff6c0264d950"; + sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7", "00c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffff44a5ad0bd0636d9dda1feb8c60148bfc57e325ef1d899af2e547ff6c0264d950"; + sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aac", "00acbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1" ); + { + // x-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "281dbd30737a13d6cb67de51c49a60017e86cbb1e5044862adbf83f80974b0fc08f48dea2b3a253b0043e332efcb996b"; + bn_t sig_s = "bf107be3f19987ec921be2e00212c269f3c49ae86b513e3fb986f7fb1f581d9f993b08ba6f5db3657ea9fa60bfb8c6cf"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "44b25dd15efd870cbad4b9e4fafa83fccd033d95528304e94a53f56bbcbc8a11d1da2c2c570bc8306476acf08184874c"; + sig_s = "72a5d7405a2b03e18c809f8371f1097cdce03bc08317325d50bed7cad26a36700738fc1e044f5209eb01f93407ca01c9"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "93af9f6fba6d774d5c930b3644f811fb46a9e54954da0f3db670292b9fcc0e8145ab032e602c995f9389c841254e9868"; + sig_s = "d2ffd5ca020101935216dabbed1fdff3a4dcc7db5906bd87319cb8d8cd31a346dff4fbc7b9ac864beccd2e89e8b58c06"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422", "00c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000" ); + { + // y-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "83c340568db683c26521a072c2ec0d3c6301e6141917b3d31051190768164966a4375d6a596daddce23fa35a0663bfbe"; + bn_t sig_s = "26f3e0761e561df924a6b12a74ddcccd4380de02cec1f30739b780b4f0216be00fc4f913ecd12491e56c82c39b181f62"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "f8dec11959a61ef14714eb32ad8ac666618c5a0fe1cb6caa75ca4df0c965b72fbe8a1011b5ae826f25d306cd48343d33"; + sig_s = "b56f1efa8d1b32932ddf6cb6ea5b20c13c9602a3be4e0b40a4d24caa0a52b1cbe9b9326fa4d8eb1739380fd2e5d1751a"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "1d53c575c4874db600e7e58488a35017fbe0dc78575b9fd336983cf49805cd1dcfd9156c7e92503681b1d0fbce96957e"; + sig_s = "3bd64bb7d409e1d9f3cf71918d3eb0fbb399cb9a9c3226c0d6a4e5e0a54bc17b01f65de803850581981d0d5bafc2fdd6"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000", "00e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557" ); + { + // x-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "d3616ab68474a641fe2abb8d02fd606e3b8e5567a8fa30a8ea037bac09f2e1d747fe7383adbd4f5449c50c401461b05a"; + bn_t sig_s = "2ea50df8beeb2cece8b6d7cc7da29737b46bb10f2c3c18aef346c3f4ab7d7230f56533f2097f7fd65460c8a26fd4253a"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "4a6b5fd43110bddd1295e311b0f8d12df3d0f9b37fb39108abf7bc1b867debdd3e1aea523058ebf6edfa447f47b7656a"; + sig_s = "e519e0c2c5f5fde47678a89a3f7145626b0a5edf5aed705c1a56674fb85266d881b56ddd135486909737a73edd5cd673"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "209e7963d1bcf312ff25967584af604229aa5cadebb1af44d413baeec779a23c3d4ecc1407fb6aa010e1856208ea798b"; + sig_s = "a7c1a17207547ab389001f4e7a3e9c93ed25dc94305d5ae9f8064af323b57a1112c93cf21c1d13c2e6ab44803b341974"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69", "00d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98" ); + { + // x-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "08076af74d9aca7e8736110c77dc8e500c211d574cac8c2ec914d5e30ee663b5bcebab44b7116124a289a32e1c3c6c3c"; + bn_t sig_s = "8f2e722c43674685641c57c8c1ed8dcea74aed0eb50c394ffa44b033ab5a5a58af422612cb1f8e08f5a7b4fb8d027553"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "934b89b2647372376d08a70d0d9d5126e4bf627942294862ccb3c64a539305c645ad7a7e17068e7196b4fd99df126a0d"; + sig_s = "832a0278c244b9b18768ed498e2c7869e2c0b5fc2c4c5071f45d8b173779dab008839ab10c10df1e1e47e9a41248973e"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "ea9bf433ebdeb5515c1e56607803098c2db8af5cbb54bb256ada709a00d5a626de8eb6eb0af53ad0beac869c6bafd86f"; + sig_s = "9eae95d2c41b670f2ed70fa0f01370141749bb4447ca063677308c17485cac90afd7df1da16c542f204526fa342dd44c"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336", "208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4" ); + { + // y-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "750bfb52b08003d4cc11bbc677005ff76facd7922450bd0b9d8fb0db01b6162ad106925096a3f311405aee322ba8fa4e"; + bn_t sig_s = "aad1626127816f28526f9244bdb5ceb9484c7e45cf6fcda0f921e2621514ccdcf28f06d41466fb52e619356cc3d4ffbf"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "3ec493f00b1ea554b8725b7e39d50dea0017cf1558d70a0fe11c72d6ba4a5df084bb4cd3faeb8f7057612f1318f3c165"; + sig_s = "e6297e29986b6a01490aa6d0ca7ddbfe8f173340688010d9dd278a0a93be09606a8da9b3159e3f4e55a4010a6590dec2"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "ce1d27dba63bbd9332e27f471e22ee105768f95ea1d031d4617b9e88033c9596d3e67abebb6d2e8b7e52c5bb3368aa5b"; + sig_s = "cc85133e6553ff21812987e58d9abe00a8acb7cc1354247bcfdacc8a914189c159034b92d59932301f17e2447863da4b"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336", "00ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b" ); + { + // y-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "7054a5bd3eec9debc0113eafecf27d11b5186ce67aa430b57c6eb3c98e239c16370bb8aa6d0cc8cb2c554186b7dd82b6"; + bn_t sig_s = "e820c50fb0ef6208407dd37d34796ea21771a988d5eafbd9b12caceec15e1519861407dfced9f20d7898ee0fa0afb61c"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "80f3ca043a055dd0784aa37d8c3afabbfc8160606afc1d54463b3af1e56b8269e5fa850808def439f83cfd4d3a375661"; + sig_s = "fe0030173c18cfd88b3ab317430e55722ec9ae8a3d8fda64243c325262da11a2f7183d2d2a462b42ec2f6a6c8f9bf12b"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "b57d6915f6ef8bc76246fe073372ac289fbd9c1b9451e261aeccb927dfbc39419fe51aa936afc3e5ae6d18b99fa7a863"; + sig_s = "dacf1c1c7a6ec67e4a6a4b2d7c0fdad0a9e8e92f65a2bdd3b42548aae9853128fd36291d492ca1b51990b3b62fae3860"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } // End of Google's Wycheproof tests ecdsa_secp384r1_sha256_test + + // Test vectors from Google's Wycheproof RSA signature verification tests. + // Generated from: 'ecdsa_secp384r1_sha384_p1363_test.json' + // URL: 'https://raw.githubusercontent.com/google/wycheproof/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_secp384r1_sha384_p1363_test.json' + // Note: + // Test vectors with flag(s) 'BER', 'SignatureSize' were not included. + // All test(s) with BER/DER decoding related errors were not included because they're not part of this test scope. + // + // Algorithm: ECDSA + // GeneratorVersion: 0.9rc5 + // Header: Test vectors of type EcdsaVerify are meant for the verification of IEEE P1363 encoded ECDSA signatures. + // Notes: ArithmeticError - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.', 'cves': ['CVE-2017-18146']} + // EdgeCasePublicKey - {'bugType': 'EDGE_CASE', 'description': 'The test vector uses a special case public key. '} + // EdgeCaseShamirMultiplication - {'bugType': 'EDGE_CASE', 'description': "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used."} + // IntegerOverflow - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449', 'CVE-2021-43572', 'CVE-2022-24884']} + // ModifiedInteger - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModularInverse - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where computing the modular inverse of s hits an edge case.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['CVE-2019-0865']} + // PointDuplication - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.', 'cves': ['2020-12607', 'CVE-2015-2730']} + // RangeCheck - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // SignatureSize - {'bugType': 'LEGACY', 'description': 'This test vector contains valid values for r and s. But the values are encoded using a smaller number of bytes. The size of an IEEE P1363 encoded signature should always be twice the number of bytes of the size of the order. Some libraries accept signatures with less bytes. To our knowledge no standard (i.e., IEEE P1363 or RFC 7515) requires any explicit checks of the signature size during signature verification.'} + // SmallRandS - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['2020-13895']} + // SpecialCaseHash - {'bugType': 'EDGE_CASE', 'description': 'The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits.'} + // ValidSignature - {'bugType': 'BASIC', 'description': 'The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported.'} + { + auto pubkey = curve.make_point( "2da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa", "4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f" ); + { + // signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7"; + bn_t sig_s = "1840da9fc1d2f8f8900cf485d5413b8c2574ee3a8d4ca03995ca30240e09513805bf6209b58ac7aa9cff54eecd82b9f1"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + n + m = "313233343030"_hex; + sig_r = "0112b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19a25617aad7485e6312a8589714f647acf7a94cffbe8a724a"; + sig_s = "00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 256 * n + m = "313233343030"_hex; + sig_r = "010012b30abef6b5476fe6b612ae557c0425661e26b44b1bfde13e404c1d1a3f0fdbd49bfd2d7ced1b1ef6d69e61b6eebbd7"; + sig_s = "0000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by n - r + m = "313233343030"_hex; + sig_r = "ed4cf541094ab8901949ed51aa83fbda99e1d94bb4e401e5ec7083591125fd5b9d8bc2cd7c6b0748e22ee5d5daffe09c"; + sig_s = "e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**384 + m = "313233343030"_hex; + sig_r = "0112b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7"; + sig_s = "00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**448 + m = "313233343030"_hex; + sig_r = "01000000000000000012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7"; + sig_s = "000000000000000000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + n + m = "313233343030"_hex; + sig_r = "01e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc5f8fc6adfda650a86aa74b95adbd6874b3cd8dde6cc0798f5"; + sig_s = "00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 256 * n + m = "313233343030"_hex; + sig_r = "0100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35f8d94e69f521d5bbbff6c685df143cd5abd3c062f48c46be282"; + sig_s = "0000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**384 + m = "313233343030"_hex; + sig_r = "01e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82"; + sig_s = "00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**448 + m = "313233343030"_hex; + sig_r = "010000000000000000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82"; + sig_s = "000000000000000000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=0 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n - 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=0 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=0 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n - 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=0 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=0 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=0 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n - 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=0 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Edge case for Shamir multiplication + m = "3133323237"_hex; + sig_r = "ac042e13ab83394692019170707bc21dd3d7b8d233d11b651757085bdd5767eabbb85322984f14437335de0cdf565684"; + sig_s = "bd770d3ee4beadbabe7ca46e8c4702783435228d46e2dd360e322fe61c86926fa49c8116ec940f72ac8c30d9beb3e12f"; + r = true; // result = valid - flags: ['EdgeCaseShamirMultiplication'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373530353531383135"_hex; + sig_r = "d3298a0193c4316b34e3833ff764a82cff4ef57b5dd79ed6237b51ff76ceab13bf92131f41030515b7e012d2ba857830"; + sig_s = "bfc7518d2ad20ed5f58f3be79720f1866f7a23b3bd1bf913d3916819d008497a071046311d3c2fd05fc284c964a39617"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130333633303731"_hex; + sig_r = "e14f41a5fc83aa4725a9ea60ab5b0b9de27f519af4b557a601f1fee0243f8eee5180f8c531414f3473f4457430cb7a26"; + sig_s = "1047ed2bf1f98e3ce93e8fdbdc63cc79f238998fee74e1bb6cd708694950bbffe3945066064da043f04d7083d0a596ec"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333632343231333231"_hex; + sig_r = "b7c8b5cf631a96ad908d6a8c8d0e0a35fcc22a5a36050230b665932764ae45bd84cb87ebba8e444abd89e4483fc9c4a8"; + sig_s = "a11636c095aa9bc69cf24b50a0a9e5377d0ffbba4fab5433159f006ab4563d55e918493020a19691574e4d1e66e3975e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34353838303134363536"_hex; + sig_r = "4a7df2df6a32d59b6bfed54f032c3d6f3acd3ac4063704099cd162ab3908e8eeba4e973ee75b5e285dd572062338fe58"; + sig_s = "35365be327e2463dc759951c5c0be5e3d094cb706912fdf7d26b15d4a5c42ffebeca5ae73a1823f5e65d571b4ccf1a82"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313436363035363432"_hex; + sig_r = "9ad363a1bbc67c57c82a378e988cc083cc91f8b32739ec647c0cb348fb5c86472015131a7d9083bf4740af3351755195"; + sig_s = "d310dc1509f8c00281efe571768d488027ea760fe32971f6cb7b57cdf90621b7d0086e26443d3761df7aa3a4eccc6c58"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333335333030383230"_hex; + sig_r = "95078af5c2ac230239557f5fcee2e712a7034e95437a9b34c1692a81270edcf8ddd5aba1138a42012663e5f81c9beae2"; + sig_s = "40ee510a0cceb8518ad4f618599164da0f3ba75eceeac216216ec62bcceae8dc98b5e35b2e7ed47c4b8ebacfe84a74e6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36333936363033363331"_hex; + sig_r = "a538076362043de54864464c14a6c1c3a478443726c1309a36b9e9ea1592b40c3f3f90d195bd298004a71e8f285e093a"; + sig_s = "d74f97ef38468515a8c927a450275c14dc16ddbdd92b3a5cae804be20d29c682129247d2e01d37dabe38ffb74808a8b7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333931363630373935"_hex; + sig_r = "bbe835113f8ea4dc469f0283af6603f3d7a3a222b3ab5a93db56007ef2dc07c97988fc7b8b833057fa3fbf97413b6c15"; + sig_s = "737c316320b61002c2acb184d82e60e46bd2129a9bbf563c80da423121c161decd363518b260aaacf3734c1ef9faa925"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343436393735393634"_hex; + sig_r = "679c3640ad8ffe9577d9b59b18ff5598dbfe61122bbab8238d268907c989cd94dc7f601d17486af93f6d18624aa524a3"; + sig_s = "e84dd195502bdcdd77b7f51d8c1ea789006905844a0e185474af1a583bab564ee23be0bc49500390dceb3d3948f06730"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35313539343738363431"_hex; + sig_r = "f6f1afe6febce799cc9b754279f2499f3825c3e789accef46d3f068e2b6781fd50669e80c3c7293a5c0c0af48e068e35"; + sig_s = "f59cc8c2222ed63b4553f8149ebecc43b866719b294ef0832a12b3e3dbc825eeab68b5779625b10ae5541412ec295354"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35323431373932333331"_hex; + sig_r = "f46496f6d473f3c091a68aaa3749220c840061cd4f888613ccfeac0aa0411b451edbd4facbe38d2dd9d6d0d0d255ed34"; + sig_s = "00c3a74fa6666f58c4798f30c3779813e5c6d08ac31a792c2d0f9cb708733f26ad6bf3b1e46815ae536aa151680bdee2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31313437323930323034"_hex; + sig_r = "df8b8e4cb1bc4ec69cb1472fa5a81c36642ed47fc6ce560033c4f7cb0bc8459b5788e34caa7d96e6071188e449f0207a"; + sig_s = "8b8ee0177962a489938f3feffae55729d9d446fe438c7cb91ea5f632c80aa72a43b9b04e6de7ff34f76f4425107fd697"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130383738373235363435"_hex; + sig_r = "8bb6a8ecdc8b483ad7b9c94bb39f63b5fc1378efe8c0204a74631dded7159643821419af33863b0414bd87ecf73ba3fb"; + sig_s = "8928449f2d6db2b2c65d44d98beb77eeadcbda83ff33e57eb183e1fc29ad86f0ba29ee66e750e8170ccc434cf70ae199"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37333433333036353633"_hex; + sig_r = "e3832877c80c4ed439d8eadcf615c0286ff54943e3ae2f66a3b9f886245fea470e6d5812cef80c23e4f568d0215a3bfc"; + sig_s = "3177a7dbf0ab8f8f5fc1d01b19d6a5e89642899f369dfe213b7cc55d8eaf21dd2885efce52b5959c1f06b7cac5773e5b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393734343630393738"_hex; + sig_r = "6275738f0880023286a9b6f28ea0a9779e8d644c3dec48293c64f1566b34e15c7119bd9d02fa2357774cabc9e53ef7e6"; + sig_s = "d2f0a52b1016082bd5517609ee81c0764dc38a8f32d9a5074e717ee1d832f9ea0e4c6b100b1fd5e7f4bc7468c79d3933"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323237303836383339"_hex; + sig_r = "d316fe5168cf13753c8c3bbef83869a6703dc0d5afa82af49c88ff3555660f57919a6f36e84451c3e8e5783e3b83fe3b"; + sig_s = "995f08c8fec7cd82ce27e7509393f5a3803a48fe255fcb160321c6e1890eb36e37bcda158f0fa6899e7d107e52de8c3c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323332393736343130"_hex; + sig_r = "0b13b8fd10fa7b42169137588ad3f557539a4e9206f3a1f1fe9202b0690defded2be18147f5b2da9285c0e7349735ea3"; + sig_s = "0478ad317b22a247bf9334719b4c8ee84acf134515db77e6141c75d08961e1e51eaca29836744103de0f6a4c798d3eeb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3934303437333831"_hex; + sig_r = "15804429bcb5277d4f0af73bd54c8a177499a7b64f18afc566c3ce7096bdc6c275e38548edcfa0b78dd7f57b6f393e49"; + sig_s = "d5951f243e65b82ba5c0c7552d33b11f1e90fde0c3fd014aac1bb27db2aaf09b667c8b247c4cdd5b0723fba83b4f999e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323230353639313233"_hex; + sig_r = "359247c95776bb17492b7bf827f5f330fa9f9de7cc10441a1479c81776ce36cdc6a13c5f5149c4e39147a196bb02ed34"; + sig_s = "f6ed9252a73de48516f4eabab6368fbff6875128af4e1226d54db558bd76eec369cc9b285bc196d512e531f84864d33f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343134303533393934"_hex; + sig_r = "a557d1f63a2094f683429ecb35a6533bac897682775c0051e111eed6e076c48867cae005c5e0803800b050311e381cd6"; + sig_s = "2a2f871efcf03cf1c8f509e076aaa2a76f1ea78d1c64804ea5b063b0324b8e98eb5825d04370106020ee15805dbedf81"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393531353638363439"_hex; + sig_r = "f22bf91169b4aec84ca84041cb826f7dfc6f33d973f3c72433b8a0ca203aac93f7eed62be9bea01706402d5b5d3b0e65"; + sig_s = "7841d3bc34aa47e813a55c25203c5ec2342d838d5b4638c2705dcf4bac9c24f765b5d4c28fa3c7fda7a38ed5048c7de3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35393539303731363335"_hex; + sig_r = "9c196e39a2d61a3c2565f5932f357e242892737e9adfc86c6609f291e5e6fdbb23029ff915a032b0c5390ba9d15f203e"; + sig_s = "d721e28e5269d7813e8a9aed53a37e652fec1560ca61f28f55ab4c262cc6214eee8d3c4c2ba9d1ba0ba19e5e3c7484a7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323135333436393533"_hex; + sig_r = "8ba1e9dec14d300b0e250ea0bcd4419c3d9559622cc7b8375bd73f7d70133242e3d5bf70bc782808734654bacd12daea"; + sig_s = "d893d3970f72ccab35555ae91ebcfed3c5bfc5d39181071bc06ba382587a695e02ed482f1a74fe309a399eaee5f5bc52"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34383037313039383330"_hex; + sig_r = "2f521d9d83e1bff8d25255a9bdca90e15d78a8c9ea7885b884024a40de9a315bed7f746b5da4ce96b070208e9ae0cfa5"; + sig_s = "4185c6f4225b8c255a4d31abb5c9b6c686a6ee50a8eb7103aaef90245a4722fc8996f266f262109c3b5957ba73289a20"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343932393339363930"_hex; + sig_r = "d4900f54c1bc841d38eb2f13e0bafbb12b5667393b07102db90639744f54d78960b344c8fbfbf3540b38d00278e177aa"; + sig_s = "3a16eff0399700009b6949f3f506c543495bf8e0f3a34feb8edd63648747b531adc4e75398e4da8083b88b34c2fb97a8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313132333535393630"_hex; + sig_r = "c0169e2b8b97eeb0650e27653f2e473b97a06e1e888b07c1018c730cabfdeeec4a626c3edee0767d44e8ed07080c2ac4"; + sig_s = "13f46475f955f9701928067e3982d4ba5a58a379a66f91b74fad9ac8aee30086be6f41c9c2d8fb80e0924dedbe67e968"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31323339323735373034"_hex; + sig_r = "2e868871ea8b27a8a746882152051f2b146af4ac9d8473b4b6852f80a1d0c7cab57489aa43f89024388aec0605b02637"; + sig_s = "6d8c89eed8a5a6252c5cead1c55391c6743d881609e3db24d70ead80a663570020798fbf41d4c624fcb1ce36c536fe38"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303831313838373638"_hex; + sig_r = "abe6a51179ee87c957805ecad5ccebca30c6e3a3e6dbe4eb4d130b71df2bf590b9d67c8f49e81bf90ce0909d3c2dab4c"; + sig_s = "7110582fab495b21bd9dda064fbd7acc09d0544dcf7699be35ad16207ffa10e8904f9241a709487ba2ba7e34430b81c3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343534363038393633"_hex; + sig_r = "50252c19e60e4120b7c28b2c2e0a588e5d107518cd61e5c7999c6d465ea134f752322d8b83f5988fcdc62bd9adb36ccd"; + sig_s = "193899352491dabfe4fc942e14ddacb200673729d61602cc0baf5732d262f36e5279865a810ce2f977f57686a0d0137a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333837363837313131"_hex; + sig_r = "eb725fdd539d7de8ea02fac8db6ec464f40c272a63e6b2718c4e0266bf1235dae330f747a6052f4319ecbe7bdade9bd0"; + sig_s = "ae84507648ba2d1944bb67722ccd2cb94b92b59e89a1ae698c668bb57f481c42b216c23da4b1d8c0e502ef97fda05ad0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303331333831383735"_hex; + sig_r = "25aa56fcbd92f2cf53bddbaa0db537de5843290731c1dd78036fcbded4a8f7187ddfed9f5ca9d98ea7b12d24b8d29d57"; + sig_s = "028f68372d66164810bf79c30a191116d496fe32314605dc1668289425fb3a15d7532dde1052a49a35866c147abde1d9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323535333538333333"_hex; + sig_r = "54bf7adc8548e7cae270e7b097f16b5e315158d21b0e652ce1cfe4b33126ba4a65bf227b4cddcaf22d33d82478937b20"; + sig_s = "bfc1b8f1d02846a42f31e1bd10ba334065459f712a3bbc76005d6c6488889f88c0983f4834d0bf2249dbf0a6db760701"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34363138383431343732"_hex; + sig_r = "d3bb29ac0bd1f6058a5197f766d6ea3216c572ded62af46318c8c7f9547bb246553654279d69989d9af5ef4ccacf64da"; + sig_s = "e10281122c2112a2a5a9d87ac58f64fb07c996a2d09292119e8f24d5499b2e8524ebd0570097f6cc7f9c26094a35c857"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303039323435383534"_hex; + sig_r = "bc32e85e3112472408f9324586e525325128a38313c34b79700cb0a3f7262a90a1fcc40eef1f1a3884032a7a21810e0a"; + sig_s = "c02f52541360358107a13dbea31f83d80397710901734b7adb78b1fc904454a28a378514ccef80ecc70c1d8e55f11311"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373536343636353238"_hex; + sig_r = "f04b9e17c71d2d2133ea380d71b6b82c8a8e3332703e9d535b2c2bca9b0ad586d176a6049afa35edd9722edb5c33daa3"; + sig_s = "bd44d4a6263380ca6f22e76c26d5f70f41f4d7cae7d4b9c1b8dc2ba5298d9d12408b04614e2f3796cc19c950c8c88a10"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313139363937313032"_hex; + sig_r = "c8807351d8e261338e750cb9a52f4be4470b63f6f181cbe0e81d43b60824ba4be1bba42b1783897a0d72b0614018b02f"; + sig_s = "52e3a598c8be982127e961eed2b04f21c86df4ebcab0d955a7c66ec7f818898798ee75367a85022276b912c0a072bff7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323333313432313732"_hex; + sig_r = "6152841b6fb460546eeb4158a3e5ffa54f51aa6a208987be899b706055cd59d8ec7c01f4634254fe050e1d4ec525a173"; + sig_s = "73f0c5f13640d892c28f701428e8fbfb736b6478bbd972c8c684977556ed599a70d313e06b126080e13068d56e1c10be"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363733343831383938"_hex; + sig_r = "842f8d2814f5b7163f4b21bd9727246e078ad1e7435dfe1bc5f9e0e7374232e686b9b98b73deab9e43b3b7f25416c2be"; + sig_s = "852c106c412300bac3ba265990b428a26076ab3f00fd7657bbd9315fa1cd2a1230a9a60d06b7af87aa0a6cf3f48b344c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343630313539383237"_hex; + sig_r = "e13f6d638b9d4fba54aa436a945cfea66dec058fab6f026293265884457b5a86e8e927d699bc64431b71e3d41df20044"; + sig_s = "9832cd1b4177118ed247b4f31277da15f420179f45c71a237d77f599a45df68247bac3dcef0868ecd1665005c25b7c6c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38393930383539393239"_hex; + sig_r = "09fff1c2e4ff8643cbfad588620c2bf7aaca5cf4242969142c7145b927bd82ed14f3ae8c6e2ce2da63b990b9f1be6d64"; + sig_s = "780c816f6c86343b008235ee986abf2136123ed247e4751e4d5467334f08e5e2ca1161254f68c3e6678e2d0b87d1cc7c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333236343430393831"_hex; + sig_r = "ffae6e7d2cea71b5a9c73cbc1285a8d252949772afe1aa27fb137740fc429c2a8c8648c9a5ba678a32f7ae7689b395ca"; + sig_s = "89d54cd13a162c34189ff524813690e79768af8ebe794cc941dfe7fdf2cb8dd0b42519f034ea4d4f1c870046d13210e1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333736343337353537"_hex; + sig_r = "efa3c5fc3c8be1007475a2dbd46e3578bb30579445909c2445f850fb8aa60aa5b1749cc3400d8ffd81cb8832b50d27b4"; + sig_s = "b36a08db3845b3d2ebd2c335480f12fb83f2a7351841ea3842ec62ad904b098efbf9faa7828b9c185746d9c8bd047d76"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383630333937373230"_hex; + sig_r = "f577095f7c74594aa1c69aca9bb26e0c7475ae5163058ecc074b03af89e56b12b6a72450589dacf0d7e6b172d0017a0e"; + sig_s = "bee756a0b5d0a677bf95f98da512854f3ecb712f94570e1ad230eab17c527b6a8bcc9ae202b657a3611ecffa94ba0d54"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35383037373733393837"_hex; + sig_r = "0ae7688c7de5882eb9c3172f5500015552f998fb53702c6cd4b03404d5a0510a8073db95db544808dbd76659fd20cf12"; + sig_s = "bc610fe5f04d8909cc439615fb7e302d3d82992817647c50c1f467090a52b328cbbc0262f18ffb6fd9f3bd60013cea08"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353731383636383537"_hex; + sig_r = "5dc8a6d84afaaf900d78c6a91dc5e12e7d17891a52c1468253061d704b8940bef85b9fe807a0e02b56e8dd37c22fbb82"; + sig_s = "914258de52932c4604dceb5ce7cc0a92e021edca9b819b84a9f25652f9af13f956a1139ee95c7aa7a079e3ad8317fbdb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38363737333039333632"_hex; + sig_r = "da55a6dbb845205c87c995b0bbc8444ffcba6eb1f4eb9d30f721d2dacc198fb1a8296075e68eb3d25ef596a952b8ea19"; + sig_s = "829f671dccad6d7b0b8c4b39ff3f42597965d55c645fb880a66fe198d9344c9311f1598930392470379fa5ff43c75d04"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343735353135303630"_hex; + sig_r = "3730dfd0985de77decdd358a544b47f418d3fab42481530d5d514859894c6f23b729af72b44686058de29687b34b3b0c"; + sig_s = "65bdfaf0ac217a80b82eb09c9f59c5c8cfbf50a6eb979a8f5f63eab9bd38ee0938e4b23102112033b230a14ad2790e3f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393733313736383734"_hex; + sig_r = "55210df2124c170e259af1dafa73e66613aa18ced8eb40a7f66155d50d5f3124edfa55276de4797013177291e8afeff6"; + sig_s = "c314d3a310a60647dad3318ed7f0405a64c3f94b5ac98e6be12208c8ad9835fa6b81a0ea59f476608634657b66e00ffd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33363938303935313438"_hex; + sig_r = "f6c9897144b5d84964515eb0c8c3d0d9c6687c957887e93c29b2a21804b40307fb88bfd5cca11c95885d28867cb33a74"; + sig_s = "656bafca242290f7d7e9801b6cfd4bd1b07e8d7c6c1c59fd3d8e82e9846a1b2855c85420e4ee6ec2d97fec2161eeb243"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130373530323638353736"_hex; + sig_r = "bfbcc5f343e2ab392ce6c1c02d91c00650c47136836a5d0622d476ac2b3274395721b1ab21882ed5cabed093b43b133f"; + sig_s = "043e9fc64c6108df73f9eced90f91185f83d89662f5a9d810c1824fbfd97b842f784305fd6b9c28c80d32d52b1538d12"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383639313439353538"_hex; + sig_r = "b8f793ddd47e657a9081cbed1600fb22b38ad6a155f9c006ba98de1f383b4c0918ceea72253e0f869524b2369cd9bd8c"; + sig_s = "96c452ff58f42e0853040a6d5c7e750b57dd4af06e2df8194e8d524e81ac000ee3315bbeabbf6a21f61b8904c55378d9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313734363535343335"_hex; + sig_r = "263ab1c93567e93b5ec4e380b0d3bb5ea1ce693c14a47afccc539aaf197f099d331ea9e26f1a0057148d46727acb6188"; + sig_s = "621db07ce94110e2be74fa953a00a8a554225b3f2c0f6c56b4ebd4db2f57ca2565ed3323fd708bb56ac6e28bfb40f2e7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363434353530373932"_hex; + sig_r = "96f4a2b3529c65e45a0b4c19c582dc8db635d4e74f0b81309696b23be920ba8ec553d4b370df4c59d74dd654bac6df58"; + sig_s = "1573ba1b280c735a3401d957ecd3b8908e4e0b7d80239ce042594d182faf2ddf811c9056aac4c87f4f85043766a26614"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353332383138333338"_hex; + sig_r = "96a691b19a6294b311a438f8da345e480b1deaa1e940cfbf02177d5f08479976ea58aee31011d50b5542be188c9d63df"; + sig_s = "8f67dc9e1588aeb8be180013d41a036f9badfad9fe9340910cbf87243776f54bef7da2ebf3a7643866eb9a3b23fe59b9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31313932303736333832"_hex; + sig_r = "cff27948c6d902c73d103d0802eb144dd89c1b0e3b9f9a5e498b0361dc122a0d555160d8c64d61539c1dbbd4bc18971f"; + sig_s = "b60827488c9f16ba28378fd59b1a29c65073335a7f236131134674c62c8396f193c76f2395ddaaa4f24b69161eb69b4d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353332383432323230"_hex; + sig_r = "e90e22d9e535dfdfd86e098d5d6a0ae08f69d4a3ffaa39f6930bcf5f5ad02ee0d0472ae984edd9f0bbe5e7d63fd4f6ac"; + sig_s = "e3f57b0a4629ecaa21f2d34a7a0834d57ba20f99c6e31b43c37811cc23b9957c8f3356f4462214d3c8e58745e50f23f6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313536373137373339"_hex; + sig_r = "18b70e272a98cc48e1e0af73146f0f972bbfbeb6b985feb2c4acd695a7a41b99c415be9c46aedaf3ddff67a65a89e387"; + sig_s = "47d6bcea088f622ad35d88bcf46d71827bcba2f57c36d6fb8a4bf2befdc0d4e3ef366d5966c4d076d3cfa43d6626717b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333033303931313230"_hex; + sig_r = "acfd981c55fd5286cfce173726d51c3d25f65b11b7673729a62167256774f7c894b74662a212c706e00cef096074162f"; + sig_s = "f4d471c97797c24d96aec1de85a249ef468d6036cd712563aeb65cea4995f3ee85e769b874f09a08637a44a96084be7a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37373335393135353831"_hex; + sig_r = "f15fcbeea8b64dad5e8566a2c37913c82d6be9d9668df469bd0b591c3923a6e12644eaf697d466fa7cd513983d946a40"; + sig_s = "70063966801079351526999e5c5c2c5f627e4c8bc96784bcbe715fe7c7afcf69785d1c8c7ccd3725e364101638396597"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323433393636373430"_hex; + sig_r = "d995147939ae6d8f62bb57372227395839e25a0d4308b899d5f506cf9e0a01e8115b7e4b822f037ec95752bd9e892f5e"; + sig_s = "9bb4d07333e468f8482a790a2a2e650e2c42da8240ec5e402506b368122f046680cd71e0117897cce3df4a1555fc8876"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333237363032383233"_hex; + sig_r = "43c6ce5184476f3f496afeae3cb96a3f9f038957686c93437b8266a233022371d266e904aa096c3566cb33824b88075e"; + sig_s = "680c13245a8bc560b638d26f0c5f261964130256939552d3fffb07b658355611612c268a89541055d3c2bf9e82cf4da3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32393332303032353932"_hex; + sig_r = "447539941dc350767fc841083d25d9247a0807e1e22e0bb9d94f504f721981b413d521efbd75e4fe831ee26338cf3de3"; + sig_s = "00395ab27ea782cee4be53e06c7616bbd41d6926b18d219d75d5979f13cba2f52101019b0ec0a41ffdbf29ef73ddba70"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36343039383737323834"_hex; + sig_r = "a0ba8e8b979c20345e34fca98531900164a859923bd6986a9c39236a2f5de053a252997f35e5b84b0d48ba0f8d09aedd"; + sig_s = "facd6df04358fcd95fa9018a6fc0828dfe319812ff65929c060b18ad4b9f06e7fc0addd1b695315d71c15e51dc51d719"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36303735363930343132"_hex; + sig_r = "b8378390f71f0bb6663f1846daf6908f8c84f770ae740cc8054122494cf0ffa9437ab26040ca22808fb29a810b70126e"; + sig_s = "427636b929a500abc34d9f22977b81e734919afaf3ed2c91eeada7074e0c16bdc52f960eaec9db5a879c1e6414035101"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333231363233313335"_hex; + sig_r = "f36a9048fd94803d3d6d1b11430b90b94ef8d5d2ad89018c69473ce9cfe0d6105b3c2fb2e7555ccd25f65af8c872bdc6"; + sig_s = "81254841e7ecbfd0d810afaaf5afd6d6c5d0542bb00cc183b1db01767120afbcc0006ddcba8db7baf65f302723dabc4d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36343130313532313731"_hex; + sig_r = "d8a4d96409c191baa9540bf35f1d5192f9352d7f0e14f92c0e8e1f19f559b42ed3c6b7bdb6becc56584fb5c09421e2e4"; + sig_s = "d966ba13d4245e248eafb46f2a3df92c2037d5969c7db6dbcb0ff4b21850e16a18a29785267239886365cf721a212536"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383337323835373438"_hex; + sig_r = "1d5d86fd48e65b0cf0b0b46062241f89cf65785dd818f93f1162771a38a15f20febc261812ecaaf6f4f2b86b3362d7eb"; + sig_s = "0c76e363de1432513cb9dad6493931381ecd25f142e61968b6f20d7b1270cb9e38a7ae54e4778aff4025eb00c6a67aef"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333234373034353235"_hex; + sig_r = "0508eed148f061114be18e8a86188feabf76b873b36eadcca9c2c60e24a2002fe456231decf7a8f6f032c08dbe0ab5a9"; + sig_s = "694c0ad781b2341e30e1d0739ac99672064f48821a69852c7940cf1d621738199c980d56d2a0b71b3fc6011c6b2444ba"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343033393636383732"_hex; + sig_r = "726ef88bb7947a043116c111cb519ddeda3e6ffbf724884a1b22c24409cdf2779d93ce610c8c07411c2b001399103d6d"; + sig_s = "95dc1d65046caf0e8dad07b224798d6f7807278e737883e7c7bf0b446791d4ee144c26f710134861af4e6771d4082896"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31323237363035313238"_hex; + sig_r = "eb0e8e3c639f5eba8eccd9020d0ec62d8ac73f3fddbdfa08fdb2155deb0a536923ebd55e20020cab9f8e39a43a88be11"; + sig_s = "c796df399fc35883dd5dae6817d02d3d67a8eec6601585e5e36fd2c134eddb1447ec12b144dddc9aae28a84f22602641"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34393531343838333632"_hex; + sig_r = "e8f8c69d0396ea900f9757736d2b19dbc2d2a8c01dccf490c8b9455bd63b34c095867e7cf3b84dc7c3c3d6b51bebf405"; + sig_s = "58152a7564eeb22a3e26597026d0cd7835725bd512245448cb5016eb48ea759809fd6949d0ee5d579643f72f908c16bb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343532313237303139"_hex; + sig_r = "380b4e48b3ff012af7c08bf871d9f4da0c708b5494a986d3d80b1979e579d0dbee61db9bc3c04c396176410788e15a0f"; + sig_s = "e6971c013c965a7e4df10f95620a5092fab096bd5b50828f4bc91c5e479bccf6e0daf287e7ef580fa9ea153fa1a507a2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373331353530373036"_hex; + sig_r = "8061de12029e2b000d157a455ecf2301222f092df95b9551b78cf0ef3a64f12212b57ec7b16d2c0f258946f51cb1633a"; + sig_s = "0ac2ca6ad99b29ca29a0dc38b34443ee41020f81ed9087cef7681a00c4fe60653a572944ba37f1fe51d112bfffbdd701"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363637303639383738"_hex; + sig_r = "e74f2a791eeb7341cff6cc1c24f459e6c0109924f7984639ae387e3ceb58758a1bc3839dea1fc3a3799562225e70a733"; + sig_s = "d90e4d0f47343268e56bbcb011bd4734390abc9aa1304b6253e78f5a78b6905aa6bf6a3892a4ae1a875c823ae5a83e87"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343431353437363137"_hex; + sig_r = "6a1cd0ff7906be207b56862edcbc0d0bbfb26d43255c99f6ab77639f5e6103a07aa322b22ed43870d1ce6df68aa0a8c1"; + sig_s = "655558b129aa23184500bd4aab4f0355d3192e9b8860f60b05a1c29261f4486a6ae235a526339b86c05f5fac477b6723"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343233393434393938"_hex; + sig_r = "81111fdc5f0de65583c7a5668d26c04ee52e08dac227753132cff1741cb721e112aa793c0d5fa047faf14cb45dd13e1f"; + sig_s = "9a25cf1e6c152bc3e216e021561d194979f1c11fe17019ed7bac2c13c4010f209665e3b6f33b86641704d922b407818f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34383037363230373132"_hex; + sig_r = "9b66d122a315095b2b66ccb97272c476a2d760e827fdea05732d634df3d066569c984dd941aad5f5dec4c2e1b7b94a00"; + sig_s = "96c32403c85bc3d0ee87f96a600182796dce53d54d7467ae660a42b87bb70792f14650ac28a5fa47ce9ca4d3b2c25878"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313634363636323839"_hex; + sig_r = "2bb062a002088d62a0b7338d0484fedfe2af7e20cebf6a4788264eb27cb4ebc3cc81c816e6a35722cf9b464783094cb8"; + sig_s = "46cc21b70f2133f85ab0443bebe9c6fc62c6e2ec1fd9c4ddf4a6d5f3f48eb7abf1ee7bdf6725879fd1b7daafb44f6e04"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393432383533383635"_hex; + sig_r = "33e87061ee9a82eb74d8bb4ae91606563c2e4db8b09183cc00d1119ab4f5033d287a1fc90a2348163fdf68d35006fd7f"; + sig_s = "96db97c947ee2e96e6139d3bcbf5a43606bae1ad3ca28290fbad43b281ef115ec1b98bc581ef48094f8c1aa8e36c282a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323139333833353231"_hex; + sig_r = "70f80b438424ba228a7d80f26e22ff6a896243c9d49c75573489ee0de58ec60efd103838143465bd8fe34672ba949617"; + sig_s = "115492bd9365b96f38747536318bffb819e7c146df3a5a7a46d6288c7fdf31cff570b22176aa398daba9073ab1e7b9bf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393236393333343139"_hex; + sig_r = "ff16ca0389ea6948f4305b434fe0aa589f880f5aa937767c31170ee8da6c1ad620c993d40ddf141b7fda37424d51b5cd"; + sig_s = "ba0f86985dffc61d6e35a37de06918b11e431b72403161acfb8f05c469f1fcfa6e215c6f7eb5a0a5e0cc9e7be79ce18b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373639333836333634"_hex; + sig_r = "d60c24bee05f5198cd155ad095ffb956bbcfb66b82fc0d3755119915a62f2f923557b85ddc1d12e6a757f23042cb601b"; + sig_s = "2c4d968b5eac930b51d283b418fcff6df3a9d6d66e3812cd1bf5fde797fd203a7c439b1b381e4fe8b44e6f108764a7dd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373335393330353733"_hex; + sig_r = "bdf634d915a4fae7a155532ca2847c33a6babe7ef8db0af50f485db3dd2c8bffe722394583932f6eb5cd97f6db7561d9"; + sig_s = "bb425cae2e5483174b5ed873af4329da4618c14458141850bee3c7bf1ffb3f2030159043277dacc708e9d32f63400083"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333030353634303635"_hex; + sig_r = "061320a3bcebac33cf399d45d1e1e1b34f37288fe4753f4fddfd496eff427e1d26b1b91d749cc34c12f4ecef837c0e8f"; + sig_s = "fd5cf468cda319fe06e773a190c38de6e150a321ac1c416ad875432cdb7a07134c446f13068e71a1a96e35da923974ad"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333037363535373338"_hex; + sig_r = "d620f063d33efa859b623f6c9a92340e4cdd854ffbe3e5e01379177aee31715ce587b00bd0aea98fddf236d2fc8a7a74"; + sig_s = "671f4b7c187297dc236c61888b6d9397e97783077cc4101807d79ee62e4a53a78c4b6a3a31b03178668af894a3d8902e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39363537303138313735"_hex; + sig_r = "91c556c5bddd529fe903b86afc0eb8fa1f49425b779a39114ae563bebc947e633ba4ee98948faa8940dfe2562c63e1c5"; + sig_s = "198b00079d8db072d25b0a49bc8bc36457926f3c101527528df6679f92c76f1b487e6695d4b92fe33b4ee7046a6a5df9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4bf4e52f958427ebb5915fb8c9595551b4d3a3fdab67badd9d6c3093f425ba43630df71f42f0eb7ceaa94d9f6448a85d", "00d30331588249fd2fdc0b309ec7ed8481bc16f27800c13d7db700fc82e1b1c8545aa0c0d3b56e3bfe789fc18a916887c2" ); + { + // k*G has a large x-coordinate + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68b"; + bn_t sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r too large + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3623bb296b88f626d0f92656bf016f115b721277ccb4930739bfbd81f9c1e734630e0685d32e154e0b4a5c62e43851f6", "768356b4a5764c128c7b1105e3d778a89d1e01da297ede1bc4312c2583e0bbddd21613583dd09ab895c63be479f94576" ); + { + // r,s are large + auto m = "313233343030"_hex; + bn_t sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + bn_t sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d516cb8ac8e4457b693d5192beeb6ce7d9a46bef48eecf3ea823286f101f98d130f5a26dc6fec23662eff07f14486fd5", "008456932e74894b7f0e3bb0dfd362502b3765dd80a3177209fb221dc9b51aaf4470b245391405bef514176b13a267a720" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "d1aee55fdc2a716ba2fabcb57020b72e539bf05c7902f98e105bf83d4cc10c2a159a3cf7e01d749d2205f4da6bd8fcf1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a8380cd35026e13bf87be693cdb6e75a82d765b4019b529e8d277c4af6c9db27ebb5d3f86e88add9d5b61186f04c83a9", "0092a187507c737325d2cc624acef3cd036bfa99e0c1518be65c88bb51f900f94123acabad81d15130d3ade7ff7e4364e1" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "b6b681dc484f4f020fd3f7e626d88edc6ded1b382ef3e143d60887b51394260832d4d8f2ef70458f9fa90e38c2e19e4f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "554f2fd0b700a9f4568752b673d9c0d29dc96c10fe67e38c6d6d339bfafe05f970da8c3d2164e82031307a44bd322511", "71312b61b59113ff0bd3b8a9a4934df262aa8096f840e9d8bffa5d7491ded87b38c496f9b9e4f0ba1089f8d3ffc88a9f" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "44ee3335fa77d2fb02e4bd7074f45e598a879c0fa822ec718c21dc13b83440edc4e3c10a1858423e03044c9eff22591c", "00d027c49933e5510557d6b4b2c6f66fe5dcb9302a3b13fdc68048c3fcac88ba152b6a9833c87fdc6280afc5d11ab7c107" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e2f87f72e3c66c73037fe77607d42ad2d9c4cc159893b4b9b8b0365d3a7766dbe8678b02e2b68f58e5a4f7681061a390", "00e38f2142818542bef6b2bc3a2c4f43c95e5259d6bd5401531378c7ca125a1f6cc609d4fadfc5c9a99358ee77ff780c8d" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "60e89510c308089a747f06374c5388416535753b33514480bf8251ff4014754ebaf48aa655dc41ca89f373257a7e50b1", "4dc4c2bed99597c146d577f4333843855da27e395fc81aa90205795bd555b3451dc4b9536e234799185123c4792cfb1d" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0a82d7df701a1f0c02a8265fc471d4851a3f08b5c82897766c18400a270c11d4fedd7b5b085e532674b395b3653f6385", "00ae089577be259cdbe030a661868d7b3b5413218a48439a6753f92316dccf692f2520058048958a6ed4085583ce78f45f" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1301dee63fca91b6de8835480c3d86297b1e6a0a7339fc5011a50c33f350e9938743df496aeaa1e3170ba1e2f0c44918", "7b6812948761816232e414e23b0f9904d171da5cc0492a341e2b4f9477da0a311cdac7c7d01037ed7dddb3376892fd44" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r is larger than n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52976"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00cce27e78386d68492fc58dd5f191a690c2ebc0a452442fe0dd331f458f18c8fcd922e148f8f251bf1b85e149ccb3f192", "0095395c884ff97f670631e84b7e0b0dab503ba9c7080eda0e1c66b04e160728067cfe88fbcbbb0f52cfb733cd951fcf26" ); + { + // s is larger than n + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + bn_t sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accd7fffa"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0bb03fce3c01ebcf0873abd134a8682f5fb8dbffa22da674047e5c3e71e43de582ed6abb908c2e4faa5d96186278b6c1", "00ba3b22123e68ccc56f17dd79ff15565706f71a0b6123c77af3cd88f0af024cc5259781516edcaf5fe990646e7b66999d" ); + { + // small r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100"; + bn_t sig_s = "489122448912244891224489122448912244891224489122347ce79bc437f4d071aaa92c7d6c882ae8734dc18cb0d553"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "58f246090d5e49863bc0bf2d501ff72f551c5f1c5e679eb49064fd02e221a2707326ec2d140bcc817afaad5065761566", "497c823fd736882cbf78fb92b1a5589b67e8067497c710a4cbb39dee2c5431bc45cfb96c9f8454385c9f2b3ef2d3d31a" ); + { + // smallish r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000002d9b4d347952cd"; + bn_t sig_s = "ce751512561b6f57c75342848a3ff98ccf9c3f0219b6b68d00449e6c971a85d2e2ce73554b59219d54d2083b46327351"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00fc6984dd6830d1485fb2581a45a791d8dca2c727c73d3d44c89f0082c1868af5ca74b4ca4ae22802640a9ebfe8c7ae12", "00998d63a5b5ad1b72b899f0b132e4952aaa19d41fdeea48b1ed6b8358dd1db207fd66e01453ad40f67b836adc802d5fe8" ); + { + // 100-bit r and small s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000001033e67e37b32b445580bf4efb"; + bn_t sig_s = "2ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad5215c51b320e460542f9cc38968ccdf4263684004eb79a452"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1b8def5922303d647e8eb07e3bad92f924b79b769eef168e7541de1f4e0d28ae9733eb98cf8a1fb6dd52ca02c8c75b51", "00c7aa4bf679d49d8114122074da8f6044a427371796a5654a6106162d5f686abb73ebd896ab08c7062687f12171fbe4a3" ); + { + // small r and 100 bit s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100"; + bn_t sig_s = "77a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1734a039a88a16c2ff4aa97d2399121f56f52ef01ed5e50887f736f65b6e51d6e8786abb4e063da5d1ba812dff998403", "00ccd698e6c296d5cd69178f8a82481a865da331627f1c4b324fbc02b36e8b5ed58a31f728e904d203a388755302195765" ); + { + // 100-bit r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000000000000062522bbd3ecbe7c39e93e7c24"; + bn_t sig_s = "77a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "52ca47dda99172cb8321495acf988548295988ec973c1b4ea9462c53e5768a704a936410ee847b5dbf1e9d0c131da6c7", "0087a47027e6655792eb002d4228ee72f7c814c9a0cecbff267948f81c9903ac10eb35f6cb86369224ed609811cdf390f4" ); + { + // r and s^-1 are close to n + auto m = "313233343030"_hex; + bn_t sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f3"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0091aa326dabe04a6ad266de30873518f978f634c740705152539787b5b42dd9683c4185ace936684683b4c136b5f2ff20", "00cacda42b735cbee78e7b6a43f50b851b85e998c365909f763d3e64210eded159ebf21818dec0e207b877b99ff595beaf" ); + { + // r and s are 64-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000009c44febf31c3594d"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000839ed28247c2b06b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b1f52ae15400a0e0a4b39aae9a11e675cfc918d0c672189a86f68c0f306b115b6b470b931d19b2bbfcddada74f30a72c", "43cdc9522c0f73082251b4293982bc3e90960384f957f594d0ebe6eefe72af1ce7387f46ca5824ba0515559c05444f59" ); + { + // r and s are 100-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000009df8b682430beef6f5fd7c7d0"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000fd0a62e13778f4222a0d61c8a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4314072bfccfe420f64cf79393bf38c773c4390f7df826c6a59043b3e0d55e8e69d37678c72a5e68a114e04ae5a2de76", "5a4b87638874c3b3ff687ba7fcd08238d46385e2aa6d65e2e53a6d5e205fcfd9b744f4087c6292b665dcb691ca5e86d4" ); + { + // r and s are 128-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000008a598e563a89f526c32ebec8de26367a"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000084f633e2042630e99dd0f1e16f7a04bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00eb99d6bf52d08c1118ce27b0e4c09ce0d6893d5a9da2757b7f03057fcc17bd8afb4c48a60e757ff61d5e54e31d6536a9", "059ec79354b3949d53461e6adf7671ddf20402e1c9337464775ee56d507832728124c514e1dca506fe5fa72f7e1778ff" ); + { + // r and s are 160-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000aa6eeb5823f7fa31b466bb473797f0d0314c0be0"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000e2977c479e6d25703cebbc6bd561938cc9d1bfb9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00bd3d91f003e18adbea73079d4eba23b91fc17fcec14c9eb15a193fbc9ca39c8c747cd7a2c9623e05dd587ccbb8ab4c44", "3adb0a0706aa5ea7a68042082fccefc979612a7a1a3d694b00793b03f89bff866a8b97c8e77990c29360ce795036c764" ); + { + // s == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // s == 0 + m = "313233343030"_hex; + sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5abbf618a084f67138c418a896d61af3af1826040835b73e7619846b495eba6f7eeaa2e9cc61c85f6100fedc25c16743", "00b065a427bc503139529e4faa63dda553aed2696fd02c2b6ceb2d941d2c4363cf9ac7a6759d50e8b9d07fe286f17cef5c" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "427f8227a67d9422557647d27945a90ae1d2ec2931f90113cd5b407099e3d8f5a889d62069e64c0e1c4efe29690b0992"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3942027bc7f33c10b159293f2abd0af935642a546ea20de9d85c36a0f4ed40cfada782a297bb2046d633fa53e26adc52", "30656a4f1804feca511d41372483af36387f658c44fdc5e7f02487ab70e1bf9d185918d7820fee0ea57a4fe006abbe70" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "369cf68bb2919c11d0f82315e1ee68a7ee8c17858bd334bf84536b2b74756a77e4eee10ecc5a6416a8263b5429afcba4"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d5db4d230cadf5bc6350f74d0bc5015b14d377934c879f74caf483dac49ef9fcf7a6676aaac5b405896d5be6ae0653e5", "00e3509606e26f71415a7f8ce37698e1c82286cdcdf3a7def73c347e32b45b32b6deeb34c4038373a30a7f8275f6daf541" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "2111832a45fc5967f7bf78ccdfe98d4e707484aad43f67cf5ac8aa2afbde0d1d8b7fe5cfc5012feb033dffdec623dfbf"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "629e253d5ef8c23319bbe9a56af387d92f867ef9f81c6d9f0ee7f5ac28412b0227eac75d982814e8e24d82b8308cc9c1", "4ef3b9286c9882d7e853f7032f01dbe88206a7f92ec7c776cdfd2117ccb2ad2165fb8650de299107037edb69109001db" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "20cd002ab7dca06b798fecef3f06a222c2d2a65e9ec92f74659a8d82fe7d75e9af739f0b532e17d6c5f622c4b591442b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3eb89e36a222831fba4be0b7ca40b7df6e4d795f921089b48989af0add1fa6c6e846946c25e4d195f9ac5dbb34147e41", "2b3081be4324036a3bc79e9b6cd78d0d48500f0fce1e5a0fa31d833f86d1afe2f7adfeb5cb9662c74763c85f0f9d339a" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "3276fe55314e426a8ed83c4c38dc27c8fe8cbba0b39bad7cfc35e963adf10ab37251ea6829b8d255a77dd0b655cf9ff8"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "66d0d1cec3fe7f8a46e766d1f7f44b2436f48164e12139313887c5992cfe5944059ba97eb10df411182f4242cb0d0bd4", "00a3e39ee77a4c472aeb3f110b088b5eb92b7d2885bce326eb8f002e2ce3c858910717841499eeb7f739441ba0ffb3c02f" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "1a80b4a3d6c88775821e26784463080eb7de510762ab0d98223e532364c7089b07af73746ae4cf076c5277dcc80cf8c2"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5ea90d3b95fe4c25b3623cba85867df605039be9c78b0489dcafb2c613ce6887c53fccc95fd342156466d0f8c05ba628", "00c81f3c6e5b5a400feffb76814c47f2ae486ac575359ee6dbea6e3a0fbad3747558934a5a1079883d02aa06bb071001b9" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "74e780e38b3a7cd6cfe17d5c9ac615895bd97dd4076b5f8218ae758b83d195fba64eb9aead39a790ca0f8b8387376265"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c8793c0b7d239c26195cbea62a97b350d74e64609e3946eca0061b19fe480332be3ba3e4b62de5c5032d7437015adf15", "00af8878a280a6469441d0ab04d0d331ffbc1389b9bf81991660b7b8c2ee20b2a0ed31b94742b5a7413fbb758be5927f7e" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "6ee5f8daae12c862e1f7f8b59294ac90448c4461e29b36ed623a719dd69bb17b3a4b7c29b9eb5c39ca6168bf6b597c6a"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "57d1385205e0cb872d619c2aec0b3442cf449959d33c1c4e76b55f9378e914fb07c4f26929832c3862de9be4b3d5fe18", "00f10779e7e09e2f0ea1ca2df8f801167bf384f061a2c272720e0a6f4b313341f29da004e91b83a738b14e7c3b3235a549" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "5426ca20a25b0cfb1ef230c62f91e98005f346e229233f1803e8944bf421fef150a4a109e48cefaa4ea23eea627fca41"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a982d9378c598e40330f1f1254494315e65a50754c701c46fbd2253b50673c6a794b72743e412aa92201df95e81af63c", "00d05e4c775885dfa050743dbf3b5d020be409bababce230b80d7aea32f38973a0b659aba3808fe7f9d2ae67ef9639d971" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "39fd1a0ae3964735554c61daf085c66bcc2e9e5350131086023aa99549fc5f9057c848e75a1b8e58069fe0b9b23fa3c9"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00daf193bd2f16d613aff2254bdc2dcd1eeb036d6506a50e07a26f83d3830629fad4433d3232628f5f24ede60bb6eb3e1e", "00e299714cc03e73b5e1a7fa0e1adfb2709a55883d9e97036007b31b7661f6fef6a1dbe418b633a5f3639f7d529da97285" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "707a37cfb7367c2e551ea1f0caeac6c0fdd2b562e1bd8f1c7c51a5dd78f21da8cb179bd832cac3d3aee21fda54729e66"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "09d4064490c7736106946b7fc6d88957c69d6f2f62e4388262603a43c129ceabe8d601ab2a700394b3b950840364bb6c", "7907bc45387fa1200b7cfae3171488d104738c60d22cacb71ed34a72bf1d315f7370aa181b265810c083996fe3a6b0fc" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "15c99e2ae11f429e74fe2e758bc53ffea26eb6368dd60d10daf860f9c79fa8cc6cb98fee9b87dd38353e970539a50a9e"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "650323415ec7cb87c02b670ba5dff00e6741d50c78f044ba179891e1e1e00cecc56803566872a288dcecfea93ae74955", "084ff6f9ad4f7ae7ec9c808259a5b640984000f7d86b412b4d04506fdce4d06cfd9b176d07cd869be6741de771438020" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "148c732596feaabb01be1be3a220740e84bbfabe6d82ad0db1c396fa047603beeb95a1cd37fc708a9451d3cc29a45b32"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00dcbe590865766687b59e391cd0e7774c8c71b48a150fd71aa85f12ae56a574a7d6c815eba1c1ac2ba98c0246e7a77ffc", "008adc0f6009441969497b33ec3ba5ca9056265ca6af4a732540ea71f4a0cb64c4a8296585be4cffa7f70bb779997300ff" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "6b3cc62a449ae5ef68bec8672f186d5418cc18d039af91b45f8a8fae4210ef06d3f0d226f89945b314d9df72e01a02bb"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "334ab85078a211761e6fe39b56b715047f6aa5f187f2eef32c66b10dc7aae5af2d43e3feb356332354f6e3231e723dce", "00f5dd6d0a40fe6c13e5008e310c848139ad58eaa1e9ba242ab383d433111ff11a494a57ab9f0924a257e751418aaaa66f" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "7db7901f053b9cefacfda88dd7791c01fd569ed9a5243385eccae12ba992af55832a2e5dc8065e018399a70730035bd8"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00f896353cc3a8afdd543ec3aef062ca97bc32ed1724ea38b940b8c0ea0e23b34187afbe70daf8dbaa5b511557e5d2bdda", "00c4bd265da67ceeafca636f6f4c0472f22a9d02e2289184f73bbb700ae8fc921eff4920f290bfcb49fbb232cc13a21028" ); + { + // point at infinity during verify + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = false; // result = invalid - flags: ['PointDuplication', 'ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "370d9e2e31c712c8028092f802319d7fdf5b3319a8518d08bed3891508c7060cfe2236e18fa14fe077093ceae633e543", "0fd79aacf9d16ecc19b12d60fba4998dfc682702ec7c8bdd4a590035773b8c9c570ac7dcd414e03252f7a0e6f53b5863" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00941e6cfa356e572dcccaeb594b06955d99dc4bf07958fc98ffa17de11c7521bf2c7aa8ff260952fcb7aac078ede67b47", "0090a78a0296b041a10f003df1998da4cc4a1614ebcbf5d239431f33d90d3023edc1802e8db6dabcbae67cc314da2aabab" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294ba"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3ecfd58a3ce583866e0471d16eb3c10a411ec3b8671f3a04769b1ed8464a71cf1c76d8d9b7e3670bbe712d6f554a9383", "00d980d8bedf57470d6b45cc1ad0c6426dc70a0e4be901106a36663bfcab04fcb86008777b92445120d5e3641d97396362" ); + { + // u1 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4150ccd0fa45aa2ef6b5042ddbb1b87c5ffd1115a8fe5995641948acda82a7b190762d84352cd74d1ca01e79f68f9cb4", "00eb11be9d494c181c156e23e77e532bdf0a20c3cc74ba8c29b1f3eb2bd99129ee0d70ff0d593f0d7a6d6887e7c55930d2" ); + { + // u1 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e78fe2c11beac7090ee0af7fed469a8ccebd3cccc4ee9fccc8ef3fc0455b69aaa082dc13e1d84f34026cb6f0af9e992f", "00f34ebba71bf3a4050bf28e4084b5c5f5d4098ec46f10a31b02fb4bf20cc9362f6f02a66e802f817507535fac3ec0b099" ); + { + // u2 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ee24ab8a34d05af684939357f32759cc5a14f3c717529a20aea8e0c5965d8a41e68925f688471994b72021ba51b28c09", "0a55693c92ad0cbae9edcf515e2b4c060b888d82c81e4a3b6a173b62ed04a46fa95db1a2f3949980fba2e371263c4fa9" ); + { + // u2 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa84ecde56a2cf73ea3abc092185cb1a51f34810f1ddd8c64d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3d2e916055c92e1b36133f5937b37c1b0102834eb77008a3ba9c3da446e9065971d68ba913091851e10cff5b4cd875c1", "39aa7aadfc2caf7107b17ae1aea8b299d61bf15aca0cb3fd6f1ffde8192bfe58f0822bbbc1f55bddf6b4fe9c8f2b0eac" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "533b0d50480a3ef07e7e8af8b1097759bc03ac9a1c7ed6075a052869f57f12b285613162d08ee7aab9fe54aaa984a39a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ae596697427aa250156c05ac4338e48980a7f093ea1f1fe67098b43f6539c1b20ae74338f9bf270d33663c50abe8fd00", "1ca6a52732db74ab15d2f249a3d839080f898367dfd64992cdce2708deaad523a2a236b43400424241c91a35b530fa50" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "d49a253986bbaa8ce9c3d3808313d39c3b950a478372edc009bc0566b73be7b05dad0737e16960257cc16db6ec6c620f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0088738f9981dd4d1fabb60ad83c2dd6dfc9da302209ae3e53498a883b6e39a38bead9b02709f352d3e6b6578154eab252", "009388a05c6b9f3a4028abb9950a51f5264ecd7580a423fdec9472faeeb57f92e31c46bef2a781fe5edad026009f198262" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "285090b0d6a6820bbba394efbee5c24a2281e825d2f6c55fb7a85b8251db00f75ab07cc993ceaf664f3c116baf34b021"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00f421541311c94fdd79fc298f8ab1a3adfd08029fdad439a94d4cea11f7e799bc439609f2fb7be3f349d55e484d0a0d36", "00b35330bbdbec1e75f2984483d96bf210d722c1830292ffc35a2f6a21a4b50519f565f024bbccc97228a2f8ad8fadc0d5" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "b39af4a81ee4ae79064ed80f27e1432e84845f15ece399f2a43d2505a0a8c72c5731f4fd967420b1000e3f75502ed7b7"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "399be4cfc439f94f2421cbd34c2cd90bae53eb60ddfafca52f7275d165d14fa659b636713b5d4b39e62fd48bae141d0e", "1b23e3b4f0c202ed7b59db78a35c12ac698c603eab144fd09ac2ed8f4495f607e4d2c87a23ce2ec33e410ca47ecc2555" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "af4a81ee4ae79064ed80f27e1432e84845f15ece399f2cbf28df829ccd30f5ef62ec23957b837d73fe4e156edccd4465"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1578bbff72137c4bca33d7385a892be94cb059f9091ddfe890345f712a9fba5fc77084cec11084ed048491604a07f66c", "76bbaa872f0710d82a08d9dddd833c7be7c7e8e265f49145157eb4e8e8280076a37ee5873271db510034da19da24415b" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "5e9503dc95cf20c9db01e4fc2865d0908be2bd9c733e597e8a5bb7b7a62abdff6dbe3978ae56536d0fb01172ecd55f57"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "33ba451c85e729058f83041077a4695eb47df93e718b09a4618c753ac803cd75c1a91290c2ff5a635389d07149571dab", "1fc7d8a71776851ff244ff632fe6f92e1652e5284893c4244fe775d8efc589d823dd03f3919027f004537bd8ee09f3a3" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "1ee4ae79064ed80f27e1432e84845f15ece399f2cbf4fa31a3ae8edab84dc3330a39f70938e3912bd59753de5aed3088"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "040771e3390216fed2c6208bdf5bfea83ab1915b166e626569f12efd410a39b7e7c76f70f0012843a26debf4ccc33dda", "00e5bc5f7e62d054eac31cd022afdb71b7c638f24c30cbad0ef35ed2fc9917f356e9c3f04391b21d1035274b81537fcbf3" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "bb51cd3ba8eb201f53ddb4e34e08c0ff7dff9378106784d798d5a3440bd6dc34be3a0eaef8776619a0c97fefb15720b3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0098d3f16e1c510a933e648e78d01588319f002e9475df8942a2a89db0666bb7c88b32bb248140e44ac4ab28111b2b7923", "0099a926f4a66fbe28ff65c09f8306893aec094b89d0fe529e3577c5ecf30a7944caaf530f4575eb113fcf4c200d2dd4bd" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "e707e267ea635384a6da09823149f5cb7acbb29e910d2630c5fb5afbc42aa8436349b214a3b8fb9481ec999e005091f8"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d1fd602feef80be9e55a19d1a9799c72a899110c6ac21fb3c21357069809d591a8775b64d1867a8cfff124f6a5e3a4f5", "00f9548064f01b9af8868705493a37a037193b48f53b7c7973023f53e6ceff6830ca2f7a14ef51536d453af43b3058d8a9" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "acc4f2afb7f5c10f818175074ef688a643fc5365e38129f86d5e2517feb81b2cd2b8dc4f7821bfd032edc4c0234085d9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0082f37604f66664c2883dba6d98397c281045cbf59f1d16dddb1381126a246553a8b4d2aaea48ad9185a1645f65567d31", "008a4d7b19f1d2e4434c9a8ecad396304abc82221bbab0679935071c72fd975e7b021c04b1d16ea36fc2d051ef5a8e117c" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "83276c0793f0a19742422f8af671ccf965fa7d18d541bef4c05b90e303f891d39008439e0fda4bfad5ee9a6ace7e340c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00f052dfc27bf8a6d36f3739f239b981f5b53fe08d999ec683b01e43e7596156206ba08b8b9f59229e2fbdce05f1e40f99", "0090f0fdfb7029f9b3e8c6144dad0339208b7cdcb3820a554259db9d27afdd18f4a750296c59bad6b62df076f90d53be0d" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "942848586b534105ddd1ca77df72e1251140f412e97b62afbf85d4822309176b5965453dee3fab709e14156b3dfcecca"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00f877bd6e2a9273e322a3298ea3add13d1104b32172283669ca6688f0cb591524a7f15dd41496681eda98939aae729fed", "00e85ca37c81ef19e3dc9ab16908a3720d86875a51a6a6d932e37492a6ec7a344eabc482377f14891fbd1da7faeffa1178" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffed2119d5fc12649fc808af3b6d9037d3a44eb32399970dd0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "14249bbcfeeceab06c75654d361c0df8d56b320ea3bc1d4627ec0a2f4b8fa3577445694664f569a91f480741381e494a", "28479f2186d715a56788f67073056aa0cb0b6a7f7893e77b9a6976ef6663d80226896d7f43bb502e1b4d49558a27dd8b" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "79b95c013b0472de04d8faeec3b779c39fe729ea84fb554cd091c7178c2f054eabbc62c3e1cfbac2c2e69d7aa45d9072"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "50a438c98ee94025ce13e27d36b8280d4843585836eb47011a070cd77729245684a0db31fde980620349c796832b2c6c", "00bdb72dba9f3f9cc878559f50b6bd1290f10a6bccbc1eeef7708b1b72059022987979e35221c51259f337c7288a2f86bc" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "bfd40d0caa4d9d42381f3d72a25683f52b03a1ed96fb72d03f08dcb9a8bc8f23c1a459deab03bcd39396c0d1e9053c81"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4d3fc5dcfaf741113cda3ce2f8dff4c912143e4d36314c361d7ed5656b68448bcca114ba9e8124281234660b7726ddcd", "680ddfef7ea07bfbcede10803d38d7211631ca11466078819eb66e11921ab7ffa3c4560c732e77595fd408e917dd9afc" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "4c7d219db9af94ce7fffffffffffffffffffffffffffffffef15cf1058c8d8ba1e634c4122db95ec1facd4bb13ebf09a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "63d65cdfeb1f1a42000f43bd1ddd130537a7b6f635e8d2bd81a97da168221183da433ca78429fd2b33c5f94895a9c13a", "00a9d1d5ea328725653a5a9d00f85a5516236f3b1428a8629287d3b0487a2e82dd57f93bb2aa3d9783dc74131e13756034" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "d219db9af94ce7ffffffffffffffffffffffffffffffffffd189bdb6d9ef7be8504ca374756ea5b8f15e44067d209b9b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d22c9c348b9745711f57debac3a07df90a527c06bd02a8454f41437d54224e071698f03fdc64b1d652414edc3f2239c4", "009ae9812a4b92f099d6659a659691768d57e530ed3c91d5455781605850997a58221f22a2451c3932470606c23f3ab1b8" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a433b735f299cfffffffffffffffffffffffffffffffffffdbb02debbfa7c9f1487f3936a22ca3f6f5d06ea22d7c0dc3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "31f05c0c29e9da49aa2fbbedee770c68d10f85e7f77e72ac3cfa9c8623a2bb42eeb2f24ac8f2aef7ab0c4b4782314003", "5bb32fc1ec04bbff5eab96e070c938ba1b53fe63970f649ae02e2a4ada420a249b6f7c525e2c4b9b0d5562ae26f2278c" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "b9af94ce7fffffffffffffffffffffffffffffffffffffffd6efeefc876c9f23217b443c80637ef939e911219f96c179"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00bc26eec95e26c980bc0334264cbcfc26b897c3571c96ce9ab2a67b49bb0f26a6272fdc27806d7a4c572ae0f78149f1f3", "00c8af5f41b99d2066018165513fb3b55e4255dcd0659647ed55e1e2602cae4efbd6eae1dfe2ff63e2c748d4acc7430139" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a276276276276276276276276276276276276276276276273d7228d4f84b769be0fd57b97e4c1ebcae9a5f635e80e9df"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6fa0964dd054250af176891c0c822b013b70f059c347172cafc6b36cd16cf3b0f9d19f2598bd0d580ac16c46acb167d4", "375bef701c002dcc040fd54824b14cc2df0154eb20e74464e1fe7b833426dd7d636bf2d79603fdde5ddaab23ab0cf426" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "73333333333333333333333333333333333333333333333316e4d9f42d4eca22df403a0c578b86f0a9a93fe89995c7ed"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00baa4e712ee0786a5ab0e5a5dafdcdcf87b38830ab2ec86faedda9fdf65332f6a9688269412f050356530d4664a7fb8cd", "00ecc46a901b016e6bb8a336ad9aa6f19abf9ada69705d1c905beafb95a44f52af43de4bf80c050cf996b7796dfcee8e1b" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffda4233abf824c93f90115e76db206fa7489d6647332e1ba3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0081e78a52ae0695583f7a601ab9b6fbfaf434f2befa1f8c833d59deb627a927c2f42d48eb617fe042f584e105c23c2317", "00cf22d565f5f3b425ef7937df629b6864dac71264b288c1a987210f523071319ce3f64411910ac23765c4266e615112bc" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "3fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294bb"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "41fa8765b19d3108031e28c9a781a385c9c10b2bfd42e6437e5c4bd711cf2a031750847d17a82f9376a30ae182a6d6e7", "1c20af96324147d4155a4d0c867ca8e36eba204fbed2087e0fcbdc8baabe07bb3123f9f7259e771cd9f1ad17d1a23787" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "dfea06865526cea11c0f9eb9512b41fa9581d0f6cb7db9680336151dce79de818cdf33c879da322740416d1e5ae532fa"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86b", "572c1e06dd2c7b94b873f0578fcb2b99d60e246e51245d0804edd44b32f0f000c8f8f88f1d4a65fea51dbbb4ab1e2823" ); + { + // point duplication during verification + auto m = "313233343030"_hex; + bn_t sig_r = "b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60"; + bn_t sig_s = "64adb4d51a93f96bed4665de2d4e1169cc95819ec6e9333edfd5c07ca134ceef7c95957b719ae349fc439eaa49fbbe34"; + auto r = true; // result = valid - flags: ['PointDuplication'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86b", "00a8d3e1f922d3846b478c0fa87034d46629f1db91aedba2f7fb122bb4cd0f0ffe3707076fe2b59a015ae2444c54e1d7dc" ); + { + // duplication bug + auto m = "313233343030"_hex; + bn_t sig_r = "b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60"; + bn_t sig_s = "64adb4d51a93f96bed4665de2d4e1169cc95819ec6e9333edfd5c07ca134ceef7c95957b719ae349fc439eaa49fbbe34"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b4d78cccbced8065c0ebdc330b4670ec99309273e442b9be341196c1043e4441fc57b914085595bfc755c64fc409f0ba", "01fee31cbbbaed5c1323f09c87df9b0712c12e99733fa23ef91b4e6ca666b09dd7540ebf1068a15155bc069e3d595c8c" ); + { + // point with x-coordinate 0 + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6e3c68be53aade81ef89e096d841e2845a23331e7ec8a6a839d58d07fa016c0973ed75de4f99177bfdc74db566e9d15a", "4972ea08e577ce1f61c13a6ca1bad1deef2982ee01a2826f002b769f2c46098d3baff068a405d09ca3840d2fafe4e46e" ); + { + // point with x-coordinate 0 + auto m = "313233343030"_hex; + bn_t sig_r = "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + bn_t sig_s = "0033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b101cdb3eba20e112adbb4bbd2cb479a69e590a44ea902631832abfab8af2c3041b3df7f1665b2c6eb533f546217100a", "1a61aa9951578ad4f00ae17339a8a6f1359bbd0ac355678ed4df21338f08763c1d3702ec132b634c7bcc0118efb1d0dd" ); + { + // comparison with point at infinity + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "33333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6761044a040a4979db269b4a377e42f11b4be0ce24611f677674dcf770f5887ca4db565303283809e6d65f7fc6bc2736", "05c7daa403fca53549f75ff3372909642d02b7fdcac1e68242814d6e925ab01a80836cfbb35581960079e2fb44c0d186" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6922c591502f01046fee5617bf16496f58398822e69afa8335308f36c09a8ed437209fefcffbbdf0a4876b35a3c7ab26", "55854db825b94b3f27e5f892d3bbb6c7240ec922894dd3598e91fcc6134a2b8fd154e1790466906206f0f623416e63a1" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00892dac0e700fc29d1802d9a449a6f56b2172cb1b7d881013cd3b31c0edb052f2d340c8995a4477bcb9225fec15667233", "00cc6c34ae17445444516fd8fd22ee83f79eb0771ebff6677ac5d4e089f87a1c72df957acb24492adcd7c3816b8e0c75b1" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "6666666666666666666666666666666666666666666666664fc15233fb49458c89a4057a8379dc9791f80a2ab84edd61"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01634117e6478ce0568b0a2469237bbac6ff096acb7e514072bf77123cb51ba0cc3e8d69284d534d8e6d1e876cecf222", "31e5ef04dc96762ce7d5ef3348ad1e241ac797ae3b630ea249afc5139af49b8ef68b32f812d6b514210363d498efc28c" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "99999999999999999999999999999999999999999999999977a1fb4df8ede852ce760837c536cae35af40f4014764c12"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "675bdc79d8243887fe1b305d12ac10d2e9c0bde070a6e3394cd5f6adfbceda75498b0e7a794c7212f42be93f61674456", "3e96d1bf6f95cdbefa774911ba06463d8a90a0c9d73c9699b061d779dc52496e8ee9b9ae9c5d4d90e89cd1157d811895" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6aae76701acc1950894a89e068772d8b281eef136f8a8fef5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0fd1aab89f47b565b8160dfcc433b6408adeb1473c036b26b7ddec714fb4d0e7dd756c88469e86e218813ead8e8e7676", "00f1cc955c4139e0071c0079ec1d77164e0569bdf453837e8b33c98535a0e7c9c61ef24762067bb46b6116ea7909a69b23" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "0eb10e5ab95f2f26a40700b1300fb8c3e754d5c453d9384ecce1daa38135a48a0a96c24efc2a76d00bde1d7aeedf7f6a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "34d74ec088bab6c6323968d1f468993812f690d6edca5b97604d718e12b8cdfdd96d42e57d33afe312f0ee3c3d0a13f7", "0086f4922bb2c13bdf7752a3ecb69393e997bd65461c46867ebeef6296b23f2c56df63acfde648f3f5002dbc239ffd1582" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4376c9893e9277296c766a83abbe36b34da7a631f8cbfd32a1888de0dd1455a21a153ea2d61cfa5071fc6be12a658f6b", "290ba1a8ee8c78b5dd58f9ffcacb22955682eea02429c3fa8cdcb649fa4d007c8693e3f8f3c0a5f3c4de7a51beaa9809" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "10878fc4807f6732a23c883e838e38c787f7088f94c1824b84673e8b9eab16de1544ae4bf2c6fe3fe4fb343b7487e2b4", "3036ff439533d22f951dae966584bafb23b217dcad2f8f4e0e6999c0c4d0f076634be805f676fd2a59c27f9fe7c5d95b" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "6666666666666666666666666666666666666666666666664fc15233fb49458c89a4057a8379dc9791f80a2ab84edd61"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "036b253e3b4ac88bb8585a2b32b978766a931e5ad0d0e653a2e34b44d6ddcc0d386e20c4def2d8bb3f8da128c1eac69f", "009c8e3b5ff5dde2205af359b3974d52758d7abae812b8b275e1452c4e59cb62e9b6771d347dbd1dea761c70291cc5e0a6" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "99999999999999999999999999999999999999999999999977a1fb4df8ede852ce760837c536cae35af40f4014764c12"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2783c1be922fce155864ecb41d0a316e193a55843e80192f1fe556772f3debd04b9fc93c27bc6f353938886a40441994", "1a352cec336946424fa3c208ea7105f5549edde8688abd305344bf4f66dda7eabcda6f8557c9af88109804d702e9670b" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6aae76701acc1950894a89e068772d8b281eef136f8a8fef5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00fa92538cdc740368caf16480ff1304cebbbe59a46a7a84603726b9592d105be069df1c61b5974f27e7552f797de97cdb", "620e03a46da862e4b089bafbb80df8f055c8f47991b3a3ddb2b089aedb2f15841a6a5b5e14c1dc36b3c155c4f74d3409" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "0eb10e5ab95f2f26a40700b1300fb8c3e754d5c453d9384ecce1daa38135a48a0a96c24efc2a76d00bde1d7aeedf7f6a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7", "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea5"; + sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7", "00c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea5"; + sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "29bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc", "009a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3" ); + { + // pseudorandom signature + auto m = ""_hex; + bn_t sig_r = "32401249714e9091f05a5e109d5c1216fdc05e98614261aa0dbd9e9cd4415dee29238afbd3b103c1e40ee5c9144aee0f"; + bn_t sig_s = "4326756fb2c4fd726360dd6479b5849478c7a9d054a833a58c1631c33b63c3441336ddf2c7fe0ed129aae6d4ddfeb753"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "4d7367"_hex; + sig_r = "d7143a836608b25599a7f28dec6635494c2992ad1e2bbeecb7ef601a9c01746e710ce0d9c48accb38a79ede5b9638f34"; + sig_s = "80f9e165e8c61035bf8aa7b5533960e46dd0e211c904a064edb6de41f797c0eae4e327612ee3f816f4157272bb4fabc9"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "313233343030"_hex; + sig_r = "234503fcca578121986d96be07fbc8da5d894ed8588c6dbcdbe974b4b813b21c52d20a8928f2e2fdac14705b0705498c"; + sig_s = "cd7b9b766b97b53d1a80fc0b760af16a11bf4a59c7c367c6c7275dfb6e18a88091eed3734bf5cf41b3dc6fecd6d3baaf"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "0000000000000000000000000000000000000000"_hex; + sig_r = "5cad9ae1565f2588f86d821c2cc1b4d0fdf874331326568f5b0e130e4e0c0ec497f8f5f564212bd2a26ecb782cf0a18d"; + sig_s = "bf2e9d0980fbb00696673e7fbb03e1f854b9d7596b759a17bf6e6e67a95ea6c1664f82dc449ae5ea779abd99c78e6840"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aac", "00acbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1" ); + { + // x-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "07648b6660d01ba2520a09d298adf3b1a02c32744bd2877208f5a4162f6c984373139d800a4cdc1ffea15bce4871a0ed"; + bn_t sig_s = "99fd367012cb9e02cde2749455e0d495c52818f3c14f6e6aad105b0925e2a7290ac4a06d9fadf4b15b578556fe332a5f"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "a049dcd96c72e4f36144a51bba30417b451a305dd01c9e30a5e04df94342617dc383f17727708e3277cd7246ca440741"; + sig_s = "3970e264d85b228bf9e9b9c4947c5dd041ea8b5bde30b93aa59fedf2c428d3e2540a54e0530688acccb83ac7b29b79a2"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "441800ea9377c27865be000ad008eb3d7502bdd105824b26d15cf3d06452969a9d0607a915a8fe989215fc4d61af6e05"; + sig_s = "dce29faa5137f75ad77e03918c8ee6747cc7a39b0a69f8b915654cac4cf4bfd9c87cc46ae1631b5c6baebd4fc08ff8fd"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422", "00c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000" ); + { + // y-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "3244768016457c463b74f2097f216d9670b191f76281c74bc6a1a1971d19f209bf4696468f5eb75d6326a0a43c0a6529"; + bn_t sig_s = "501e0ad985ed9f95697bd17fdbe3f9ca92e0f76426d3664e6896648d9c750bf588d0ce7d011c1a1e8d6c2e082422dc93"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "5e1af40f2480e3d97c4ae4bfd34a9f45269241356f3a46becd86a4a7c9716d73ca5aebdb3db1a7765650666683bc856b"; + sig_s = "7e7c4b473a2baaa4953785be8aa2a10006f6d36b400ab981864d69cecec046718d0404b9647454b159aa5a92d76d7955"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "6688e36a26f15bdc1c3f91367f8a7667f7bb3e30a335d6f0900e9534eb88b260cb29344c723fedfbe7ac9c5a33f4bf0d"; + sig_s = "aa35fddf0fdc9017860b378f801cd806f3e2d754cd2fd94eb7bb36a46ce828cef87e9ebbf447068e630b87fee385ad8f"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000", "00e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557" ); + { + // x-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "d4a8f3b0b4d3a5769e3a0bbc644b35f1d509355ed1fe401e170f667b661f693b32598e8c143a817a958982845042bb48"; + bn_t sig_s = "04cc07578bbd1981dbf6e8a97a354c98d41b8b6f6e8a2c2b1763c7c2a29d79e24f8476075c9aed9aec6c64dff50461ae"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "c286d1928e9c79fdd3bebdf22a1dbd37c8105e8ecf41e9e3777fe341b6b8d5a89b9d986827d6d1dbb381cd8239484a22"; + sig_s = "201119ae305b9360aa9b5e5d1567e0674c09e4f025556ebf81b987466b0f421b8d31f72bbe95f3ce2aa9874a84edfd40"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "d9c678550167f10c511e62acb4bd0a3f7f336bc090c94e6c6b02622439c348a2159c5f41f9b5aa4b470590d40dcd7cc2"; + sig_s = "1fd5eaee295abb4081cb626745f4ad279ceb44604062830b58e6c0465c562d41f02ba588fc0db1ebbe339cdc008d7a1b"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69", "00d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98" ); + { + // x-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "20fee7c71b6cb0d1da3641ec6622c055a3b16a1f596c64b34da1b2d0b868b66a8f0a0d0db983b3dc7e53bb7295da8197"; + bn_t sig_s = "8141a931d3579aec1cac9887d2fff9c6f12d47a27e4aab8cf262a9d14a715bca0b2057cbc3f18b6fd3d1df76f7410f16"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "913eecc559b3cf7108a65d6cc3076bfdf36c6f94dcc6693d06690470f34a2e81564241e1de5f5f51421de30af467f10f"; + sig_s = "649bd3717244e8ef3c6b0eda983f84dca5ea86d1bec15386b9c473ec43a8cd0ba558eee819f791d9ff9272b9afd59551"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "23855c46403a97b76cbb316ec3fe7e2c422b818387604bda8c3d91121b4f20179d9107c5f92dedc8b620d7db87fccccd"; + sig_s = "50f57343ab148e50662320c4161e44543c35bc992011ea5b1680b94382cf224ea0ec5da511e102f566cb67201f30a2ee"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336", "208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4" ); + { + // y-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "d200958d491fcebde667cd736c9dba0961c70db2ecaf573c31dd7fa41ecca32b40b5896f9a0ddf272110e3d21e84593a"; + bn_t sig_s = "c2ecf73943b9adce596bac14fce62495ae93825c5ff6f61c247d1d8afcba52082fc96f63a26e55bccfc3779f88cfd799"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "6ac17d71260c79f81a7566124738cb3ee5d0aa690e73a98ae9e766f1336691e500cad51ba1302366c09cc06b8f7049e0"; + sig_s = "32ca965d6d7012ec187c7cab9544334d66c2a7658ddefa67e4ad40429815518ecc87b1492ddd57333bd2300b4660a835"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "e19a4646f0ed8a271fe86ba533f8be4fd81bbf4674716f668efa89a40cac51eec2a6cfbd92327d25efe91ca4ff712bc5"; + sig_s = "4a86b2e8e12378e633dec2691e3b1eed4e932cc48b28e45fa3d464cc0e948c02cc9decf2bb43b25937fcf37e9ad86ef0"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336", "00ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b" ); + { + // y-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "15aac6c0f435cb662d110db5cf686caee53c64fe2d6d600a83ebe505a0e6fc62dc5705160477c47528c8c903fa865b5d"; + bn_t sig_s = "7f94ddc01a603f9bec5d10c9f2c89fb23b3ffab6b2b68d0f04336d499085e32d22bf3ab67a49a74c743f72473172b59f"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "90b95a7d194b73498fba5afc95c1aea9be073162a9edc57c4d12f459f0a1730baf2f87d7d6624aea7b931ec53370fe47"; + sig_s = "cbc1ef470e666010604c609384b872db7fa7b8a5a9f20fdefd656be2fcc75db53948102f7ab203ea1860a6a32af246a1"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "dd4391ce7557cbd005e3d5d727cd264399dcc3c6501e4547505b6d57b40bbf0a7fac794dcc8d4233159dd0aa40d4e0b9"; + sig_s = "a77fa1374fd60aa91600912200fc83c6aa447f8171ecea72ae322df32dccd68951dc5caf6c50380e400e45bf5c0e626b"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } // End of Google's Wycheproof tests ecdsa_secp384r1_sha384_p1363_test + + // Test vectors from Google's Wycheproof RSA signature verification tests. + // Generated from: 'ecdsa_secp384r1_sha3_384_test.json' + // URL: 'https://raw.githubusercontent.com/google/wycheproof/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_secp384r1_sha3_384_test.json' + // Note: + // Test vectors with flag(s) 'BER', 'BerEncodedSignature', 'SignatureSize', 'MissingZero', 'InvalidEncoding' were not included. + // All test(s) with BER/DER decoding related errors were not included because they're not part of this test scope. + // + // Algorithm: ECDSA + // GeneratorVersion: 0.9rc5 + // Header: Test vectors of type EcdsaVerify are meant for the verification of ASN encoded ECDSA signatures. + // Notes: ArithmeticError - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.', 'cves': ['CVE-2017-18146']} + // BerEncodedSignature - {'bugType': 'BER_ENCODING', 'description': 'ECDSA signatures are usually DER encoded. This signature contains valid values for r and s, but it uses alternative BER encoding.', 'effect': 'Accepting alternative BER encodings may be benign in some cases, or be an issue if protocol requires signature malleability.', 'cves': ['CVE-2020-14966', 'CVE-2020-13822', 'CVE-2019-14859', 'CVE-2016-1000342']} + // EdgeCasePublicKey - {'bugType': 'EDGE_CASE', 'description': 'The test vector uses a special case public key. '} + // EdgeCaseShamirMultiplication - {'bugType': 'EDGE_CASE', 'description': "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used."} + // IntegerOverflow - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidEncoding - {'bugType': 'CAN_OF_WORMS', 'description': 'ECDSA signatures are encoded using ASN.1. This test vector contains an incorrectly encoded signature. The test vector itself was generated from a valid signature by modifying its encoding.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449', 'CVE-2021-43572', 'CVE-2022-24884']} + // InvalidTypesInSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains invalid types. Dynamic typed languages sometime coerce such values of different types into integers. If an implementation is careless and has additional bugs, such as not checking integer boundaries then it may be possible that such signatures are accepted.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449']} + // ModifiedInteger - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModifiedSignature - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an invalid signature that was generated from a valid signature by modifying it.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModularInverse - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where computing the modular inverse of s hits an edge case.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['CVE-2019-0865']} + // PointDuplication - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.', 'cves': ['2020-12607', 'CVE-2015-2730']} + // RangeCheck - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // SmallRandS - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['2020-13895']} + // SpecialCaseHash - {'bugType': 'EDGE_CASE', 'description': 'The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits.'} + // ValidSignature - {'bugType': 'BASIC', 'description': 'The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported.'} + { + auto pubkey = curve.make_point( "29bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc", "009a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3" ); + { + // pseudorandom signature + auto m = ""_hex; + bn_t sig_r = "9da5c054a9eddabf4753559edd5a862cdf57adc0c2717a6949a43d80cfccd02b14ec06113ccf08081be43552391cfb16"; + bn_t sig_s = "88bb307e9a04f923c70013db3ca716d21b313dde0cd6849435bf3b192d5266589a00b34e9c4c626b1055e7a38ef10853"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "4d7367"_hex; + sig_r = "22b0ee0e8ce866c48a4400dd8522dd91bd7a13cc8a55f2814123564d039b1d1e3a7df010688dab94878f88a1e34a905e"; + sig_s = "f7668925262da6aad96712f817a9397b79f0fb893aedcd7221f454a60a18abb3b165aae979f29d22cfab18fb61945f87"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "313233343030"_hex; + sig_r = "3db6c4d7d482fdb0a13470845f5ad2438198776c2a5954b233e24230889f3023ff64e4cbc793c4e3e94318b4e65f8cdb"; + sig_s = "03c22aa010ea7247ae7cc6c7d0f6af76f76ef91ce33a028de49979bdc2cc17d7df4c19c0e4c61c49275bc408697e7846"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "0000000000000000000000000000000000000000"_hex; + sig_r = "7a36e2c2ebf9bc0165ff75f5906a4806c2a668cb48477f7f105169c9b5a756abcc06b05b4d5ac42ecfd12cdd0f8fc65e"; + sig_s = "96aff9db7873cd2f6aa85c2693e1129b7896340287762854062df8104162a4572bdcbaf673af28a92314ec597f7acfe3"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa", "4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f" ); + { + // signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "34a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c"; + bn_t sig_s = "c0bb0ee1bffc6c7b74609ec20c460ec47f4d068f33d601870778e5e474860d77834d744db219e6abae9c32912907efd2"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // valid + m = "313233343030"_hex; + sig_r = "34a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending 0's to r + m = "313233343030"_hex; + sig_r = "34a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c0000"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending null value to r + m = "313233343030"_hex; + sig_r = "34a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c0500"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying first byte of r + m = "313233343030"_hex; + sig_r = "36a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying last byte of r + m = "313233343030"_hex; + sig_r = "34a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db4cc"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated r + m = "313233343030"_hex; + sig_r = "34a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db4"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated r + m = "313233343030"_hex; + sig_r = "a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // leading ff in r + m = "313233343030"_hex; + sig_r = "ff34a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replacing r with zero + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending 0's to s + m = "313233343030"_hex; + sig_r = "34a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a10000"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending null value to s + m = "313233343030"_hex; + sig_r = "34a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a10500"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying first byte of s + m = "313233343030"_hex; + sig_r = "34a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c"; + sig_s = "3d44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying last byte of s + m = "313233343030"_hex; + sig_r = "34a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd3921"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated s + m = "313233343030"_hex; + sig_r = "34a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated s + m = "313233343030"_hex; + sig_r = "34a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c"; + sig_s = "44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // leading ff in s + m = "313233343030"_hex; + sig_r = "34a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c"; + sig_s = "ff3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replacing s with zero + m = "313233343030"_hex; + sig_r = "34a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c"; + sig_s = "00"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + n + m = "313233343030"_hex; + sig_r = "0134a42eda6d8a881c6a3369fd89db629c9b61904c86019726b4f0fdd1ba4eeb869ab3182345a88754178a3e92aa12ddbf"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r - n + m = "313233343030"_hex; + sig_r = "ff34a42eda6d8a881c6a3369fd89db629c9b61904c86019727262a62cdd1e08fc7ea7efcbeb447385e3db20bbd10888ad9"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 256 * n + m = "313233343030"_hex; + sig_r = "010034a42eda6d8a881c6a3369fd89db629c9b61904c860196ee50db3243fd459cff5ca6bcb9ad9f5ac616b78ff4a277274c"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by -r + m = "313233343030"_hex; + sig_r = "cb5bd125927577e395cc960276249d63649e6fb379fe68d912724fb039e84258bd66f58f03082026d561dad822b24bb4"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by n - r + m = "313233343030"_hex; + sig_r = "cb5bd125927577e395cc960276249d63649e6fb379fe68d8d9d59d322e1f7038158103414bb8c7a1c24df442ef777527"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by -n - r + m = "313233343030"_hex; + sig_r = "fecb5bd125927577e395cc960276249d63649e6fb379fe68d94b0f022e45b11479654ce7dcba5778abe875c16d55ed2241"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**384 + m = "313233343030"_hex; + sig_r = "0134a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**448 + m = "313233343030"_hex; + sig_r = "01000000000000000034a42eda6d8a881c6a3369fd89db629c9b61904c86019726ed8db04fc617bda742990a70fcf7dfd92a9e2527dd4db44c"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + n + m = "313233343030"_hex; + sig_r = "013f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78874db51f73e84e472ce6a716df47684a2b3c004470826314"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s - n + m = "313233343030"_hex; + sig_r = "ff3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78f8871a1b8b79f2887cb28bb24de619545163cd6ed6f8102e"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 256 * n + m = "313233343030"_hex; + sig_r = "01003f44f11e400393848b9f613df3b9f13b80b2f970cc29fe402337e991b6deffbfeeda4bad473e3bbc2a6951a668e6aca1"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by -s + m = "313233343030"_hex; + sig_r = "c0bb0ee1bffc6c7b74609ec20c460ec47f4d068f33d6018740159862804edf982b33669b69693f30c1b019265c42c65f"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by -n - s + m = "313233343030"_hex; + sig_r = "fec0bb0ee1bffc6c7b74609ec20c460ec47f4d068f33d6018778b24ae08c17b1b8d31958e920b897b5d4c3ffbb8f7d9cec"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**384 + m = "313233343030"_hex; + sig_r = "013f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s - 2**384 + m = "313233343030"_hex; + sig_r = "ff3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**448 + m = "313233343030"_hex; + sig_r = "0100000000000000003f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + sig_s = "3f44f11e400393848b9f613df3b9f13b80b2f970cc29fe78bfea679d7fb12067d4cc99649696c0cf3e4fe6d9a3bd39a1"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=0 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=-1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n - 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=0 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=-1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=0 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=-1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=p + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=0 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=-1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n - 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=0 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=-1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=0 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=-1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=0 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=-1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n - 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=0 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=-1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Edge case for Shamir multiplication + m = "3337333130"_hex; + sig_r = "ac042e13ab83394692019170707bc21dd3d7b8d233d11b651757085bdd5767eabbb85322984f14437335de0cdf565684"; + sig_s = "c1045ed26ae9e8aabf5307db317f60e8c2842f67df81da26633d831ae5e061a5ef850d7d49f085d566d92cfd9f152d46"; + r = true; // result = valid - flags: ['EdgeCaseShamirMultiplication'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131353534393035383139"_hex; + sig_r = "0c0b82be4c36d506063fc963133c14d5014d65c9eb796ee8a8387120119ccc16b57302b6ccb19a846b7762375b3c9718"; + sig_s = "285919259f684f56f89cbaa789ef13e185fd24d09dcd46ce794aedc4e5b4a3820535213abb7c4e605b02200fbeb3227c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32363831393031303832"_hex; + sig_r = "7da99d7e8bb505cc5f12706d5eb7669336a61a726a5b376ff96d678a621f38681bc78592cd06717cb87753daf0d39b77"; + sig_s = "ca91cdb78f21950877b69db1418a3e9b5799b3464f1fa223c7ac8d6fa9f647f2a08109935ad67477c96bbf1a2a127a1d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333336353438363931"_hex; + sig_r = "204d322af7178ac20b39a42723fb1f8329b105993e09dbdcabf3e0eaa0a08d54719e06ba704691295a56be7765b5fd74"; + sig_s = "3b526de3e47e69518d4fbc0833a5785074c3f4eef27b9f0fc48481514931e43235b81e51d2b577b1739964ef25d8faad"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33363235303538313232"_hex; + sig_r = "9d4adb54f52349cc73322ffc946bf44a1a1bb954bd4b58f912be068ce05272a12479bbb0f778a9faf8f9f2e9324bd5e9"; + sig_s = "1eee2f98406c30728da3b2b533c387108cc67fc24abdb6bdab686f207f0a75cc9c3b4d4ea9427d881c47d419ed7a1b95"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323739333237313834"_hex; + sig_r = "ae50b1aaad54efbe007f1da7d50ec00cf1100f904fd8f4940ef48f364031dc1284ab984e018105e6d368bb5a47c25022"; + sig_s = "a803fb0156a10e42d4294a764a1da9c3e0c8320bd1a83544ff46751a777bbce23985669e43ff63fcdbac34d68f42de56"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383836363432313439"_hex; + sig_r = "bc65644acb7dcf72bbf937e781d6de7bca052adcad474e3a2b06795a18db7b89d246a485d696b2b8d07c07d2ba2e2929"; + sig_s = "af811cb9772b4b3f1eed358b722a5b28a21617aea7eb6f9371b68a8d1eb7232def267ba56a6220f66a03c3ed7cd322e1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333737393036313539"_hex; + sig_r = "f6205c154a9cd38a1fc9a18c7bf6350699c95144268ba4ca182a5c8d50b780d468aa9beb8115f8ec489558891ecd6d65"; + sig_s = "863f41412ab418fe037fd688a9f6c509bc5535b2c6b5ad7bf9486fb0e5b02136219aca2cdd9d5d63f9140e6d1d054201"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38303833323436363234"_hex; + sig_r = "aedf7382965359c9abff67f0fad2be6b84d760ac95da1c656989f19938b046371e101e8bab9a0ae9b9ad2bc242a98201"; + sig_s = "9175511515a01096b4d77cc505c60facfceb1841948442448e5c9f24204f817eb20d12479305e82ee5a34bd73ebb04ad"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343832353634393539"_hex; + sig_r = "bcc696d8d3445960e00c9f76f277e5fa3267224d0187ad120f9c074597eeafcb6c7f22f51900351848855b20072afdae"; + sig_s = "935dfc4f7b48ac01116e5cf194fd2feed3cb28e72cba8485f1d94e5d20f5f4147a1ca3d6496bbe915913d21c4f5afbaf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303635303732353033"_hex; + sig_r = "c029e49048921647659a042eb533004ea3487f22a7f2c471c43a5a2326dd03ac24386242c05698194b5c6171f08bb7cc"; + sig_s = "a92ed5f2c736e27711384a131c464f73852a7dd167b27c63020040d8de991a390ad76627d597ccfebed809f2f7f57b26"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343932313138323033"_hex; + sig_r = "0f5e1771ba1957fe8794c23776832ea40ec4fda999186f6c365f4749f07893cb55e972658c2d3b39a7b485193ff1d719"; + sig_s = "3967983d1da9dcf0105ddc383f599539d4b32b1bb8dae1a6fe0afbc9bff1e0952a32f08d161b3979a60bb6e49b6c7d7a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353535333230313336"_hex; + sig_r = "0939874c2f67090a900ad7399df78c6005fc4673e23b155df7471b31debd2174fea94e00180ddc1a86609eda8830b449"; + sig_s = "c9d71934a7222e415a01692c7274e5097d580dfe74175dfc0055feddfb414c1ae857051ce12c0ff25d5372751456622a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333331373032303036"_hex; + sig_r = "c35b9eaa9a03a36ba52b7ab207ff48925a0188d288b1ed25d7de8bc203e8ef912a01891eab8f8e3a7d0a948a26d35ab1"; + sig_s = "cf04105208f10af61240da6073cc39278fdadc0578bf40bbd0b0f601ed791e041a90a09d7c423a83f6cd047d745c4f24"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373531313832333938"_hex; + sig_r = "6c1fffcc270c9bf108289b42514e57e3f29ea0f1b3fbfc10ea283b3e6d2a4438d591fb7274c9ffee15009cd9e340f106"; + sig_s = "de38043b47c7d5ab21d8ec5a35758f1a69ee59ea6df525884a04210172e7421f2a49f5921a4eac40b278f6e7c49474f4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3737303439353436343831"_hex; + sig_r = "ecc637f3d32bc9a1ec20f025af72eb03df49f27901fef6b58d226b6eaa9faa6374f87c2aaaecd69946f3777fb9d4581e"; + sig_s = "48f6a06b296a17d84dd26ffded0c5dccf177e6df9a7710b0406fedfd269b2c220f11c1e02cea42c18ccac768c64ba7eb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34323539303733303333"_hex; + sig_r = "7dcf9ded94532d50e9a2ac971642da0de95a1ca95500621174113c1d554f21bb2d175b5beacdd73443043c6cc8eaf105"; + sig_s = "d4da518de6b8c05c640a3e7a1540482d935c4dfdca7544daf94ac8135804127b93665e1191b66bdb0089c49802c33fb1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343139373133353036"_hex; + sig_r = "8209054bb408eed6ab65f4bb76223d509ea24d02cbbc5273145bcb40189052540e565fbf50474f83db3da054a793c863"; + sig_s = "b8169b12568ffa03c0e37d4a19911e9f4af7cd256343a36e41cd7b41395524235e86d55c647f288fe5cef2b5401e4413"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3231393238333534363838"_hex; + sig_r = "9fe969770d630bb938ca2282536f71f3dc461071186216d940eca10fc53c4e7ef067bca237bd6a82eafef0fb8d38050e"; + sig_s = "b23a042178fdea5da86229c08a51227f23e31b1e2345defa12ed7041bec31f87837ba4764721823ea9f1e652d536c5ed"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363235393934383739"_hex; + sig_r = "459be510bca760f75aca10e41efb7ff64b78fb9711e72f224373b9af14f2c042b68b15bb189b3d7ccaed9318936543c9"; + sig_s = "579c07e99fc9891498ef3109360017052cb20bafb290ca2ffa64a72cf01e38e12770ba0ad5e190d2ef10c2d294e099a2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393538343937303836"_hex; + sig_r = "2bc3bb18191a5bfe6d13c735104d78dd947854cf1d93017695119c8f04ebb44d7a7fffe71d15b78e0c2c28765bbdfc38"; + sig_s = "a9051dd102b20e3c69a01a36b85a1ccea670da784038989145e3cd9108b064d6d54f7df21164adb91b3850cd005ff68d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32353939333434393638"_hex; + sig_r = "fe2c0567483ecbc6086a24160200a9ce91e6cf52df6d25b2ab08fedcc4ca95cbb6be68b58870c10169264f3b3e8d552e"; + sig_s = "34b7ef7c580506d29b1ef8223e2131602dad9fbcbce6f846de42519faecfa612a82e999cbfed45f377b77ae5ef0b4835"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36323332343733393531"_hex; + sig_r = "09296917f12fb3bbe2c69c9bbbccf8a400d7e0b31c453ff7e928a7e4347a185435490790f56a5a819271192d64d612da"; + sig_s = "163860e1f6390c0ada261d2d0346b49f18ec3b17e0389e4c3b2296382bc23d6576bb968120cfd24ce735a14d3167f203"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3737363033313033323137"_hex; + sig_r = "9bf980d1d91fa0daf73e3bcc02c7773503f291b3378c96700ecd71aed81fb8ff47d4baa8b6782842f227a9314f343e44"; + sig_s = "4342d335dd870f4a1b817b519ab184710c2c79b6329ae3f87b735e48874b6e47950db7c8f0fba59a349112bd2b3d9eba"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38393534383338363735"_hex; + sig_r = "3f9b09855b47d180d60fe6ac427458a452ad72678d13818d1a28a376b31fd7d1c67e70ec234c40fab7d17719f7caa27c"; + sig_s = "dc1d5765bc5c266a39e1a94085983ccc63cb41556e3733330c98934c329eb7e724e12cadd082da23952b831bcc197f18"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343533383530303035"_hex; + sig_r = "8c6910c012fb1a5b45032b09f2cfdbc7c3b22b0e18a0cc0ec4adc296cbfca66832379456b867ad1a0184ab1a80af59ee"; + sig_s = "3d87fec6feb833d01e4f77a306441fd27f328d01f6c20eef9b185ad4723c46f5d15e7be0db1c496018b4fa1987ac6b78"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32363934383137303236"_hex; + sig_r = "8cb0ad263557318156ffde6b45cb6ca8633c3b50b51454605dd01242dda44c9cc5b59b327e919629a9f73720e53a5e63"; + sig_s = "4f2a0cd11c7ac03425e25d84bb44149117903cc4638e2f64450e2a915b14c6d9c74f70c4f85d6036bc604a92f9b97166"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343331323036323937"_hex; + sig_r = "17d2c9d32253234b36a02e59f99163913a7c11a723f7122c521dba2cdec36bdcd1837c8b60a916aa64ed32b2c400d23a"; + sig_s = "821fb503cb89385bf9a6288ce6559cb69652e8bf940ccd0fa88aae2e72d31ac7d7cf51433ee45889094f51a4cc17272d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323031313936373336"_hex; + sig_r = "b2e6fbb2a70af41654fb5d632fcbf9dc8a8a362394e42d13e086e7da261aa980b49c4a610a367973f798b9aa9df6d0d1"; + sig_s = "6d237b3161ec602529eecb5c7c706020f82b8040ccf7082576e3caef5e8d6cd87c46a8f3ea9947b18d1a35c83494d849"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383330303038353932"_hex; + sig_r = "a6927125459e31afc31810117677c6ec2ba27c3ee5cc5fafbbd74153d3d2b2f7c7411e564c09d582dd2d5a201ec2b0fa"; + sig_s = "6e14a3955d24c4ac4f8c035f5edaf74e45ebd95a27954bb1c11fdb00fbc7156e96318d33725c0666006ae0573f7df785"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383834323632353236"_hex; + sig_r = "d0f8e8a570a0462ea8ccb980789acbf243cbe946522ae4e9e6fa7e5e8e1bc006c8b84915355f00f39a61dbe77d2b4b9a"; + sig_s = "0f1ed97929bd7cd633f835086d2241a7b7d8f857b94f71e30b3e9bd19863a401834d01d29d32399006e8f84e0852e3d3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132333434393638393037"_hex; + sig_r = "19e5a38c81ae167c70ef4a1879b7dba0dfaf5dc8a841269e82b106c6ea3f9e3f7e162b8c561d8f1b7b4a2cfba4c8a925"; + sig_s = "08c41e654d262ea6e1d2f74cd99ef479cb36476b2dac5bf0f250d87f7115bdcb59ddda54abf3b3b77471348facc0c8de"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353439323433353935"_hex; + sig_r = "e47a0dd0507717c29d0e482037d7fd001eff3b80013688085ae430d46edb23cab8df8716d078c6503e38a1cf6a9e74f2"; + sig_s = "edaf65e609db0925dff88d252791db4a008d9b46e5e6da98e23a766a8a35b8df79ec189d272429dd64ca60983462daef"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303832383235333337"_hex; + sig_r = "35d47a723521553ea0440e6dea660439c51b80e896877b03b0c02ffabcecd86e6cfed2e4fcd80d76c97ef945b626b025"; + sig_s = "dd61311a4d0eb024288fae55abef6f0fdaf71a55cd3ccb2f8ba8d43ef36dd5562c07d2b4ef60e04ec4c696fcd052185e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38303337353732353536"_hex; + sig_r = "5319f4a01c4e88261146de213d65e55c2532d9a535bc8c47cd940fd2b7b5bb363e1932bdacc9a196cde39368d86a14f5"; + sig_s = "8afea330d833a1f3310aafef6bc27b684838ef3e57ac7e36c02e0dbf9e33b934dc7afa7418aabc3e6b0841eff09bc470"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373734343739383034"_hex; + sig_r = "5c51106927cb275b54a7c90f6ba69902f1b1a19e2ac4b76b8d1e41b86f14ff32bbc66f07d4be610ccde84af4e1401181"; + sig_s = "551d9901408a4d9a1a85fa17de0c7bc49b15bccfae095247fc256a048582610b6ba87bd89dc98859dba2df76d77aff2e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3133333732303536333833"_hex; + sig_r = "e931ac049c0b7bd9060a58b0f78d8d0b60f57caf647fe6476802c9baae7e06062fe3d1a1f0c6345dc7c530db32cad843"; + sig_s = "b83867f656b9fea099ca0678bd62f2013238bbd6969a2384e0cb2488dad615a4d91dbdf7908426c9ea9ecf17b872a25e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35313832373036353336"_hex; + sig_r = "d4ccc6e89e85ffcca4b9e32fd45c5be1585d20c35ec83253f3080b0705746f0f5e7e92043b5ae8fd95963e45b4199213"; + sig_s = "48448f45ad0fc8d20fd1dbd088bdf6d51577f79a1e5e55432ea79d84eefe0b9b55ba145d637be5a686477fe00e1fb481"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34303337363939303936"_hex; + sig_r = "6d3ea919365f9f39fe1f9b8c17415766f4c2b77c8393dc8cef321af5b4aa955646643ac32b2220b7590deadec15b88af"; + sig_s = "4d64a4fb9e26aaeec0d92270becbb5e2f04d812b2bb8b86cb1744437e62e58dc72f98ecafeadae69aef3328953143490"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131343230303039363832"_hex; + sig_r = "7774080a80e32087c8e923c65522c76648205d9804805bdf05977c4559eeacc518560920e55f626748ae12034745f7bc"; + sig_s = "1bfbb5bcaff2b70298456fd8145bbcc6d150d9f2c3d91d6ed0f3d7eacc16456f698138ab34a546195941a68d7e92f3be"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323037353534303132"_hex; + sig_r = "b8232417c371ecc56ef6342abecfa42afe479ad1cfcb18f8945ab0e2076621c185c2821a8028c36f1f2a8d3be7fc3442"; + sig_s = "17a0f7c15403a3fba3d8f095cd7eea597df761dc46e5c8122a3fffabb9fe37c52232e7f49af7e7cbaad8ed62dee8a371"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383536323335373531"_hex; + sig_r = "9a5e7ac2a195f5859a0753087da0a2ac20a8bacc551d4c19b10fffe6b7acdd3ca6543957c9f7be8bedd33e89df7ba594"; + sig_s = "106cb9821f8aadaf7a7c411df6ca3bde9b6d4a267e4a43ffa9d5d29cc973f3ca4d776351b82586be7d6e2c251726b3ec"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32363736343535323539"_hex; + sig_r = "1cdc96cc7892322075399aac7e0a86d4ffdb6e45153c0afa98bfd912941c22d05f360fba6f8734542eb55375b26d38aa"; + sig_s = "8ec452f8acbbef3ebbff11e6bf349032b610e87946a6221cccb5055c18d1f1188b6254a60113ed8adc6d0b09fb2f3fd4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313832323433303137"_hex; + sig_r = "937d4df90d09299bd32bf354e1121a311a77ba0274e7b847804a40d5b72ecb8e9e441afc5289e0337ca1195a4951c1e9"; + sig_s = "7e442371b9991905f417e4e67ead31621bc068964097a46d5bda507a804f5b3bb142ff66d07012549fc42cec38754d11"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353232393434373333"_hex; + sig_r = "65210ed179af3b99c09b9e95dc81f77007a32002ee7d53eed567086a68a62f1c08543c85f7d1e1f081bae477ff3613fa"; + sig_s = "025ce6efa2fe24732fe11f5b1f1232d48fa5dbcfbd62f96776302b1ac52f0d0d40549f2b2f67299569cd14fb7ead4c45"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343535383431313936"_hex; + sig_r = "e6a4518771467967e264a9b736aa1f8bc6f421de607fec7e93fc62d91082c979930e6a3ffdcc54d5f0f4b4a2f0665d49"; + sig_s = "4c6c625b60ab3230e6d190f37a6f14e574f8dc7595467fe89ce62d6d1f2fd198368769fc84b556a3847be26841351408"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132393134353430363938"_hex; + sig_r = "6388afc6cae9421ba6c52a640a0ebcb9c547505f500307194c8c1eb41cac959686ffa7b3a2adda65136030cba17d1695"; + sig_s = "cb1e148645580dea5a87c60db7c818942d55f169fc59eda9a2177a001ecc1bcbf2d519d67d79fba44daa2945bd380c52"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323730323132343635"_hex; + sig_r = "2d7f29f767ba2f21619347bf29494a318eee949e91181ed7d2cf61162b92f0747c308885891b1734e9b6d5d3705475a9"; + sig_s = "1c34c2ce61e3dca2bb3202b6c4320155f764fc58d318ba44df9a7c06a0a453ee43b633353dbcfe129a54ddc8b6a27e13"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35313732353737303635"_hex; + sig_r = "68a8758fb66c0ee50309490852f214f6bd09dd888f35390163defa70647202983ebabff3791287d016164c945494edf9"; + sig_s = "099a2c1073815916cebd4a41448e1b8dc9bb150465adf99c8a965b5fb327bb879e1b34f8d7c509aa1b018f98c9e13e40"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333835393530373037"_hex; + sig_r = "7ff134c055bda5bba91fa53da5ff90c501a6264abd8db5ced03e9eb88ee63325f267a8fe483b0f7f129434d2e2114705"; + sig_s = "11649294f067d415681ca6cf6245b0beadcb4095b8e9c9d18bf11ebae41ecafde7529796286ec2efa9073de2f9025e3d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3634333837383033373037"_hex; + sig_r = "9dfc836f6a993e1aeba9fe4b4e09901b83a5439a0ede150ab583c217fc22154050eb9c4a2f1f0f75c06139549d3013ee"; + sig_s = "ed83ee554777a5086ac90b9654f724507a54e5651b4d38153ac7576cf8dc9487be7d3efca544ff4b4804981efbda10d7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34383637313133303632"_hex; + sig_r = "fd614924d6325daf270efbff4db11d645ec9b1f903fd36e1543bbd536ee010d07dd154fdc945a57f52f239439279f42f"; + sig_s = "079edf2f7ab361f7542bfd9175dd41ec137bc00d997943720e164e7187585a487a1893cde536b1dc52cdc0baa1fc2183"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3133343239363139303533"_hex; + sig_r = "eb55101d2d489c0151d991b0e486016222997b917363f8c48386683091297819662ccc34381d5e5ec1c0c43d137232e0"; + sig_s = "d8bd992c2e0ab4fe46a4b43dc3b5103c123ca38e88e3c555385a6fc8ece7d9c957776667f389a950bca4b2ad6503c48b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35303634343932363338"_hex; + sig_r = "f29aea476f19eacc44749f6057d39c6da903ba5c5b5667694145a6fe053ee08abed1d6869d3830036a29b063b295e67f"; + sig_s = "2decfc3e7d8cf0391f8e21714eeef04fa4f660a404294bcab6cdf23e4fa9e44997694781c49f4539a8d5b0dfa55603f1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3232373339393133"_hex; + sig_r = "4b55c6c5f0264ddd31b88a92072d3a8f33b28306716d5430c0ff8fbc37d9ddf1e4a60e4e496b355f77ed005b51e352be"; + sig_s = "54d6da5a6385fa10e97c21b5bdb732a9a9c0685883da74f1f8dea0ae497b7609b3aa4ee92f448144ea2c5529ec2fc016"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333932353736393433"_hex; + sig_r = "6024ed7ee8ef3edc593a9d07856b9aa78972ff33b82608c93e7068bcac05e0c5048889c8d520351047fa80f050abf83a"; + sig_s = "0d221dba3ef2d3c14923a651bd2b803603fbc94634033d52a66d80ea6120976c8fadc7274d05ccd47e1d06a63310b6c6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343435323032373632"_hex; + sig_r = "fab3f2cf338bd7bf46dada597a4f66cbeb336393e4a289e21f8a02a6428bcd5fe66e87bdd3b5072997f94b76f04d9aa6"; + sig_s = "ad0c0f1d9c4f8a4b5100e183dee6d5d6825296784cb8205d448204237f5d3435f4c8f0a4fef81890c5a5a028405330da"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37353934393639363532"_hex; + sig_r = "15cd4339b568212b20856d8397e5c5aebf3b4e4eafd8c90adc2dfe93f928e8a8bf17ec307064ba866491d4b44440d116"; + sig_s = "ba9357237d9d6b22be6761f63d91a265d1dc08cc693ae14576200d6aa7322eca439eea414634f5666c22ab29c67fbcdb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303134363536343631"_hex; + sig_r = "9d2deb753b8e16e6f24e1b718000daa0d4617242225f1b91192b1ea8acdca607b05f1c0da8e3cdbdc52f448a376f13b1"; + sig_s = "8654d2738725423c0934c20b28327f7a5ac53a61f296a5ce562c8684d2f3090d19811fe70dbce71f106c4060740981ec"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39373034363738313139"_hex; + sig_r = "1c7c8d1c493bdb1f1290f04aed3c4a7cb0a83c36330a4fab50e68f235777579dd06a073a3857f226dae511a2569e928d"; + sig_s = "14e5058d70b7cfb04cfb0c3c1d3d6fe500328340860e4b7cc2b5f11cab09cba0c7b887274453ab30d9164c73fc1f6f36"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343131303338333134"_hex; + sig_r = "cade486e6a8e78141b15dbe60095e42d8196fafd843c722c8c686a60063e701f30d8a488c2a18a63635a13bc8ff0a787"; + sig_s = "ed7aa0208952d2d452432ffa1bbf7146080911cf7e87aa848ee90314b2afe427a80cd70187b3ac3572a360d4db6b17e5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353437383438353336"_hex; + sig_r = "2787240e7fd6d895098d1773733727ee5792fe644b0774b8530ddd758b347143d1939bb7c9a3312774cf7126e499f5ab"; + sig_s = "ad215cb6681f287ffb96a6e7c41331a2e773e68791391c658f2e5c95cf82e3871e49c9fff08f7b540848c1a7cee2ab85"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333738363732383631"_hex; + sig_r = "aa92d0b7d6046210024b962fd79d1a27ee69c25936e5895cd92224b3f560829c11de20e7f52320bba91b87c4c7ef4962"; + sig_s = "816c95ee54c677c4be1ba70317a90aaf1c1d2f233fd480d22cab453d9539657ce695e21952e6157ce3460680dc2fdbf2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313636353734353639"_hex; + sig_r = "4eda9fc1e0df8ef24f3148f8a737a76eceddfa6057441c877816ac402349f32571c8074611179968e6fe7cfc1f41a80b"; + sig_s = "e0549e78e774377dffb9e742f05f5b1a1a2198571d0f2243fd25703029e0effac2808fad1c82efbdf0063d6032df33dc"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363431343037363435"_hex; + sig_r = "18a83b96dbd10de3a62fdab7142f201f9f480447bf000f6ee314da64d2351bbc7bb94cd1c551dee4828a603e6a853fca"; + sig_s = "8fbf2a1a7ad4ed76a08748f41f5b3468a9a7cda57503aa71c455292bde2dc88a2580a65a6859d20f924aa7a5cea3743d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303833363036303631"_hex; + sig_r = "2fb5726226521d1105cdd22e84ff46a36768ee4d71e6f5cfe720ddbd36ad645c05a7207c9f7cae2d8236d965ff64f943"; + sig_s = "ac3f8b7841b31c95f27e99a86413b6aa9086fcdbd176f7de65a696d76edcb0775f2e257db75fa5aa716946f3d80b1cea"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383235303436303231"_hex; + sig_r = "2a38f4cc1da426f15d8c8dbed58608eec86862554f4d6d503dc6e162e72754b1298ad4508ae2a93d493c836b19548c4c"; + sig_s = "9b51610514136d5dcfda3c4736a839288bc1f043ea362cf6e56dce3f4337204d5bdf92160a034f459b30410872dbeb0d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313432323938323834"_hex; + sig_r = "3407844641a75ba72ed05f9b7289ea2c8f9015c97e8d7aacec4a88b374a255371b19e7a2e7949f4b78b63334b4984434"; + sig_s = "cee117c6fb8f8e47ce33357d7ed1a82b1ed912be3778eda9de303b2ee910c014eee3cf03e27f16fd94d7ed5a8e8c7b05"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313636343232303939"_hex; + sig_r = "b98e1313e62ff0155158059e422cb6e8ce70d103f1a95a77e1795ef2ae38a42596732405602299ee730b81e948083adf"; + sig_s = "8a34134e86354d26f343343c05cdb46350b610ad16883f234e847fad97047ee4b8dfecd0bf77479b65643f9c35b74441"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343830313930313632"_hex; + sig_r = "0ae0a9cbd0de42e6590835374548708df9671208ab72e23bf7aa4329bbd0d4a696e99d04d36534e895737b468cff08ea"; + sig_s = "8c8b6bb101ee844bc75cd2b3b32ea9c3b6c2ac5408c26f6a444335d730af2dce6f4bf1bf4585428e902f901eed10da62"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35323138393734303738"_hex; + sig_r = "cf0310487690de93d344bba957a1ba380f72c2ae44975f69716b2aa2a866787dfc46629825ef19e5528395d872ff9367"; + sig_s = "ff60a995865b6f5e6ffc15884e5901d55f384ffc62982e54a9c2dccaf7543246673c5bfe710f2a29daca77de766ee9ee"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130343538383435393733"_hex; + sig_r = "4a0f3d91ef6b9b6e512cd9c996f8e896717ea8c6d685834e4c31bcaf592a93d0f0b169efeb0ea52a5bea6be361d7a7b3"; + sig_s = "c3d429d0daf1ee7c2bf4a0bc8f10cd7ce453b8e2a762b31885d36f5e03cdae3adb693bc2efe8a64d6e7bbc17f23b5500"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343839323235333334"_hex; + sig_r = "40f82935328e34e31f1966bd0bc1dfc2adf1d71d86fc6dd0f9e9e1930dfc357e30fa67722c562dd84cdb73fb715b622d"; + sig_s = "cf40658591f34527587b0969a45ca5a30f87dbcf0b058f75c158ac883d52119030881c0aeb1f8e12682d06d072705550"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35303433393832313335"_hex; + sig_r = "a3434df3d065f4b32957077f429bccdaa8875981006ce880585c160fca1f552dc6334583d7698226e650e95d86a896b7"; + sig_s = "54e2eb28c70796e3bea9f2fdc3799f7d6dde5b3cc84de7448296d65fd8a44260b0666cefa416adda5046f45a5b8a9ae7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132393833353030363939"_hex; + sig_r = "b54b004489e12ec91e875f3062dff1f1bd0407e216162b4913a34f19943c8f967c1f7250ff0ce5f43a0b250bb9fae16b"; + sig_s = "95c13a702ca6269ed8cac69291e01767c0f862648b0961238ef0b6be88cd316973a290bae4f50147816a49ab014a7d69"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131333236373331343032"_hex; + sig_r = "ea28a6b9158328d0711bfd10019643648e695c1fa9df2a7c2e1a6d3b03b6703bc763f8f0c701d7b925d35075da783f38"; + sig_s = "b4bb6b034288af213ecabdcc2d55610181ba77b26673b1490e7e08a43f6e57fe20618a5adc7fbfcbe255fa79655aaeb1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33353733323839303232"_hex; + sig_r = "d973f5fa26a7069dac82790097db0d93dfc52a490ac2a84960c6dc52c2e84d2df1917c8d194789fe8981be40fbefb006"; + sig_s = "1dc1ab55752add3952ee3f5d86bb167ed1fdf20e19d5c893c1a6031c1a2b70701ba03cf7d78b89331d524c5dcf38462a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131373339353634333738"_hex; + sig_r = "3d4ed5e71127a0da4aa63cc1d7ce517a450370dff65ef95b4185a44199181ec5ff70f80f6d7435e6bec4d6e58e73591b"; + sig_s = "27b2d65bf08ab8e745544225181638af5df08b85c9f7a9057e1605f145b3a1389661d9c990d0f4d82636dc6332b6941d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3733383230373935303035"_hex; + sig_r = "e36ffc2ca7e62c2fe35c7761a78ae2839d1503b437cc7a89eee28ec74d75d2948c7a3148070ad715f7ce8260c160611d"; + sig_s = "0c18edef913d63ac220cd4b28aef1cd43aa9acf7b0fe889c4a28ac22934e46aa2a99a5b803a61471bd5bfeef8c86b17b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34353233333738383430"_hex; + sig_r = "148906bcfc686aa3f608321d17a425373bd9ce2f47a35a6a01124992cba56e744daef2b00dececff63ed96d5d7c2e158"; + sig_s = "4303a5c7049766956679f204e655301dc16fe9cd85f6ebb1997410e0d2029240181c946d86800cc6ba882f276603db29"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39303239363535323738"_hex; + sig_r = "5264c26ceb0481b74472f26ecca4459785a2d63c9494d8744e42e9eea5799bfb0fa95ff3c8a5de2868098a025110bbe9"; + sig_s = "e1858d96c814dbd39ca5dbde824be0894b4e418fe51306784a8fd0680850a5b32958714ae9124e9ad6372412212df1be"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363030353238363330"_hex; + sig_r = "273e229dddfaa7ba5763c8563f3a05c7d2d2471331225e8f26a20e0ae656115c62ddfac3895f10012253ba7bb79a65ca"; + sig_s = "89a6ab6fd5bca31659278ac3f3e79ded9a47a6fd166fc746b79fc3bd9d21e5f332bb1e89a14efcd3647f94aff9715aba"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333639343536343136"_hex; + sig_r = "f447dcc8ce6573a2da5fd58a3974f46a8d76608e477742b68c2e93245f359567a953cd18dc1d95fa7e3c5d02210cfc0e"; + sig_s = "b273a9ce5a021a66f6a44f2ae94f2f5fab6e3b5016648c9df38756a5b7e71d07aa453240d39bef0d22afab1e19095694"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130303139393230373030"_hex; + sig_r = "9378874a38f221b27d8b7ab06d827130d0db2e9c43f443e9cdd254ef77a4f7aae589a6c1499970dd5acf516802688aa6"; + sig_s = "f94a6319379598119bddf9f787e74b135ad193b692e44a848ac6d1d0443d49adcdcf1a9f530686e76080840e1b647be2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373032333133323830"_hex; + sig_r = "a48cc74a1d39a0b8cfcd12768277535389790c9ad2638aca42401a44e80ff0ceb40e193cd9e27e39443a1d2665de485c"; + sig_s = "1569ca82e563df78feb1d704953b8c35b7eda09259fc16ab262304d0c09383f550cfdc97ce549874212e3fc7b83f6d4b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31383038393439383431"_hex; + sig_r = "e6049a43aa5761ad4193a739da84c734f39f2f79f8d97241982082185fe9cef7747b68c59ef3909f18af6c5df48ee559"; + sig_s = "bb7800436791bae910fbfc6b69c0b7e6972dea1bd5ad82aaf97ebb85d920a15f9f5f280fd813281f36b2ae3c53fd6e41"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373438323839333135"_hex; + sig_r = "148d734104a52c9d58ca1ad7ba56fd35147e8d324a0923ebc9c5d8b393f492bce1da6c9d1fa68d4faeebf0868e03f171"; + sig_s = "4629809043f228f0f3adfc0696c2e9d800791ee82034c5fac37fc521e40f9bf2250c53036b8286e032959ed5f3a58483"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363232313031303338"_hex; + sig_r = "16762ba4645c905590e6a3dd4b1e2af693cc4e64153812f93b80ed4d1c07e664e5b22880f24a120d4b48e1400fcd3afb"; + sig_s = "d481c2f9b255bba2ac29fe055536c3c7fa92e4f34cfdc5b5f5227f582736c87c1350bcb760069c4004ac33fbe2ed3549"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132313833363339"_hex; + sig_r = "830c8c92465fc7f1a654d22eaeadf62b5fa29bebc8e184ca104913eb8bea234d287961900f308d88f9bb7387c8de58b2"; + sig_s = "960eb635db967cd69f80123e0a43501c6161cbd9e8058f5bb7506cc24fba3a3694688b5b0e066bf2ccaecbb5a9eb0c9d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393535323437333036"_hex; + sig_r = "1377906f42629010e79bc60142234a44c78e8887f6dc4086bdc7e9bf94c92c84aaf48efb0269205b8bd6e324224df178"; + sig_s = "6f430a1937fc0463143c80a0e132074a64acc825c2f4ed8b0de03204a681bf171e9e002a88431fd388c7a906511171a4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393531393636303731"_hex; + sig_r = "d1d335dca83a7ef4770e68ff82d2bb75341abf72a362c88d8a176020db37bfd5874e14c0cb011cb316bc6e6d1322a893"; + sig_s = "c61fc7dd9f66b8cf2f8c9a780089fe31a20608b458ea12a246a1cba34566c2d833a71bbe09482ad3c26bf9bb6088fd5a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383830303734303635"_hex; + sig_r = "536183374fa37f210723fe3aabde18997be247be006e20c5d17d8e4c79790ddfe4e6f17f8823d36aceeea22c9e44ba9d"; + sig_s = "b6a0f63b27876d1686b9e601c273c20530c765e506605cea39d9accba9a7007bb10d64333e5e22125f34d1dfc8e60461"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3136373937333631323130"_hex; + sig_r = "2fa6073fd290a699ff0a4bd425a69d4e151a3ec3faa65c504d5e41b45c2a738d343a99865690bcc22c03230c3949ce3f"; + sig_s = "3989dd2d632007c498ed830d277cc1193590f23fe5e778deeffdbb2c135258327b121a81313a0bcc9f77db206afddd8f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323235353833343239"_hex; + sig_r = "cf60fb9789b449ac9b9f022dc83481777675e55f09b4cba5d8349c0e16907f8929e3b538cce4d71c01b010a633807997"; + sig_s = "67654a0bebf3a63fa93cf9906c846cf5edbb03968c86eef5e7555a14d606009006f9f9e4569be3375a9a8aa04aa20c45"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3236393238343433343334"_hex; + sig_r = "6ab23c76784d003ec508233f7f5e6461d6806c66af62c4769d45ec8751d276bdb68b2efc4fcf83f675a3101941f9adec"; + sig_s = "6f306bd6f782aba3c7d0c0d6c0e0e8897f967f0de2a84db1d67e477378ea425dcc6fc6113e5a5f67ac34eca2c69d0bdf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36323734383032323238"_hex; + sig_r = "526365e36472883664eb011bdf9a1503397f0e3509066665f9c276e367cf2730774d4525125cadccfef0c0cf28949a2b"; + sig_s = "948cbaf1c0e7f0ccca5f5d2a7e4a94f4a7ec43d2cf69ae5ebecb41521daa9e618615208cb62b35809fc40401670ae3b5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31313439323431363433"_hex; + sig_r = "b1cf39b023502a1aa3daca372c295c1eb3c5fee2a841ef2cfd4087ffdd4e35e8804b8d879a939216d24fae1bd1e7f19a"; + sig_s = "8b8bea55a9625efb9733d1dcfad8d426b81c9e71fb53b246ae54c3196972d284172e6b1911bafe6b631e5e48344c4409"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d7dea8ac1e4b9aea2d3d1ad7d6a877e116a8bcdb87c8463c69ad78f8074f33b2c179ac0580af901d21851cf15b3a5e34", "2a088198c090b9e367695a1c7fa110b66828d8f07bafe6eb2521dd20e517cebd295cc9cce52e0c0081b4cf7fe5ea884e" ); + { + // k*G has a large x-coordinate + auto m = "313233343030"_hex; + bn_t sig_r = "389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68b"; + bn_t sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r too large + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00cba0cc097c795cd467d835977764b7740fa480c3cad83a726d68bbfe8dbb752934eb4fb6c767dc09bdda6d0d2d057ae8", "00e277c7ad56d6f21099d998e7bfded8c8d2d100c8ebd9f57681a633b91ad0890c020e724689c6b1b4b8f35b49679a4fa3" ); + { + // r,s are large + auto m = "313233343030"_hex; + bn_t sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + bn_t sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ffc271e311cefc1c133202448e2ee74457bb68951b0e575747cc6ee9c0691720bcf9eba23c18f96e845cda05e06d4f7b", "00dc7c5d17e91f12abf3638fc8e87866f0373f0ffa90c2c759712d3fb163730a184e4707ef424ef833079c0ed5e1498344" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "d1aee55fdc2a716ba2fabcb57020b72e539bf05c7902f98e105bf83d4cc10c2a159a3cf7e01d749d2205f4da6bd8fcf1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "74ae987af3a0ebd9f9a4f57be2d7d1c079c9ec7928a1da8c38ff0c2b9bd9822fa7603decc1becabd3f6ceebb353cb798", "00e0c9ac6f4f575fa1ed2daf36224d09aa569f8b1d25b62fbaeddf766a34b9309000cce2447017a5cd8a3ce76dd5428ff1" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "b6b681dc484f4f020fd3f7e626d88edc6ded1b382ef3e143d60887b51394260832d4d8f2ef70458f9fa90e38c2e19e4f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00dc23280ae627109b86d60be0e70cec0582a5b318fa8254dfcb97045eefdf1aa272937de99c6b3972c4cd108b4fc681cc", "0ec5438a5d44908c479da428e5b2e4f5ae93bf82b427d8dca996e23d930700082828112faac7f710928daa670b7576cb" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009bdf0a7793d0375a896a7f3084d3c45f8dfcd7f73d045484e71128713cab49b4c218af17e048fa6dbe32f2e289ee8395", "0be28a090c2f6769f85e5ff1cfb300bd0ae907b5d5367ede98dfd3e6a81c4b4903289973285a4ef91b790ad12761321c" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "02"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0090770515f27351111e56d3bf14fe392d42186cb870374a8d40870830057bf52da8c2e27691236a0de2876893f9b77ab2", "00fb1cb5dcfd30e3a2a0056a5dbbc1c5d626ba669cbbfe8bdb121de7cc394a61721d5c3c73a3f5dea9388cad7fbca72649" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "03"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e06c663d7324540cfd76aaeeef4fdac904264e30ee9f5c202f7c499d29ab05e895b8b41952df7f80bfc9e7474df9b2ac", "00ae09d908c09ea6333266a15ad74c4e4d051d9aa3f5c93b3027a072ddd20b02f9b25f0a527cd6773e323ac0e04162486b" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "03"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009f31fd6cf46f8db0b46c735ae3b4ece85e4112dddcbdd42981783efaeac6217d4d841189b05ad6e45e4d15a15d4f1651", "687e6da1b56d02d66e4b927f7a1ee00bc578d1799a78764ffe7cbbd611fe233b161f84abd13b346867a0248da4572be5" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "03"; + bn_t sig_s = "03"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "55cf46544ba3665a483875bebe791fb844bc60be3828144f403d3a5f879ff5df907f7f5618927e6dc5fda4d73520323e", "2fe8aa11b033cac53dc3527759d8967e724725f7dbc8b35712ea8ee27366baecbd2c7c81344d889faef99f9d83236f84" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "03"; + bn_t sig_s = "04"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r is larger than n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52976"; + sig_s = "04"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00fde3383d470bee8a6ceab51498e5fd6111576578244188bc01116ca9b1c63c0e74eaab57eb29a293c17ab6d7ab90c6ec", "00bed0a26455351c1672925ca931d8a386df8da101f598487f37e48841fc53d12585d3e1b8458b1fa31e6b4527a339cd51" ); + { + // s is larger than n + auto m = "313233343030"_hex; + bn_t sig_r = "03"; + bn_t sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accd7fffa"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "24f0d59e6bab85cce63823e4b075c91520e0f7090c58dbae24774ef25917cf9fab1030513f4a10b84c59df529bc1d3b1", "2469f23a674bf49a0383d239ca15676704eab86bd3149ea041a274643866643b786bb17c5d0f10dbf2bfc775c7087cc1" ); + { + // small r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0100"; + bn_t sig_s = "489122448912244891224489122448912244891224489122347ce79bc437f4d071aaa92c7d6c882ae8734dc18cb0d553"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "39833aec7515dacd9546bab8dc740417f14d200bd26041bbf43266a8644628da82dbf53097fe43dca1c92b09832466ec", "67f862c02c8911343a146fddc8246c168376e4166e32bad39db5be2b74e58410b4e9cc4701dd0b97ba544142e66d7715" ); + { + // smallish r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2d9b4d347952cd"; + bn_t sig_s = "ce751512561b6f57c75342848a3ff98ccf9c3f0219b6b68d00449e6c971a85d2e2ce73554b59219d54d2083b46327351"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6cc5f5640d396de25e6b81331c1d4feba418319f984d8a1e179da59739d0d40971585e7c02d68c9a62d426ca59128e0f", "00feab57963b965302cffe9645cf3ee449846381d82d5814e8ca77167ccf4c20ec54278e874f834725d22e82b910c24c2a" ); + { + // 100-bit r and small s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "1033e67e37b32b445580bf4efb"; + bn_t sig_s = "2ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad5215c51b320e460542f9cc38968ccdf4263684004eb79a452"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "567e0986a89e4a51ff44efdf924e9970cbdaf5796dea617f93e6e513f73cb529e7a666bd4338465c90ddd3f61823d618", "5b252f20921f66a72dfcd4d1e323aa05487abb16c797820f349daa04724f6a0e81423ddf74fdb17f0801d635d7af213d" ); + { + // small r and 100 bit s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0100"; + bn_t sig_s = "77a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0095512f92e55b5d18003397b822c1173f4e25a2640a4a68bb880a6ca8605cbfb83c75dbddc4937ed822e56acde8f47c73", "48e4ff027a1b0a2d5790f68c69923f3231ac61074caad2a022f6eabf8c258bdb8142be43ffa16a6f2c52f33cba006400" ); + { + // 100-bit r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "062522bbd3ecbe7c39e93e7c24"; + bn_t sig_s = "77a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "74d5679e10edc41eb06ba54a1de2c9c71820bbac14f3758bb7fb593dddbb2e573e0d7a785344961399da18c8f615ae1d", "00f71e1c0ea892931571da09432ac46f6cbf53129e1e3e74c567180c037df59da84c8374b295b5a0ec6100ce9d800cd05e" ); + { + // r and s^-1 are close to n + auto m = "313233343030"_hex; + bn_t sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f3"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6982e9820d0c0078418692a9e017b0e896609970992c62285e825c94980bad199b1cfb45a6314ae1bf35fb8255f3e0ea", "3e63f4c32d828a3e2e1368a0dda0a0491e90a2040084d4d79c2229184afe4f62879822c54779f2136c6a46e7408c753f" ); + { + // r and s are 64-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "9c44febf31c3594d"; + bn_t sig_s = "839ed28247c2b06b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3b6131ea967f5e3c54cfd0211ba7666d74e119403af55024e2938c774857badbffedb6f4e557d86595e63f8dbb2c4289", "00e89119062a122176d9f57cf66c9c00a442901f110f2d782da7a99a764bf89e21b96d513ce4fa45c6d19dd0a13ca548a5" ); + { + // r and s are 100-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "09df8b682430beef6f5fd7c7d0"; + bn_t sig_s = "0fd0a62e13778f4222a0d61c8a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "292c15a18011b795a115793af1d6e91bbcd5f2362a68441284307b2d35a77e768f54e6f744211a478f28aef8e80e1003", "432aeb3fba7f2b56976e91995ca2454dcd01416fcbc0385152aa4d5f7ab4b6e7cfd77e34afd8c0a0f9f4dbb0b0587123" ); + { + // r and s are 128-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "8a598e563a89f526c32ebec8de26367a"; + bn_t sig_s = "84f633e2042630e99dd0f1e16f7a04bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009fdc7e0a73087f2109d6581b0b70f3257cd87982bb2bdd3d2827cf8988dc0e0e88ee691e8a88aa25b979fab3268dccb2", "13959bb97e11c91c698f45d84ae8ca4c5a7c23e92c9e48f05e9bd3710d7c143317c0a890f7411156a12460c26a560af1" ); + { + // r and s are 160-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "aa6eeb5823f7fa31b466bb473797f0d0314c0be0"; + bn_t sig_s = "e2977c479e6d25703cebbc6bd561938cc9d1bfb9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1764c83ff4c28f7b690ca1c4b05832d78394f0aa48de452eb7b470526f4099d45de563b506c1570eb9b0f899a5f03f5a", "00ff89e562385d77b2c5d48dbb54501960997566bca5dcdee15848b907ee7457f8e46a221f64091c36f8d3053147c1a628" ); + { + // s == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // s == 0 + m = "313233343030"_hex; + sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + sig_s = "00"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a3e044abfe616fa2c0341ffc4326f3367221dba0bf33e56ae09cd3549e61b33364295c1c2747713cea7acd6dc7bb04b6", "49a7a8292ed773b33772d3fd925b77226a79551a436b9738b4577c89955bc3e2c2afbdf75cc751d7f8855298892463fd" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "427f8227a67d9422557647d27945a90ae1d2ec2931f90113cd5b407099e3d8f5a889d62069e64c0e1c4efe29690b0992"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1daa2bbe04e15631da2692da5ce55817430c332263caf13ae5626e9ad75e28938cb2d246b391c9e80ca301040e04df3b", "22b5021bae7d5f5739fd44027d70ae9b44ce82bb638c2d44e660cbbbb493e4499203d750d6c451b0a091f7f363d7c59b" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "369cf68bb2919c11d0f82315e1ee68a7ee8c17858bd334bf84536b2b74756a77e4eee10ecc5a6416a8263b5429afcba4"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4a42f3bce03237811543677df2b8bb9c7034fb6b9eab2e29041d81fc93b11b4d3e6788d57031fff957c9d10ef786249b", "176cffe0e08dfb5cdfae7e330977c7d88bd04e814d2d5fc6bfbafd9dfdd8e59f9b79c5af26d6edef3f6070e59736cfa8" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "2111832a45fc5967f7bf78ccdfe98d4e707484aad43f67cf5ac8aa2afbde0d1d8b7fe5cfc5012feb033dffdec623dfbf"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ada857916b3ae94e2309c4478749e2d43f34702f5da9f6279670fca56d0a4c8b24a96145af01e8d6cdccfdf236f8a026", "00fc246df477514a830748fc713f25ce5d5780b8b253e7dd09a4a41f65af07fe95607faf0a737ba820933a5c77ade053b9" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "20cd002ab7dca06b798fecef3f06a222c2d2a65e9ec92f74659a8d82fe7d75e9af739f0b532e17d6c5f622c4b591442b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "787b21230df5f1036a459a5f81445cc9f07d2bef3f872b33cbf1de8381f026cd943f960f094fdc2e13561af81f3eacd6", "00cc29c6c5b8fbbab21953cc979b0391b3e051d8cd7cd112dccaf487af7e29b415ebc206a33b252b9237ddaa1bb286affc" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "3276fe55314e426a8ed83c4c38dc27c8fe8cbba0b39bad7cfc35e963adf10ab37251ea6829b8d255a77dd0b655cf9ff8"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2d06c9d3eaa9ee5aec68df7c097b36a4a8c2ce6f704d944cbcf4e8f8d45386a2b43a61c9165c2d008975ed2e183f9c63", "611bffb7bc19e852fdfc6767609d41dcb680319378e039743b37b0e9e9c6a686cf9036ab77052a8de1b2ae71c47b6f99" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "1a80b4a3d6c88775821e26784463080eb7de510762ab0d98223e532364c7089b07af73746ae4cf076c5277dcc80cf8c2"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b9d04ce66c8737ec6425f7b458163d44880428ac62858566490c3fe88a56cbf9f57cc76c6726393e39d4ed97fc95b5a5", "008244af490369e7008b68f725345b9c2b91f719c5fa88705ad5d33a986be75873c51856d1afcd99e0e69d687646eb3438" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "74e780e38b3a7cd6cfe17d5c9ac615895bd97dd4076b5f8218ae758b83d195fba64eb9aead39a790ca0f8b8387376265"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b318b005c3b79ae4ed584c2a7dc8aa73cd3b47673940dec5e7acc1d0cba904d20f0f9e00b3dbc66681818fdb32ad706f", "0086eae465fcd5b3b81f3005d60b84ec8becaebc610f6063f432f94816fb586bbc608c579a954c0583a726a13ddcc271d2" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "6ee5f8daae12c862e1f7f8b59294ac90448c4461e29b36ed623a719dd69bb17b3a4b7c29b9eb5c39ca6168bf6b597c6a"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e49cc09972b1134202ccb8ae75156e3aa1ab1cab3c76b948890a1d00bbb619e701106d6d2b89b4a3cb3fee7d7bc1e1d3", "515301ef8e56e263179ee36058fccd4072f8f073e6580114ede2ad5da71b0fa3926aef13715e0f2f5ba53847c66ffac9" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "5426ca20a25b0cfb1ef230c62f91e98005f346e229233f1803e8944bf421fef150a4a109e48cefaa4ea23eea627fca41"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "189ed7ae2c68d2cb2337e8be079594b73fd83044dde91d80b21c14913f48f243d0545239921cd3cafc4da26d872bb27f", "36f1fd8e77aa536e63e8f720a9f6df0ecdb3ef6efd8f8e4b8bae68d36bfcf9f94c2d8538ed85f0e02e573070b37692fd" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "39fd1a0ae3964735554c61daf085c66bcc2e9e5350131086023aa99549fc5f9057c848e75a1b8e58069fe0b9b23fa3c9"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ab69a9010b6a49c6fc70b68d13416e124eab0855e023e729abde0c7c2c39f288b7e978e90fe8aed9117151eddc0cb43a", "0085f1708fa08ef674c9e8f43351e5f60fc33c2e1057bd747dc07e243d9414d2aa14f9f62f475ff08d6a7ec9fe935239dd" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "707a37cfb7367c2e551ea1f0caeac6c0fdd2b562e1bd8f1c7c51a5dd78f21da8cb179bd832cac3d3aee21fda54729e66"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a2c11e8b85862e43d15e1ec7948e24b9e5af9c137e3d3026524822b46290373be52d5311b2b85972c689828e6c7e6766", "4d0596346a35a48ff64a83891e1c54e4a5546fe8e02c0c1bba12a71a60bb9c2a0db73deade44fdd9099e4583dcfa0493" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "15c99e2ae11f429e74fe2e758bc53ffea26eb6368dd60d10daf860f9c79fa8cc6cb98fee9b87dd38353e970539a50a9e"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3a5dea2fd350ee0f71a6df2eaf3371a31563926502261cab0d8fa9766b020c0ee0325564e11e76edf0cd754f5191cb31", "00a5e4f83ff046694b90737a778f1a14fb9ce877949787ee856797069ab8fe0449a07379883eebcbda7cd671d6a86f9c7b" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "148c732596feaabb01be1be3a220740e84bbfabe6d82ad0db1c396fa047603beeb95a1cd37fc708a9451d3cc29a45b32"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7d1c6e405b2f1508abd51f94c2c631453d43c60000195d5616e0140a6c5a273cfd21c2594c4c57b2ce1ccd9de3ece324", "00a77fa6ce730e4bc0342df1c55486ae12404633c67f7c2479c41e847189cd2a400fa6ea48203c8d202ef8019fa87455a5" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "6b3cc62a449ae5ef68bec8672f186d5418cc18d039af91b45f8a8fae4210ef06d3f0d226f89945b314d9df72e01a02bb"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d7b6afe6f56f4a971b0e3c76f21dfbd31d677dfee379a7533de31dd83acfe81232eace1e0346bafe8e9cbe395e2fcfbb", "7780a9132cb9b85bd37965060de6d2baff92e76488bd65e4d3311573c55965b403c9f5874f6d1f8dbbe0009cde1f8e0c" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "7db7901f053b9cefacfda88dd7791c01fd569ed9a5243385eccae12ba992af55832a2e5dc8065e018399a70730035bd8"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "100fd7ac4ae442ab989f94a10a1f310f799d76980d00a14418db067b144bf45fa7639446fad508b76fd3ad9c9fe55810", "693598529b8349a28dd1d0632039ff0897523fed9af2356c0e36612135ed629369448b97d165ae5b2fe5c5ad396d2b06" ); + { + // point at infinity during verify + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = false; // result = invalid - flags: ['PointDuplication', 'ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d9a08d4f9f8708471e2e6b04ce08750c395b80f4a14169123e2fd97556c1171d82e87165a77b2dfd089ad25382ef4251", "517d0c26bebfce8483bfb089243d82eb0e712a7d2e7f71f9abb82ddf16c2e525146c7dc5686fb7ad334022ad092d32a4" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "68133653284ee7e9a8cccf584a9e4f06bc31a3eb031999f0229db7c2b10630424c7ee7513e40319e3972c1a5152d5d28", "00a547a17df730d86278de44cc099643ebe1f07e48618de255bc672dff63c58f86b2db29c89f109147d8d6be1f03c466e5" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294ba"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "233c399596e090c132c8e8b33c2ed443d73ab9abafaece5e47c6a6dc82d3fcc006ebf8b5b1c5fd028c97097909d5be38", "035f777dffaac0ef909bbe6be4e01ecfae3b36b2ea2095e352c179737980f96124d45b76677274d975eda57436f453de" ); + { + // u1 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "f8723083bde48fae6e2f3ba5d836c2e954aec113030836fb978c08ab1b5a3dfe54aa2fab2423747e3b4fa70ec744894c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "357931297f6a369df1e1835ae66a97229c2ab63a75a55a9db2cdbf2e8582c7c0d8aa79f2c337e4e01980d7d84fd79917", "06b1de385965ae26fc38ab2b18a8ea60e52faea5c2e27666913858917cb1cf5b5c0bdc9c1498389c1db155e54d3198e2" ); + { + // u1 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "078dcf7c421b705191d0c45a27c93d16ab513eecfcf7c9042fd744d6d8dcefe1036fde07248d32fcb19c725c0580a027"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b760dcee338ca73c8cc69f0360d87253ef3632d302bdbf743a65f8762ecea207a5c5aff3add177378e133378d2c83a40", "00abcba73c686f35e13d1cb44197bd763b5221d3b17ca7d888bbbc52eb2c33462036dd7a3b569290cb586d9e6514d69b92" ); + { + // u2 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00fa8f96db8c7c9350d90ab49baaa941a79ebe62f017d54b6f83854f430408926e4a46335e44e1d67f0f18c7db2d70ca93", "00b65df386caa193875fe91740214526a2ed17393d8bb62bdcee9f887802bc2d76ca9a304b94e795032956c8608c0e7f46" ); + { + // u2 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa84ecde56a2cf73ea3abc092185cb1a51f34810f1ddd8c64d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "69bf123fb0d38b6a1c3f01a811e16ac78f40301332a0a18454fb4bd9b7c9516520f5ace9eddad328b8d283162eed1c75", "009fa36f89c13419404c11c2ac982777cd30aea7e621351d96ba39676c26b36ccd109035d708da63ab9aefee3c82f6d405" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "52d0bad694a1853a24ba6937481240f8718f95b10102bcfe87d95839091e14aa1c38ba8e616126d4be6fe25a426c2dc4"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1e5863f2dafa6a4d1a10a4cb18ebe792c0154aced0c5c2abe33f727335c720693e92749795539350d8503f209da1bea5", "6f0889c25cd0aee834431262177f43b7ddb01a75532dd55086c44c1931cdd3e0312eea51d300050130f6e754aa9f92f8" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "2412cc835da0a4357d1b7a986a76fe42b79542258c02dd7af927b27a9f9352ed3eedb6520a422e876949cb5fd0724090"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0087fc8357860b94528775f3787406b79d7a7d65d23d1d5707e66978be71aabae87bc539c24addf6c55468cea11cfb85bf", "3f881573285dd3742ecf062d5321c3d5f86212ba88ae75dd3945ebb3b44c37a178d440bfd72ca8f2e7c99cf6367da248" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "1a2303bd73ab20717627366a498a23f4afe23f30b93b0f3be65b74e5eb19f2abef049411ba50146a305c5bb98169c597"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00eebe3763025894619173c8b4397deb7febbfe10fe2d283fd303d48691ebc8ba3ab1209278e763199a18f398b9c148405", "0098640539d7ec66d3c43bfed723292c85856f02e020deff4e468bf3bf3c7fd08391d9525a2cb4f85fbebbb7945a5853ad" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "2805e063d315ae83078dcf7c421b705191d0c45a27c93d16a277765a9f34e9a4b2e3bac6291d3ba508e5769fdbc4920b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "41a0504da3995adb7665654b6ef7d0d00f77fcc536fc1cad41b0daca5a60dd88c99c20e698c99d5663eb532a57db08b3", "4d2b0acb79b95b70cb0a5e2eba110061ef87f0d34b5bbfdeaf5184b67103f8a2bdcd20a7b9f09ad11811776659becb75" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "5e063d315ae83078dcf7c421b705191d0c45a27c93d16ab4ff23e510c4a79cd1fa8a24dc1a179d3e092a72bc5c391080"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "45c152c4e642f156b50ef6252f2b0cdd36f20cfacbe389fd79e2fbf19f0810cfbfe5d157d2fcc9b2a649e9675fd86c07", "4eeaab3bec18eff3b702e0e0f5c40ce928ae48161e06833ef3d76fa743c51b2711ca7c06cfc3a20ab804066251d2a115" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "bc0c7a62b5d060f1b9ef88436e0a323a188b44f927a2d569fe47ca21894f39a3f51449b8342f3a7c1254e578b8722100"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5f6849efa9aafd6a4030018579e39d241df4c192e5ba78c6e9b441aabdac8eb8f4b353865c1c9127ecccca468c41a561", "00ec501582456fe6396643c368d2b9735c47384dbdcf2cc16927ab9b327c36350fe7e1f949e7ce14e60b1c1dbec8dff5f0" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "d315ae83078dcf7c421b705191d0c45a27c93d16ab513eecce49d6742e48c5aa2b36ea79df9d9e3277247c3d843d5887"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c3ecd74e383f55b7ec8cf0579e6fedb9863ee0a82cc84cf13854dc1017aecb2a5969f15194a9ccb09e823559fcd7b6f1", "1faa3cd553119de6efd237b9a84dfe520694ba373c8b60d5b2e741b35bbdd9cfa635353a1f0cf47042881684a96fe516" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "e2c087faeed9abb45e3942a10187bd6d2df94757e2584ca7599b3385119bc57f7573f71dfcc9161dd86a91096695d236"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e4efcd7525aa87a1390ca91cd3f0ad38613384377278c4e29b14264ca550e6e57e6c6559df830065caf902a2f8df41ad", "00ff1121276e4228ac454d62994ca1a3cd24d500a90ddaaee2e5203da658504292bd81b62c4024a8fd4d0725e6a07c254a" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "e727c7f2d36924d4f4fb46d5d0c752e8aabb5317b2e59419d1d54ca40b148e12b60908edf846b56e4d64224fb8d7e885"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "54a018053bf8dff69ce32e1f8c0c9ba658dffcfc1200cbd89c16996aece05b84ba945164b4bcdb4d8b6dac967ac78c47", "00edaafea84b25520478e67b328def37e5bdb94f18f3bce507cc24161aa4297477fff23968ae367cf0c3f2f70ed2bc205d" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "ad2f45296b5e7ac5db4596c8b7edbf078e706a4efefd43013f89f548eb1919353be15323e74f80a62e7c37108a58fbaf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "68828912c312ed14280c954102f2d4ab06d58bd9e7abd0afcafa0c349d0f09100bc5c91156cefeb9d3e33721f5d1d5f4", "69cc3a91967d5b964963044ea966e4a3e2488f3be4232f1a8723d2956c687240fb2f92d456bea0b087b1007b444141a9" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "83c6e7be210db828c8e8622d13e49e8b55a89f767e7be481fb9d492c668a0ee02dc4f5dcb69eed3bcf4445e36922e4cd"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1dc3d0da27139b88b61893d1bdee2e5fce3dcd8c4b65e1861ad0886068d32d905d343c4567ab20903f43beb1f5e3059a", "3cb44b0793c790e3f65bf78799755a8f40107cae627b57fbc03181f65b12416ba5f5fed566a95dc4b1b93a1a63550811" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "8d1181deb9d59038bb139b3524c511fa57f11f985c9d879dd6df6133efa89045a38f50e201805df28ea43a9227177785"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0085d1e93894969ef05e85263e3751285abf14ce1fb1a947d99ab869e61249ab515224ab3b0f322be36c90a3a1522f83ab", "0088fcdd8457e34a9e8105d361fb3711b544e4684aac178a3217505bb894e851181033d7c756d572abcea1aa7bb1e10c6e" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffed2119d5fc12649fc808af3b6d9037d3a44eb32399970dd0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "609b7164d1e196a5596bef71b34a8fb4eacbbea10fd41d126c16ea3578d893e898c413805230c7fd7e33ee832be72120", "00c2e379c857c01d95b53daf382fa5c196705c7f927ab3dcd8e6aa6bd4fe6767c56c178dcc1bbde32ea00afdc1a4f59fa6" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "79b95c013b0472de04d8faeec3b779c39fe729ea84fb554cd091c7178c2f054eabbc62c3e1cfbac2c2e69d7aa45d9072"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6f557ef52d480ea476d4e6bb8eb4c5a959eacf2ee66613dc784fff1660f246a1765e916d20ac0dbc4543303294772d12", "00daba49f78c8a65d8946aab0a806140136516cff6725267865e9f93e4052e072ae984f3e975e7792b67b5b1807160d429" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "bfd40d0caa4d9d42381f3d72a25683f52b03a1ed96fb72d03f08dcb9a8bc8f23c1a459deab03bcd39396c0d1e9053c81"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00f07a94c4b1dd878c2b4507549ad7557cf70f7286b95d7b7b48a0491a635379c0032d21d3fbb289bb5b7214e2372d88ee", "38934125ec56253ef4b841373aea5451b6e55b7e8e999922980c0508dc4ffd5df70627c30a2026afbf99ef318e445c78" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "4c7d219db9af94ce7fffffffffffffffffffffffffffffffef15cf1058c8d8ba1e634c4122db95ec1facd4bb13ebf09a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "61f352564999c69ce86c0336c9a9a9baddcf4555b675183ea27f682a7b0661250ff7d2d00672880e7d3fd5329b4d19a3", "1f28c529832d0b336633e3ef2b0bf97007a61b7e427c9d2ca1fc2910b0cc685d409ec423bf2f5211742b8d3b33d2f04a" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "d219db9af94ce7ffffffffffffffffffffffffffffffffffd189bdb6d9ef7be8504ca374756ea5b8f15e44067d209b9b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d23d62e8f8c286da7a8e2aaaad9b759c6852da31639ebddf7b4e4fd1ebe26806caef21c9fdccced05cbe1332bce4bd4d", "00899480daf03c5918b474d9dac0742ed97aa622d18b747c4446191b5639abc708c02ff97147b5092cc1395da611476001" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a433b735f299cfffffffffffffffffffffffffffffffffffdbb02debbfa7c9f1487f3936a22ca3f6f5d06ea22d7c0dc3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d1c1d5980bb20f6622b35b87f020a53d73fe7d148178df52a91964b541311bd88e00b35834238a0bc1401f9c3ea0c3e3", "00a50b861b701099048e0b36ec57b724b781f5c9e9d38eb345dd77eab0cb58b4fdea44e358bc6a6ae4d17476eb444bc61c" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "b9af94ce7fffffffffffffffffffffffffffffffffffffffd6efeefc876c9f23217b443c80637ef939e911219f96c179"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6626339de05be6e5b2e15c47253ad621ae13fd4d5de4e4a038eb2127fe33fd5b898cd059a43ec09d186fbf24ed8c00d1", "009251db17bc71d07b53e8d094c61b8e3049e040da95a885e4e476a445f7bfc3705f8c66a7f7d95f0697b9bf2eff9e4cc0" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a276276276276276276276276276276276276276276276273d7228d4f84b769be0fd57b97e4c1ebcae9a5f635e80e9df"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6288739deb45130ee9d84c5d7a74a64d4e1a829a657c8f06a178438b8657169c486fe7c2610ea1a01b90731edf8e2dd8", "1f2d7a092ecf4a08e381473f70519befd79e3b1484076fb837a9ef8065d05f62df4753a26f72162f8be10d5bdf52a9e7" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "73333333333333333333333333333333333333333333333316e4d9f42d4eca22df403a0c578b86f0a9a93fe89995c7ed"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2bdc91e87927364f316799ffabbfcda6fd15572255b08deb46090cd2ea351c911366b3c55383892cc6b8dd500a2cbaef", "009ffd06e925b733f3f017c92136a6cd096ad6d512866c52fecafc3b2d43a0d62ef1f8709d9bb5d29f595f6dbe3599ad3e" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffda4233abf824c93f90115e76db206fa7489d6647332e1ba3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009aaa6c4c26e55fdece622d4e1b8454a7e4be9470e2e9ecd67479f2b7bb79ac9e28ba363b206ce7af5932a154980c1612", "00cb930ccefbd759befafdb234f72e4f58e0ce770991dac7c25bc3e4c7c0765fcf1dacbc55f4430520db7bf7da401080e1" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "3fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294bb"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009004b1043628506e37308dd0107ba02d809b1504f89948161ab7a580b9e2b6c111688f9a7db9ec1e52c987cbe06f1173", "00f20b953d46c6172a883fb614c788bf860c456b1b08db110b09447ef0176f7222be4120128f8a198f37264efe6256af93" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "dfea06865526cea11c0f9eb9512b41fa9581d0f6cb7db9680336151dce79de818cdf33c879da322740416d1e5ae532fa"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "23c5694ec8556343eaf8e7076de0c810ce26aa96fce9da325a813c4b0462553d679c70a3d9d626deac3160373bf05d11", "00f4e0f85a87d3b08a699d6e83d0c8309e7e1646625f7caa73bed83e78b2e28d8384f2c0555bd1023701c10a2c1726a9dc" ); + { + // point duplication during verification + auto m = "313233343030"_hex; + bn_t sig_r = "b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60"; + bn_t sig_s = "7cd374eebe35c25ce67aa38baafef7f6e470c9ec311a0bc81636f71b31b09a1c3860f70b53e285eab64133570bd7574f"; + auto r = true; // result = valid - flags: ['PointDuplication'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "23c5694ec8556343eaf8e7076de0c810ce26aa96fce9da325a813c4b0462553d679c70a3d9d626deac3160373bf05d11", "0b1f07a5782c4f759662917c2f37cf6181e9b99da083558c4127c1874d1d727b7b0d3fa9a42efdc8fe3ef5d4e8d95623" ); + { + // duplication bug + auto m = "313233343030"_hex; + bn_t sig_r = "b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60"; + bn_t sig_s = "7cd374eebe35c25ce67aa38baafef7f6e470c9ec311a0bc81636f71b31b09a1c3860f70b53e285eab64133570bd7574f"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00916e5351bd3efecf755786fa77f6acfecf3b00cd496fbcdecd8d255120dfcf27b70e7fc9de74be9b15f72650b3eedfdd", "5bb6bcbdf478e15f77221d01d6086eae7dae44a16bdeb4afe178eb444600452789889310ad61014a3957436a59a3239a" ); + { + // point with x-coordinate 0 + auto m = "313233343030"_hex; + bn_t sig_r = "01"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e79f9ee594e711ae1439a237a0db174abd0b0138c4da3db1a6bc0180280b83020104580528d1030544ee4e7a17341e5c", "393de20f319b72e523b0b9ff9cd10cdc4a5b6b35850be57079e1afd30dbd6d4651139cfe0b16b32b074f81563009f7d9" ); + { + // point with x-coordinate 0 + auto m = "313233343030"_hex; + bn_t sig_r = "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + bn_t sig_s = "33333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009d91680bd5ac912ddecc5b609094a8d5fd12b5d5af7c5bbff8f129d9bcedd5dea45df2d09513ec7aead188885fd278bc", "00d968fbaba2bd7d866f6853a6d79661fd53f252ea936573f6bc7a32426c6a379d3d8c1a6b1e1a1aa7faa7ffdf5c4b0fbd" ); + { + // comparison with point at infinity + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "33333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "66c48ea217602f3e0e77f402dfd386450c3a33f3b9a266d01cfa4d8cb9d58f19e7cc56315a5717ae27f931a8b6401aed", "0f47cc979e0edb9b7970ac66bc66315d3d38594dc933dfb963ccd5676efb57b14be806c0879b3cd28fe6ddeaaaf4ad92" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a03d026431e0f75a9ce6cd459eb268c44d59a00bb6facd5b816a2823845e7f65c48c69cfb4841bc0ab8c981e6c491db2", "488eb2d9321b30ebf3f1f99da618d3311b01928ae9b23764b530e2ad41dd121b6812b7a8a80f669934dd8efb0445a962" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00db12e7908092c195819ea7652a2f923f678f00aa8181f3c2cb0021e268a176737d48a48ea25a48ea2b0cce3c31f1406c", "009c46a9b415ca03d1b309c5f4735b6ce48da4d32a0eab51772dc6bb7e63d835ea7612c92a629c058af638a5bb5354110e" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "6666666666666666666666666666666666666666666666664fc15233fb49458c89a4057a8379dc9791f80a2ab84edd61"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "532b95507ca92950613dcffe7740715af07953e881d133b75989426f9aea6ed1bd22a9eb899441b29882a8e4f53f1db2", "65dda7154f92c561b2b6c9f154af3a589871f5290114a457896fd1e9af235de9f1eb7cfe0911e27cecaa30f90bec73b4" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "99999999999999999999999999999999999999999999999977a1fb4df8ede852ce760837c536cae35af40f4014764c12"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1dd1d7b6b2f677d7e10fa14bb35a74bcf83d6ea0bb308ffeb7d73634f6911e4213752173fa76b2c5be12d752b8176659", "00888325cc90b23ae34fac03a5b9a30cbcb9d24e02923d6d68e8e54066eabbf8a87272827fb2f26392dc45664bb2399e90" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6aae76701acc1950894a89e068772d8b281eef136f8a8fef5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00edc6ddb4a76167f8f7db96dbbbd87b241a2477e60ef21f22d0fb235fdd987adb15a13a9c9f05228ec7e33e39b56baf17", "008397074f1f3b7e1d97a35d135760ff5175da027f521ee1d705b2f03e083536acfef9a9c57efe7655095631c611700542" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "0eb10e5ab95f2f26a40700b1300fb8c3e754d5c453d9384ecce1daa38135a48a0a96c24efc2a76d00bde1d7aeedf7f6a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00febf3b365df31548a5295cda6d7cff00f8ce15b4aa7dc8affe9c573decea9f7b75b64234e2d5da599bf2d1e416a75007", "69205229d1898c7db1d53a6bd11079458cc40da83c16f070e5772b1d2059fef19f0f36d4471ad85ec86cf1cd4e7d90c4" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008373e65ac625a5a4110e350e7f08a0392f8261581c06a88b125a145681687fc5a6c796f16ca48977bbfc7729bba80063", "01d966a2d30fdf2b6dbcc8c9ac3b6b2150431f95fdf49e8ea5fff99f185cbcd2f9631ee3f074d680700fe693b0398583" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d8b5b751bef246a3769682966232b714b05d99a37199223e55cbc4df6941b2529e57965c94f60d88837cfd952d151abf", "009eb51727dc4665f8e74e8f5c79d34ffd11c9eab8b5b773950d1f2c446d84c158aef8bbf93b986d9b374f722d94f59f1b" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "6666666666666666666666666666666666666666666666664fc15233fb49458c89a4057a8379dc9791f80a2ab84edd61"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5f2098bc0eda6a7748fb7d95d5838a66d3f33ae4138767a7d3e221269d5b359b6456043b7a0973cf635e7424aaf1907d", "00b1e767233b18988d95e00bbb2dafbb69f92dcc01e5cb8da0c262cb52924af7976d9ded1d5fe60394035cc5509f45865c" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "99999999999999999999999999999999999999999999999977a1fb4df8ede852ce760837c536cae35af40f4014764c12"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "018cb64da6154801677d34be71e75883f912274036029bb3cf2d5679bca22c9ff10d717e4d9c370d058ddd3f6d38beb2", "5bc92d39b9be3fce5ebc38956044af21220aac3150bd899256e30344cf7caa6820666005ed965d8dc3e678412f39adda" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6aae76701acc1950894a89e068772d8b281eef136f8a8fef5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00aedfc5ce97b01b6201936777b3d01fe19ecee98bfade49ec5936accac3b02ee90bd5af667a233c60c14dac619f110a7a", "00d9b99c30856ef47a57800ea6935e63c0c2dd7ac01dd5c0224231c68ff4b7918ef23f26195467e1d6e1a2767d73817f69" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "0eb10e5ab95f2f26a40700b1300fb8c3e754d5c453d9384ecce1daa38135a48a0a96c24efc2a76d00bde1d7aeedf7f6a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7", "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "f8723083bde48fae6e2f3ba5d836c2e954aec113030836fb978c08ab1b5a3dfe54aa2fab2423747e3b4fa70ec744894c"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "078dcf7c421b705191d0c45a27c93d16ab513eecfcf7c9042fd744d6d8dcefe1036fde07248d32fcb19c725c0580a027"; + sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7", "00c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "f8723083bde48fae6e2f3ba5d836c2e954aec113030836fb978c08ab1b5a3dfe54aa2fab2423747e3b4fa70ec744894c"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "078dcf7c421b705191d0c45a27c93d16ab513eecfcf7c9042fd744d6d8dcefe1036fde07248d32fcb19c725c0580a027"; + sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aac", "00acbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1" ); + { + // x-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "82b41176571a051a82c18e1ffbf4f3ef7146e0634755ba30fc965efec684d12830ed366acf4759fcce146e867b9108ea"; + bn_t sig_s = "52eaa43df5a95a92aee5f0002f4b4a1c870cdec040c966280be579a15e865bebc1269b084e17e727bae14b8ad6e6c73d"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "b4c1897895e4c214af7ac546230ab6ea733a6353fa11bd5d9892dc89e113dffb50a3581e58d5cac31efee0d56601bc84"; + sig_s = "b1494f4cc17f4baa96aa2c3da9db004f64256c1f28aefd299085e29fe5399517a35ae8e049ec436e7fe1b2743f2a90a0"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "c9b58945eed8b9949bd3e78c8920e0210289c1029cdb22df780b66aee80dca40e0e9142fc6db2269adbc4cb89a425f09"; + sig_s = "d672273cc979c16b3336428a60a3627bf752f9d7f1ba03c5e155cec8fcf523376feab08fe0e768f174828adcd17da0b2"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422", "00c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000" ); + { + // y-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "9ad0ec81fe78e7433ccfe8d429ffd8cc3792a7ed239104ade9b7c828332a5be57493346c9a4e944eec914acac1ab5a45"; + bn_t sig_s = "cab9be172e51ff52c70176648c6c6285630594330d8ffa5d28a47a1b8e58ec5c32c70769ed28bc553330c9a7e674da8a"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "84ba925242eaedb53cc529e4763d8995aa7315e68a47ef89f291dd29ef138e4810bc1c58a6bcbada3ac83541dc139c79"; + sig_s = "4579278b73adadb63599028b873bf5f7cee2ff01eaf0faf2d529b01211a63e78433011da37fab174607fe90a4c3d81bf"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "56a69cb5b4026268e11631f7fc35830e8a612ed79278f280e7d7e409558c43ef226ab25cf639aae7f435545cc4d8e8e5"; + sig_s = "5066494754680d61c23419273ba030df0f0b8b0a486cb0dd498298a34db478a6c133b4f5e071b6696cdbec63a74d84c2"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000", "00e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557" ); + { + // x-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "6328e30a8e218904631d6e8858e1e3841a2f6c0959af1b53ad3515bee16cbb600b5abaa5123c8eeb8cdc9b2da1a8ef39"; + bn_t sig_s = "40e708de5a00178926cdb263afcb12710ae8c03b298eeadbc40522c0479a94e98dfbdce493fcf0cf7f4afb6949d9f95d"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "34b9ce48ad0aac78ff138881f3b13badae7e1cf5da7ff060c5642b22c5ec4c76fd4cd46d564676d4631bd567a7ea9284"; + sig_s = "61dae7993b4500005f45f55924c502f8803455e21a62499db2cbbc80a582c1107c8014afb4619f5d4d37fddbdf2d7bb9"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "e337217405a8457b0e31ae4e909eabe79343331c4dd0623c2b13d0981012e28d1fbf88f0101c1abae8cace1c801dfe16"; + sig_s = "948603710e13fe5b87e96ca87fb17bddb5762b9e4f2fc6e1c4acf4ee20b641518158b32bbd42884bffad25e0171a3462"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69", "00d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98" ); + { + // x-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "b2f22aeb025c40f695850ca8d9243d671557ecdb28ba78ad2f3389e78fe685251a29dfbc2ebc1d7e5e1098b4b286db18"; + bn_t sig_s = "d2ac24a65d1463405bd4bb117e4d1ed7f7d9b457d51dcb1fd8704ad27de5cbc11bea45f8e3cd1ecdb51981962feaa4b6"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "f3b374deaa912309be3a08722fcd0fa17fbad8a0d674a96b1140efe2f9451e373029546b84a565dd88b6816b03c69912"; + sig_s = "f44fcc8e2513a2574e9c88de1960e8d7f6c607fb0aa6400362ccacf86e56cc44bfa6e233a993800fe1385e747312393b"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "de778636b0c8775a48e8f7c2da3ce056ea18c0f7b61a6ceebccdc1db0462a739a9f623b342d82b5cdba9329fd32d4870"; + sig_s = "5f843dc49e8c8642d0ade1fbd635ee1ea6f6da8f980ec1d839de2b37ba7082668179cb80e7c97775e77c7afe8dfb9791"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336", "208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4" ); + { + // y-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "8f6f35102ebc10571603d65d14d45e2658e36a961d790348df0ed3ee615d55919e1c31d02e48b4c29b724e75094e88e1"; + bn_t sig_s = "1674424d64d3a780b031e928ee3b246a3703868aef1afcc6b50dd217ae6bdcb5fc7f59d2b14dc4dd08f22853abef621b"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "81fdae0b7e18cca48e0bae1a4e2c96f3973b0f661ccae269c1f0535265954e76473f51710fd2eca0b014e0386bdb387e"; + sig_s = "b4fd60411ae7ad836c8b1768bf44fe126d753781628a2b34f21fe1fbc961d21a153d3838e0200ddf8b7c16819230c0e2"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "f6b94cdc2083d5c6b4908063033dbe1817f5187a80fbf21e0155ebc16c3b14b06282171a63d8c6ad173bad8aa40b8406"; + sig_s = "569db82936c0d284c752149034a28e2415b57247c723077d8a5a7c9725ebca7603de5b7a41c53fed2bed8143a9bb8beb"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336", "00ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b" ); + { + // y-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "89d3d1a5c2ce6b637cc9e30a734ea63d34a7a72630400ee82916b79fa9a9a83b4e2faf765ddcf1fa596a4c026293ea06"; + bn_t sig_s = "9013c5c51bde3c114ae0ce19141c6c72bbf0a8f75885257f202240af212064f0fa9b1409d8c5e195a8db9d996eb1cd67"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "4bb0ddb7af2d58e75b17f7ea81c618ca191efaa374026901fc1914b97b44ed64873404b40c249ee652e9685c67347881"; + sig_s = "af0bc80678b411ce0ea78c57f50bbb9b11678e001d92f2f49ad17af4759c7a013d27668ed17b13bc01e13eb9ee68040f"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "024deac92bccdf77a3fe019fb5d35063c9ad9374bf1e7508218b25776815eb95f51c8c253f88991c3073c67ca8bbd577"; + sig_s = "8da6b6f9fde42f24536413f8c2d3506171c742b6a0883de116b314d559388b41630aa24c485e090fee5f340c79486164"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } // End of Google's Wycheproof tests ecdsa_secp384r1_sha3_384_test + + // Test vectors from Google's Wycheproof RSA signature verification tests. + // Generated from: 'ecdsa_secp384r1_sha512_p1363_test.json' + // URL: 'https://raw.githubusercontent.com/google/wycheproof/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_secp384r1_sha512_p1363_test.json' + // Note: + // Test vectors with flag(s) 'BER', 'BerEncodedSignature', 'SignatureSize', 'MissingZero', 'InvalidEncoding' were not included. + // All test(s) with BER/DER decoding related errors were not included because they're not part of this test scope. + // + // Algorithm: ECDSA + // GeneratorVersion: 0.9rc5 + // Header: Test vectors of type EcdsaVerify are meant for the verification of IEEE P1363 encoded ECDSA signatures. + // Notes: ArithmeticError - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.', 'cves': ['CVE-2017-18146']} + // EdgeCasePublicKey - {'bugType': 'EDGE_CASE', 'description': 'The test vector uses a special case public key. '} + // EdgeCaseShamirMultiplication - {'bugType': 'EDGE_CASE', 'description': "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used."} + // IntegerOverflow - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449', 'CVE-2021-43572', 'CVE-2022-24884']} + // ModifiedInteger - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModularInverse - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where computing the modular inverse of s hits an edge case.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['CVE-2019-0865']} + // PointDuplication - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.', 'cves': ['2020-12607', 'CVE-2015-2730']} + // RangeCheck - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // SignatureSize - {'bugType': 'LEGACY', 'description': 'This test vector contains valid values for r and s. But the values are encoded using a smaller number of bytes. The size of an IEEE P1363 encoded signature should always be twice the number of bytes of the size of the order. Some libraries accept signatures with less bytes. To our knowledge no standard (i.e., IEEE P1363 or RFC 7515) requires any explicit checks of the signature size during signature verification.'} + // SmallRandS - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['2020-13895']} + // SpecialCaseHash - {'bugType': 'EDGE_CASE', 'description': 'The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits.'} + // Untruncatedhash - {'bugType': 'MISSING_STEP', 'description': 'If the size of the digest is longer than the size of the underlying order of the multiplicative subgroup then the hash digest must be truncated during signature generation and verification. This test vector contains a signature where this step has been omitted.'} + // ValidSignature - {'bugType': 'BASIC', 'description': 'The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported.'} + { + auto pubkey = curve.make_point( "2da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa", "4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f" ); + { + // signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2"; + bn_t sig_s = "7b0a10ee2dd0dd2fab75095af240d095e446faba7a50a19fbb197e4c4250926e30c5303a2c2d34250f17fcf5ab3181a6"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + n + m = "313233343030"_hex; + sig_r = "01814cc9a70febda342d4ada87fc39426f403d5e8980842845d38217e2bcceedb5caa7aef8bc35edeec4beb155610f3f55"; + sig_s = "0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 256 * n + m = "313233343030"_hex; + sig_r = "0100814cc9a70febda342d4ada87fc39426f403d5e898084280d6f6c4c54ffc59f2e8c9b538f242cc160c3ec02b7597388e2"; + sig_s = "000084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by n - r + m = "313233343030"_hex; + sig_r = "7eb33658f01425cbd2b5257803c6bd90bfc2a1767f7bd7b9bb4483212b9f6e08e58c6c6bd52b610715198180387b1391"; + sig_s = "84f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**384 + m = "313233343030"_hex; + sig_r = "01814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2"; + sig_s = "0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**448 + m = "313233343030"_hex; + sig_r = "010000000000000000814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2"; + sig_s = "00000000000000000084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + n + m = "313233343030"_hex; + sig_r = "0184f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e5fd3ad1cb7a61dc9507f6eeb2a65341ad0cac035dfee58d140"; + sig_s = "0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 256 * n + m = "313233343030"_hex; + sig_r = "010084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e276f975129e9147ac941628fc0cd2aee42c9ed8741e6bd1acd"; + sig_s = "000084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**384 + m = "313233343030"_hex; + sig_r = "0184f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd"; + sig_s = "0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**448 + m = "313233343030"_hex; + sig_r = "01000000000000000084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd"; + sig_s = "00000000000000000084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=0 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n - 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=0 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=0 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n - 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=0 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=0 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=0 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n - 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=0 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Edge case for Shamir multiplication + m = "3637323636"_hex; + sig_r = "ac042e13ab83394692019170707bc21dd3d7b8d233d11b651757085bdd5767eabbb85322984f14437335de0cdf565684"; + sig_s = "8f8a277dde5282671af958e3315e795a20e2885157b77663a67a77ef2379020c5d12be6c732fd725402cb9ee8c345284"; + r = true; // result = valid - flags: ['EdgeCaseShamirMultiplication'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33393439313934313732"_hex; + sig_r = "d51c53fa3e201c440a4e33ea0bbc1d3f3fe18b0cc2a4d6812dd217a9b426e54eb4024113b354441272174549c979857c"; + sig_s = "0992c5442dc6d5d6095a45720f5c5344acb78bc18817ef32c1334e6eba7726246577d4257942bdefe994c1575ed15a6e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35333637363431383737"_hex; + sig_r = "c8d44c8b70abed9e6ae6bbb9f4b72ed6e8b50a52a8e6e1bd3447c0828dad26fc6f395ba09069b307f040d1e86a42c022"; + sig_s = "01e0af500505bb88b3a2b0f132acb4da64adddc0598318cb7612b5812d29c2d0dde1413d0ce40044b44590e91b97bacd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35363731343831303935"_hex; + sig_r = "d3513bd06496d8576e01e8c4b284587acafd239acfd739a19a5899f0a00d269f990659a671b2e0e25f935b3a28a1f5fd"; + sig_s = "366b35315ce114bffbb75a969543646ee253f046a8630fbbb121ecc5d62df4a7eb09d2878805d5dab9c9b3880b747b68"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131323037313732393039"_hex; + sig_r = "b08c4018556ca8833b524504e30c58346e1c0345b678fdf91891c464a33180ed85a99bc8911acf4f22aceb40440afc94"; + sig_s = "4a595f7eed2db9f6bd3e90355d5c0e96486dc64242319e41fc07be00a732354b62ec9c34319720b9ffb24c994b1cf875"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131323938303334323336"_hex; + sig_r = "2b08f784617fd0707a83d3c2615efa0c45f28d7d928fc45cd8a886e116b45f4686aee97474d091012e27057b6ba8f7e6"; + sig_s = "c440aa6ecb63e0d43c639b37e5810a96def7eec8e90a4c55e5b57971c48dfb4e850232fbb37bd32bb3b0523b815ff985"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39383736303239363833"_hex; + sig_r = "0609f4ec120c8838bda916f668e9600af7652e1d3f7182734f97f54da5d106bbfd216c32f227b76d583de1c53949b2ee"; + sig_s = "46926dffc766ff90c3b921b3e51a2982a1072314c1fdfb4175de7adea5a6f97bdff587a473504a9c402aac7c05bd4785"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3230323034323936353139"_hex; + sig_r = "5ae2220e4716e1ef0382afcc39db339e5bd5f05e8a188d4a5daaab71c6c35263ee8820a34558092877449ebb15898c5c"; + sig_s = "c4d38e2e85451c43ee35b0c56196cbf3059acf2b8b529f06dc1de9b281d9b0f3f3983df8936e944ab0b18330a342ee88"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343531363639313830"_hex; + sig_r = "51fb84ed71d436c737ab24e2a45c68f8f623748be2caebd89e02bfc89309b8350042ab1b97849b9f680f044a58765175"; + sig_s = "d4a8f60791657a8c12985fd896ac77e7d95cb050582f2466471dc2c6dcf90db05ce34beadbfcfe690dc56c0cc9944007"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303933363835393531"_hex; + sig_r = "40159290d161df6b3f81a92cefb6df56149d588e7b886bf24939f5c8b6bb515d325b3764f0ed284a77fa9081ccfa5237"; + sig_s = "bd55dfb47709287ce7b88dfd96ac7543eeba9bd31b8c91f203d2b90418122406399c80a53539b81f1cb60fa3b23a2563"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36323139353630323031"_hex; + sig_r = "d7fb9f53865cdf9d4cad6f66981aea35a1454858ceb678d7b851c12a4c6644fe1915a4b219b51389a5ae2c98a433cc3a"; + sig_s = "94ad75c3dea88740205cab41032dfe149341cf4ee94dcd2f0c8bbe5af5860b30b5e1f764b2c767b09fd10761050c989c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35363832343734333033"_hex; + sig_r = "157ef8f85cdb9257983d06a7f29674752659097364b401e701705b3bd9ead884fd32141320ae76ae05f6fc7ec155d6c2"; + sig_s = "ccadc3851020e41dd91bc28a6c073409136a47f20b8dbf2553fd456a8ed5fa7e73e4ec59dca499e0d082efbb9ad34dc7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33373336353331373836"_hex; + sig_r = "e763001769c76f6a6d06fad37b584d7f25832501491bec283b3b6836f947dc4e2cef021c6c6e525b0a6a3890d1da122a"; + sig_s = "acbd88729cce3992d14ec99e69ff0712b82a33a1c1e8b90e1399c66fe196f7c99bdb3ff81db77dc25ae6f0c1a025117d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34373935393033373932"_hex; + sig_r = "c6425b6b046ec91ebc32b9e6de750e5d3d36d4ddc6dffd25ba47817385a9466f6fc52259c7d02c66af5bf12045b5659d"; + sig_s = "84cdc06e35fecc85a3e00b16488eac3584942f663d8b59df111c0650139d7cda20d68dccae569d433170d832147bc94c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39333939363131303037"_hex; + sig_r = "3061f090e4932133a0e08ac984d1c8d8d4f565e21cf15427671503880341265cd44f35a437ee3c3a8857579dd7af0c35"; + sig_s = "93ae374a0f63dcbe41a1b7b07a50faf2b33f35e0b6600bb36aa5cda05238640fa35c635c0fa78e1410f3a879bbb8a541"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303837343931313835"_hex; + sig_r = "0ccc627f35454cc84e08a828f5bd5f5e41eeeaa40475bcc2e71ff372e8c718a5e179d3b7f2d7051db9060c4c978eb638"; + sig_s = "b12d0240afbdfc64c60861548c33663b8960316a55f860cc33d1908e89aa6fc9519f23a900e0488fa6a37cfb37856565"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323336363738353030"_hex; + sig_r = "e72419fb67ebbcc0de9c46ce5475c608f9de7e83fc5e582920b8e9848000d820d393fdac6c96ea35ce941cb149516400"; + sig_s = "6aa19934ef60f4a247bc261ba256283a94857a268f42a0939c95a536fbd4f8e1f1c285a7b164c12213abb9e3393cbe9f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343438393937373033"_hex; + sig_r = "8b740931f9afa8a04c08cde896b7fdd9aca3177d5e4a3e5a51e54bfa824b66ab11df4e90f49798d644babfede7830224"; + sig_s = "afd91e7ce15059a5b5499e5aef4afa91fd090e4e5029b3f4348f0d4349df11745869f9255117eea405a78af5dd6a646d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35373134363332383037"_hex; + sig_r = "989024bce204a7539fbd2b185ecf375590d873177c1ff26bbf755838ae5bcde180054663702ac3a4e68fe8b58fd88c70"; + sig_s = "bdbedf64e424dbd7f979f83adef3fc85077fa76f8b1724815b5b8c24fde7fbd72f4b369a415d9bbf565cdc459bdce54c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323236343837343932"_hex; + sig_r = "22624fc23403955c0c9f5b89871177fa53879c8424de3b4ab1bcbcddc6e57b870b0491b848e19f728722b3163f4aa328"; + sig_s = "5bb82642cdaa84d6977fb95b3ede4ec7f2d54881cf435636d3509816f13ebb7be24fd7d4e1e81fddf07bde685e8d630d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35333533343439343739"_hex; + sig_r = "da5a2daa7437df4566ebba6ac5ed424655633e354ef4d943dc95ddefb0dae69f3616e506cc8cb5bc433a82ba71f6feb4"; + sig_s = "5107b24041bba45073ce54488a5aef861e7805bbb8f970aedc1c59149cfe72c7025e2d117337e8677c88ef43374e6907"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34373837333033383830"_hex; + sig_r = "2b0659fb7fa5fc1fce767418c20978de9a6a59941fc54f8380619b2ab2a7d6039de5373fbb503c24f2ce38e9c57995de"; + sig_s = "0d94dba98dd874bfffeac96a9295b6ab667708b8e33252edc029574c484a132135b13e52db6f877987c1be4f51fca193"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323332313935383233"_hex; + sig_r = "4a5a14f1ecf053bf3ec14843db8c7dd153e9545d20d76345a9e1d1a8fcb49558ca1ee5a9402311c2eaa102e646e57c2c"; + sig_s = "1573b8b4b633496da320e99a85c6f57b7ee543548180a77f7fced2d0665911cb4cde9de21bc1a981b97742c9040a6369"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130373339333931393137"_hex; + sig_r = "104e66e6e26c36633c0af001f0d9a216236816923ec93b70bea0a8ff053a15aaaef5fe3483e5cc73564e60fe8364ce0e"; + sig_s = "ec2df9100e34875a5dc436da824916487b38e7aeb02944860e257fd982b01782b3bd6b13b376e8a6dbd783dfa0d77169"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31383831303237333135"_hex; + sig_r = "4b06795da82bda354e8d9422a76c7bc064027fcdd68f95b7bc6177a85b2d822c84dc31cb91fc016afa48816a3a019267"; + sig_s = "18e31018e312d3dd3dd49ec355fdb0def3bb3e44393c26cf1bc110b23a3aacf6c442bfcec5535ce37527d0e068f75c03"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36303631363933393037"_hex; + sig_r = "ad75ca5a3df34e5a6d3ea4c9df534e8910cfb1d8c605fc398fbee4c05f2b715bd2146221920de8bac86c2b210221bcff"; + sig_s = "a322d3df3bb2cf9e4215adf1ff459e70f2f86bec6dd6af5d04ae307d21ed5955136c8e258fdc0f9cbd6cf89c31aa691f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38383935323237303934"_hex; + sig_r = "b0fa6289cc61bab335932ea1ac6540462653cc747ef67827825f77689a4398602297835d08aa16e23a76dea9f75404ef"; + sig_s = "278d654a0b50c57d13f9c9c8c7c694001167f8e3b71491772a7427f1410fb6de518740c22e455e58de48846479b300cc"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353830323334303934"_hex; + sig_r = "c216cb4fe97facb7cd66f02cd751155b94fa2f35f8a62ba565aca575728af533540ff5d769b7c15c1345ab6414e15068"; + sig_s = "278a8a372b75d6eb17a4f7c7f62d5555c7357a1a047026bead52185cbcc01d73b80a1577e86220b2278da2b1ee8c983a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33393635393931353132"_hex; + sig_r = "9591c80453cffbcd0b8d6d20fce0cbb2a458e54aed7ba1c767e6c017af4c4aa07a76859c0b249f6692a3c9ace893f14e"; + sig_s = "893b567cd2959cd60557d3d6013d6e1741421a6edc5bc18244b3e8d7744e57928ce006a3fbd6e6324cb8ea3e5177e7e3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323838373332313938"_hex; + sig_r = "350b5515ba9785f149e2a566c14f4178757bb325179888f526f7db11161aedcd752551381316c2713f5de21d3d517af0"; + sig_s = "97d48a90c3bb3444736bec69db0649f82428b39238ada6048a0bead84f2f3b73816b48fed4d57b5f87a194ce4004ed7b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323330383837333139"_hex; + sig_r = "833210c45d2448d9a4d69622d6f2193e64c65c79d45d62e28f517ca5c68eef05a2e98b1faed4cc87cbdbec6fe6bb8987"; + sig_s = "b777b44cd30e6a049dc56af19a251d955c1bbab0c307fe12e9e5382fd48c173db0292f0b1047da28ee18518e11688eea"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313239303536393337"_hex; + sig_r = "7728ef10d9d5f3f32132716e6b403926929b05201700658d4b7f25a0692f153b8d666fd0da39888ab6234212659268d0"; + sig_s = "55df9466ee2c98225a2b0c4ff77622f9d11b4e48aa7f9279cdc2e245fdd9b9f4282106e25a458ff618bc3ca9422bea25"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373438363536343338"_hex; + sig_r = "552040701dba17be3b4d5d6e136ce412b6a4c50ce1ee53415d8100c69a8ee4726652648f50e695f8bb552d0df3e8d1c4"; + sig_s = "1374972b2f35b2fd86d45ed0c9358b394e271575e429ac8aa60eb94b9df7e755d9317fb259269e9d3b1db8d48d91dc7e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37353833353032363034"_hex; + sig_r = "fe6ef07056ce647128584bec156b68b8005f42d8c85dfb122134c488cc0e72cf8f06700417d7ff694b45e894ec23cbbd"; + sig_s = "7f5e33c5bfa697c144d440b32d06221f630a9ccaa8e9a0489490c04b86e8daae0e41d2466429b4b3cc1d37348e36cc0b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333237373534323739"_hex; + sig_r = "e009fc1a13d282bd37f10693350a5b421a0039713d29cb9e816e013c173bd1ec2bd6eb6bd88429023ee3d75d9a5ec06f"; + sig_s = "0b8bd481982a6e52355bcde5fe0092abac41f0543c31d1928b9a585e63e9520e24a65f46db2696e1b85a65c4e5240879"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373735353038353834"_hex; + sig_r = "acee00dfdfcee7343aeffa8514b11020c5435027887529d255bdbd45a90f160c68f05bd4b567daa8fa14e5807f5167a4"; + sig_s = "1c9fdf546190970aa33121a3043280669be694e5f700b52a805aa6101b4c58f0467e7b699641d1d03f6229b2faf4253f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3137393832363438333832"_hex; + sig_r = "8a4ee1e3bb251982475877d18763fafcf49ccc8b0fec1da63b0edccbb8d3e38608a2e02d0d951031179e12ac899d30c3"; + sig_s = "73cb62ad7632cd42dff829abfbfcb6165207e3708ed10043c0cdee951c7f8012432696e9cf732dcbadb504630648419f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333936373737333635"_hex; + sig_r = "3903b59f837ff5f41f42cbe3e2fc8e17d859cbb35386c4327d3947fb012b3629fea911c83cefdbd503aebbcc1114afd1"; + sig_s = "0e5be9094b5a22ade00c24644f476baad0f7741dfb2ce9644a1c45769404f8dccc522017c2b8cc630f1a0ef5fee99fe8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35393938313035383031"_hex; + sig_r = "7717ffc8d0811f357299423c56ec181c58f1981f5c1dd4f346f6a2ad71d3582e203a11e8609c1146ff3247a1820f832c"; + sig_s = "96c89ec707da3cd8b09084b065e3265327a536a974c4285155388011e348f2e7f005ae7e3e502732fc2971ac13fd72c0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3136363737383237303537"_hex; + sig_r = "a21519ce3533c80826f1e47fa9afde7096151144291134421990285a8d89a8c2d4afdadd547a923dcc17bfcdd0e9ffb9"; + sig_s = "40577245dd2e022c8ed8b5de7b8c26f31307429a7a64e5729311cc4128e3b486867e61b4a8a1cd0731792eb1466d08f3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323036323134333632"_hex; + sig_r = "a727addad0b2acd2942cb1e3f7b2917ca65453275198b06436a993bfc982d3f54620c395e253d57b8fe026efcf7252f9"; + sig_s = "7a19811aa4c12c45c3c041e7c614d0d98051ca7a0c57a9a107d552793ba1d0debb373525aafcc13ae1acd50a42a89adf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36383432343936303435"_hex; + sig_r = "22287277872d175d8a3ff5be9818658f845eb9c1b2edc093ae82a75aa31cc26fe1771b4bfbd4c320251388d7279b5245"; + sig_s = "b47d1833867e889fcfd7ac171855293a50aa6db24c6522e374fe87be12bf49b13c8b5e1455a2f25aa7912f799eebe552"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323639383937333231"_hex; + sig_r = "a0f41362009b8e7e7545d0f7c4127e22d82ac1921eb61bf51e9ea711e41557a84f7bb6ace499a3bc9ebca8e83728787b"; + sig_s = "1f6e0c15a3e402370885e2aceb712280ebc45b63986357765b7e54b06cd00db8308e4715c39d48d246030bf960e6a2ff"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333837333234363932"_hex; + sig_r = "4144e1c6ad29ad88aa5472d6d1a8d1f15de315f5b281f87cc392d66d7042547e6af7c733b31828f89c8a5dafce5bb9af"; + sig_s = "f5d0d81f92428df2977757c88ba67f9e03abd4c15b1e87fa1dd49e601a9dd479e7c3dc03a8bfea60fcfc1c543931a7de"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34313138383837353336"_hex; + sig_r = "5f177fc05542be6e09027b7eac5eb34f34fc10ad1429e4daaea75834de48dd22626f2bf653dfcc46234921d19b97406b"; + sig_s = "7def6c993a87560425f2c911046357c4b1c4c376bfa22bb45d533654fea6f565ba722147b2269ea7652f9c4af62ed118"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393838363036353435"_hex; + sig_r = "bd77a8ff0cd798d8f6e75dfbbb16c3ee5bf3f626dcb5abdfd453b301cb4fd4caee8e84dd650a8b4cf6655dea163788c7"; + sig_s = "ef8f42394469eb8cd7b2ac6942cdb5e70dd54980ad8c0c483099573d75b936880459c9d14f9e73645865a4f24ee2c4ce"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343739313135383435"_hex; + sig_r = "a02e2196258436da6a35a2f73cf6b08880f27757566ce80c7fc45f5dcbaec62d3fcebb784b4a650e24c1a997e4b971f7"; + sig_s = "f1195d2ba3321b6938e04169d7baf605001b6311f08a5e82157a7675d54993f2fd1e41f8c84fc437a1a139d2e73e8d46"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35303736383837333637"_hex; + sig_r = "686c5dfe858629125fdee522b77a9b9be5e03a347d79cb4c407f17fd25c97293cd99711f33e77814bd30d2453d3a86c1"; + sig_s = "509ac9b18c1b2b5a2b1b889d994b950743a988c2fcfb683e89211a43da6ee362c2e414d84fe82db1904b81701c257822"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393838353036393637"_hex; + sig_r = "83ce818ecd276432a8ddfe75406d01329e76d7586cd6f611c1fe1a0913ad80014c2156381942d58dd6356e44ccdc52a8"; + sig_s = "36a35983b97a9ae2a19cf05ba947dd880c973d5c78f9676ebbcb0b40d639124030c137236232f1fad15afd71c52ad8ec"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373231333036313331"_hex; + sig_r = "7cb78ebb712b5a2e0b0573d28440a5da36bd2338805d90ef3b0c1178ae613be8ae8bf548af4e7403e5a5410462afc2e3"; + sig_s = "8631a82cbdb8c2c7df70f012405f06ad0ab20d6c4fbceb3e736f40fdff1a8e5f6e667a0e77259f277494de84ec0de50d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323034313031363535"_hex; + sig_r = "85110fe21156b7764b91bcb6cf44da3eb21d162395071c216a13b5920d67a31aaa20dfc4669cf32c04964d0831bcdc29"; + sig_s = "e19187033d8b4e1edf7ab8eaaae1e13c80c0c4db51d921ccf62f424524cbd530d07de2cf902a0ecda5e01206ae61e240"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33313530363830393530"_hex; + sig_r = "0fd621a892ee5a3eb0bcb80f3184714a6635f568d92f41ad8d523887d5b82d2b930eb5ff2922fda1a3d299f5a045837f"; + sig_s = "1278725a607fa6f2fc7549b0de816fe2f88e3a1ec1ccaf9fb58e70a0f6646c2d7aad6e4f73d116e73096bdef231d0c89"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373237343630313033"_hex; + sig_r = "802cbe405d3ce9663b0b13c639aa27730b3377ce42521098ae09096b7fc5e7ac998b6994344e89abfb50c05476f9cae8"; + sig_s = "9aa7258c0dc4eff4b2d583575368301e2a7865cfaa3753055a79c8b8e91e94496a5d539181c2fd77941df50fe87453cd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3134353731343631323235"_hex; + sig_r = "859b0446949d7f78a0301ac4cc02b599a758fd1be006bf1a12570015869e59b9a429ce1c77a750969f49e291f6ab8994"; + sig_s = "99a812a1acc2c646814315cf9b6290d2232236cdf131f9590088e75a55786cdfc9d9027ec70056408ab55445fd79fe60"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34313739353136303930"_hex; + sig_r = "dbcc7ee9fa620e943193deae3f46b3142779caa2bce2df79a20639c8d01bce414a61f72764c1ec949c945320f5ee2a1d"; + sig_s = "1d9879787b880bd05db39bac07bfe3e7d0792932144e211e81f21da9621b83bff11bc52bcc7cb40cf5093f9bad8650fb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35383932373133303534"_hex; + sig_r = "7a1f9fbd0f6e776c3e3a3c798f5c0d9e20f0e2f3f4d22e5893dd09e5af69a46abc2f888d3c76834462008069275dfeb9"; + sig_s = "45e6d62a74d3eb81f0a3a62902b8949132821b45d8e6cad9bb3d8660451727cdf7b332a9ac7bb04604991312143f8a6a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33383936313832323937"_hex; + sig_r = "047962e09e1b61823d23726bf72b4dde380e032b534e3273db157fa60908159ab7ee4cadce14fd06ebe8e08e8d8d5a07"; + sig_s = "1892f65ee09e34ce45dd44b5a172b200ce66b678b0e200c17e424e319f414f8dfbb2769a0259c9cc105191aa924e48d5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38323833333436373332"_hex; + sig_r = "8f02799390ab861452cd4949942cbbcc25cad7c4334c4bc6146fbef8ad96c86f923fbf376d9ab79073e5fcb663f1ea91"; + sig_s = "ce15d9862d100ff95ad7368922eec3f6d7060ce412c01ff13870aa61626ee49edf39bb27005ecbe406bb6825f74c0438"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333636393734383931"_hex; + sig_r = "1879c4d6cf7c5425515547575049be2a40c624a928cf281250f8bdcbf47e9f95310d0992c9887dc6318b3197114f358e"; + sig_s = "e1116bf68320bade7d07a1a9651512d60b551af8625b98b5eb8ca222d4073ae5c140a80e5dbe59f073647daa00837aee"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313939313533323239"_hex; + sig_r = "31dced9a6767f39045472749baec1644ae7d93a810a4b60eb213c02c42de65152ffc669af96089554570801a704e2a2d"; + sig_s = "3022ecfbc88a72b9c50ef65344765b615738f2b3d420ade68cbf3ec40bef0e10c5cc43bcfe003bb6f17ec23802c40569"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35363030333136383232"_hex; + sig_r = "f4bdf786c61c5f1ce7568638ba9dbc9a134e27fc142003bf9870353980a8f4c2fbd03c8d0171e4048ef30db6fe15388a"; + sig_s = "d0e96768bc6adc91f93ae5704e86888853f479f32a45bfd436dc8a030603d233c56880124b7971362aa11b71315ae304"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383639363531363935"_hex; + sig_r = "ec0f635b7ce31988a07f41b3df35ca03c70e376bfb3b6ab24831a83be2121b9f9e93928b10a8f5fc0322bdb9edd406fe"; + sig_s = "66618ccb473c6dac3b14cfab6dfb24d219b37aec63425067c2c1c631d64a80b9cab6445f5a5439adb28bb99daa9234a5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36353833393236333732"_hex; + sig_r = "4f2bea24f7de57901e365d4c332ddb62d294d0c5fd58342a43bdd3ba5cbaf25adaddb5944bfef9dcc88f94d93650bbbb"; + sig_s = "0851b97ddc433e4521c600904970e2bf55aa901e1aaaaf06818377f84a28e033a49eebc21ffe9cff3cbefd0963fbed00"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3133323035303135373235"_hex; + sig_r = "72a9bab30f8da1437f17115cc37b6ef8cf6591ed934d596675ad7b000c6a74cca5f37210a68228a58023790e3726c357"; + sig_s = "12d697c4e20b18f63a3e0164dca8ca4a5fa0058ad7cd1c571cef356e85fd8f56ab7963d8aba824e8d31efb3e690c27b9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35303835333330373931"_hex; + sig_r = "33b7105f4cc98a1ea2abad45dbbe3761b4613ddd350e62da91560da694be3e84b1684f9a8ee4b3f556c61d02af544462"; + sig_s = "2c86e3a216dc7dd784cdcbf5084bdf6cdc1c7e67dbd61f9f6ed161fda4d4c26167e5b12731cf2b0cf5d9a5f0b6124939"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37383636383133313139"_hex; + sig_r = "252e3b5b60b8f80748b83623e30013723115cabcc48770c0ab6e7ee29c429ef1d9da78db3a9a8504133b9bd6feceb825"; + sig_s = "1ba740f87907cf6d450080f7807a50f21c31cd245dd30f95849a168d63b37628e8043c292ab7f130a4468eaf8b47e56d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303832353339343239"_hex; + sig_r = "b8694dbf8310ccd78398a1cffa51493f95e3317f238291771cb331f8e3a9753774ae3be78df16d22b3fbe9ad45bed793"; + sig_s = "daaead431bbdbf8d82368fbbd2473695683206ee67092c146b266ed32f56b31cb0f033eebf6c75118730eef7b7f96ba7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130303635393536363937"_hex; + sig_r = "d37ba39cd1b5289e7aa3f33afefa4df6821a07d3e8ee1c11e7df036c37e36214bb90264633d4c395644cd2cc2523833f"; + sig_s = "8b0d58ed75af59e2abbcec9226836f176b27da2d9f3094f2d4a09898136436235025208cf5444265af66fed05b3dc27c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303234313831363034"_hex; + sig_r = "b4ef419020c0dcbdeeeed76c255560f1ed783c0f9e7fcea4c08a0714b9d1f491fda9ae7bb1eb96d294b02799f8286129"; + sig_s = "8d987611063d2f28cb309a56eaf1ea65f27d95c97b77a5f037f2f914fed728267aaf62a37f3c7b44fc4b15125b349863"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37373637383532383734"_hex; + sig_r = "b2df7b11cf60ac93c078d19f37f889717aa5d9af1d00d0964f9e9f5257c3b51b3d3e47ca5b5aa72058ed63b52464e582"; + sig_s = "b524968ea8c58d379e38f4cfa9da1527a2acb26d605d22f173fcf1e834db0d7f031cb9245cb62b8458ff499b8d3decbe"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353434313939393734"_hex; + sig_r = "e0edc08b4122b75ebbd1635d07f0bb55771bda15573a5081da971955f9a63f6decdd4919911dbfea503ea8ed1faad93d"; + sig_s = "ca7850c74ce878587056206c590a1097d197a2090cfe3e057becfa2700c7a531623ae7331e163def693e26a97feb540d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35383433343830333931"_hex; + sig_r = "68f555eef5a323a929719bfd8cf81d6d8a977ecb35defd86fa54d8e5749c7b5f3e80087fbd39f8aa0cd29d8310bd6578"; + sig_s = "e2c2314a50fc0ad78c1ec02ea77ee2e13dcef1460957c6b573f721d72c209ac5fb529ab20397234c59ed44f60400971a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373138383932363239"_hex; + sig_r = "9e330e29f18123813e83b9c6abd68de96a57f97a4005b88d5b470a67a541b6d3af12124cf8658b751671c6698fb8b021"; + sig_s = "d210fba9bde6ef077ca06b75e1cf7ce8dd70b08e9dd42d81a215ef9272f1779ae3e9f0dec510571d87237cc6bf3203e8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373433323233343433"_hex; + sig_r = "483192056f753f64ddf0f21072b73d68893e6fa5432c981c7a1955b6592a6045a5c1c58c383e70023c34e09b7964ec8d"; + sig_s = "94b005d5f98c4fd2ad40ff8e03a8599f45e206082112f834df1d48502d2ac690cd3204f0078913794c9c39077ad6c58b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343036303035393336"_hex; + sig_r = "2b7ec14fd77c4b33230dd0a4e2710fbd307e469baec54b6f25daac7e196b7b4b5df251cdddba7bdc9836ca1319bb900b"; + sig_s = "590036192586ff66ae9a288199db9d02bbd5b703f8c329a9a1f986001b190f20ae96fe8b63681eda17bac2a57fd40f2e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363134303336393838"_hex; + sig_r = "2611484e7ff47dfaece4aa883dd73f891869e2786f20c87b980055ddd792070c0d0d9a370878126bab89a402b9ea173c"; + sig_s = "4e0006b8aabe9d6a3c3018d9c87eae7f46461187d3c20b33e975c850599ec1cb52c76e1f507e439afc43f9f682e7a8d2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303935343235363835"_hex; + sig_r = "2d504e38cdb1bb80bf29e07afbc66aea732accc85a722011069988f21eef685084f55efa30bfe32427eb8636db9171b4"; + sig_s = "883e3d80d766ccb29e73a9e929111930da8353ec69769785633fe1b4505f9051e78d50c79a6b7c885c10b160bbb57fb6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303038303938393833"_hex; + sig_r = "28dc1b63dc61ecde754ff4913780e486339103178e27d761987dac0b03c9bdf4a4a96b8680fa07fc47ae175b780e896e"; + sig_s = "5a9898eedf8781b9afeb506e0272a12c0c79bb893b8a5893c5a0a1bf4324d46dde71a245be2fd8aa2975fdeb40adf8f3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353734313437393237"_hex; + sig_r = "4c978a47b9e9449337178aa6413a794c4c9bf182a42062646a469b1d2c2c95621e818e661352b07e63254b6954e14598"; + sig_s = "6997345f05cfc05c0fd4d1dd133e555e5e5002e0929a59f60bbffc354234783ebf4fe5db10a870952cabd453635c1082"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383636373731353232"_hex; + sig_r = "36d8e2cfc80d0436e1fad3702ec05aa138618cdb745652cb85b0b121ee107bdf1ade0464dc0c6bd16875bcc364044d8c"; + sig_s = "898b8775c9b39aa9fd130b5ab77e6c462ced6114898045b7f606142277d9eb2aa897f24c9ba4c8d112111de04dc57c10"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363934323830373837"_hex; + sig_r = "ce2bdcf924caaa81e79bd7dd983dfeeee91652e4ea6edd077f8b56ada4953733a22dd3a6336446a648aec4ffc367cb3e"; + sig_s = "08eb09faeef4b0e5c1262eda2127464f7e2981ea1736e80afc7c622461c3d26fe08694fb4914ce9dbba83704e3077b3c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39393231363932353638"_hex; + sig_r = "e3a1b4b0567d6c664dec02f3ee9cd8581129046944b0e6650f6e6a41b5d9d4bf79d7a6fd54ea5a218492cfa1bb03ca07"; + sig_s = "986206925cbfa186c7d88f7100d87dd3b2d03b8789309a722d582f119eef48cd0ea5460917cf27246c31f90e28540424"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131363039343339373938"_hex; + sig_r = "95a5e29940e42099c4637f4ae51e7d1ec02be0dcfb0b627030984c35e477e80cc57e7eef970e384dee16a9b9fc8f2bf2"; + sig_s = "0ca166c390339653cde84e79a87e5ceb4f52c1a515a5878542fd82705b9983976fd31a4123b5d0bde95a0818114cf462"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37313836313632313030"_hex; + sig_r = "c30c49d0ba131944e2075daacb1259d5580a712a08f73d889c4d3d484d73dd9719a439a986f48b072c4595c507a01083"; + sig_s = "a5595c0691bc2d215f981fab513e3a88a452f2a1433367b99b02b6efe507519afedbe1ad0337899944e29c9ccccb2476"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323934333437313737"_hex; + sig_r = "9fd0585f8740669885c162842bba25323ea12b1d05e524bb945cad4e31538742eda5128f467b3c562c5f0a99019d3406"; + sig_s = "43acfadd03915c2350e1d8e514c47eb36f3c3456169c9a562a6262c1c2d7d33378bf9fec7f220239d5c61e06414414a4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3138353134343535313230"_hex; + sig_r = "4ecac0cdbf665c584f8a40614cd55d042706c54895b1de02984fe309122566c959a4dd3315e7d3f089879f8f45821336"; + sig_s = "09187da6587a3de90eba41f4e6510e711f4467f3122971566ecc39a4bd53e95b8a19380e20ec2a7c752d29de54fd2e8f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343736303433393330"_hex; + sig_r = "37a1ba49f11e97ad0ec47e687c6c6e94f794f874720c0dd2da501437b50e5b00fb6ed33adf7cf1f9c870fd3d37165bf7"; + sig_s = "b3ad08c9886b4ca1593a68938b67142c65ed4da1714c22204cba71300c094ccdbdf84c38a3f6d896db72ed5051a19266"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32353637333738373431"_hex; + sig_r = "a0abe896d2f30207bc9b21e75400eedb88d3498d49806f41aa8e7f9bd815a33382f278db39710c2cb097937790d0236c"; + sig_s = "9a29aded30e8ce4790756208d12044e18c34168608026000a883044dd0d91109d866b422a054c232810ddfbb2ae440bb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35373339393334393935"_hex; + sig_r = "b024fc3479d0ddde1c9e06b63c9bfb76a00d0f2f555220cb9a1311c2deec32eb3d6d2b648f5e8c104d5f88931754c0c2"; + sig_s = "767950cc149697edbae836f977bd38d89d141ff9774147b13ddd525b7a3f3a14a80d9979856f65b99a6faff173b5d6eb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33343738333636313339"_hex; + sig_r = "2a0ae7b5d42645051212cafb7339b9c5283d1fd9881d77ad5c18d25ee10907b7809740a510e65aecd61b53ba3a0f660a"; + sig_s = "4c0457dd19ef6e4d6ae65f45417ddf1a58c07663a86737d271becfa3ea5724b6018f1fa9e64fd08601a7dbd3957761d9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363439303532363032"_hex; + sig_r = "0c1657320faca6668c6e9f06f657a310b01939a7d9640fa0429872fe28bd1667688bc162221285ecfb14e8d80627450a"; + sig_s = "f5272aa08c321aa4f7e520825cc720f6511d635598c648d4d514669b3ad803ad259c799e195a095982f66c176435be21"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34373633383837343936"_hex; + sig_r = "d821798a7a72bfb483e6e9840e8d921200ef1976b7e514036bf9133a01740ce397c73fa046054438c5806c294a02c680"; + sig_s = "8c5d12887fcd945ba123fc5a5605d13a5a3e7e781ad69c6103577ee9dc47adc3e39a21080dd50304b59e5f5cf3f5a385"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353739303230303830"_hex; + sig_r = "c996bd6fa63c9586779f27523d5583135a594808514f98cc44cac1fa5cfa03c78c7f12f746c6bd20608ecbe3060eb068"; + sig_s = "27d40a11d52373df3054a28b0ab98a91ad689d1211d69919fc04cadc22ff0367d3ef9433012a760c1d1df3715c8d5cf3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35333434373837383438"_hex; + sig_r = "42dd6c8d995938701a538909ed6aeae0ba50c995138de84e195bbb9c56180e108d4a6274548c7be6e121c4d218d2d4a0"; + sig_s = "fae8668bb2003f0da1dc90bec67d354ccbb899432599c3198b96c5ca4bd2324c46998f4fb76a123467cf24570b1b6916"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3139323636343130393230"_hex; + sig_r = "061f185633291b9a768e15ec03a2b7c356c757b023b61e313fdf0c5349d128a78668d20b2561709b3bd8451b920f12ab"; + sig_s = "8fc5edc66410dbf20a7cbc3498e405761756ed39866856e74256ac1f255f62b0edff519762ecdbbc8395d14715c4388e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33373033393135373035"_hex; + sig_r = "69326e047c62e8bac5c090b76bf73ae652fa9a6aecfa1ccb8702f419094c9727511264fb1aeec00e425c7a0d746793d3"; + sig_s = "9dbddd22db4a77dbe16114bc6fbb981aecba7e82a9cbc1ed385e28a51793561770fb3f9696090efca24f268d8788f2c9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3831353435373730"_hex; + sig_r = "4ca1df89b23ed5efcdf601d295c45e402d786a14d62f7261104e4cb05b8cae17abb095799e71173841749615c829411b"; + sig_s = "1bb777e0a6fee8a2337a436a6fa26a487de4640ff97d57b44b55305989803863d748c7302f2dfde8b8cedd69bb602e2d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313935353330333737"_hex; + sig_r = "67be1b06f67172c503a5ac50582235d30bc9079eaa4cdec69a39c096310f8d99186cc9af7c8b4369a291d3e921d60705"; + sig_s = "ab645fc91f06b1ff7cc58fccf6f7cfac74db30d839748a78cb5f3b8fefc7a06f3b5ff0310a8580c6050bebb75eda972c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31323637383130393033"_hex; + sig_r = "d966442d6c29e5a4cc60e2374eccd373db3ebe405ee7c9664c4273100cd1899a1c58110487528616d8c5321dbf522764"; + sig_s = "9bb0e4a2c041a3b7b672029fe480d155f57671ecd6eb598660d025acce1f613d03cd6cff4a214131c8c7a8ad22df1397"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131313830373230383135"_hex; + sig_r = "08a84a2bc39b082ab82e6e45f088a36f1cb255f97ec8124eca929d4506d7dab63957c647994be2c2c7344f902de5b38f"; + sig_s = "0c9645e84a304ba0970ca5ce00b8c8a971fa0d0bcbec6a70134894c44d3075030ff04333ea3889f847a1ed769ee618ee"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333831383639323930"_hex; + sig_r = "83004b034202bbf51a327d32ed3ddf67b46eda9bac695a4422744a4bd99aaac3b3e8ed80ddac6538939c9385d6c8f616"; + sig_s = "7b4e61926cb9afa8cdaaf44909df6dc6449887d59fe2acac05f7684a235fa77179bdbcc69fd8f359e8eda19e5a5d4807"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33313331323837323737"_hex; + sig_r = "ad93375a1d374c41e5de268a8c08c205ff5652445bfe3ddf4ca77a70f5819f9f06db861d82fc9637946f0fe38457f2bd"; + sig_s = "4bc043acbc6a68d4824ed768af9476ad5b93e4cb3bbac284fb5fbd548ae3b96c265c6d1ef4588a3e2da21b124c0d6b12"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3134333331393236353338"_hex; + sig_r = "9e0d45d2dc93fd363dc919405818e39922f3f9dd0827bcad86d4ba80a44b45a6f60b8e593b580c91262b32859dbb1e53"; + sig_s = "eb9b8dfe5ba4a055a974f19b488f3a6fa07161006ac94eb1fe1c12dd0e20f3a7be38a37ce96d671183c5871249b2a3c5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333434393038323336"_hex; + sig_r = "7a5d04cd2fda59d8565c79ea2a7f1289ab79cae9fde060094c805c591a2534e4393e28c3fd858529bf17643846aceb83"; + sig_s = "8de0d8c0092fd02d554afe25f814744beaaa17c6946a6387ec7046b602db8a6c900246c2fb63fcef2ac8d9394444a0fc"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36383239383335393239"_hex; + sig_r = "a564eea0cdac051a769f8ff1e0c834a288ce514f67d138113727b53a1a6fc95ce237367b91f1b91b2f65d589adc8288e"; + sig_s = "182e5b47b6fbd8e741a04e809487ba5fcb8a5f2f1b9af6ce214128623a4768e38e6ddc958ff39078c36c04a314708427"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33343435313538303233"_hex; + sig_r = "6758867cd1ca1446cc41043d1625c967a0ae04d9db17bbb42fa9c076b3593125d63cd3e7471ee6cdba5235a21cec2f22"; + sig_s = "563db387adb537e1d89231d935ac790316925aeb29132b9f87bee91116c33bf50943fe39b671ce9535dca0a5d22bbfa4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132363937393837363434"_hex; + sig_r = "cde033e38d3f791db87d8a6907516bd8021acd47e897df683fda529d48050f8b5688f6361daf1b14bc3f45fc7f76150f"; + sig_s = "e14f4811a667c85335a4709a589ea46bac72055b794eaea92d28e834d5bc459c605fe4f27c1ab18d186d59e7d205cb67"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333939323432353533"_hex; + sig_r = "f2384468b55553c68f9764d8248cfd7358d604fa377ebb13828c43a8ebdf308fbbbebfa49a9458bfda957d2068d24e3f"; + sig_s = "1fdf4891d56e3e90c02b05c14c27c17f56f8e6aa144f02328c90109e1f70c9e3f582f0d299c44da505c543cc89c6a990"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363031393737393737"_hex; + sig_r = "b1ccafedcc21ba90b342fa23c0149f3d12a939ab6c3342b36ae61fddbdc753927a7c3e978bd780cf25cd78c8c5efe280"; + sig_s = "4c32a73f3157bbe2384095eb67726b9cd3c2623b98a182a3b4f00e8db933e1113b7ada2695a7d79b471026462b20e289"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130383738373535313435"_hex; + sig_r = "f3ed170e449758299ae55eb85244745e1876621c1f708e07e55c0d2d9ab5f9af9e0a8b3c7bdf8936ab3c9ebd1908e9dc"; + sig_s = "da62ccdb658868147286d7269bcbd4addb4dec9ea3d5d79fdbe0ccffa40d055170bddeb4ef4c5e0bc99fae5db62b4477"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37303034323532393939"_hex; + sig_r = "83455fc4629e7693c8e495fec2d29bb23bb6db79180fcfa83a4f9310d9db27e29297dee27ee80a71ab2f7a2d59f48b88"; + sig_s = "7736c056c8f2bb57e9fb6b8de0ab6d09879f6611e737634e7b6337aa5c5a01f515d5e3702dec9a702177c816e32bac67"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353635333235323833"_hex; + sig_r = "74961587cbe49bbf0a73fea82b8b2242f67b0ea09224774639f437c60378a36b2d511a9145d576b440dffd1f02286a8b"; + sig_s = "8fb95d46c22889085cc1d3e20bcfbcbc52f4532445f76f08efae2de8b56fe8525204643330dfd23cce946687a0aef046"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3233383236333432333530"_hex; + sig_r = "a3fd322330d0f0efccc54bd7d73c3159eb1bcca08cec369a4a08fd00f9ec6d482ced58eb08a0d7c2113bd5575de4917d"; + sig_s = "164e3232a628c40fbba1de82bfb9627cec78a8040cf325a5a8bb8f864c2ac19e3524ac93f4db5713ce62ba256176e05e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343437383437303635"_hex; + sig_r = "4c862ff9e4ff88f9a58e9fceaaf9bbb30740d3f6c8c6a69b5627fe234b144f8cdf09520735cfd708f5e341a78cc4873d"; + sig_s = "a861972514a0e975cf2da214125ec93288524cc77492ed63c516424278e5ec8d41724467cb7c3111fa34c69193abb435"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3134323630323035353434"_hex; + sig_r = "62225e4e492a9773397870336168960a66b9e50391ef7289cb2d3878f32252dc1b904f6682545e14564e415bd93e0117"; + sig_s = "9f4d0327f79e043505c691e361fa2e00f87f41324777eca6966f4bea2fa0858876aa01980b2cad7f66037524de49bf65"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393933383335323835"_hex; + sig_r = "450c65d2d88ba464eee3a5ce9310b519d5dcf608799fb2275eee987a67c2c4d7ac53716987cc5139c18c67ef07b1e207"; + sig_s = "1ee0439311a7bce1c4fed0a3152d1b354d96536c6ca0c9188ac1f1afcc5cd7305b5611ef0d19d8bd57c5059976dc5e68"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34323932313533353233"_hex; + sig_r = "aa2575fb5bea0effb5247d20c3d0165d575831840b5c18b0245a99a61b7ad5d7bf8a8cfcc375e095a84e781025bee3ee"; + sig_s = "9c8b7797ad330abc206060b28b6ca1c639d89f59582528bda1527e3ab081697a2ab576f9d09c2ee329dd73231667308d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34343539393031343936"_hex; + sig_r = "01fc45285aa2c2e50458199ade2ded0dd36b1de03e8969175be4a6f09f9719b195ded8d9eb4ea132d95d19a3528fd6c9"; + sig_s = "59609a358c5919fef4781061804d4d64a067edecdcfd14620161aae3ef2735095a558e4f8ae345040123f093e5f70af2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333933393731313731"_hex; + sig_r = "d8e1f6b19e5b92e36060e59e53eeb788a4758c2c8ee9519f3949d5f3315abafbe937b8ed44d47e886a07c107aa8ac9f4"; + sig_s = "12550574318371e5168d0a339f20fcacaec87db211bba4d4e7c7e055b63b75fd31790ad285f4cc061378692b0a248e34"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333930363936343935"_hex; + sig_r = "4815aec44a7a6b86ae87fc2556accd77832fa33a4710e02ec5ef6f41f68a910e6af4d173ae462a759bd98079b371bf5d"; + sig_s = "6e78d562f9e8be65e8d7a74a7305e5d6cf2f3c4c980f2b18dfb8e9c8b0134ec86548053b3d125e56d5872294d2d14ebc"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131343436303536323634"_hex; + sig_r = "d302f9db6b2d94e194412f0d40a135a554aee014bd939b3d7e45c1221ef7ce45c2aed875f9a2bc43dbc8264d92e444a5"; + sig_s = "04e7247b258c6e7739979c0a07282f62958ac45e52dd76a41d5e1aca31a5cda73d7b026d67b4d609803001cb661d74c6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363835303034373530"_hex; + sig_r = "889f0e2a6ae2ddcad1cde3f65b61d4dd40985917ba841b47a1f802491f5af5067722b7683df0fca7ee19d2b73724c8fd"; + sig_s = "1f989bac23b51c49e5d7dcc319eed2fc767e9b432bf75af92814d9e67a5d4b3398eb15e98b70527abbc029abc1bea524"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3232323035333630363139"_hex; + sig_r = "e69c70c679795ca7d2b66e2632529651c120055fa3cf25435fe8bb28987c02412ce73e6ca5ca7e0b42e9670c0a588175"; + sig_s = "edd8513bff40cdca9e22659238fbcea2de2caeef53c5287a515db9168b3008ec446c9b94f28a6e021c69bc6637fc4634"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36323135363635313234"_hex; + sig_r = "068cbecfd47bfd688f495df05e45fd5fced6d8e240605c5b2be5e69368740b694b9b1ea034af3180e571dd38a86369ef"; + sig_s = "1a1d2976f748d1621128013c61abda5398a3e24f0073d1a6e07a1e96c12be4f1e2e7b144f9b5a350500acfc5cb0698d9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature generated without truncating the hash + m = "313233343030"_hex; + sig_r = "0e2c56eb5f6612f0c2b22ab03d57d9a443075a2b7a0b460883e4f4876121e9b6f1ed67de20b79f028f7f66ed0281db71"; + sig_s = "3916b72b12d035a307b7c45a9878333a8c61445aad2330dc49a12b92e2e5dab72e53e5789f40afb90aea0ea4431f2dd1"; + r = false; // result = invalid - flags: ['Untruncatedhash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ca5ee479ad6624ab5870539a56a23b3816eef7bbc67156836dfb58c425fdb7213e31770f12b43152e887d88a3afb4b18", "2aceec92b3139aca8396402a8f81bb5014e748eab2e2059f8656a883e62d78b9dc988b98332627f95232d37df26585d3" ); + { + // k*G has a large x-coordinate + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68b"; + bn_t sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r too large + m = "313233343030"_hex; + sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe"; + sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "70e6a90b4e076bf51dfa01fa44de49b448f7afa0f3d07677f1682ca776d404b2a0feef66b005ea28ba99b6ce21d0ca12", "424f7d179951fb89156cdf04aed6db056c98592c651b5a881abc34e2401127fb81c64e90cee83269c5141f9a3c7bce78" ); + { + // r,s are large + auto m = "313233343030"_hex; + bn_t sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972"; + bn_t sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5a568474805fbf9acc1e5756d296696290b73d4d1c3b197f48aff03b919f0111823f90ea024af1c78e7c803e2297662d", "4c1c79edc9c694620c1f5b5cc7dd9ff89a42442747857cace26b6ebc99962ec3a68a8e4072226d6d98a2a866dd97c203" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "d1aee55fdc2a716ba2fabcb57020b72e539bf05c7902f98e105bf83d4cc10c2a159a3cf7e01d749d2205f4da6bd8fcf1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0088531382963bfe4e179f0b457ecd446528b98d349edbd8e7d0f6c1673b4ae2a7629b3345a7eae2e7c48358c13bdbe038", "009375c849dd571d91f2a3bf8994f53f82261f38172806c4d725de2029e887bfe036f38d6985ea5a22c52169db6e4213da" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "b6b681dc484f4f020fd3f7e626d88edc6ded1b382ef3e143d60887b51394260832d4d8f2ef70458f9fa90e38c2e19e4f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "080da57d67dba48eb50eef484cf668d981e1bf30c357c3fd21a43cdc41f267c3f186bf87e3680239bac09930f144263c", "5f28777ad8bcbfc3eb0369e0f7b18392a12397a4fbe15a2a1f6e2e5b4067c82681c89c73db25eca18c6b25768429cef0" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0e74a096d7f6ee1be9b4160d6b79baba4d25b4fb6fbdd38f5a9ed5cc1ac79943be71ede093e504c7dc0832daeb898a05", "00a8d005b30c894686f6ecb2bc696e25effaccd3c9e4b48122db567c0118a0b983b757c2f40082dc374f8f6117a8e76fc0" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a2ad0e27b40410d16077ddc5e415f109d328bf75e73a0f56876fef731285f83188b207a68690a40e76ed23e2c5e49fcf", "604f1c5d7d7df365005d40e209f4da7bb06f310d5a1660ad6236577fbb47955261f507d23b83013ffb951bd76908e76c" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "65825b7c85ee36e98a00fda722a70a7bca2981fb642084f896c1670107ca01f407f146251bf979724f2dcffe2dc425e1", "00bc10124ed3f2a4acd6d1e1f1a9b7bbdc196365f3b90c90d0085246eb0a336ceeef6469619b6a44c6cde3ade84bdcb664" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0097d213d98a6a6b4b1fb3d20533b333b8f3d9d38458e52846ab7893763e08a69464aebecfa64750bbd2736782d5fff413", "20a7c0bfb103d0f13ddc7858c219139de34698b30d19b894269c13ed79842edd91fdda3e94734c79bd4258561ff0890b" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0bfd55e9478130ae3dfaef83c7802a64701c3f3a4112a25de26a24e038036618a603a5cf784163c4f9511aed456a5661", "0098a0eba39541265c29def7f89dc8799599af95bce3006aa0841133d4fd63d06df461e00306f76ac7a64e95a779d9f7cd" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r is larger than n + m = "313233343030"_hex; + sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52976"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0b2e5e46bbbe09fe974f71dee41cfb484457edebd47c50022934e248e7713f4d7fcad531a3b71224b482406125a05e2f", "3ecf586ad81c48a8062845cbc1147b61225112c244b1b63d434068cff7712ac4a1375a0d252759c303c522347e062872" ); + { + // s is larger than n + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + bn_t sig_s = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accd7fffa"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3c9bb63607cdea0585f38d9780c9ac3e9a5a58153e2aacc4bc7a1d638d12e32c4d3a90c0c114b232c6f16e23e4bebb24", "00da2ac2ccedc5494fe534a9abaea3013de0176f1b0e91bcd62154bdf3f604091a5008b2466702d0e2f93e4a4b6c601a54" ); + { + // small r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100"; + bn_t sig_s = "489122448912244891224489122448912244891224489122347ce79bc437f4d071aaa92c7d6c882ae8734dc18cb0d553"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "559a66ef77752fd856976f36ed315619932204599bd7ef91d1a53ac1e7c90b3969cab8143b7a53c4bf5a3fe39f649eb6", "1f00f86dd8b8556c4815b2a01c59eb6cc03c97b94b6db4318249fe489e36ac9635876b1ca2ec0999caef5e1a6a58a70d" ); + { + // smallish r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000002d9b4d347952cd"; + bn_t sig_s = "ce751512561b6f57c75342848a3ff98ccf9c3f0219b6b68d00449e6c971a85d2e2ce73554b59219d54d2083b46327351"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0548e79a17fd3a114d830ea88f218ee1ef7aa3f8dc139e0a8b9b60e25049a816ef449e8bd5dae867446495fdf20f4770", "0363a1e8afefb02ebfd59df90b6d23ff7d5f706f9b26daebae1d4657ac342844ee9c2e0e9269f7efe7ab91e0303c115d" ); + { + // 100-bit r and small s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000001033e67e37b32b445580bf4efb"; + bn_t sig_s = "2ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad5215c51b320e460542f9cc38968ccdf4263684004eb79a452"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a0eb670630f9bbbd963c5750de7bcbae4ddfd37b13fe7690eec6861a3c56c8efb87dbbf85ccd953c659d382c3d7df76a", "00fb08840635a16ac7ecf3de2dc28a77c8af9d49e5a832551e3354a2b311e52be86720d9b2fbb78d11a8aec61606a29f0d" ); + { + // small r and 100 bit s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100"; + bn_t sig_s = "77a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "254bce3041b00468445cb9ae597bc76c1279a8506142ce2427185b1d7f753d1c0aad94156b531a2071aa61c83ec842a3", "710d6c8c96766ae8b63396133e5872805e47d9ba39113e122d676d54dbb2460b59d986bdd33be346c021e8a71bb41ba9" ); + { + // 100-bit r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000000000000062522bbd3ecbe7c39e93e7c24"; + bn_t sig_s = "77a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009129db4446c2c598c4f81070f70f66c37c39323e01418c095de9902e0e1b20f26bc3e011ba84c10626ffdce836690c9f", "008e4a104fec4aaa4350c238617ee50456accc49efc3b73eb9548e1600c2483f1c4bae9ddf3ff92af17afd19f86274589c" ); + { + // r and s^-1 are close to n + auto m = "313233343030"_hex; + bn_t sig_r = "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f3"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a5d6896125b332992cdbd8ad948ff1242d5f13a22712715735801acbb8942547f03e3b0afaf8b82c3b5e643b5f17e40b", "00cdfbca7338f6ab3b2e6e9061944063aff32d704cf8aaa0da261b93375a8ea7feb0490c7a1e77199f1b00273c2311c11b" ); + { + // r and s are 64-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000009c44febf31c3594d"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000839ed28247c2b06b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6a50284270976040d1220218b75ced142e26e820f46c91307f05dfa4ff0972ab8099679623d7e2872d712fde8e9ebfd2", "00b8233055606a0bd53752bcdb43306abdd67839eaaf5b41d585404d2e2b7ac1ee7cab5d4eadc9e592ba73b44095799be0" ); + { + // r and s are 100-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000009df8b682430beef6f5fd7c7d0"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000fd0a62e13778f4222a0d61c8a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5219117ecd2995d6b740e1b036e73415e131f816584105aebe9d17b870a8b660d64fe90446caff673fdafd54ab93086d", "00b8690fc241f3ec981e77de6761fa8a4fc3bba9b95421011eb7bd736fe1fd2b52fa892793dab7d76bdfde99e7b9882bc9" ); + { + // r and s are 128-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000008a598e563a89f526c32ebec8de26367a"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000084f633e2042630e99dd0f1e16f7a04bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "733ffd3c9ec93fd00cde0ca95a6ef8be688da4a6db9a3d2eb04626407d24edd0112cda1a3259c526cd09ee1c91481093", "3f58096e7bfc680f0cafc632064be165c315a2fee3dbb0870898c69ad63aebb74b916aaf7cfa1432696a8d6f71eeafbe" ); + { + // r and s are 160-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000aa6eeb5823f7fa31b466bb473797f0d0314c0be0"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000e2977c479e6d25703cebbc6bd561938cc9d1bfb9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a701a8111cdf97ced74a00a4514b2b526be8113e7df6cf7163aaee465880d26275b833b186d80f1862dc67ff768dde43", "00e5a991f16f8f777311b17eabdc90b6ece3b5da776cfbebbc504382ca1abae1c6aa6a64d9c41110d97950514e99578ed8" ); + { + // s == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // s == 0 + m = "313233343030"_hex; + sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e612db39a8729a85c937a41e1fcd770cdd6489e209fdda6ab0630b9c44209d6cb1702f5498aa90e05ac99925426dda32", "7eeaf17d8574e781c091fea1e078fd17f82c2c451a6ac11a137f3a81b763a0a42c9f6905691a9c2fba28cabe670ff8d4" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "427f8227a67d9422557647d27945a90ae1d2ec2931f90113cd5b407099e3d8f5a889d62069e64c0e1c4efe29690b0992"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a90271cd61b20ccbac718c99c175f6383acf6ac89ce4cd548338346d1774ece7ad501b4af6802c08236d7be4a4ea3b37", "4f449063c4e74600828b6f4e372633b5c5ac8493476979a9af58d4111ff2b8ac62e191e415a49d4dc209432e9f5dd507" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "369cf68bb2919c11d0f82315e1ee68a7ee8c17858bd334bf84536b2b74756a77e4eee10ecc5a6416a8263b5429afcba4"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008b326acd923571636a8f4202869ae942407eafc1362d06dcd1b4665b00b1f9a94a4bbd45653443a638d952d70879abbf", "00bd8e6393772edb0d245c008c3fa8ea3af4299bd6c4b073afbac6bb43bf3332855c035492f6608a075ed567ed422582b5" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "2111832a45fc5967f7bf78ccdfe98d4e707484aad43f67cf5ac8aa2afbde0d1d8b7fe5cfc5012feb033dffdec623dfbf"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a1e8b1972502dac2049f0e319b6185d799d08f1e806c162e3fd135c12177008a1aeb9fc5fb81c0ec71dbbfed300a27de", "00e29a49d89b68642e11b83c58a521b761b44f1e41c557919a528e2866fa6a7019365729a8418824592859e7c64e454fc2" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "20cd002ab7dca06b798fecef3f06a222c2d2a65e9ec92f74659a8d82fe7d75e9af739f0b532e17d6c5f622c4b591442b"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00870649ff8d3a7a14f6952be825beb0711483bffdceed1f556be0b29c4e62d73238f19507038687a69481b7ae37c4c754", "1de0fbcd8cb50014d338d1c83cb4d2f901450af7f435fa6790bbcb66ea87db25fb8ba878c00bb88e20c379576b6d3e8a" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "3276fe55314e426a8ed83c4c38dc27c8fe8cbba0b39bad7cfc35e963adf10ab37251ea6829b8d255a77dd0b655cf9ff8"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00dee7e74e4eb4b7b064ce3ee571fe8c5b79c12234c63193e8efe4466a07c601dbd260d33d3ed36adde0e8e33aa98f1ae9", "00c4817f36e6b2c98e6807c37d93f4903f65283ef372da1a8cb837d2727e6476513b36e1b2c1aae9a6af4d05666bdbb97a" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "1a80b4a3d6c88775821e26784463080eb7de510762ab0d98223e532364c7089b07af73746ae4cf076c5277dcc80cf8c2"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009a2141e20e0f5f4a2ac77c20115c29d39fe510acceadcd8750bbfae9f9ad68c8671b6505d2baf770d1e4fd5f314d26fd", "27477d03efa31a797e42835f867b89986523ca02063fb1d8854f57dbecb69352834caaeb272bd7d59a42bf08e33998ce" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "74e780e38b3a7cd6cfe17d5c9ac615895bd97dd4076b5f8218ae758b83d195fba64eb9aead39a790ca0f8b8387376265"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e7fbcf59900e281e939172f1ea7a4ac9e5c6bb9f30f15f8379b15d739b302293ba8ec4ceec1a6ddf6605bcb25f2a8e2e", "00c06626028702ee8f45fedb501cbd47e16235e1e4386eadea5661ce71cd200876e7d0a467ce6104eaf8e526ad67a41d51" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "6ee5f8daae12c862e1f7f8b59294ac90448c4461e29b36ed623a719dd69bb17b3a4b7c29b9eb5c39ca6168bf6b597c6a"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7134832af3c609b17b40641039152600d9b318b3a41578f26106a4e97443b0d204bca2dff9aa4ca0d9b86a6192fc2c91", "2407202d2a51192674661b402d8957197c439e65b2b20b6631f5b771696da43099c29a1002b71bf99437eb5413fd9d50" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "5426ca20a25b0cfb1ef230c62f91e98005f346e229233f1803e8944bf421fef150a4a109e48cefaa4ea23eea627fca41"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d3bc62d583ad855a35ae39f4116ba97ab2f25157c55075d177a083912fa749500e9ba7b2801fa8529817c66d9ae8bc33", "4f2db63f152c5795a2aa623a999aed8628ea305161b90bcf0c43c1757534c6472f683c9ec310b3e15c1beb8d4937fb84" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "39fd1a0ae3964735554c61daf085c66bcc2e9e5350131086023aa99549fc5f9057c848e75a1b8e58069fe0b9b23fa3c9"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "26bf1d7f97f412d6e940565a881eddc1b026569265f02cd415e82fbd4190da9a86c79f9ef221f1f95368e57ab0ecd2b3", "76e2ffd121f572c21fc83261361aaa716dfe9b6f1fb48fd7fbbde14d284fcb723b3f6252bf34a3c92171e86ab0c24948" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "707a37cfb7367c2e551ea1f0caeac6c0fdd2b562e1bd8f1c7c51a5dd78f21da8cb179bd832cac3d3aee21fda54729e66"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00f31fdd34ed4e15da354326e13ae48005d0166b1a3db26cd6b9d62c4d7db29c450091d15093828dc4543ff578ca198c84", "1f5f7ceda1a4a3b8dbbc1bc4a60d98d748418c7bfee7cd418243ef5d8c346b0f825d2b1c06084d67b7471167921dec05" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "15c99e2ae11f429e74fe2e758bc53ffea26eb6368dd60d10daf860f9c79fa8cc6cb98fee9b87dd38353e970539a50a9e"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4bb7245b1960c5ef4d9670242b6e0478162644cc3416543b9dd79c04e57a90f981aa48bb110edd54c657056f7fd9cd46", "61524656f1aa505d7f53497165cd63e7ab8727760955f87e66fa627543d156423577109e8e2aace4bd57ad87efd51946" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "148c732596feaabb01be1be3a220740e84bbfabe6d82ad0db1c396fa047603beeb95a1cd37fc708a9451d3cc29a45b32"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009ed91f3bd77cafc98d2152f5a10e947af87c4863359877e178ec977050f5e289322469d439506eed00bad84eaf79f03c", "4956440e4f468ccd298dee1b41aec2829da1b33f33e39624e659b6a831b06593e4365707b8d66fecfad0fc7beab3b15d" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "6b3cc62a449ae5ef68bec8672f186d5418cc18d039af91b45f8a8fae4210ef06d3f0d226f89945b314d9df72e01a02bb"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ea03e9823cc5e5a4891651b2c56fcd7e2e357e21835f559f7a8800dee1cf6b70a7051193b4c00b948444a3f127bd4a3f", "00f7bfd49aa2fa48827364851480d22c92070bed72f1aa9a3d12313b6ec9ba8f028f660e10150e7abb0bdb32fec5f3e4d0" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "7db7901f053b9cefacfda88dd7791c01fd569ed9a5243385eccae12ba992af55832a2e5dc8065e018399a70730035bd8"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b6815ba05413bcf34f4c0704af590c1998d7fcd169541e1efe1567ca1dd71a22e35ac838b20c75281582044a57b58f45", "6cdceb10612062779abadd8742c6e93ed74adf306f3b3a0f96b70dd1134b7558b64b55b200c5732c50f05aa032ae7c00" ); + { + // point at infinity during verify + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = false; // result = invalid - flags: ['PointDuplication', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1af19841ff3df8bdc4f8cce957e0dab763efe413929b279f1d46dde1c6f2bbc55af1bb1d8011fc587a4d599a4ae7cd8d", "5f663860c43c88e08399f00ef6641123787956a2b7012883b5ff7c46bd156d96d3c02a63ef86e060a2a0fa5b80d0c0e5" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6836084fddfcfd527cb3847fb8b911c0fa002537fa460ca8f5d40f025603a4d89aa6ec640fde0cc4b31c46239a1d0bb7", "6beed7019892e87287e23f0d35093ab14c4d41c0efe8463ede3494230a384eb1bc410de918c5484a25640741acb8cc0d" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294ba"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b4b2d5a8b50ffabd34748e94498c1d4728d084f943fbddd4b3b6ee16eaa4da91613a82c98017132c94cd6fe4b87232f1", "6d612228ed5d7d08bf0c8699677e3b8f3e718073b945a6c108d97a3b1433c79052b2655a18a3b2e621baa88198cb5f3c" ); + { + // u1 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158ca"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00842b3d89e54d9a4b5694d9251bba20ae4854c510dc0b6ef7033e4045ba4e64b6ddcd36299aac554dbac6db3e27c98123", "00868258190297e1d6bae648a6dee2285886233afd1c3d6f196ad1db14262a579d74cf7855fffc65f5abd242b135ae87df" ); + { + // u1 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "bc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d322ff6d1d1162b5de29edcd0b69803fe2f8af8e3d103d0a9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009ab73dcfffc820e739a3ed9c316c6f15d27a032f8aa59325f7842cf4a34198ac6ff09eb1a311ce226bf1abb49d808511", "0135f4b0c2b6b195da9bbe1993e985b8607664f1a4b3d499ea1a112b6afc7e6b88357c9348b614ddfdc846a3f38bbdca" ); + { + // u2 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "28771b137fb7d74c0ed0290416f47c8118997923c7b3b717fbbd5308a4bb0e494714bd3f1ff5e9e368887377284272eb", "00f92e5df476a2fa0906ce4fad121c641abb539ab4ef270cd8f0497cc3e6e05b18561b730670f010741238a5d07b077045" ); + { + // u2 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa84ecde56a2cf73ea3abc092185cb1a51f34810f1ddd8c64d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009d1baad217829d5f2d7db5bd085e9126232e8c49c58707cb153db1d1e20a109c90f7bcbae4f2c74d6595207cb0e5dd27", "1eea30752a1425905d0811d0f42019e5088142b41945bee03948f206f2e7c3c1081ba9a297180e36b247ee9e70832035" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "c152aafea3a8612ec83a7dc9448f01941899d7041319bbd60bfdfb3c03da74c00c8fc4176128a6263268711edc6e8e90"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008e39e1e44f782b810ea93037c344371c4fb141c8bf196ea618f3a176547139a6d02121d2794cbe6481061694db579315", "00c3184e8cd9b6c16b37699633d87f5600654b44cbcb5ab50ba872dfa001769eb765b2d1902e01d2e8af4e1fd6e9c0f30f" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "4764eeac3e7a08daacfad7d1e1e3696042164b06f77bd78c3213ddea6f9fd449a34c97b9e560a6bf7195da41333c7565"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b96fca0e3f6ebf7326f0a8ce8bdf226a2560c22526bf154f7b467010f3a46baca73414070db0f7ab039f345548452ae2", "6f7b744274e9bd6c791f47513e6b51eb42fea3816b3032b33a81695f04d4e775be06484cf7e6a69cba8bacbcb597b3e3" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "cb4d5c0ff0abe29b2771fe9f179a5614e2e4c3cc1134a7aad08d8ec3fd8fcd07fd34b3473ca65ead1c7bb20bcf3ea5c9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4fd52b11ff747b59ef609e065a462cd85b73172d20f406fdd845d4eaa3ec173e06ee58a58e1810f051b275bbaa47ccb4", "0084d2382b9e72c526dc3764a11a4a962a7a4c7355e6f057fc976ab73cc384f9a29da50769809ecbf37358dd83c74fc25f" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "6e441db253bf798dbc07ff041506dc73a75086a43252fb439dd016110475d8381f65f7f27f9e1cfc9b48f06a2dfa8eb6"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7d123e3dbab9913d698891023e28654cba2a94dc408a0dc386e63d8d22ff0f33358a231860b7c2e4f8429e9e8c9a1c5b", "00e7c95d1875f24ecdfeffc6136cf56f800f5434490f234f14d78505c2d4aea51e2a3a6a5d1693e72c4b1dd2a8746b875a" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "41db253bf798dbc07ff041506dc73a75086a43252fb43b63191efcd0914b6afb4bf8c77d008dbeac04277ef4aa59c394"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "608ce23a383452f8f4dcc5c0085d6793ec518985f0276a3409a23d7b7ca7e7dcb163601aca73840c3bd470aff70250bf", "674005a0be08939339363e314dca7ea67adfb60cd530628fe35f05416da8f20d5fb3b0ccd183a21dbb41c4e195d6303d" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "83b64a77ef31b780ffe082a0db8e74ea10d4864a5f6876c6323df9a12296d5f697f18efa011b7d58084efde954b38728"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "48d23de1869475a1de532399da1240bab560eb74a6c7b0871bf8ac8fb6cc17cf7b34fcd7c79fd99c76c605bdf3fcbe18", "00e15b66ab91d0a03e203c2ff914d4bedc38c1ec5dcd1d12db9b43ef6f44581632683bf785aa4326566227ece3c16be796" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "53bf798dbc07ff041506dc73a75086a43252fb43b6327af3b42da6d3e9a72cde0b5c2de6bf072e780e94ad12dcab270a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5d5eb470f9c6a0bb18e8960b67011acf9f01df405ac5b4bf9f4611d6a8af1a26b11b0790e93ae2361525dde51bacac94", "00d42ce151793b80cee679c848362ec272000316590ebc91547b3b6608dfbade21e04de1548ebb45cc4721eb64a16b8318" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "24c53b0a00cf087a9a20a2b78bc81d5b383d04ba9b55a567405239d224387344c41cceff0f68ffc930dbaa0b3d346f45"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1da34a149ed562c8ec13e84cb067107bc28b50bfa47575d5a9948cde5a3d7357c38ea41fcfcdd1ab1a1bd9b6592b33d9", "00e14aedfd0cfffcfecbdc21276e6a2c78b8729412c48339ae538b799b7d8e61163047a64cfcec9018aa00f99ae740e3f3" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "c600ccb39bb3e2d85d880d76d1d519205f050c4b93deae0c5d63e8898ca8d7a5babbb944debe0f3c44332aae5770cb7b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008b8675211b321f8b318ba60337cde32a6b04243979546383127a068a8749cb5e98c4231b198de62a2b069d3a94d1c7b1", "009d33468a130b4fef66a59d4aee00ca40bdbeaf044b8b22841bb4c8ba419f891b3855f4bddf8dae3577d97120b9d3fa44" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "3ead55015c579ed137c58236bb70fe6be76628fbece64429bb655245f05cb91f4b8a499ae7880154ba83a84bf0569ae3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "442766bdb8b2cf4fef5f65d5d86b61681ec89220c983b51f15bfe12fb0bf9780e0c38bbcc888afb3c55ee828774b86f7", "56b7f399c534c7acd46be4bc8bb38f087b0023b8f5166ab34192ca0b1cad62d663aa474c6f9286c8a054ef94ea42e3c7" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "de03ff820a836e39d3a8435219297da1db193d79e359663e7cc9a229e2a6ac9e9d5c75417fa455bc8e3b89274ee47d0e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "11342b314f31648931abb897c1371dd3a23e91f2405c4a81744be18e753919752208779de2d54e865eeefbb0bfb4998a", "00f533d7a4d6fc6cb5cb98915ce08d0f656e37a502e78f8c1b8baca728c2ecb05a2156f01cff16595b363cdb49c00c1aa2" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "e5a6ae07f855f14d93b8ff4f8bcd2b0a717261e6089a53d54bf86e22f8e37d73aaa7607cc2ab831404b3e5bb4e01e79e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3c96b49ff60ff05951b7b1aca65664f13128b714da620697ef0d90bfc01ef643baa5c608f16ca885038322a443aed3e6", "169a27f2ea7a36376ef92a900e5389a7b441fd051d693ce65250b881cfdd6487370372292c84369742b18106188b05c0" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffed2119d5fc12649fc808af3b6d9037d3a44eb32399970dd0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "388dae49ea48afb558456fdb1d0b04d4f8f1c46f14d22de25862d35069a28ae9284d7a8074546e779ad2c5f17ce9b89b", "00b353298f3c526aa0a10ed23bcb1ed9788812c8a3a6cbea82a3d9d8d465a4cca59dbd3d3d8a36098d644f1b45d36df537" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "79b95c013b0472de04d8faeec3b779c39fe729ea84fb554cd091c7178c2f054eabbc62c3e1cfbac2c2e69d7aa45d9072"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c85200ac6411423573e3ebc1b7aea95e74add5ce3b41282baa885972acc085c8365c05c539ce47e799afc353d6788ce8", "68cfce1eb2bfe009990084fb03c0919ab892313d7a12efc3514e8273685b9071892faefca4306adf7854afcebafffbf4" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "bfd40d0caa4d9d42381f3d72a25683f52b03a1ed96fb72d03f08dcb9a8bc8f23c1a459deab03bcd39396c0d1e9053c81"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e63ae2881ed60884ef1aef52178a297bdfedf67f4e3c1d876ad10b42c03b5e67f7f8cfaf4dfea4def7ab82fde3ed9b91", "0e2be22bc3fa46a2ed094ebd7c86a9512c8c40cd542fb539c34347ef2be4e7f1543af960fd2347354a7a1df71a237d51" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "4c7d219db9af94ce7fffffffffffffffffffffffffffffffef15cf1058c8d8ba1e634c4122db95ec1facd4bb13ebf09a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e9c415f8a72055239570c3c370cf9380cdfabb6ebdbd8058e2fc65193080707895ea1566eeb26149603f4b4d4c1e79d4", "0096ae17a001424d21eae4eaa01067048bcd919625fdd7efd896d980633a0e2ca1f8c9b02c99b69a1e4fa53468a2fe244d" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "d219db9af94ce7ffffffffffffffffffffffffffffffffffd189bdb6d9ef7be8504ca374756ea5b8f15e44067d209b9b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "637223a93dd63af6b348f246e7b3bcb30beaa1dcc888af8e12e5086aa00f7792fbe457463c52422d435f430ad1bb4b21", "00f9a1e01758d1e025b162d09d3df8b403226ed3b35e414c41651740d509d8cf6b5e558118607d10669902abebda3ca28d" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a433b735f299cfffffffffffffffffffffffffffffffffffdbb02debbfa7c9f1487f3936a22ca3f6f5d06ea22d7c0dc3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7f4dc23982ecc8b84f54241715c7e94e950f596ce033237639a15fefa5eb5c37cb2e562d6d5b3051ea15600e3341a565", "00fed2b55b89d2793321374887b78827ee4ca2216eac2993b1b095844db76adc560450135c072ac1a2c4167520237fbc9d" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "b9af94ce7fffffffffffffffffffffffffffffffffffffffd6efeefc876c9f23217b443c80637ef939e911219f96c179"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a0ae8c949f63f1b6a5d024c99e0a296ecd12d196d3b1625d4a76600082a14d455aab267c68f571d89ad0619cb8e476a1", "34634336611e1fd1d728bcea588d0e1b652bbca0e52c1bfbd4387a6337ff41ce13a65c8306915d2a39897b985d909b36" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "a276276276276276276276276276276276276276276276273d7228d4f84b769be0fd57b97e4c1ebcae9a5f635e80e9df"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7cad1637721f5988cb7967238b1f47fd0b63f30f207a165951fc6fb74ba868e5b462628595edc80f75182e564a89c7a0", "00fc04c405938aab3d6828e72e86bc59a400719270f8ee3cb5ef929ab53287bb308b51abd2e3ffbc3d93b87471bc2e3730" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "73333333333333333333333333333333333333333333333316e4d9f42d4eca22df403a0c578b86f0a9a93fe89995c7ed"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2024ecde0e61262955b0301ae6b0a4fbd7771762feb2de35eed1823d2636c6e001f7bfcdbc4e65b1ea40224090411906", "00d55362a570e80a2126f01d919b608440294039be03419d518b13cca6a1595414717f1b4ddb842b2c9d4f543e683b86a0" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "7fffffffffffffffffffffffffffffffffffffffffffffffda4233abf824c93f90115e76db206fa7489d6647332e1ba3"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "40c5f2608956380c39695c7457ddce0880b5e8fab0a9a3726d0c8535b2ff6ca15814d83ed82c0ab33aba76e05e5c0476", "00c9d15a2a0b2041237ff61c26519d1d74b141d7a4499fbdefc414a900937a8faf6ef560550c73cdb7edfe9314c480bb2b" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "3fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294bb"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "74acdfd2ab763c593bca30d248f2bf26f1843acf9eb89b4dfcb8451d59683812cf3cbe9a264ea435912a8969c53d7cb8", "496dcb0a4efed69b87110fda20e68eb6feed2d5101a4955d43759f10b73e8ffc3131e0c12a765b68bd216ed1ec4f5d2f" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"; + bn_t sig_s = "dfea06865526cea11c0f9eb9512b41fa9581d0f6cb7db9680336151dce79de818cdf33c879da322740416d1e5ae532fa"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00da35d6a82818ae5254cb65fc86ac42a47873ab247a5ca664e9f095e8de9a57fe721860e66cbc6bd499431a48a3991734", "00945baab27ca6383737b7dd45023f997aff5e165f0fd7d8e5c0b5f9c5e731588af2fe5bd8976a0b871c132edf21f363af" ); + { + // point duplication during verification + auto m = "313233343030"_hex; + bn_t sig_r = "b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60"; + bn_t sig_s = "e16043c2face20228dba6366e19ecc6db71b918bbe8a890b9dad2fcead184e071c9ac4acaee2f831a1e4cc337994f5ec"; + auto r = true; // result = valid - flags: ['PointDuplication'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00da35d6a82818ae5254cb65fc86ac42a47873ab247a5ca664e9f095e8de9a57fe721860e66cbc6bd499431a48a3991734", "6ba4554d8359c7c8c84822bafdc0668500a1e9a0f028271a3f4a063a18cea7740d01a4266895f478e3ecd121de0c9c50" ); + { + // duplication bug + auto m = "313233343030"_hex; + bn_t sig_r = "b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60"; + bn_t sig_s = "e16043c2face20228dba6366e19ecc6db71b918bbe8a890b9dad2fcead184e071c9ac4acaee2f831a1e4cc337994f5ec"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00820064193c71c7141fe41e711fe843a7474be6b05f50cb0be411cdf7fc78ea7ec96aeb3991ef7646bbde59152d381a32", "631c5adf93d488b45e67cc9890d8e779f63960193dc16bd1cc136b3e28cf499dfa8e7bff482a0115e6083987f7c042fc" ); + { + // point with x-coordinate 0 + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "52fabc58eacfd3a4828f51c413205c20888941ee45ecac076ffc23145d83542034aa01253d6ebf34eeefaa371d6cee11", "009f340712cd78155712746578f5632ded2b2e5afb43b085f81732792108e331a4b50d27f3578252ffb0daa9d78655a0ab" ); + { + // point with x-coordinate 0 + auto m = "313233343030"_hex; + bn_t sig_r = "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + bn_t sig_s = "0033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a8fdb1a022d4e3a7ee29612bb110acbea27daecb827d344cb6c6a7acad61d371ddc7842147b74a18767e618712f04c1c", "64ac6daf8e08cd7b90a0c9d9123884c7a7abb4664a75b0897064c3c8956b0ca9c417237f8d5a7dd8421b0d48c9d52c7c" ); + { + // comparison with point at infinity + auto m = "313233343030"_hex; + bn_t sig_r = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + bn_t sig_s = "33333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00878e414a5d6a0e0d1ab3c5563c44e80c3b2ef265f27a33ed5cac109ad664c1269beae9031d8d178cbfdb1bfa7cc3cc79", "00fabbb2b6f7ce54026863b0f297a4fe3de82d5044dacafede49d5afc60bc875f4b659c06c19bb74c7c27351687f52b411" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008faa8497ae3006b612999b03f91f7884d95543a266598e897b71e44ecfd9abd7908bfd122bb366c016a577cb1b2e2e41", "2bb1a719289c749804ca677d14c0900fab031da8c70724723a0d54e3a0035da7dcddeef6fce80df2f81940817d27b2b5" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c59cc648629e62dc1855f653583da0ace631e0f4b4589b7fe5cc449e12df2dceeb862cae00cd100233b999af657ae16c", "00b138f659dcc8d342fd17664d86c5bddaa866c20b0031f65c8442a0ed62b337d09adb63a443ab14e3587b9299053717f9" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "6666666666666666666666666666666666666666666666664fc15233fb49458c89a4057a8379dc9791f80a2ab84edd61"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "386bdc98fe3c156a790eee6d556e0036a4b84853358bd5ab6856db5985b9e8ea92e8d4c1f8d04ecd1e6de4548bf28821", "5503292c2c570f57b42f2caf5e7ab94d87817a800b2af6ffcd4f13e30edb8caaf23c6d5be22abea18c2f9450ad1a4715" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "99999999999999999999999999999999999999999999999977a1fb4df8ede852ce760837c536cae35af40f4014764c12"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "294c37b3ec91a1b0500042d8b97bc9619d17f784a9ea528c0602d700783bfbac9ac49bff1e527b39bb2a49d1dc3abd47", "1e798679b7c58f4dfa33cfe40bb62e7df6d2f190b0f3804c700fa19eba28ad7fd6edd7e3a754af852921c2705f444f0b" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6aae76701acc1950894a89e068772d8b281eef136f8a8fef5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00bac7cd8a7755a174fab58e5374ec55a5ce5313235ec51c919c6684bd49305b7005393f72bc4d810ca864fb046d2c8341", "5a33b77f4145680bde63b669ea1f10f3ee1836018c11a6f97155d90827c83dbac388402ac8f59368ddaf2c33548611af" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "08d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61"; + bn_t sig_s = "0eb10e5ab95f2f26a40700b1300fb8c3e754d5c453d9384ecce1daa38135a48a0a96c24efc2a76d00bde1d7aeedf7f6a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00984a1c04446a52ad6a54d64f2c6c49b61f23abe7dc6f33714896aefb0befb9a52b95b048561132c28c9850e851a6d00e", "00b4e19f9de59d30ca26801f2789a3330b081e6bf57f84f3c6107defd05a959cef5f298acea5a6b87b38e22c5409ec9f71" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "55555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00f00d6327b1226eaa1b0897295eeddadf7510249e6f0f811b57d7197eb6e61199a8f1c6665ec4821d3e18675d5399fdf7", "0087bf1e3fb7fee5cb3582a4159808b75e8b1de07eaffd49d3882d15c77443ad83213d21a4be9285223aa44a840e47eb56" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "452b047743346898b087daaac5d982d378752ba534e569f21ac592c09654d0809b94ccf822045f2885cbd3b221453cd6", "68a01f502f551af14aab35c2c30ec7bac0709f525fe7960439b1e9de53cdad245efd8930967cde6caf8d222c8200cd69" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "6666666666666666666666666666666666666666666666664fc15233fb49458c89a4057a8379dc9791f80a2ab84edd61"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "44a8f54795bdb81e00fc84fa8373d125b16da6e2bf4cfa9ee1dc13d7f157394683963c170f4c15e8cf21b5466b49fa72", "00bb5693655b3e0a85e27e3e6d265fba0131f3083bf447f62b6e3e5275496f34daa522e16195d81488a31fe982c2b75f16" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "99999999999999999999999999999999999999999999999977a1fb4df8ede852ce760837c536cae35af40f4014764c12"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "10b336b3afb80c80ff50716e734110fe83cd5b8d41d7f2f94f0dec7ecf1facc663babb8ed94e4bdf3592e37464970afa", "009be144d354e9b456873c6387a12a3eefd3e2feb66f7519ac72ac502c09d20d72cae9d04c88549a285c081023e1c1da08" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6aae76701acc1950894a89e068772d8b281eef136f8a8fef5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0081f92630778777a01781e7924fced35fc09018d9b00820881b14a814c1836a1f73c3641f7a17c821ffd95da902efe132", "221d81323509391f7b61bd796011337e6af36ae0798c17043d79e8efcdae8e724adf96a2309207c2d2cfd88e8c483acb" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7"; + bn_t sig_s = "0eb10e5ab95f2f26a40700b1300fb8c3e754d5c453d9384ecce1daa38135a48a0a96c24efc2a76d00bde1d7aeedf7f6a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7", "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158ca"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "bc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d322ff6d1d1162b5de29edcd0b69803fe2f8af8e3d103d0a9"; + sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7", "00c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158ca"; + bn_t sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "bc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d322ff6d1d1162b5de29edcd0b69803fe2f8af8e3d103d0a9"; + sig_s = "2492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "29bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc", "009a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3" ); + { + // pseudorandom signature + auto m = ""_hex; + bn_t sig_r = "2290c886bbad8f53089583d543a269a727665626d6b94a3796324c62d08988f66f6011e845811a03589e92abe1f17faf"; + bn_t sig_s = "66e2cb4380997f4e7f85022541adb22d24d1196be68a3db888b03eb3d2d40b0d9a3a6a00a1a4782ee0a00e8410ba2d86"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "4d7367"_hex; + sig_r = "8071d8cf9df9efef696ebafc59f74db90c1f1ecf5ccde18858de22fe4d7df2a25cb3001695d706dfd7984b39df65a0f4"; + sig_s = "27291e6339c2a7fed7a174bb97ffe41d8cfdc20c1260c6ec85d7259f0cc7781bf2ae7a6e6fb4c08e0d75b7381bb7d9b8"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "313233343030"_hex; + sig_r = "470014ccd7a1a5e5333d301c8ea528ac3b07b01944af30cec60f4bad94db108509e45ba381818b5bdfaf9daf0d372301"; + sig_s = "e3d49d6a05a755aa871d7cb96fffb79fed7625f83f69498ba07c0d65166a67107c9a17ae6e1028e244377a44096217b2"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "0000000000000000000000000000000000000000"_hex; + sig_r = "377044d343f900175ac6833071be74964cd636417039e10e837da94b6919bffc3f5a517b945a450852af3259f5cbf108"; + sig_s = "32ea25006375c153581e80c09f53ad585c736f823c70147aba4fb47bb0a224fae4d8819adad80d4c144ecc2380954a9e"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aac", "00acbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1" ); + { + // x-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "ccb13c4dc9805a9b4e06ee25ef8c7593eaff7326c432d4b12b923163cf1cbe5fe1cfd3546c1d0761d8874e83ffd2e15d"; + bn_t sig_s = "db1b0c082ae314b539f05e8a14ad51e5db37f29cacea9b2aab63a04917d58d008cf3f7ba41d5ea280f3b6a67be3ae8f8"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "c79a30e36d2126b348dd9eb2f5db6aa98f79d80214027e51bcf3cabec188a7ebaf25cb7bbe9ec6bfed135e2a3b70e916"; + sig_s = "241338ee2ac931adea9a56e7bfe909947128d54d5122a47b00c278e684e10102740d26e89e343290a5b2fa8b401faec6"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "0df82e4ec2960e3df614f8b49cec9a4ee1054365414241361feec9d9d9b6909d8775f222ec385a14afab46266db390c3"; + sig_s = "0968485e854addba0f8354e677e955e1ef2df973d564c49f65f2562cb2a2b80d75e92f8784042955f7b8765f609ce221"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422", "00c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000" ); + { + // y-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "1fafd83d728422e1485f1e52e5b631548647cc3c76c109c3177a73751d91a19012fa4628b218f2229fc4d55f105fe001"; + bn_t sig_s = "4474f9af7b4b0bb96fdb05ae918f799024e8d5b864e49ccd047cf97e7b9f8763cce015c11cf1f461c9027cb901055101"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "e6025bb957ab197fb4c080d0a5c647e428afb0d7cc235c605ae97545494fd31a9979790bb2da6e1cf186789422b15c97"; + sig_s = "8ae9872291430d1bb371ef72360dad5afbb6fb001f403d9aaa1445f0326eb1eef775c9dfe1d7ef8bf4e744822108d27e"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "877d5567c18fa568259005a89c2300d1b3825b732fa14964c1477d4b3098afd09384b97d497464adba41e9df8a74d339"; + sig_s = "c40f0760717b4b3bae75742b6dc3dcf04cc22a449cfea19d305e0658cb705fda75163e7399e0b3125ca7d1919c13851e"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000", "00e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557" ); + { + // x-coordinate of the public key has many trailing 0's + auto m = "4d657373616765"_hex; + bn_t sig_r = "e706b0045a6f54bd175e2437b48767b0204f93d8a4d9d3d00838278137e5b670de4305c5c55e49059b8b5f6e264654c9"; + bn_t sig_s = "405741adff94afd9a88e08d0b1021911fa4cedb2466b1a8fd302a5b5d96566ada63ccb82b6c5e8452fde860c545e0a19"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "0c57ce2bc579fbd3a759dfbf5e84c3cef2414846a2e300453e1e4c5188f24432b14ca647a733b6ad35c980a880d36145"; + sig_s = "f12a119e22d48b82049df611f1c851fb22795056498a873c730fcb9fd8f314728de0298b9b22c348abc6de2aba97e972"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key has many trailing 0's + m = "4d657373616765"_hex; + sig_r = "9a8f80697ccf2e0617612027d861a3a3a657fb75cc82810b40dd5072d39ff37eca29008390da356137e2c9babd814198"; + sig_s = "a86537a83c3d57da50e4b29b47dcc3717c5a1ed0fff18ade8dcce4220eac63aab60b9bfed5f1bdd241dab655a9bdd75f"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69", "00d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98" ); + { + // x-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "93718f6f8542725f62de7039fc193d3fcc81d622230ccc94e9e265390b385af3a3ba50c91a9d6a5b1e07d79af2bd80b2"; + bn_t sig_s = "d08499f3d298e8afecea122265a36dbf337259020654739783c8ec8ef783d072555b5907285ce83fc8ced9c8398c6269"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "ce26e42c490dec92cf59d6b1ba75c9a1400d6e5c3fd7c47e1eeb1cded30a3a3d18c81cdfdcbad2742a97293369ce21c2"; + sig_s = "94671085d941fd27d495452a4c8559a1fe24f3225f5b8ef75faf9d3fb01372c586e23b82714359d0e47144ff5d946161"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "ffc4738acf71f04a13104c328c138b331fb7202aef66f583ba543ed490d12993c18f724c81ad0f7ea18dae352e5c6480"; + sig_s = "e67d4ccdeb68a9a731f06f77eae00175be076d92529b109a62542692c8749ddfde03bed1c119a5901a4e852f2115578f"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336", "208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4" ); + { + // y-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "e6fa8455bc14e730e4ca1eb5faf6c8180f2f231069b93a0bb17d33ad5513d93a36214f5ce82ca6bd785ccbacf7249a4c"; + bn_t sig_s = "3979b4b480f496357c25aa3fc850c67ff1c5a2aabd80b6020d2eac3dd7833cf2387d0be64df54a0e9b59f12c3bebf886"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "1b49b037783838867fbaa57305b2aa28df1b0ec40f43140067fafdea63f87c02dfb0e6f41b760fbdf51005e90c0c3715"; + sig_s = "e7d4eb6ee61611264ea8a668a70287e3d63489273da2b30ad0c221f1893feaea3e878c9a81c6cec865899dbda4fa79ae"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "91d9da3d577408189dcaae33d95ed0a0118afd460d5228fa352b6ea671b172eb413816a70621ddaf23c5e2ef79df0c11"; + sig_s = "053dadbfcd564bddbe44e0ecb4d1e608dbd35d4e83b6634cc72afb87a2d61675ee13960c243f6be70519e167b1d3ceb0"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336", "00ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b" ); + { + // y-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "af0ed6ce6419662db80f02a2b632675445c7bf8a34bbacdc81cc5dd306c657ca4c5a3fb1b05f358d8f36fda8ae238806"; + bn_t sig_s = "46b472c0badb17e089c8f9697fd0b4ce71f0f4471b235483d4c8dd3d00aa282cde990253df38ba733b2ad82a601c7508"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "e2aa9468ccaaadad8b9f43a429c97f0c6a7eedcb4d4af72d639df0fe53f610b953408a8e24e8db138551770750680f7a"; + sig_s = "d81020846d1c50ee9ae23601dd638cb71b38d37fb555268c2fa1ad8a761fa7b27afcab2fa69224d1f976699914e09de2"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "6bf6fa7a663802c3382cc5fd02004ec71e5a031e3d9bfc0858fa994e88497a7782308bc265b8237a6bbbdd38658b36fc"; + sig_s = "3a9d5941a013bf70d99cc3ff255ce85573688dac40344b5db7144b19bf57bb2701e6850a8f819796b67f7d0b6aea7e50"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } // End of Google's Wycheproof tests ecdsa_secp384r1_sha512_p1363_test + } + EOSIO_TEST_END // ecdsa_secp384r1_test +} diff --git a/tests/include/ack/tests/ecdsa_secp521r1_test.hpp b/tests/include/ack/tests/ecdsa_secp521r1_test.hpp new file mode 100644 index 0000000..83a3176 --- /dev/null +++ b/tests/include/ack/tests/ecdsa_secp521r1_test.hpp @@ -0,0 +1,6286 @@ +// Copyright © 2023 ZeroPass +// Author: Crt Vavros +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace ack::tests { + EOSIO_TEST_BEGIN(ecdsa_secp521r1_test) + { + using namespace ec_curve; + using bn_t = ec_fixed_bigint<521>; + constexpr auto& curve = secp521r1; + + // Verify that the curve parameters are correct + REQUIRE_EQUAL( secp521r1.p , "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" ) + REQUIRE_EQUAL( secp521r1.a , "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc" ) + REQUIRE_EQUAL( secp521r1.b , "0051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00" ) + REQUIRE_EQUAL( secp521r1.g.x, "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66" ) + REQUIRE_EQUAL( secp521r1.g.y, "011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650" ) + REQUIRE_EQUAL( secp521r1.n , "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409" ) + REQUIRE_EQUAL( secp521r1.h , 1 ) + REQUIRE_EQUAL( secp521r1.verify(), true ) + + // NIST FIPS 186-4 test vectors + // https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program/digital-signatures + // CAVS 11.0 + // "SigVer" information + // Curves/SHAs selected: P-521,SHA-1 P-521,SHA-256 P-521,SHA-512 + // Generated on Wed Mar 16 16:16:55 2011 + { + + // [P-521,SHA-1] + { + auto pubkey = curve.make_point( "01939b25d13ee8e04203643ba3709526a92912b0e98f06962fb217ed18d1ba52bff192640f980d3f7f92c116b5d94dfd48c25a26b72acb9425e316b3d2ac130a6943", "0122d0809c5de123c6e5373c1680a4d566c565408b6750d942c024d56c0d6761807adf9dab454b84254671dc68f6917f09a442643e6db1bb35e6796816dd3e5c6a7a" ); + auto m = "a2b07a8c08cf0bf146cd11882553147831c118d9adae78dbc1700555842c5758c553751b88da75b8c6f45315db85b1d147519bffb49fa5024219054123f0925c7e715a040478aa3a5d24b4ecf1c49033edafa6622dc7e47fcd0311c54b1e3229d9caa9ba3c3dd8ea9501018a7d4a3b45b865696c94a366d818f1285426944f1d"_hex; + bn_t sig_r = "0144c1a1e075aced5e10f50ab7ab0f795bac07439c953ca0c749dc12d50a7e4dce21850dac1fd773e46576335a555f20d266842a8bb47fb464fe3fe297e9ee356e48"; + bn_t sig_s = "0125f3b6f1cf7eb704bd37391a43034df9260c4d5fdccd583bf65dd5ab4b007c8f837a31a0b7c5a0be3743a187b2569841fc4c69f816c8234d8ae845b92fb9263242"; + auto r = false; // Result = F (3 - S changed) + auto d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "00882e2cfed1286668e62699ab20c6c40068b460917b306e51ce7f72a4d760e19b3f6cb5897de599cfd84ae70c26d1a39144772b90f8ba1ec2d0f09395265f0308cf", "0020b80b99778dcdd3dc47da42b279cc289eaae369b9e2c4b0322d2eee9b1a76eed6b5b70d03d83f1db81a67ad6bea98ce71b120e9f83f0178cd6fa3f109a87b1fa9" ); + m = "69638c3ce737f19ec3492f5cf0428f0ed411aa86254c0808810b03ffe041b3cfafcefa398de1e965da22739145622378bb439cddd76dbe4d8cc66005bd5acdb819412bd7bc8358eda95f628f431199e0cc400befcf3f518eed60f986c1b710442454a71918a240db6a9b48122bb4ee5fa1f96a916cb640413b26d0f43a32e1f4"_hex; + sig_r = "013ec7124331d896832b77440854c043cb605ae9cc7d20cb358513a5bab26371903c6abc6e4860a0b4940bc5429755341a10251195e5f8af42494c002340ccc57bc9"; + sig_s = "01460bda2fd76ef05dcbe1cd17b9c5663b03551cce586c56e103179069fbef6ecae47f6555db755860f0b06eb1bf247312ae0f9d64c5cf13fbc42b923d6bee151b5f"; + r = false; // Result = F (2 - R changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "011a5a6f7166fe435c5cc4238daf92a2d1af483543b7f505785ec4e2d93b2ca1d1eed3bccc31761aa60f7dadc97629475d2712998c2eccb82a78d6da7b0524662e9f", "00c66d54768f5daf947cd414a1296a54c90e2b65a14cb94aecf0ba51c280676c160c39539955f2a8194357a983a1311845f8cac51cdca1e209bbac32cc809f0e4e10" ); + m = "3f1b870323330de661aac0ff50a0426ed28a99b97b2d5221587c15a2ed6203d8a83ecab3d65dca6df1baad2adab24e7a5f71f9180ff2a28a98ade4fc054c3ef4c88aa8a61174e2399c06d336141d17b27d002cfcd34600585b4efa37131fbb80a0d3ebb5878c8bc3ae8e5db9083210d8318302a2e584fbf147a9ef4a3c0315a2"_hex; + sig_r = "010f45ccf0b4de7d2af890d65395c715043dc5ca1489c79b820347d51848f599ebd4aa558c62ce8769c5d5a294679f9aa74414ca6a1b82f183f23558b0a8dc6cce68"; + sig_s = "01adaf876dc35310ac592d1e3ba89f148c3b76417799f43aa1b24c1d2e3f544c018f066ed7baef480f7488820593bcbb25ce08183fc14c6c12fce0c118743f04e281"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "00f3bd2590cbf620991d990b84efee86073f6c789deb07b89a1f278e6cc9ea573d8586ac395958ce4e1b09bda73af1b1e6f2a8c09ecc697c021974c024564ed87165", "00514871935c187e57d1aac376aeb018acf57c4d005d85cc939a6c83256f38b2c9ecb1a0ec8d132e0f5169843faca4ae664459124bf5f30309fa86f87a2604058150" ); + m = "14ab6196185df9ed556cd0ea664fed60c4e11cd77293497cefeca1973d291727aef380918747e1b986badd1f7835c7cbac2a1260dfd4d3c27c03fa4089dda56806518b60305041c95c78096aff537a5af1e73c674b13b536bc1256810d136530ba49d1dacc0b4d8f2a56b46c1df148673d73635790fb2afd8050a8d8174c6b0a"_hex; + sig_r = "0083e6155dd97bf9ba7c60dbcdcba7824b125a73df1433fcb46f57c51f63ae161ce67393d327d174aec7f0b552decb8131a192ae940deb84acc3b45be61917fc580c"; + sig_s = "001fbfe61d75dc3fd814eeabdececf361a0a066b8c06c40f0e057faf8e4e7b206dfbbd3a99ef55df67234a29fb1a618620d2e27636d35bb98eb7535d1749c4b7e7d2"; + r = false; // Result = F (4 - Q changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "013136c4e5dee983f761955bce7c196a000cb26863a1dea762884bb041e45363a1ab1665c0ca69d1167e555bd63bceba08f6ee14571acd06eea3e1e5d9c11a036984", "011c830e1fd29ee4e10d7c6db7e90d6c1319c9858f87a944542c28679d83680747eaf71a29362ea2c22a89d78e2ce020dfbba74448d2f46b3f84b99f22604075b22e" ); + m = "22edb41beb81e6f9479f11cf76cc67fd7177e2c452d4672aff8351737829656991e0649f1845c5a4484a81f16afcb96e9571717b2eac63e747b98421147f77a5b60b45437640a57d0fc5ef37d0d4b1fa3c7cb0091d5618f1d188c3d8aa9bcb37cfb9f7925d3b4a5135f43b104833ff1359854103cb391f6352ba9c362d2e8e4f"_hex; + sig_r = "0124b3bcdae17413de84721e6ebe64409d80ac07a3b6c9a603ef19c5162566076108d30ec79426d24c72ac12af6fa1caa4830d55b4e6fcee900b0e4b20cdae0eaf70"; + sig_s = "003e0724d156c3fe5cb799a17972fbb891f0e11cfb650a1c524f6f2aab134c70fb114084a7821e0e12054fe071c516cbfb393fe9d98c840e1cc9e8475d3add81e0c7"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "019eb73393f070160d871cc396cd8d6973d828d6f3c17bcec7168843f0342c1b54f3c02a1b11348da1035833df6fa469d75692ecaa2feddce9210a813bdb0e1f9936", "00e030c5a11e2317ba10a20ec373cf69c96660b434445235efff0a9d23904c5d3ef49efdf0897222e51624f047b567ed61814f3f9e8c62f16ac27160897d5a09f476" ); + m = "63b738e1619d533997f0e558699c5dfaafe2f5f330c4a12e9d9401db1d8767d044f543214ce9e65b9363702017a114f81f57e3f607a13268282dc4a6ef0e99862008d7da6e8b19807dc0671bb4d36045afacbe1f337663e6c06edea24b16aaccba6119e55ebbaac28cf3fe0082faa9a9e8cb0e038b45b05d7e65bbb92e264caa"_hex; + sig_r = "00ca41bcf9e80780687ba70d7f5ffec7da25542dc22144d9f6843889e941cad2fd8d8771755f38c0ef77909416371726b066464d1d41f888efa39456dee859f0ce98"; + sig_s = "01770961a369ca70f9d73b61aec34662735cf228299a7c668aa24afbc9d7f621cb3acff79cee19d107361614c1e71ff1f32ae4f02b7bf94486f0fcd61b6f76f304e4"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "000c12d47011ed272aaabcb0fb6c12d8627f33bda02b2b3c3ec7b5ed60eaa577add4205d222b8ba0485b1d98ade9df18ee1e1ad9e0a9e78242322201e3c664bf8c9f", "00d1b86d4a1171bc80822e0e1094a96bdf7e031201ec212ab7d0e7b55394cad8335050701327a0a1a17181b586b89ff24a658e4b0ee16b8418dfcac122f2457f67b1" ); + m = "cf18ce9521ce1c6e99000b03a92fe1b13df5b2b1d37f5f97e83fcc49473fb3188739810e51f85c2cac73294daa80c9f36dd6704cb0e7d14ab21328935f5a5631d5a8172349155a3d945b4b36110cf8bef096120e6dad4164176c6b8d168c83cc5619c764819eb966aeb67a5bdd3a525c3ccd7e6e322e42c7e17ffa27eae91e03"_hex; + sig_r = "00e4678311d0c068eab2118fc0a59014ec32c89cfd1e0273b966634b87783011b58a99204d266014d0236bd6f276f49c693a4d62b0601c307c936252cf718e239dfc"; + sig_s = "0149f5cc02a6aaa126a99a59b83ae34f405f8076b597540625fa76e27dd29a85b6a4b0fc3e73a245a91d64a8f2b13ac345553b7a40835af76a9528cb48ac8d0be364"; + r = false; // Result = F (3 - S changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "00f50a08703250c15f043c8c46e99783435245cf98f4f2694b0e2f8d029a514dd6f0b086d4ed892000cd5590107aae69c4c0a7a95f7cf74e5770a07d5db55bce4ab4", "00f2c770bab8b9be4cdb6ecd3dc26c698da0d2599cebf3d904f7f9ca3a55e64731810d73cd317264e50baba4bc2860857e16d6cbb79501bc9e3a32bd172ea8a71dee" ); + m = "9bbbbe8a72130e1f023fb77be4648c80e1722d98bd478882383026c5c4e8748873997c5a38e0a173ed461546422d7691393dc2aceb0c0775068bc7145e33bf6a9e34f7fc6acc8f079a265168e54d3cca8d40aa04c1afd0909aa3df50908d7324aa7861b50f471fbfa5d615b0d718132c81957b178ad936deb89fde37147f8ae6"_hex; + sig_r = "001e7cbb20c9a66abf149c79d11859051d35cfddd04f420dd23bd3206c82b29e782453cabfefe792e4e3e68c9bf6bf50d5a00ba5dd73b41378fb46e91ca797dbb250"; + sig_s = "00f1e9252573c003cb77f22c8c6d56f2149f7e8d88d699983da9250c8edfd4b9f864a46c48819524651886e3fd56492f4b6c75fb50a1d59e8bfc25f9fd42dc4e1d37"; + r = true; // Result = P (0 ) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "00fc6486a5cc9a366b2c25d57f3f1caadf93659223c7eb38c310916cd44bc49d3ecf1cfbd429b57e329e1eab5f552abaf828ad9cfbc2f7534dc8c87f54d252e7b69b", "01c0010af6c5cdfe26b068990cf44b1bcf324d0940bce1e953f7366c757aadaf25ff7dee4947879f305d3deb1e9a849db3cffb83bc1c7e5e82777be140931d58d177" ); + m = "0e75709c7f795f9dbebd482fb5a71de2c7ef01fa74a64292324491cdcfec7ae6bf315a030b81096eab2fd0142fd3dae77b703554b0fcf0561d8bc2b5ce3a63c31600fa1c5ee469c9cbcd4f16523b1e5c26a24af1ac0fa2920d8c0ce2b9be11a6e818ea7ab1683eabd08e249281ca83f322594c1a47862a226f80bcb75e51e12a"_hex; + sig_r = "00a58843085162864b2246c619d6cd38626657eb8f13ed5921b73071b6bddd56640ec9a55e7f2190481ef5e356425749e626a4b988b811cc12dd21c61cea89640095"; + sig_s = "019fbd1f9b108aad0208d1a27735ead4685f04d01882ed18c217d8e0e0fc71d8a98d3c45c471327e4dfa631cf4b826ead3bd5fd4bc0426fcc95b58bd354d012cfcd2"; + r = false; // Result = F (2 - R changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "000933ee70d1470acaea66626394023020ed521d5b9a52e068b827d23af283bdbbbf3999b0c2ced0abf607b467fa86ef89bee3852d4e993df3c2c73a49488740cabf", "010231bba67cba896274e7af7f9c65403e48c56356fba772120aa8781611239d0f50b8958ec8709a301078379b59123b47c5edb87bc2327cf607f876154904b93e92" ); + m = "e2f17dda2941ce1909c33f3e1076f42957d8d9db8cb7f8ef5e2a6a2d7a03d56c5247c08b58727d40009c91458c818687ca060bb724a061b72bdd2e55988094a99d89c618bc099429e9f2bd2b47771fd116d4227e7d368c5fda34597d74f2ccc3bbf618c53f706d761ccb658dcb8434d9c4c11b0e0ee6fed9a0cdbcf308e5a64f"_hex; + sig_r = "016f79df89a498ac65bb39d62e1ce82e5578eaf778084ec5926a638d50ee5943c87955c8255340a90f800fd43d4dca125b68dfe957d148533126d5761d711412bcb9"; + sig_s = "0175198228ce2eb0222d64eeaa403c0571989046e638419ef96612a90094a26fb819ff1addd823f8912e07ff32ac72790c38c601505b45dbb9cafd1b46f352aaea0e"; + r = false; // Result = F (2 - R changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0007a5694d537eea406d753532b307c5b86e8823d31e81f6e7371e6def61f31c8f706c1b89f8655e54f68e6821096e6b96a7c3752e47d8d3ef5da135f881927ed92a", "005810620b7d83d3e7e48f7338b18e03c2e97dde5dacdd5d54e4c7e75d736f159dc45431d5d3c07153a334fa60567307271bfb85cb0fcae142cbd7baaddcbdfdc018" ); + m = "f3278fbf2cd7edb7c0667eb911210cf3599d7322b15c053d1a3a8bf3fc6445fd7c6e68cffa765b8911d93eda77c0a3ce8ccdfed6bb07c9aebaac8d1245f0e02c044ca04b12f45670c97d96db7c36b80c0763a4c2fe93bccc6ccffa91e228b095bd2ef25b111c89aaf05d811b4625d343aa787877e8bfde0a9f432719473cee96"_hex; + sig_r = "002cba23e78a1f9c6c18bd26321cec0c26db4f1100b986d37a0f24fc42c75ce4731a2876e8865ae21700289734ad5bae3611418ea37a13fae67db2d1a58a86f85422"; + sig_s = "00c438e76249b5016e0b83ddef5447420fd13aee6f099a0b9ffafcba4e7227f70cc5dd5abba03532ebc50424fefdd4f6d258ffe044573aa51b8a5d1d5c6e5dbf318a"; + r = true; // Result = P (0 ) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "00a00f34f4572450d93607d3ffb1fffe7c86334426ad60fda27aa647e67c34b2cb1f0a12f4707336f1f708b3ba1f3cdd599ae92a2be92f9ae5526eba9d4adc052fa4", "0166808273466ec1ef2865e92b263b897131c5ea97fce1adb1ef88c8ac2e63eab97567d82db9c0825510812db1b2e4cba705ba64d33ffdce676b7f3aa2e343f7834e" ); + m = "047876e08961d6855a7f11010caa839e506ec89d6e8e007de36a1f3355d0c7bdf90f0ae8586fe73108869d1d0577a9ee0395706f69bfc0c8c3e17f53fc78fda86290cd3fd63a06bbf1255667a33da0ab50100c239de0c036d40835a317dd9f054543b6ce25f84b1df261a92d5415c2f5bd19eef1b1d6eac37117b53939b792b1"_hex; + sig_r = "018ada7d95f4d05350ae95494b7c81e233168ec88c5ebffa2d2a3ac74cf90b6d9f80407276f92bd9b3ca949e5d5cd51166e29678aae58a284b9e6ceda3a550b08c15"; + sig_s = "01ff12f5e9b12efd941e8a445ac036d735e7bf64237972002568e8eeb0dbb887709b53cfa67186f4df215e2a9f7b9feb045270c72196e19335a9c554a19cee0a8397"; + r = false; // Result = F (3 - S changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0013a5c825a9ffe6179cd106b4a2343fd3318d83cf3be58d971704d0328486738f7536041cc69e6f9548851cf591ba080c4a1c4b4f5d95d216138d72bc56eb63779d", "00e79075f5acb9f52b67f8411f310c02aac5a98dcce0275438e59f8a2a3754ebe57815247a00d3506fd342d3d43607ba67d4cb608da3a9296d57619223c02e0c4f8e" ); + m = "774c1af085bd44543f933f6db8d8c0cd07a25cd1517e82ee5a0ca3d1c54ac09e0addeb8b32bba2b1d67f86fcddd747a818e693668cf4569d9c25bd69b5e2d350986b1479fa03c1605c4691938e6bd9f505b9995e77469436b8943e9ada77351614314abaa05343f6b5f2a67dfbc0d61606cb97cea5b2277649bc21e5b076b289"_hex; + sig_r = "01ad988418099c6483e6a8d62fc16a9fe571ad35c8cf111c3f35e680541a2f5ed96896715efa4943f8b46d20a0abb228852bdd5cfce1787c150d01231abc065718e3"; + sig_s = "0095c1e7dcd09375d1760700c5351ab23618b1fdf1b2b02e918c0ec341e5156300b602f7960e0eee2c027aa0076b194080e63155dc56a81699e8aea36ddfe703b94f"; + r = false; // Result = F (4 - Q changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0092bf4245f0ece3a8c3a723de152c6413526c333a64f4f2455e7b45396c1614c473460246f49c65e957dcf779af0b675eaf5ed7800539d3619a6fb131f1bc610968", "0047689692e52baa835ee9c49793bca7b01ed3bc4d4c396a54eaefe0520840a31fa3c35cc0d2317ce367881a15a3c06e7c26b192e90fe16c10e84c92233910d7df7d" ); + m = "bc59b04a384e79b631f0f401ba990b8d48606cd6a1d4aecca8673058b283ee97aea6362b49ad52ffa533fc089a926f7d0c99b56483ecf0618046ce173527c1ce8648d17a45da8c9376bfe081df57ae9fb09c1e7193d41f359b2164b056737cef4b88a256db2939fbb1f143473e45b0976c964b78447abcd85c66c5d8366fc011"_hex; + sig_r = "0141f936c6a5ca580e5a18caeb85fc13e9ff57d50d89b8447c8645ff66202e71eff4303d57c28ee6b68915de6767a124f3652c22940656f4227d61ff30b17c2b9aeb"; + sig_s = "01c7bb4c22e68920bc6b9df0626b09ac79e5b76ba29d0b632c0b892c8661087461c4131771a2b3a9834ea4b3d3bddac9910331774643ae22b613bd0b2464a12cfabb"; + r = false; // Result = F (4 - Q changed) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0194cc7f51d9caff692137190541f5aea160977bedb0d3b67c3deed6669bff160696a96550934b3dba4129e204f068901c84c821523bec91ec40336dce0d2673e794", "00709279f85ef54164fd7347afcdbfe42d8d14e6808002b3e0b59bcbed80ce0c16e2db1b320c1d98ccdd75efc50fcd6ce91df6baaa99ecbee6df41da9c142a74386c" ); + m = "2df095b1f48341c352258afc19240c805a72a7662c38362a81fd3f788120bddd86fc10a99cfcb4855a0f64eeb9c6f75d74c145cd6b3d938e325a9f154a36305e1a213165e83e51b0122a48553d26c9352182fba98dfe8fbf1d64a7e0ae637d855084b2ef5117028d8226af607ed6f6e86065cc3715613289976deea128af123d"_hex; + sig_r = "00d2542223b0a5322249e8f1af6d559a87c39aa5c3c7e595b07fb7be4d3bd0184a419651f96811f3e8c9c578a4be68188a8a3a1ff0ccba4af5429ef95c64f34d645b"; + sig_s = "01ee3123fd300cceabe2ad99bd1975c4594005ac9ec31d44ee4b9fe325d39049a5a83b4ac2a7f0b603c82dd88d136507bca2d383c7e8375c36eda82a169b3e4b4034"; + r = true; // Result = P (0 ) + d = eosio::sha1( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + + } + + // [P-521,SHA-256] + { + auto pubkey = curve.make_point( "015bd9bf7a35cc60147b32b64e0e4e54bf9ac2173cc6784b3d4ebd076aa5d45c1e3d0846b20b61d6342341a8801a2f63028c991831318245c2fe31f8acde6bf2003e", "01afb67c9c700ed332b47a2d148e6ddd3571e138f02a81c3cfe6d4dee0f512d92e76574fe5797c5566c05b3239fabb212c735615e719e718fb40fa6783c964357f72" ); + auto m = "93e6fa311b9cf278babcd49a6739d312e5f12e05bc9dfee9bb37ccfb2f9ce57d2a3c0336674e094834a9fb80143c3c8ca82b34949596ad17ae6fc7592d1d93f143e7e7c842e17a7d230ace2d2be15c757c37ba0b1f34810c6e51786af718136db22c1f8336540cae5e2fc762ca43cd94c4babb1b11f8fd93a2ac9525324bab88"_hex; + bn_t sig_r = "01a341d0e8906239faace79554b90d1445bd28f703d7c7cc8eb163337ad3d4bfb3725cb06e618991491534d399866df5c5bdef897c889947b21148d89c657e64124d"; + bn_t sig_s = "005c5b728837d44b7b6935efb2b721b4f45c1675d803d87f70158e451434176d9682034c9b356b5f9181e07599bdcb55e5bc808fdd36fef9c19ddb6342c975262024"; + auto r = false; // Result = F (1 - Message changed) + auto d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "009f21a6e7295b183656709089b3c647140c81f71b0b3812e6de22c52245335599ade6a3116cb70277dc2485f91c7b1f46d62afb60fc17a110358c9a02e02e010960", "01e914284cea47dd6836e7ce899d0c9a88d67fc9d039ffa9fa5bee58d247e0d0dc9251be8b82afd3add327f98c5570bdcd8ad8827820032774d19db09232aeba190a" ); + m = "8a3206879e6e463c6d19c4037c12c66ae26e23e09fa96e3b26d32bb41810cb9b02d55333733fad583ca5d24614c23071ee19e4dff9e4d958fc1de573e198eb6964cfc464ce97e69642c19c0ec75aeb01f93361b9df37cd2b1bc2602d967f3f508d1a9f3155a07675e8b1b53e79b608dffd6c4e0f0711fd0b8c6012eacd8e26de"_hex; + sig_r = "00ce4b2ac68afd071531027b90d4b92d9b0e1044b824ccebb2c9ab241d5b909ead1ffa2dc3d330f57187efbea7374bc77c4f7ce7ee689aa5a1e27aa78abc3cc1e751"; + sig_s = "00aa85d84f9c7fecd25064dbae69c16d6fcff38040027bf476c7f913746272b5d4b9bd34d2482e27730522df724895b99253aed86011139928fa9a272892f8c99d8f"; + r = false; // Result = F (2 - R changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "01098be00de7b2ee7390f26eff82ba5b6de8f04d7f11909193923866d2feefad9b01c5d78b699ce0a6900dc2a3073a03505ae946aa6f384ab0573ec9d17fa775dacd", "0106e122e7148b547a0314da646b6f834e66c2ff7f64f39da9dc7983e80e84063e23c8ce12994e8495b7786c2b3180d7f22bd2d2becf1e1ba2029cbbe8d4801b65b1" ); + m = "a2555db3870730ffbafd007a8b565e3c79103751b9c634a40e9ce79098fe74bb43b4cd990c50a80a50f8426893f03998e617a74c8997bd7acee599c24770da781502011747fa55b9215c245f5d36edac311640029663b44b01a50c9b8c5e53f09c11fd73609ce665c066dbee92a749847805c26039089b94f80521e1ac94317c"_hex; + sig_r = "01092e5ccfc4f966c3281a3924cd527606ce8e64cfd78f57373cfd702f528368beb71eb1a2cd64005bb172cb35b4ea61af88cb06bc8f1a38e2d75b235d23947dc209"; + sig_s = "01aff29a28d935d0e10bf8015f38ec128e0ec047f04020d1474366807b140e4d4a6d069aefc8dce723fcb4fc803df30b3880cc6d0dfc75c291d848d89e06ab7e24d1"; + r = false; // Result = F (2 - R changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "001ec67de63455605b31a460d4faa664697cc505885577c0844472842dee78fa6d522e4b942d3c7e2de684e6399f6a44a328ccaab5e678cd99d49f015e35a934cdd9", "019b41da41e7506cbcb7c31d39751669cda166fd045c86e1fac68d39d2ebb0f1ed50b8a923511e1306952888e068092b19130181c2de5f25c5e1fc4fd9ea202258d6" ); + m = "58a98d6740bcae94d49817a49edcec1bfe9799f22fe7bc7c46933ec74db0679a34dd8057b71c439d00da2dab80711b943a9f4560d4b5e7f58b79a77f84eb7ac3b9e88c8f13b7ea5568b8612c22e4e5ff6f83c36649917e7165be0f3c759b06ba44cfd6b6d54ad996ac2cc9054e8d3d077386f4835cd024116462257907c1b496"_hex; + sig_r = "01e1882a3d98c236189a35ffddc9fecdb7cb5fc5e3d0784eabb69d9c37862dbb38eed6c5567a0abc4f74099329681b9a0921515f1df83ba8948b51d3871866a8f7ce"; + sig_s = "0025ff707889678f7cd05665c941a2bbe13622a1e75ab986cc86778658c62e527f55804ab27d0643f6bb8adaab0614eac47f33f0e1fba109c63b28fa6732a5afbe49"; + r = false; // Result = F (2 - R changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "00defff5ef7cc5de0e1ac32261e7a74e8c434c0b51f76df7566b612cc5b8201e7b38c51aa6118b6307f436394bf452a72224c977e37e410eae9525df2ee00a8123bf", "00263b7db73558ddc783824f0b19776802aaf5e46ccb1b1d1dda07d2d6c5843f5036ae8d381b235ccd2ed04eb90c5d51e32cbd7acdc7031cae63c06797556fb66fe3" ); + m = "77bd3d86c52fe8c327649ce44ccb313cf34d6eee9f6074fd60a9ee3dbf3a84dc680c91703632d6f4ff39b8ea3d13090054d186b4a928b1052caee17dc9bee7a5905ca9bcbcd065be4160c4dd25639f2b23d1ce4837598917d7c86425679de1b33e922e331c1f3f748d3cbd8fc6aec68b73978f5d25d730c8a7fde247edd32822"_hex; + sig_r = "0089bd129a537840a52ef434d5a8ba4add952f72f22a84ac4523ea0bc02cbfa8b681ab0ed3fa2bca24ae575f23fce7efbb9bfd28e465174158a5ad2b08fd9e0b7132"; + sig_s = "0004ed533337791e05f8d097eabdf4be96b3fcc9f876d47fb8c5c7a05cbddba398cded2edf5ec9b7dbb4e32c1374b46953d66a193c211ef12de4b9d73adc369d5e95"; + r = false; // Result = F (4 - Q changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0180f1e933054473e81ac82aa458094b7cb95d4b8d399600420cfb082e37980414909a133d5e42ebb7d2defddb34a9fb51fe4ab72e88526fc28608e152aaaba3ee5b", "01c5cee9fd322d1c3af1726366e8a1e3f22099d9246d4bb02708eed89ecef1fc73926dc97a5c263afa235edb39a9e63d9690608846abc482397a2d8673c5d472c970" ); + m = "12e796e7b92085ce16fcb9f420ee18bb0b5b985cfc47618d7b28a9e2ceae5d526c9dab015c33ccadb05185f8b205875b20323edc7d0a53a6a35f7061ce823244c6c73de20a38650fe6ffad79bfae8a54dbb611eb55a76fa7400ffddc6421e58efad93f43db1b7aedbd63ba94ea12c39c686dc335c7205f05f6b3e1d12fb508ef"_hex; + sig_r = "017f1fd4df519ef432f68b5f426ff23a8f36b5729fdf7c8363d73f4e707d9800c7b50174fc3d66d89813a5265f8734602e5c998c2d7b51bdef6e90ee5a527e1357e0"; + sig_s = "010560ed68f152d649493c02c1e32bf4138aacb5f2d7f449e7685336edde24e5ce1cfaa2c54530f1419593614971896f1a877dda7bc5d56ccdbab18e770647287979"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "006d8c16536b17cab6ff41f5df4038fe416c05ccb601710909708dc561b02ceed9cf020441d9daa075e8fd604531ff58084035b1c19a498b82582f5b20f9cedf61f9", "00e89d71c66e55c4f5bf245413388bfe9de83944b11d1abdb4692db7da8a086442965ee512f7089f89464dda5d7786e52cc26a8a30bc8824cc56a289fefcd42bdfd2" ); + m = "3c06bb2421c7ebf060b9da78403a3ef87406cbcc73eb350a2e0a33d20f6a59572d282091654f98b5ed4b41411edfd216704c44a3e295bd7174cd51818b021cb37bfc3f644023ba69fdc081dac3e5f6bdd7c7bc1f71549882566fc4cb30114a1f02f9c0e7610feb0fecde666eb94f5e43245473ea56bd6256610b08162dc2eb36"_hex; + sig_r = "0087f86cf4bd36e8253097ac1bc8500dedafdbccbe5767ec25e53c73c4f053f3b37acd1d5ea4c16e4058919b61d2a67393220ffefe07535d53923ace6815463c4c31"; + sig_s = "01def2582fd0df89fa28c9ce882f5c3846135f51bdf7f4b2497b190136ef04618eaa22a8c5a117b0adfc6425eac3111b6558df145a8b14ad39524b98659e01d51c21"; + r = false; // Result = F (3 - S changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "01c7fb4747a409a3723177c38c9943b81b2d0aee867b8f424e227f3a664f1877c560d37953e7cc09390e05599292bde1ea345073ec365834d99ac59332f6e5bd29d7", "01b7485b454d5ed5d581c7897a7e68f425d8c23cd89b934747d90765a5fda1cfc3d997af61728f328cc8bdfca8a3ae1b3b90be13cf164c343d199b8e16b0400f3e33" ); + m = "08f3847e8b10f18a2f33abbec099f764215aeec9ce64c33fc1c6ae6e7dcee8eae995885dd91a354ccd2ac9bf8f9924a375b6387696fe415a08f7ee429318f045b9394f4d6e75ad099ebde5ca94e69414155f4dc271cdfe4bdc318122ae469f9a4b5f44550fef6d4e09925eeb579d61299578d6d84d99c4260ccae583e042b0b5"_hex; + sig_r = "01552ac2dfbe67c6abad8d3325713c1e28537eae620d805a73dbaa4e5e04acff6ae0498346d6e41df1cbdb20b70d8e548564da8fa239fe6c6f28b6c2a6ef57973097"; + sig_s = "00cc9e60b694d792f36cbe9adff8dc79f0f75b3ec11ff2d54419227c7566e0bd441655eb30b558c78a55ac613c1bf3c3058ea7a4bb70adbf5b49fcae15e54defd6db"; + r = false; // Result = F (3 - S changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "016c0e1d1fc81e5069e9c02794fdfe1f5a8ac5008305d9ac2234eb0117e565203acc6777c570f41661c5db1adb26097d7f5f2a1762c4f8039f1b68caad75915baab8", "000b3690995d6d881dc1564f792ab174cdc1a0fc6f12d69a21088d5e82de4a7d56947a2dad0ce64d9ad0675e72b6da755e3ef82c9cc6d532378c23112210236889d6" ); + m = "a1c88c643303f293bd918e30ac00964e52f78585be9ed920c579c48fa0276f749c04ad73e3a86697e393e7172d2459cdc30e0f1e2830e5e6952fb23c6a6e3eb61cfcb15a59cd6e11c3c2e080e78da3e0dc206ee9e1e5aed87d7b61d14702c59a116473f386faa21dcc97328f966771fc3e5ff72af66535f41e3daa4ebadd5624"_hex; + sig_r = "01316e9a934cad1aa0f7dbade1c9ad942d61bbe1bf41b7b95e3b25b761b9899f6125790369277aa09fa57340a2b8c3c609a08ae7be5a3c09dd4d081e6cb54d9f3061"; + sig_s = "00d6b285f91c3c8d6192af624336caf793ad5300d96262f5e25228dfb60896c4e28e61be22e92ca7d6e11a02f36655441032bf291f895aaa117f6bfdfb422286f255"; + r = false; // Result = F (4 - Q changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "006194b1780a2416dde8c9402e3ddbf310c51ed87fc40530ad5c97931b99336c00098337fcca7b01c634e56a7874309177364e6d4c24c2ab33d6a1a09a84689ad0b5", "00c5bfcdf640c0a7573ecf4a9dc1aa75db298ddf1a679609e0669182a594b9b9a8186ee961b902d84fe998e3b380c304a0be98974514966965bfef9971f05a57c162" ); + m = "bd980fd69fb9e1344540e5bb12fd0aab8199a16ffec416edfede8084b7cabff5891f8f04fa72a3260403adf5ee286efe9dc128b06466b21915c394b21ded8d468ec1f2ff82d6e4306c61b3315c8b131131c1ee8d093f5aa47b56dbf388cb935900c4d3413dde92cdb7d6b8c35440ed962d5ef036b241f2bc51842fa64496aaff"_hex; + sig_r = "018051118c2d8b841c6d78e2e5068c7305039cbae1f8b5a479b9bba559ebc45d8c8ac18d1f6033713871e656fa4eba9c1c0892e7263bb22c46ec3c72aae92afe2c79"; + sig_s = "00de0db6a6ba5e6a953a126be3b87d6c895f4bc2db27be223109dc67cf115bbc8c566e1c9a1bdf1a87e632f8a0e4b31331a086caeb60793e87f03b404140aba206ae"; + r = false; // Result = F (4 - Q changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "00397714abcc503eaa0c18abd1fd26586d28ec1b1035d37ac710f2823911ec9afa429b41ea89cec13d5bcae9d6d7147794407e409f3b267cf4dd27e8c77e7ccf4d36", "00a3a4b749d19b84708e42b59e9faa5a99ac0f0a01121655fab87785fca38c8cd4277c8c2c9a0024ff608c3cce954596315dfe0e3b133aeab08bb5389eb2a4f1fb42" ); + m = "961c9451bbb298e17f503680099244d969a0ff3d0ce6cf15b5bcc73d6edc3e8c8535a18531d885664612cad97da174f1daee6aad95220f6e2fd8c734c57747e46db21e169a03dd673df07aff30848e8370c0960d732e74f9b1d8b53847b69d2cad80f346b50e89d7993cb758fc218668c771422f804d3c9162da98cb30821912"_hex; + sig_r = "019da96a866db12948e0aec7231f797061f345739d439bdaaba63e4d03e0bb52c3fea2fb593347d983f24a3afa6a77f476e6bb49a5de843b4c4755cddce97b8b909e"; + sig_s = "001bb442f428b2ca445a75ad88ed49d965d6659d748d02cebf78faa1ecc187b606f284d11d47791d585dc371c2d91848a55ca7b092f06d561efcf64e0de0814e1db4"; + r = true; // Result = P (0 ) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "01af06b10d357fc3c807854b4be235f81d5036da4df1af6a054a03ff800c1aa2d59c2ad5c0e25ed25c002057cae4b4adb92b95c36cf422a46c8833fd8968e0f32441", "018432172be0e535a3f3a5f6d6927dfbf6a00051cc1983ba25410ee3598a60dd1f7c38526de7ee23f8e9ee973ffddff49eb3edb28adc7d094cd95b63d52ba45ecb58" ); + m = "b9afbe0d18f798d2992740c35217eec0552f0812c607ef823f74dc2eb2ce58a9abe1c683ed193245a81b9f1eeb68d57c721f052f926b1ce3d79751bccf007375715e70b52c9bce92a6ccad24c205d43a4355d084dce3db2f50ab7d4dc3c6c400db8db47a48dabf295801e960232383480f029c7111bf8d5d7a0c9d64c9465644"_hex; + sig_r = "01396b4f044919d0ba5ad43004cd37b8bb0626ea5549d57c532339358ee1794988a7c9eab91a9340dc2aa0f18e89b236a6c20d03a6e98f35c011430fc4213cd65dbd"; + sig_s = "0101e5a788a867d9b5a4444554c9651173f9f8e15c0f39f9adb66c18ef8075243f23b95d5229ccf5f56b87f5c50920b01b22ab7476ecf4c865a3d6d8f2242d422d8d"; + r = false; // Result = F (3 - S changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0176f1276918fed24a098d6d03077f3c33ae543316df1b6b06ce877e74b69b2cd4131fdf797e77e5f6391b0b32411120d03c0c59ba1721a7187d18708121d6f3a86f", "010f9d38b30a2da1a745840de7c9994578e32bb10f9334b46f533b6eab550aa55048e4ac601889564ac8314e01b61613fc7b8e2bd3f1a188c5c5e869af16a8d61d9b" ); + m = "a6c421bfcf95f7dc2f3721c56eddd2bf58bd8a2717396441d95e265c8a3c85b031b80e5f90786126f578affecfb4fc2dcfb3adb96a33cd0953b109970d218a6e59a688b6bc7d51e64eebab69929fac48f45fdccd2a27c1e1a48f19bbd36e5f8f8f0d8ab3f4e2cca2301893f8c373794582eda7b700f57d092d1662b929a2d43a"_hex; + sig_r = "019cb5639a321e95214c90a612d29c9ffd5ae5aaa2a814ee2d66ac1ce1d2ab3229009129ec9d472061444cbfbf50c7e4cba09aab65299a42740bce7af3fddf2a1f46"; + sig_s = "00082ce6bf1d809d3bb4f9f09a95590bb64b0c41bcee5fcdd332947a9b59618da5da897fff44968d92635e7833dec1e91d8d99bd8b527609393b446c83d109a32243"; + r = true; // Result = P (0 ) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0089565cf5838658fd36b70cf5246cbe999a394562c46e9d8057928e0aa9e04ade6002cfb83f315e06790e58ea833b3bd64fba8e93c5fdba8319c5d38be7cf25a21a", "008faeff531e683d28d817045a03b2dd22e50e6168f1e5fda5b5abc71859effc5e5c45b88705b62ca090e3362a8313dc472ec2ed970bbb5029200318e7582643d613" ); + m = "1e8824c203e8915e62f5304b021a3a1cd027f5dfed3366e123ba28273b1a63956006aceb45a03b5995f14ef08e430131fe93123a4f91683cb0074280b525f7342963e98280d63ae179cdc908a191fed000239f1e56b012b7fecffc1d1a5883a29a78149d507205308170460da5a7d5ade323bef2c9ec4b9a336cfb8b1b7ae473"_hex; + sig_r = "006b5237ad17da6037aef116532b3aaa70172d0ca0eebdc478c35e6f8bd0f9a6472d052c5a18a23dcced7be6e5e7b6d0bcb5b3cea707000e7d114b6f41084d6f5620"; + sig_s = "005e2556425b35e6495b137f7dab522c7e7b812004c87a002f6ce4f4b6cc5f967b8f5b7d3786a17d5f717d3ac467b73e176e90cdd8c5151a6e62fc4604cbeab7e717"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "00aa42473f80d9d81f6d41ed05c8ba35c005f90e2690f71dfdb12555b7590c7a8e95b618368c39f4e84d6cba25f522c9bdd256c60d3f8c8425ad313701225a9cc9c4", "01992b7966b925f42c91f810eb05d602b804301849ea278466a68e5b616e3a0bce110fc9250db14f9c8f5929347e1bb8727bcf8072c6aebc26958954fe96df04e139" ); + m = "aedf4e8089c90d95f870457561df7fe825138073e867fe13c39a0d0bcd77dfa2abcd635ca40bbb71eeae2b674075bfc5d5fc7d489dfd8f34ed30050631238af2122f7d45cc0634ae8a2efca5cbcc4f967ae55c290f77d53f2c03163f532f31097bc34f531823d23de7e5a9e09a1d17cbd9383a4381f3f6986368a6014fba8b96"_hex; + sig_r = "00cbb35513420f206bd26b568712503b66e159a54e154c8d4e9c661aa954e0bf425871275fff5e8f368c8ccc77ffe6adf84ba88a84483d8ba5cc862bd408f6a192c1"; + sig_s = "002ffb4e461e3161c801ad217a0483045181013deed29eec29cca94776139ddf5fe9d7771e5ac7b637a4bf7e5276940489bd8ae36f41ef6be93cff4b96bd0e1f3e59"; + r = true; // Result = P (0 ) + d = eosio::sha256( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + + } + + // [P-521,SHA-384] + { + auto pubkey = curve.make_point( "00984cf3de2bbaf1b37ad4e9121a1294a0128d8a031ddfac7a8c5d7c9db83699de26c50012d42223d902cbd4be7e6fb611f4502ce8444d43d3eb0685aee07349d0c5", "017165e8feaada26cc599ee394dfb5de7e2201004f755ebecb92ffda0a24be55aba88ab9b3c7a575884ffa7b78b631806f54e01ef875c5819fd2d52dd6369d649615" ); + auto m = "4db7b4e0b8c91130fef9bd8fc4ca9c1b2970103cd20366371b1f0d4a00885cec613f5aa54d723289f4ce252d446b8c213f9ee207196f88029e66641673b0ed5cc5a2700219ad5dd6c35486c04f637ba15c77dd2a5b53b1bdcc7c5efb194de1e00adc53bf78ee5b7bf69e9efb337d9f24d697838ca5ad56b08903c5891b84c096"_hex; + bn_t sig_r = "0036c8554602661d9d8f4bfecbb099f01e9e314136e50c6d026de2297bbaf66213ea72fce13b73bb07e6e333523f19d3910983ea5842a1b634b3e3ec8157d270b496"; + bn_t sig_s = "0129b439d3ba2d66c89c34be2a674013128dccfcef33f5d3844c4465381453c361ce80e1b52b6a611749bc70933655caa56da2c5dd6b04defcd8baeb2d9be06f3caf"; + auto r = false; // Result = F (4 - Q changed) + auto d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "00f976d58a015d3015a14997fa3f59ca8d762a6541861be923d6110c9e742a0a2a77d59a6a9335c67f13a626d9545b27c072349c3d20b80c35b0a9490f3e6c5c1b3c", "00425c22ac0755c58fe3497c1f1a9f537d5e26127d9b031359c2378fd4b13f83691a854444eac3fa346bb5a63bb9567c122945ce99d2aeb0bb1b956ad348f7c9c461" ); + m = "66fadb3dc27fe2a0057eb1e0aa3d49cdb93da4a07bb5c4c01719f8deac82fb0066d9c1466ae5ef67d1fee3e2cccf3185a24c8cb58c18df2bf0ca0caadcdc0ed63107b14e3627a9db7efc88544a91774fed34e335dde43a67ca44581bc9757932414a0fc3970b091e94dc52d39a9815a4aed5d27683d8c537c37e140e8f512750"_hex; + sig_r = "01ca7346a2efe39e03e627ee9480a9b7c925a6677dc80932ffd67ca52b7e46acd2063402545d678d218ac579a64cf1fa4eff4f32f92d3fa4510eea22472dbd3daa72"; + sig_s = "00893d86a6502d5973f6c766413e7c7ecbc4583577c58672ef36a76c83755a0ab65af0e0af0ad0f3e6cb8f9ef67669132ce7e996d6122cbbe1dec710a7ba9c9d1ff9"; + r = false; // Result = F (2 - R changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0066ad5c073425bbbe3a1d97ce6e1a9f2c298392c5afb95c60eee1393f7cd5c9a12c283258b1a53f2ed4abd13ba1287f3a1b051a09cb0f337cb6cf616dffd16aacc2", "009d2b2afc181bd82043b13b8222cd206b9264d73b229c71d9abcf74a478a7f7088bc8c7bb1e54882fee693340a3cf1aa56ccc2fb81d2675b19bba754dae0c2f00c3" ); + m = "f209ba5871f0a05677c7ddfaf93d39dcc69467fb6dd99b09c7685958aa155838779f9df0f2ff04b6b80275d2e9abce8285333c18cac19a42a6227ea1ebac521110d393e4e43bdeefdda0b3f9ceb2f3da6c5364d44d2a18795327668624fb8dd8c9e33dbc810f4c24edbecdfaba6ac632f5b2831f42121f1330930902452fbbc5"_hex; + sig_r = "004e6f08380c43f225169acb0e9f3ff61cdd2e9b713d149f63b5b6a4510d381409648fc1d442fa1bbbce2a8fe1ff7d1de0597f72d7681c79d3a876db6d3ef89ed192"; + sig_s = "011745ab4dec3542cbf37d10090d6038bd1ef9cce8216a4069b21e4a08075e7e8502ec97b99d3b18fd314d6ab6826bbbfaa2343ada1abc7c3b551c0b854dc45ffa75"; + r = false; // Result = F (1 - Message changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0068801cdbb1e07f4b72218c52aa24bda872f1b2ab4e0c13b686cb8b10096ff88018e82196769359227192752a1c4c884f08cfa7f947ac428651f528bd41d1034073", "01aeb335cb89ecae3cbc05681e2170870dcf40d486db4011c4d7bd84c58c6b3204161d9ca3516760b0c42466605077c96c0540939c635bf5d7d11e1407b6da30c094" ); + m = "978116ee2d7fcbf1f5013fc84153c5fae7c1785a2fee2c7bcacd962aef6dc201ac62b04eab505b6a5288ea21d41b64114ce01a0a01c617ffd20d1e70babf1af1523a285494a3fe5bd8619bcf87370cafe1188d9843ce805db9adad563d0d2832833a8898bca03965a2dde6f94d2be5a653eb389b6539ec78844cff4d4df532a8"_hex; + sig_r = "01ce67a3509d59f8a0f171b86559f1d84589ff2693ff7d3ad3ae64b0e5af85db2fd99bfd7eda6e8f984a87f16767231cbd9026bed0a9a49d74ea5047201227c98f41"; + sig_s = "0032b0e4c043df8e81ff22c9bead36f704c992ec160d6be7764640200e1307002421b5d73154eccde012b463aeefd11138c5b9b705623c2c849736da23c122df06f9"; + r = true; // Result = P (0 ) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "001dd34056fd2ff3009bca2d0bbfa70ea0fb678597d41dc545358263ce2cef9a2efc016622c12099c2a50257609d6a14f3c5ffac8a52661e4a34689a3aebdbe86163", "017926740659acf72f7c7a147a3a320d501efadef8519bb289ebc33e348d6b9efd65fa516048101678548898619d311b8ef2a0d4a6f59f86810e9e6534176a24faf9" ); + m = "0784227d3d40bf646f7402cef305863d59d904b16535bcfae67e4e2ffd79d26103c4d3f096493ad46c09a0cbeaf61269d49df46494a860b25c8e5cb40227eb8aa76e6307ddc47e5297393bb5afc946fbae5f8de0069ccb62889df88560a0dce85f888f83dcf80ccc6617a51466eb9d9cd450cdfa75acba6f3ea43cba0760dd0b"_hex; + sig_r = "019043db42f44b957784a0e1f09d2e0a0dd548b865947f93b516f249ef1757402544ce5dc402cf8c1f180e9a3be01657258a1dfc14b25ef564805651763d6f609d43"; + sig_s = "01e0b45e00bde9c4e8dfe094f9bcd7af5a19b631db850a69bf0b6291fd3df6e26f4c712e3b5d4b7b8572f637874057d5652fa2bcd1977065a695d26a80669a23f0e9"; + r = false; // Result = F (2 - R changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "016e5b4f4ff81c1b1e7956103c5cde951c56b37259fb8bf735b386e4d8b3d44063ef062d6e179f618a506ec8ad9773cfe99044748e2c8ae229a51bca6262aaefe2f5", "000069bfdb9123885d8ce4ce67c63311055aa9a1a5150197717a853d0549bd17d2683e427fc90a0b78af5dc96465ea3f2862cf98e8f3ee2a07089e8837aa8d09d97f" ); + m = "c1c9b8b123b5680b07669c285d3cf9e82e96fbf5c9cb7409265b2c57036137ef73460263b7a279f363bd7a0c7f72318b8fdad4a2d5f8f2d74b4964e54a1409554bec5e3e36d7e594b3af9b4f5cf28e59382f56c1c01a9a6c5c12b4abd127726a7fca24f2aa8281d7e86d6e61b460f2436e23493e83bf99acee860ef609ff919b"_hex; + sig_r = "011550cb365daec01901b5a5cabe7930c10d79128c5e510d58b7593c88647eee811e6fa736b26351558cbe7f17d7c882bfd1ffa72ca3bf4bc1cf1c05f31f5e8bc057"; + sig_s = "00d6fc97ad14639a5157c92b39cfd1315d7e940a454f1289c8e95c8cbbce8731ad37180554e7a91565d86cffb3f5caf4ef883184d717e03eb776af714a32234e3f5f"; + r = false; // Result = F (3 - S changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "00202896ccf6710cf780bef8908a2783b3c8d5b8356f1546a1b6b909b0d65ffd7999a16112d8d68c837597656e520a56c2f6578e322df6dd794d2c08bc5d8f9f4c37", "00576152d30218c941e83080a502cdfbf9de7ca2c394969e779b76c359ffcb84902ff89e37125dea7dcdea0ba928ce2305c619b1906955e6be5ce40d087c5245eb45" ); + m = "8d2f5ad1abb9f5cc9a981e24ecdbc6f2fd50d52b848e872c579465121151341c1ec8e01165a0365a2e36a26f119b283485e3e385141b4c4d03bab2894211595d46839699c36db0551bf32aafa658d819ad8ae0cc013570487f2d4c6de5c4e4df311f4cafdfa47cd6495d99453bc6fbd0ae538917f6f49a961551fb0c6497b15f"_hex; + sig_r = "00bc6a7f5d77cb6ebb36a261e80d739f42b67ddc7a6496acc0ba7804d14b4850cf3fe4d8b56cdd8c019ef9f0d33aa26746018fbb4c69f4587b6da1adcf2feee2b438"; + sig_s = "00f09c6a94a8550a2781e70b4542096407fc07617f537cd27f1a1ddd15c599d5a9e3fa41da57094456277b44b89d40b26f2cc054fbe657788fa9d71659008d0d698c"; + r = true; // Result = P (0 ) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "006ee95783b768c895e2af569bb84b0b1b00c8b72eec022df255892527987ffecdd81bd8afe267408a8912cce80982bad79c30610571a37d2a0e027e73ad23923b8d", "01ca3f60a37b18bd8b08529da1e39f93d518ae3feead5d00e07150d80d641b20e887c62e8e910ca1c2f64cdcfa678c89b2e3012e3d9b96088ae31dd660dfe6369cb6" ); + m = "abe8ff2cc3397f3a914d6b026ed01dad7dc33fc11a736060a217ed20dd89a4458f8ee0a670a2f489d0e00599f5aab560fed8405496ba51548a07a722a3ff3546b94572b4c0abbd6503a46cbc7a38dfc9322b702c6b17a38a06e3736749801adc08f6200f06d3bc5fefb9ce72f82af2d68f55e1607602ce6670346b93ac1280d0"_hex; + sig_r = "006823e8f6514e42e79d50a112f0f320ecd53963729038ef0d66d5fb59e1c664fda493027678a02b139fcf290657fffd7a529f4f38ac73542f316e1b0b25b3b88cfd"; + sig_s = "01b3bf9e54b0f48bfcc7289d187e831d94d165949db3c660cb63106be1b933e10614e3673bb8078bd8b80ba052c63d566899e618ea31e2a37e0c9c10da111ad11560"; + r = false; // Result = F (2 - R changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "01ba73e2af308df78d4f2a9e552c3b9fd35d35bf20126fdf751d8ad9917cc58d734fb9de27553cd07c02eabc077f16ad4532871a8aeb59bbec82e46ef1581e4abac0", "00cf888c75582fb50bd0de724a9f4834ea127a1eea437b9a05935d1ec06815bace3464c230314b7f796423ba9fa983b2e6d1eb0260a32cf2f163a5ff46a9623ff149" ); + m = "84508e6d7c687b7425b212230a1754393156c5643b80ac3c4023783938ed972f6644658e0f4538248adbf08533a10f75f21081dce9636611461cf8bafff496b984cb933d337b1b8405cd2e4626cee1cd9fe9acac22efd1c434eeebbeeef02f2a1c4a5083dd8651adee80aeb41d1e45029eac3dfa2967e76589fc5edfad49849a"_hex; + sig_r = "01df7e724658f1666aee8d5d75609e3f5215228ac32b978ea53434b7d154dd4edf661c688083d0937e43836c3611526c75f6f26b08f7844a95113ea4a6f1ab824a0b"; + sig_s = "019d40a7e03bd69ca568f70a066a4a57c0e6ab82dc8c2c8aa52b00c3ee4c327a87eeb7d837b0c4de68e25f7ac7cf6c0d8bbe0393b98dd61ac4961c7f8c70b40082e0"; + r = false; // Result = F (4 - Q changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "01419bc65174998ac21026f81e6807d8b42f0477396e7ff8a330e17c1d84bdc9b39b2a310767b46c41711f3f2fe503504350c86bf3d2b39473b64822ee32dec526e4", "0184c968f6ad79bf0da00520e5339751cd9c50e41e7cd21ef37756bd0e36e23a8071e5f0240988b73acb3bb2b6002002e09bc7ef70ffcfc7cf42d6b7c65110f54ae0" ); + m = "b4b1372e94253cdcc6af6139b12dd61fa559299e80e24c900416fa79f9eab738512c7c381acdc2fa4d0393c370ff38d371ac96a6bfa47c4b8fde12402cd27c704059cfe1cb7c3b5fd009f415b4827c7ec0ff32501ebf4dfb179b278f013a16746f52cb5005d902c3cdb5a241a462fb9b1c86576c3a18d21793b0f2403c32f793"_hex; + sig_r = "00d785b38c5283466f796988242aba08398ed2493aaabf959ed0e8b7b915cbb711d7694f94206db74641a518642d43c843ea7f43b8354a956a3695764021cc5d2774"; + sig_s = "012c20c6ab988ae911c7cdea0549de2e40e3e68c47cfe58fb777ebc204641bbb44f2c8b6a0196d330ea2ffa1d8cdc1dd9be353f1c657e43f7fe3c094898a569c45b6"; + r = false; // Result = F (3 - S changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "010f3bb1c96a753d278ddf6435e7a79a53bc2855d26d9f8d5c1337b0fd7d70bccf204377a02a1cbe95cb63e21a9e8a3ce8ee7c8d4ade16ff4083dcacbc6c4b2a350e", "01f98a0273c48fa78a91c0f8c1a43f59c7bccb74780fa38b08989d334f2ba0353a3619e6d4a1072e4e052720ed10e4f2c07e12d0c81a062fe912708dc51d4cdba97c" ); + m = "b96387edb83eab72ea30c323a7871fb0704ea23b21e20cdda697823b33fdfe31ff8b1e7b991b1cad074d4dee15ead4b298b56aa62477167d40350f864f3db57a414e75ba06223ca29b42676cd57cedcd8031e76de66949ffa933f3b8cf717baf0d7fe21b84bcfe7dbeadd99d665d1ae90c8f74cd6050038e32920aa04c0820c9"_hex; + sig_r = "014c4b9e23f51df21b4e02ed7611a8530466d1ed799b50b34b5fcac3bd1d63fa345925122414119cca76d22c167c18ad0fa8e1b47b53ab0f201bd4ca7ea25e011965"; + sig_s = "00ce91a050938119f80b5f584a9d9515c998212f6e122780f1607cebdb9b538dceb2d4039ab5e1b13736f4166e73d86c720516f20ad8f24e4b9fadd459c2988534ed"; + r = false; // Result = F (3 - S changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "00819178ace7bf1e6e942fd6ed69193386f6c90cf65b42e9204d34ec96a0ce8fb92552ca57a7ba658422dc8b53bee150170362e6e74bdda24fb458271602aaa9b832", "014af772624921f61b3d1275591ec2d68702fbf348382e9e552a9b6c110eebf6e93f20c8bff287d504fa08ae3628e611fc1262736916fa9edd87db1c78ed2426cab2" ); + m = "a56d82d65841bee94ad279a0c9bb3354caf8471ac11bac1e6b445ee0415b9933ebda8d54d8500e132a3f5b3e9aab72c4fdd0048b9e84ab2b1d4acc3df4003481a33cb7243e72005a6fd1e15995d7b3251fa47605d220ddb1e24571187bcbb67392c94f0b308406f5ee4115d5f18227c98124a087bf06c4c31a93a558bfc6d937"_hex; + sig_r = "012c45d6ac0b5dbd9647211f770c3cca4411666aa39b6988a968bab345129237597b6c9b3bd788c5f9f39a38463a8afb159ad72f19e7e33e7f9ce8d67d611c3d9b46"; + sig_s = "01684000b3d7381aded85b18576832c4a89b4faeea0515454677e29e3f072097e786fef11f72f229b63defa1c2fd3c07090b34f9147647035854cf2950c12a8b16d8"; + r = false; // Result = F (1 - Message changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "011f8e50ed6905b029ce4b16c8acb8ed9136b1c5adf6f11bfb5f3dd8bb1e208ca8329a0aff9bf286e3be90e4d61d5147bcaf2293f934862cca6aead51d6e0a083093", "01963e84a2f06a9cb273a424ee5fa1ae5900fef348371cc91c99323f58bbcd8742a4495a4f7ef52677501a4d5d663658c1f6c8f6edef8b7880e6894ff9e52bb617da" ); + m = "9e49b40d074d5e899060654ff081fc11ea9cbfa5904e00b49d5c0a0166b61e302ea0dac2ab5567b7fb1f5e116abc48305ba3013ce957aec0f239f7538fcf4f26dcb03540837c4bf8a3338700306e3c6aae6b27c73ce8948856f6c2120e96faf0b52a5954d9134a9b4b9d5395bbbfab3505acae48b30fc58e7676b522908b44b7"_hex; + sig_r = "012fc3e0c18c4edbcda4f82b5136c893a6307c3f60affa15d0d99fc0e4a3576b7daefa363b3a362014d14f631c35619f6861bdff9a7b503825bf9f027fcb9a31fd8a"; + sig_s = "01a138d6b02fd2a7ba45f7f952b2f329ba6a8e25697379330dddd91d1d6e865d3df1541bc4717d3e09b10a57cf38dcef587ac31b4a8abedef43e4f6cdf6ec3f49eea"; + r = false; // Result = F (1 - Message changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "01efc81c1efc7a9bc36ed49a5ef6fa1ba641360fa5c0f96cc1e4a3f4d973c95e86935d979fc2101370777637ab210a56fc4173a50a758725d60e9f925f2066d2bc00", "0108225fc94ab33c74aff785dcc68c45cfc3cbbdfa3481fd2a3f97308be671fb32fc8d268c129d97f140210def188dceecc9d712ac397793dbc39c5cac332671ec54" ); + m = "036fdf92f353c2a55a33f54d4f731db18e56a5339e731bd09d0b8554806cfbfe36d3c43395c70505866a5659c246fb14a845635d73e222bfbdfad011669d2291fdf88461cd888fb32e5d7f63935dc536d390dc9a9d3f4a67ac1435b89002b4348d80a601b61bfb8f95dbfcee4fec34acf0af907819e2be2d3b68d8eaab4789ec"_hex; + sig_r = "00480c48a24e7a7ef832547d107769254fcdb4e7982d0e6abd16822837fd4f3b66d81e1d4a018606881abebd220ed8ca865d7e00499ac9651a98c65502baebf34a98"; + sig_s = "00ccd22d1b44a1701c99f662535aea9abff7e27f73628101f42708737db8b07effdc2b0b05d4ef233c5910b6261ae9d9c540115f27d2af766c0494c33d31bd56b3db"; + r = false; // Result = F (4 - Q changed) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "00a15c8040f94235b8b444f7a74ca293ed1b718449911eefbdb74332687850a644395394c690aa98e8064f6eca600fc3f659208c0f8a21a1e7113bed0c6e00e3176e", "004bebea7037b731d175043dec3630b2ee85c680a81256921a89407c14507c10ac043deb5d474602211ad58cb569a8b805686bdac3ef7ff62a4d25b27200706b603d" ); + m = "9ce982c91af08a21d405f96abd6204588bb0ef1c8b78305b06f36a12d1914cae9dce6a1f1a0b4c42b067667c457c3e90e56f34cff0116bbd350d27882dd6e47997c944dcead9cb945f7c691078c1b533960a55f93d241970a1fdf4441107d8bc8af5aa8e088ea3aa82c7f3286e815dbb85d5cfae0aeeeb093468cb55201eeffb"_hex; + sig_r = "00c1a70919025aceb29dbabdfc2a43715192cc60fc3d1ceababb40f91e3110b2cdd8f6e9c1bafe7415a26fa4179f8fc261b143ddb094fe61117afb13adae9db8943d"; + sig_s = "00197d7f87aea8d6ccd2178614b147b290ec780c8075f8439137803c0e9a589e415d84fa23f5f31d61c1674f87142d4ba4f8473fc92d7715c281dcf3f1ee5c2f1390"; + r = true; // Result = P (0 ) + d = sha384( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + + } + + // [P-521,SHA-512] + { + auto pubkey = curve.make_point( "012a593f568ca2571e543e00066ecd3a3272a57e1c94fe311e5df96afc1b792e5862720fc730e62052bbf3e118d3a078f0144fc00c9d8baaaa8298ff63981d09d911", "017cea5ae75a74100ee03cdf2468393eef55ddabfe8fd5718e88903eb9fd241e8cbf9c68ae16f4a1db26c6352afcb1894a9812da6d32cb862021c86cd8aa483afc26" ); + auto m = "a0732a605c785a2cc9a3ff84cbaf29175040f7a0cc35f4ea8eeff267c1f92f06f46d3b35437195185d322cbd775fd24741e86ee9236ba5b374a2ac29803554d715fa4656ac31778f103f88d68434dd2013d4c4e9848a11198b390c3d600d712893513e179cd3d31fb06c6e2a1016fb96ffd970b1489e36a556ab3b537eb29dff"_hex; + bn_t sig_r = "01aac7692baf3aa94a97907307010895efc1337cdd686f9ef2fd8404796a74701e55b03ceef41f3e6f50a0eeea11869c4789a3e8ab5b77324961d081e1a3377ccc91"; + bn_t sig_s = "0009c1e7d93d056b5a97759458d58c49134a45071854b8a6b8272f9fe7e78e1f3d8097e8a6e731f7ab4851eb26d5aa4fdadba6296dc7af835fe3d1b6dba4b031d5f3"; + auto r = false; // Result = F (2 - R changed) + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "01d6aef44370325a8a5882f4667c21172cdc8fa41d712562883ececff53883ac8ee276124e825088c79d6c9d96323cb7b8c0b7ea44d3f0026e2538f4b62d785bb1af", "0027203959a6e944b91fe6306debe74dc5dde9831fd0ec27e8be2d0b56807d63151b15f6495b8632e919e1e6b015f5ae5f2b6fb8cf75b5f848f00cf4ee457cebed3a" ); + m = "2fc1140a7414e33ab469799f9432b30d29d1e4451b28a756a0f24a7f7f90cb284fb443c074267a7600b370eefffea23078b4016b59cbeb95fab3c6f37a72e92271b29ee2382e1106f8dfd3871ef9bf045f78d378acc8d16c983d54c7bc0b0cb46bba0de78630f6d0796c2c275e46ebc88e6e6c0e675ebd849f02e47f51abd215"_hex; + sig_r = "004417ff74889dde6bb1820b5d13da5c81dcf9b0723ee89bb1ff0d3faa90d497685709f315b2cbe55481dee43ebb6d25b1501ae69494dd69e7bffb72f987d1573b93"; + sig_s = "00fd7aa027c665458c7ac11d54d4f32cb4a1e727b499ce27b08d3d647c636cc3222a4f0a6057732249ddc22574d7cb80c3769c3ea9de3d33db3edd8ea90cb3f8dc8a"; + r = false; // Result = F (3 - S changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0153eb2be05438e5c1effb41b413efc2843b927cbf19f0bc9cc14b693eee26394a0d8880dc946a06656bcd09871544a5f15c7a1fa68e00cdc728c7cfb9c448034867", "0143ae8eecbce8fcf6b16e6159b2970a9ceb32c17c1d878c09317311b7519ed5ece3374e7929f338ddd0ec0522d81f2fa4fa47033ef0c0872dc049bb89233eef9bc1" ); + m = "f69417bead3b1e208c4c99236bf84474a00de7f0b9dd23f991b6b60ef0fb3c62073a5a7abb1ef69dbbd8cf61e64200ca086dfd645b641e8d02397782da92d3542fbddf6349ac0b48b1b1d69fe462d1bb492f34dd40d137163843ac11bd099df719212c160cbebcb2ab6f3525e64846c887e1b52b52eced9447a3d31938593a87"_hex; + sig_r = "00dd633947446d0d51a96a0173c01125858abb2bece670af922a92dedcec067136c1fa92e5fa73d7116ac9c1a42b9cb642e4ac19310b049e48c53011ffc6e7461c36"; + sig_s = "00efbdc6a414bb8d663bb5cdb7c586bccfe7589049076f98cee82cdb5d203fddb2e0ffb77954959dfa5ed0de850e42a86f5a63c5a6592e9b9b8bd1b40557b9cd0cc0"; + r = true; // Result = P (0 ) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "01184b27a48e223891cbd1f4a0255747d078f82768157e5adcc8e78355a2ff17d8363dfa39bcdb48e2fae759ea3bd6a8909ce1b2e7c20653915b7cd7b94d8f110349", "003bd6e273ee4278743f1bb71ff7aefe1f2c52954d674c96f268f3985e69727f22adbe31e0dbe01da91e3e6d19baf8efa4dcb4d1cacd06a8efe1b617bd681839e6b9" ); + m = "3607eaa1db2f696b93d573f67f0359422101cc6ceb526a5ec87b249e5b791ac4df488f4832eb00c6ec94bb52b7dd9d953a9c3ced3fb7171d28c42f81fd9998cd7d35c7030975381e54e071a37eb41d3e419fe93576d141e36a980089db54ebbf3a3ebf8a076daf8e57ce4484d7f7d234e1f6d658da5103a6e1d6ae9641ecac79"_hex; + sig_r = "004c1d88d03878f967133eb56714945d3c89c3200fad08bd2d3b930190246bf8d43e453643c94fdab9c646c5a11271c800d5df25c11927c000263e785251d62acd59"; + sig_s = "012e31766af5c605a1a67834702052e7e56bbd9e2381163a9bf16b579912a98bebabb70587da58bec621c1e779a8a21c193dda0785018fd58034f9a6ac3e297e3790"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "01d9020b8e6717254eebe619d46dd5a9dda7ba5491a7d1b6820fba888e236fafd71179200437f4d61284fb5a3dfbada66bac3e6909ccbeee03c2b93a8bebe41a73f4", "0048a5f09174fda12704acdd8ed560695dec42864b6300a030768a0be7f09d25f82d7b126125e41417a145641937807ed8d1af7a53f5bc3fc3c57427d755dcce3e25" ); + m = "307bfa6a2764591bc31537fcbc7275e258f158f4b7ac5cb03761aafee8ff0c58a933cd28a38fcd1a29a7c907050c273bffb249303ea0007d16c8c4aaaf145afe9cc97285d33a8bd42f566b1bea7a5ef77844e3d7c3b55132ac7407da04f1a7e85ec7f2d03b667d9c3c52ebeb1d25b392fb4aa210aff2dac00ffd1b14b0e2112f"_hex; + sig_r = "0092df2dcb457fc7578eaacc98ffd73ade07d764e9553506f3dc958cdb3f65d37665528cb2f5f8bded0db0a57e6fa73bfad1aaf94718379d1655db4f32d4c505a785"; + sig_s = "010e0c31479c2b29dc2726fe9f75b397d9e37a17619e96bc631c62e9ece71f05b199804cc803940d43ddee41171dd7787668c7db05049dd5b63e4f63562aa700ca81"; + r = false; // Result = F (3 - S changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0007067d2cf7b7619b9fcff2c898246ae0950439b8bab92d809624970eda18456cb99953ce1ae45ee5d36ef02fcd5caa4d951de8581f0c21e572caad56d6dce60da3", "01913c59007a309005f226b6a30122828d60b4d0390359e1977f88b5347dacf2056dd362648e8b1d6fc038a3bd3fde6f1140c740efa9075ab8b4a64b334c5cd43f09" ); + m = "3629ce6137cffaf0a485594cd47049e7866fa81bb56dd66168567542c6b8fdf7dbafe693c919a7288a03f2483b09c9cd2b3f91670264672967e4542d5bb6c87e861115ff3ec2ec2e96535148623e80525abae8d71f296a4e8947b48bb64074ebb7e0c7a586f57b35da910704f44b41151ac6db350c47e81805fc6932f435a98a"_hex; + sig_r = "012aa4a532c108aa3cfb1753f95ca626bb72bd96a423d727656d4ebdc3f406d6cc6c44d3718f9abae8a0b46be9b57f8fd3a540326b63d0d4a8a93165715920437787"; + sig_s = "001badaf38e16efd75915f4806f054d40abd2d11e402039bd48c832f66cbfd145e4dac93357d476b7e608d7b75a017374ae76eee86c505f2cc16eaa19075827ccd60"; + r = false; // Result = F (4 - Q changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "00365388d9589c18ae608124b4cf746ff488183a912e07d26b6e867c5defb552a5a0df5a16b6342014dd1b0b6760072bcd60045d6a9a514fc74d16047c2e8765636d", "01a5319b26fd555f2a12e557418f6aa65a3461aeaea5c0c6d8698ceaa5495eed7a7d2fed0b76e77b5be11834f36e413d5288e47231c0eb0e9007d4b042bb7a1b6014" ); + m = "27383a923d22292dacff105f00d0433eb719cc5fdf0d555f05a75fef392eb9a2b10aa7984ff8cfcc1425366578d138d193d735706e9689e1f2590374075c3b0143cf2a6f0d2108dcc3d6682c060e036c399774a3bc7800c7f34cba204693a42803df6592165fa19e34b6c1872ea11aa13e7a6648a4f0d56a5bf41dffd8f03aa4"_hex; + sig_r = "01d9ef377063a592cf81e27815a2c20789ff9b60f7f125e618b52d90b35abdd41cd7f437cfad337953ab0314fe8e79a2f2d27fa08597d4b28313358f714a737321fb"; + sig_s = "00f01d4f150e0a174674a6a61a58a4ba781406024f6dd1b5252e04807b8a807a4ff8d52883eaa258286e506ef4b04ca890e6f81a79ed9a0cd5ed585094fea0bc5c43"; + r = true; // Result = P (0 ) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "00fd0cac24aeb75ca50c50a72340256b43649050e0fa155f72342877bf49c3d57ac2b51b828385ee6aea94bae38587e63390f5ef4ac5540a9e6fc6f1c1e79b524693", "0107b227bdd307efd7a8d4034f733d150c41601215e76eea2bac62ad2427dff52f75f46da3d5fe31bfaedf071d2a8bb5e3c82bf6c84ecdf89ca233c92d599d376309" ); + m = "2235705a18ad2fc1940d6f1641ef3b7019e56e1cad01aa4c6da18150d622551206dd00163e71b9c2b133f29507fdef144c6fa4a1110a30eb309b04b3f3f9d7f5d6649ec3cf9416c8145e12a0934db1e48ff14800b238a4abe1e2b95ae6984a47aba11408b5f4dbc2cba858d52d58022b66ba2721573b83d5b62f07f38c4c58da"_hex; + sig_r = "01c00196aa5dcbc4c4404fa76504a5eacbc96aa66c3ba531a3a679f3fb675ce58f863e08b0d2bdeae74d96ad93a39a78ed4bb3749e26567d0ca5c48a71079925b617"; + sig_s = "00f1188eba4f0943f4003ddad6a54606c13af26014db2eb8e60534fad3dae8f07c021cea0990987f1e02dce03fe53360472c3dee3c305bb3ef4b0b53ea6625bf152a"; + r = false; // Result = F (2 - R changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0104a96beea09d88ea6789a9925880c8a9ece8d764be931675640c1bf847ac8e7a8b14f408ba6722c2bf6295db9132d6ad2fe287fa6e6855f7c58ed238148a896944", "01b5e8e643fae552261427ea7d521f380adf605579462315c75e9203203ebdc9ee33dd7ba885b6cccccbd2327462988223c4b31485311c935a341ee87ba1ee820ce0" ); + m = "f1f3b286307569704538c97c680abd5bb892b421463895c74aa8e1c4a46213f21a95941b8629af8117c2a00cbb71f44d79917357d529e486d8d5b8640f809960973fe9e28b34c6e4082f3b3b0689fd44d3afe5b71bf4349d32b7d80ef5e22d58f19a138e1b676addf384b3e54795c6cee53264f883d080630bf48f498761e6aa"_hex; + sig_r = "00ba2c57827baae684d2c637590275c782a6db263a5358c8e1a08b5460ca3cf0f5ff8d4119a6b0d55fc68a75c793098e0a5622a0b4e2fcb0f17943440138d751797b"; + sig_s = "01594beb73b2ebb7c573ff07b5c43e722dc05979df0eef53587e9fe06a920f61d2efcc7671e6cb875df4e4d92cd4d37cc3eadcb9b6aee8f2097790ce24d6dcda8706"; + r = false; // Result = F (4 - Q changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "010d587aa82a4d8e690672c00e3fd71826d892862d14dc4fbad4935aaab86924dc7ee6f7fd3e2bbe86a8652589448494dab83d363d1d623cbae59f6c2670706a0576", "01a9734c99b6ff21267050738937c30971d0f6fe07e29794748a5017ea1036c975c9a52e6d3739ca0e8d70e784529cc1a7437aac5d75c69121b69020a95356137f1d" ); + m = "b6fd672065774d5c252a6a596d0373b898465af6778c7219011db482fd94a4e260df7fb7bd3703da7293e96e5324c12f5b8e1cd2c27dc3062007b6ea08e1fcc819ca099033eeb0a88ae28fe49be330a1b727d49fbff8f497edb45b8e0fa1553c33e26ff9b4c35b729b85a6e98654ec3f46a2089b6f863033498e1e4aac3690f9"_hex; + sig_r = "0188dcb840dfc573a97117009226d58dbb930ba8ec848931786abc770611f3519c8ba73cceb5b489170805bcf04974672fe66c908ba379aca99fa67fec81a994c2d1"; + sig_s = "000b1a185512dc6a65e454ea2bdb8049ef8f012a53ae87b759fb5d9edba51ea32e254e80545a99eb4b7c58af96b7c433535fa3f009cc644b1c97666d88355af9fc19"; + r = true; // Result = P (0 ) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "0182c957a62e2e27aa28acee2e2f7b1ed6aef81c68001d2648da47d2b621e8b8bd18d991cd1e3fb9afb84f639fbed1050584428cd2a1d50f877532ffdefdd4e6f7ba", "005fadeef58cc0d79362b599e94636f9c70e3e5580c085b7ea52a5fd24fe4a892120b8f28ba53ec249c42d6d3b36268b8ca8464e54b72d37327d7504d9b7ce534d95" ); + m = "297660ae8a7038969a7f0838cd95ed1885bd20c5a69a24f5fc8a63918c2167868ade4e372390b0c5ff198315ca1ef947d9c85036e38ba1277f1e6146723bd8f9ad1db6de80dce053c4c9e4597630a02dc514683310d3792a4831df7e8fcc77298f2a2fc4c071412219482a6e218c916719c613cd249a336f823632aeccff486f"_hex; + sig_r = "01e3a78e973fef6b6de8a0356401e89f435ae5f49c0173f073c4dbb9c91463e420f5265eade8305f11d30fa8d97e5b4c5ab33975f73385aea81fbdde2f7ddf7fdf16"; + sig_s = "00efeca10b5362e05a8f2e3df6661d0d536b32ca1e0a62515df2d94eb314aadb5eb40468483e24b16efe85c503d6c231ef860aabe674b72ed1ddd93853338e5e4e50"; + r = false; // Result = F (3 - S changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "009911b41f9af525c874e05bfdf050331bf830296911bcb18eec16275027d63fa106c8989b07921c7e58b02711b5b5880cc4e6d9174e0d31060548cf643bf7ed4f0c", "0184fc0fac3c2c80c69c1c0293f4e5e22fa08c267b1f36ac5ad6dfdf4da1754f7942f48cb56f56cba05e22b91508fe4db3703066e8f697aca56f974f3fe530c9640c" ); + m = "5d058ae533538ad5f6122e8cc4f5c6dbba56c9b9e49d7eac506874683b7b20093552db5ccd2d819ad554eadedb9b2cf613b73429723caa9f21b9fdff20d575f17b02bbedaa9e2c6b788ed90e239d9def9d108df3cc596fc5e975c59f1d78b9be3fa41c4fe86d1dcaa2d4876c494e14bc167736fef07563d2db0506b24da891d1"_hex; + sig_r = "017b8a22fd8f73112310867909f234fad6aa82999c28ea5a2e74b4b4bc79b2f89008b4d361ef7e797c7656f7d9317eff3e5a4982799b8cc0db82618bd2aa3959f617"; + sig_s = "01edacc6d1c0004b2090d2025d615de1fd53a96e826a3930c7cafaf3c87f34b2583997534cfa127485600a7ae04e6af4a2e98c77fd04507195e520e80014aa982a3c"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "006da3b694e3123ef96b3fd2ab964f85a36110590720dc1724a5d50d3050498957211c6a1535032cf1f31240bfab967cc0cf3b442c35a1bfa3e72470df1863d2593a", "017d0a5dc460c85d0365c7bdc2e9300e276b8aa97368af9972744f4422442afc601ecfe7903a33b0354c901c7b61f29d2d3c5610192cd188291c5651754b385b87a8" ); + m = "c805a07a01e3806dc81454ee64b3afb33f302dbf65062c1c31169bb501fff4c4a1905729a4d0ff463f2349fd74596b7d51414419e3c92767ebc9db52dae4df2a83cee45486dc1296c6422000699c72137178ffd666d2f1d1a105972bef6eef74e704d8c815bea269512a32fb1b8dd82174e04b2d0d5beaa0401284a7e2bfaca5"_hex; + sig_r = "01f9cb1f4e2e65282a929acd8b685ab34da176f5c73bcb374fd1b09bc995385ce3902d6c5496b02916fd5a28f6f8bb662828a76aa0ad14b01bc24a63b328c7bb949b"; + sig_s = "001d6b3a2f34e3b7bf63d06b11ace172ca61ac5a911a4b408d766eb586c9ab820d42f555e546d892643e12a6752465427c213e3839e4f8cb3a7e4fd83642843e8544"; + r = false; // Result = F (1 - Message changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "00b7e03f0d623a0998add5360dfb0bfe836fcb0a46b0d6f697ba6b3766bd8698ac8c7af62f50511c6aa5e613f4a99fa28f70b220ba1cddb22482be74c969953ae6e5", "00d4ee40ee4441dc85356760f87ba32e2e7c269a2e53a2e8425d5ff02f5e4fe8d65cefe20e162c3915d2eb9ad1354bd28595a86dbdc94a5d40c5b44b1e3aa3965455" ); + m = "05f1b975f4f446a1b8aef50dfca608b03574a83a7c78d5c2efe1660a034994917455b9c8a774ae381cbfdfff162d36b9a17bbc6ddef34517cf8fa54bb6901f42def4b787a83d3285eaf04621c58267ae6d2bdf20b3bb4cb6c4bd8ee5105eb3f049c44df4cca39f6015a3d316f08af97eda47f92a53600cb2304a2724e40a9361"_hex; + sig_r = "01fcba4781de6506f7c3f26521f0e036b5225f651e69e115d6784b2176a666edf69d759627468400a73a136f599fb8db4643fcc16bdeeef6384a1875e1c81c36b962"; + sig_s = "00a21cfaa7e1ee0eff7efc3d7e936378500283b00687363070974483ad474c58c6b55b77f678d78e7cb44d9745f79394659bdd26b72663608384b5ae9cac1c888d13"; + r = false; // Result = F (2 - R changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + pubkey = curve.make_point( "001bb7c623fde41beec7ddfb96f65848c2f52b50b39576bf06de6ccf157b8ec49889528728480928236300447da7171f58c8f0e0ba8fd3e2cf378b88619aa6c1e0bc", "01f8b20a1a7df319bf78c2cee03581a1ffe8ca5107fbfd40760fbd5ef5247e2df1092d5caf504a9ee653ded2995f0cdd841d6af29c9f720770056ebbc128705f68e6" ); + m = "3a8d8066c0bfc287e1434c2430261110e33d0ebf69d35b65b0a2d70763c7fec993decf883174f216a6c0ff622ef777c078cae5c6724f9a020f8ec07041dfcca3689a8abcce10efae0a2da949b87459586fd012805c54f0807d927d0b64595c6b18705b49d497cc2ee8b867f9e58b1382e25065500d1d7442944283346657a835"_hex; + sig_r = "0000db4c31f316912295c5b9506aabc24b0b2dc2b2358e6b023148889d9200bcf44762e88575e359b4868b2d93ba7bdb24800b09fc22eade0744b9832b71ee784e9c"; + sig_s = "018c84437fac7cd82099a2a4230084ac27ec7ea9c92e1c9d9a71290df9b37dc881f9ba59ed331c22dca4b2cbb837cd916e0a78398d2b7aaf8e88f113a942beac48c0"; + r = false; // Result = F (4 - Q changed) + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } + + // Test vectors from Google's Wycheproof RSA signature verification tests. + // Generated from: 'ecdsa_secp521r1_sha3_512_test.json' + // URL: 'https://raw.githubusercontent.com/google/wycheproof/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_secp521r1_sha3_512_test.json' + // Note: + // Test vectors with flag(s) 'BER', 'BerEncodedSignature', 'SignatureSize', 'MissingZero', 'InvalidEncoding' were not included. + // All test(s) with BER/DER decoding related errors were not included because they're not part of this test scope. + // + // Algorithm: ECDSA + // GeneratorVersion: 0.9rc5 + // Header: Test vectors of type EcdsaVerify are meant for the verification of ASN encoded ECDSA signatures. + // Notes: ArithmeticError - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.', 'cves': ['CVE-2017-18146']} + // BerEncodedSignature - {'bugType': 'BER_ENCODING', 'description': 'ECDSA signatures are usually DER encoded. This signature contains valid values for r and s, but it uses alternative BER encoding.', 'effect': 'Accepting alternative BER encodings may be benign in some cases, or be an issue if protocol requires signature malleability.', 'cves': ['CVE-2020-14966', 'CVE-2020-13822', 'CVE-2019-14859', 'CVE-2016-1000342']} + // EdgeCasePublicKey - {'bugType': 'EDGE_CASE', 'description': 'The test vector uses a special case public key. '} + // EdgeCaseShamirMultiplication - {'bugType': 'EDGE_CASE', 'description': "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used."} + // IntegerOverflow - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidEncoding - {'bugType': 'CAN_OF_WORMS', 'description': 'ECDSA signatures are encoded using ASN.1. This test vector contains an incorrectly encoded signature. The test vector itself was generated from a valid signature by modifying its encoding.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449', 'CVE-2021-43572', 'CVE-2022-24884']} + // InvalidTypesInSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains invalid types. Dynamic typed languages sometime coerce such values of different types into integers. If an implementation is careless and has additional bugs, such as not checking integer boundaries then it may be possible that such signatures are accepted.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449']} + // ModifiedInteger - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModifiedSignature - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an invalid signature that was generated from a valid signature by modifying it.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModularInverse - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where computing the modular inverse of s hits an edge case.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['CVE-2019-0865']} + // PointDuplication - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.', 'cves': ['2020-12607', 'CVE-2015-2730']} + // RangeCheck - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // SmallRandS - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['2020-13895']} + // SpecialCaseHash - {'bugType': 'EDGE_CASE', 'description': 'The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits.'} + // ValidSignature - {'bugType': 'BASIC', 'description': 'The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported.'} + { + auto pubkey = curve.make_point( "012a908bfc5b70e17bdfae74294994808bf2a42dab59af8b0523a026d640a2a3d6d344520b62177e2cfa339ca42fb0883ec425904fbda2833a3b5b0a9a00811365d8", "012333d532f8f8eb1a623c378a3694651192bbda833e3b8d7b8f90b2bfc9b045f8a55e1b6a5fe1512c400c4bc9c86fd7c699d642f5cee9bb827c8b0abc0da01cef1e" ); + { + // pseudorandom signature + auto m = ""_hex; + bn_t sig_r = "01eee90ae46276f5a4d085d97da8d3d73e3aa41e809aeef225fa7e1780128f43ddb99afd82aff727e7dacfa0f59b1023350741fead9de533527aa6ef6a3a3a285a6a"; + bn_t sig_s = "b27e5ab4845f86ed525fac4e9e8500e56dd5a5161c02f0513393f4381a67ee307ef6516405445e931e6aaa3d7d3f969c6dd5f2044362304d112fa78c1956fe845c"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "4d7367"_hex; + sig_r = "87b41aba38fbc1d3bed442302c6c35080808a772892d8d7cff937316aee26a78589562d6df69459426ddcc22eba2ad7b46f5d837364487d25064577c2350248f06"; + sig_s = "01e22bd1983a6da4b2ffc3002aafe484aef52a2ed9226e27c11a3e31a0f047a848a93e7383489cf305eba232b1f4daedc1db0606c198b95514cb0dd82596d055222f"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "313233343030"_hex; + sig_r = "40c2378fb645cb6892d3d78f11eba20a97baf8a78be3adadee1abb5d747dbfaea91d83276cd1430278c39bed88d720d6149932b29748a1b0a791048c8ab477601e"; + sig_s = "01866551c42bc508ca0be80cb459e5fc364c77b7cbe3a6cc95af31a10751240fa634ca1507884f9f88393000fabc8983c487e502a7837cb8f8a9140a1370774f8f45"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "0000000000000000000000000000000000000000"_hex; + sig_r = "01b4a3842c80a39f50a7de3cbd5676f7895a3047c833df0ff965820361ec0c42c3a3d1cc68b469ee43083371d83b49d72a94e525c1223690cef9eb1c5b49a546f92c"; + sig_s = "01a1b6d398ff656a7159b8d3393e14a17e03411d3ec7b409f68c88827b5e19f383843c198599ca4d22d6f81f7774b31baa6e95d5de02a31c7b56dce517460f603235"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5c6457ec088d532f482093965ae53ccd07e556ed59e2af945cd8c7a95c1c644f8a56a8a8a3cd77392ddd861e8a924dac99c69069093bd52a52fa6c56004a074508", "7878d6d42e4b4dd1e9c0696cb3e19f63033c3db4e60d473259b3ebe079aaf0a986ee6177f8217a78c68b813f7e149a4e56fd9562c07fed3d895942d7d101cb83f6" ); + { + // signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "01ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b2"; + bn_t sig_s = "01abcd9bbc11d77ae8aacb4dc113aa0d5a53ee51b5e4b189befeed4649f35c97fe595e3ee86ba4c3358e80dd91c4e7db45cfd0fa027f18458c30602d7038515558b8"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // valid + m = "313233343030"_hex; + sig_r = "01ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b2"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = true; // result = valid - flags: ['ValidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending 0's to r + m = "313233343030"_hex; + sig_r = "01ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b20000"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending null value to r + m = "313233343030"_hex; + sig_r = "01ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b20500"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying first byte of r + m = "313233343030"_hex; + sig_r = "03ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b2"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying last byte of r + m = "313233343030"_hex; + sig_r = "01ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a632"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated r + m = "313233343030"_hex; + sig_r = "01ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated r + m = "313233343030"_hex; + sig_r = "ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b2"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // leading ff in r + m = "313233343030"_hex; + sig_r = "ff01ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b2"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replacing r with zero + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending 0's to s + m = "313233343030"_hex; + sig_r = "01ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b2"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b510000"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // appending null value to s + m = "313233343030"_hex; + sig_r = "01ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b2"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b510500"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying first byte of s + m = "313233343030"_hex; + sig_r = "01ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b2"; + sig_s = "56326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // modifying last byte of s + m = "313233343030"_hex; + sig_r = "01ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b2"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30bd1"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated s + m = "313233343030"_hex; + sig_r = "01ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b2"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // truncated s + m = "313233343030"_hex; + sig_r = "01ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b2"; + sig_s = "326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // leading ff in s + m = "313233343030"_hex; + sig_r = "01ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b2"; + sig_s = "ff54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replacing s with zero + m = "313233343030"_hex; + sig_r = "01ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b2"; + sig_s = "00"; + r = false; // result = invalid - flags: ['ModifiedSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + n + m = "313233343030"_hex; + sig_r = "03ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ecdf778ea1da4001729f30bea5e3cf64b9f4421887e4aa3c3b8ae86129c45cf0abb"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r - n + m = "313233343030"_hex; + sig_r = "ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed9546bdb1625a0ea52f373e7cc4ee2fffeccb5f50d376b345b37a6a45f235e42a9"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 256 * n + m = "313233343030"_hex; + sig_r = "0201ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a3769252c79e6591466ec3e3f41320c4f92760abe35774f5d4f2ac562cd7a0eecfaafb2"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by -r + m = "313233343030"_hex; + sig_r = "fe31e7e8fee8be05ded42c3f10ff14cfc83fc776dca7bf8032c1dd98403fd5c8912c5a0d9d661b2f7f418cc016eaba135a30f794413a3ef883f60ce9a4824b69594e"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by n - r + m = "313233343030"_hex; + sig_r = "31e7e8fee8be05ded42c3f10ff14cfc83fc776dca7bf8032c1dd98403fd5c89126ab9424e9da5f15ad0c8c1833b11d0001334a0af2c894cba4c8595ba0dca1bd57"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by -n - r + m = "313233343030"_hex; + sig_r = "fc31e7e8fee8be05ded42c3f10ff14cfc83fc776dca7bf8032c1dd98403fd5c89132088715e25bffe8d60cf415a1c309b460bbde7781b55c3c475179ed63ba30f545"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**585 + m = "313233343030"_hex; + sig_r = "020000000000000001ce1817011741fa212bd3c0ef00eb3037c038892358407fcd3e2267bfc02a376ed3a5f26299e4d080be733fe91545eca5cf086bbec5c1077c09f3165b7db496a6b2"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + n + m = "313233343030"_hex; + sig_r = "0254326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca368019b44ce269bd99bf7487eba70cd063805d0a67190f1faf3032d16b1fe04d11b6f5a"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s - n + m = "313233343030"_hex; + sig_r = "fe54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a6a1c117945b3cca717f226e3b1824ba302f05fd80e7ba73cf9fd28fc7aeaaa748"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 256 * n + m = "313233343030"_hex; + sig_r = "020054326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca367fbf279cf22d74a02cc5ccaefb87b18d4303c20857fc30d9e6a39caf9657778471451"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by -s + m = "313233343030"_hex; + sig_r = "abcd9bbc11d77ae8aacb4dc113aa0d5a53ee51b5e4b189befeed4649f35c97fe5f0cb860e7e5939f230111907bf0d19fff954438c68ea94481a4bdb919c01cf4af"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by -n - s + m = "313233343030"_hex; + sig_r = "fdabcd9bbc11d77ae8aacb4dc113aa0d5a53ee51b5e4b189befeed4649f35c97fe64bb31d964266408b781458f32f9c7fa2f598e6f0e050cfcd2e94e01fb2ee490a6"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**521 + m = "313233343030"_hex; + sig_r = "0254326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s - 2**521 + m = "313233343030"_hex; + sig_r = "fe54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**585 + m = "313233343030"_hex; + sig_r = "02000000000000000054326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + sig_s = "54326443ee2885175534b23eec55f2a5ac11ae4a1b4e76410112b9b60ca36801a0f3479f181a6c60dcfeee6f840f2e60006abbc7397156bb7e5b4246e63fe30b51"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=0 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=-1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n - 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + 1 + m = "313233343030"_hex; + sig_r = "00"; + sig_s = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=0 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=-1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "01"; + sig_s = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=0 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=-1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=p + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=-1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "ff"; + sig_s = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=0 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=-1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n - 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + sig_s = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + sig_s = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=0 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=-1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + sig_s = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + sig_s = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=0 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=-1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + sig_s = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + sig_s = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=0 + m = "313233343030"_hex; + sig_r = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=1 + m = "313233343030"_hex; + sig_r = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=-1 + m = "313233343030"_hex; + sig_r = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + m = "313233343030"_hex; + sig_r = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n - 1 + m = "313233343030"_hex; + sig_r = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + 1 + m = "313233343030"_hex; + sig_r = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + m = "313233343030"_hex; + sig_r = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + sig_s = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + 1 + m = "313233343030"_hex; + sig_r = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + sig_s = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=0 + m = "313233343030"_hex; + sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "00"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=1 + m = "313233343030"_hex; + sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "01"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=-1 + m = "313233343030"_hex; + sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "ff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + m = "313233343030"_hex; + sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + m = "313233343030"_hex; + sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Edge case for Shamir multiplication + m = "3132313930"_hex; + sig_r = "b4b10646a668c385e1c4da613eb6592c0976fc4df843fc446f20673be5ac18c7d8608a943f019d96216254b09de5f20f3159402ced88ef805a4154f780e093e044"; + sig_s = "013aed2bb1d92ef16a821bf47203a3a7df2e9d3efdb040f7d6c7b36bac07bf2c1fa1c44ce630e40f38ef1b838b5252cd41d03f974ff2eb6e731cc52a96d789ee1dce"; + r = true; // result = valid - flags: ['EdgeCaseShamirMultiplication'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373239373236343137"_hex; + sig_r = "61a4212b4a97c71fe13d44d85881cdb999566cb3e0ab3b8dbe19eb493e3ddc93ca482dbf2a2be8b2593405840e8d18b32bd29e6c3227758632abad768f08cece00"; + sig_s = "014e853cf725c53676c4a807e389036302ab4d9a37a3a565d65cc44e51fc10ef8a9358fdcd02f193dd8b6053d1e5a436d79ef89ad7764270da133222f0ccddec0a4e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343331343737363137"_hex; + sig_r = "0108a2d18a9052bf94b3ad92c0d1dd4e044793d154562394de5d2b87abb96553e27c13551c1c02c96b55654c61067dd38c646a5a22edb74a8b2a9918061f50d046d5"; + sig_s = "010d71d4946272199678f331ad5a1d6be422b5289e05b313a1312380f2b633d03f2f871ec3800c531a95b2c8aed55a18031d229c74a4bf673be46dab46f7db6ea322"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363033343338303333"_hex; + sig_r = "01d1850d561d65708444e3ecd468d8857cbebac709b128f358257959ea1df83cf0b6511532247ccf4342dd0e45c0e9c41ab0ff00ace007722c223ee973cc60e2d54d"; + sig_s = "0180e7674a0f0120d9922ac3dfe23661fb69eb0b328b307a0b6245ac881c8a198db56f8f6ad0d63c0fa4681cce10ad4421675afed97ea57bb7837f716d9af939904a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383239363231343535"_hex; + sig_r = "01b46717f9a79cfca7966a09a027288efc065709d7ff2e3e330ea79988ceb766648cdbc824642d95a4bde04d85cd7fbff7150a60369a66e8ca38056dd0a31d7a3074"; + sig_s = "018035d894c0a0f9fe1db8afcdcca4f0b3fc8f36117708f0176b805d276867e339807e408808817d91f99d9c29880c4c162ae8b67d8bdc24d2c5acc3d29e4ed0967e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333131383231373336"_hex; + sig_r = "016121c9e9c79f6bff0cfcd8dcd22f9be3d87729d9015123b0f497cddb98772790744081bc692f2e99f27ee10bc56239b2783d754b5020999f31a70c76129f730924"; + sig_s = "0143ff0fa6411ed447156cd44e1746d390a59373943c01fbd9457c23df7701022e69b06804165c16ebb9a536d5c28c00e98f7b1cd4ff294f878bc00c034d9f382515"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131373730373734313735"_hex; + sig_r = "e2d1f70f08770c220fdca23d2301850a332ca31d57edbc65231f4920e9b6e6fbad37a3266e0a01032906d064163e8c549038e9d5e52d32cea30f3e22e4f1c49ae1"; + sig_s = "45216ed90546b8a99ab98be980bf9a1f7f7fd7bd4112f0561a85cf0c13933efbdccb7528f217babec7eb702bb26570feee0885306b3f8c3f86c9665a90a4dabdd6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353938353135353635"_hex; + sig_r = "dbc9fc7d1b18ae9d5c42c4043fb468660a0bb74e0fd40a8279d0f5b4a37377eed84b07fc1e9b6d5db1ac1c88cb25eb23e3188754e4c7e38aa5f153076e6b1b8e10"; + sig_s = "3424f4b74d7b19e910fd9e6641e8172c03f759aceba300af49f9f7ffa98abd658d512d79f843d1f4421e46532de99496d11640ad1ce376ef31455c8bf4417fe8f0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383831313031363138"_hex; + sig_r = "0134fe8e5e3625aafc2db789eec8eb1591ac7f5e400664a04aa5e9bb643c795c1506931a8b976dd00c4ec86855db40e24c45c724c57b54494e4fa4261ff77e16e211"; + sig_s = "ff3280b9409c4cbe6ed29ed9bd1221fff69da388531f62952ab05e97cb7b8af69a32bd31043efae743cd00382dcdc13626f0b2c6cef1041ac550a6c1f8d93c27bc"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303034373833333332"_hex; + sig_r = "017c711b844e59b2699d69c1dc27a3ed505fe686a0e6ff5c1ee674e36964902def9f92f453d10c5b185242ac98c1f65c0433fdc96de39943b31be16314fc9c73db92"; + sig_s = "0170767fd3b8a2bd2d8cb9c8c1a69073a437e3bd07061ef930e47bef09e4033f467e220cedbc7fbfe193c48dee3fd15f51686fb237d8b00874cbeb05c237c5880b97"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39353030323437373837"_hex; + sig_r = "bf986f02e077a60e9be04a9d7700e3d4ed4b04a9a9d1bef5f04c7eee01c320ccd2fabee38d44d71fa65b4ae15330f989adcab23757a70632f54ce12c37ccb195cf"; + sig_s = "869f9e343033ffbc0f1f05f90fbdf14b7ba525ffaab1d69cf4ca219f6f191db230b1c223125832894b546222cd22ea7b4bf7ec0fa36f1dc2ce51207f1bf38be51d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323039353030303630"_hex; + sig_r = "014c2f8a18655c6d4e6a54e1c51c9d61edce24ca37e38459621549e653c3fa9b9a0120cad50295d6f885427c2a18b604e6f6c57f7a9cecabea68b9eebc49aaeb623a"; + sig_s = "436e05bab531350aa441e6e7a1042ea4219de3db75752dc263bb14592b5fdb15827b2a4c2f6ae94aedc89eb0e664989fcd573bcc3014274cbec6791982b8f539"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38313933373839323237"_hex; + sig_r = "0c59126e6eb5932c6a05ee36738100c24141bde74e3675e112d1a9c0134add3e78b3697ea48fc26394761503dfc1cbd444dafd8d0831b4f517b329e37600898c80"; + sig_s = "017c611d7bce811524911c2741f2ead675b9cb7ccc7738fdb7aa47ab01d4fb6690e938a179159b3a2f83393d006c04f0948ceaef9797f6630ee0df7a35559a34b16b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33363530363033323938"_hex; + sig_r = "7cc7fe18cca28a8c231bd3c7aa2936d02e3906a49dcdc2a30aac9926d8c89cf25bc644f584ab6ef026dc551af6ba32ceb8e3ce2af46178c4de8c7add701314e774"; + sig_s = "34ede164d5d60a69ca905f0c83314a63700024dbefc51ce1cf2bc69447cad76918580d45b93447093f5429170c996f2f7818ba0c51ce96b7526ea969d7c060d225"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3136333833393533353233"_hex; + sig_r = "0154a680570056cfcae672d5af7e19556298b9ddd3fa162dc2066ceb8910008f304bcfec4faa917c7c8060f2f5c46fcf9b136ee1ea845b93f1e71613c45f22f9d0b3"; + sig_s = "ecdd6293480007e51bb4ab2eb863eed6742e693d160418522c182aa02851593b02a818eb757200f0cfcc1045fd1239c648b9968f2d38c3b98f42f9d21fe8943ae2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303931373638323035"_hex; + sig_r = "593c8392ac4e7e1b966ae851ccc07940a04c5cd09dcc977b6223a936e849297dcfb01e65b2ee850b8fbaf9e62fd958c6a73a767020d2207cc405f795e77c808078"; + sig_s = "ce6358773088e069648e44976b0f9633e0d7a3fc4f21f568f196a5f4d0ae193b2ace16d765ac8396ec631acb5bdda0ca5fe10dcc6c2e685021e7442b45baa6d343"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39333634373032383235"_hex; + sig_r = "6226a7101e0fd946778d45dadac793c04dbb4e0aca011eaad718f505ede077115c5f0e8074f30d3fcd04bfa3ffd69607e17dc1dde1047e1ada38d6daae8b45716c"; + sig_s = "bf2a2a249e0873b6894d6f8bd2f4ac64671525762e463a29c0afc86bdbc73223985feece210d360c7631134acc319de6975b3ba98a1cbeb8e37800064b4792c1a8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393236383638373931"_hex; + sig_r = "d70238ba91fb3261a3baae40852190517d4d75e2e5ee528651399d615990b0d08dc687d7d060ffc91271a37f66a2d89d9d22a80ce4cd1f8c4a4e02def1a070681e"; + sig_s = "01e82c779a915d496a101829012ee2b2cd6b58b9ad902cbcbdba49876b671f9bb9bdd223ca04997b9f946dc441f98068c6a8dc573c69a3db9b6a563a4b7f5a712177"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35313738313334383231"_hex; + sig_r = "01904b72705dbc8c01a422a34c3b72213ff9385eb56a6cb271c57ae5ee3338a735977d92666f474b670123f589a8b5d2682a685ebc24afce49039fc57b23480b723c"; + sig_s = "0161185a8e41a08b44663d001824c2483a5086e6da36d7140aa1612724de553894662f9eee58735af46c1a80147665a46048393ead5a5478f0ac05a62a02a697fd2d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34373335303130373531"_hex; + sig_r = "efe4e821d4b26d7114502a72384a16d070e1a87f166bbc4caec10229ee423a0a6edb4d734a641f5411db4c0d218f979bde59b40b516835cb422981af6fe4685674"; + sig_s = "01afdbf5e549255948a5c8188d26af9b6cefad74d5d431d7f7c49f7c2fb27329cd359520e14a9c3d3c6e935d95f12c48d034e387dabd7cec0b7caac64b0551817d53"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3134333533393131363839"_hex; + sig_r = "c69ff834fd8c2bfd562322fe6c65c25dac7cc08cce12d2a841afe601575b54610cd10c682afc20b782616b38d1e63a24cc9a3a0ff7a861f93cff1d9d9701f98e44"; + sig_s = "acb471793c0367a786366cf6ff4436bc140fa83572b3ad304d0a1073e7d3aa93da8a4952b6b5985e9e6b331dca2b687bf2fdb2e4bfb781cb0fcb44da56f3b5918b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333834353439323034"_hex; + sig_r = "01f6c06a2f7a6e10338018fc6960f7617ffd3d64302e1f26bfbfa6cc70f472614dda2ea5dbe4dd693ba4679fb23c926050d2b92761c1e84c5f2c222a21b3745eec7f"; + sig_s = "01ed0aa68af7c551ca17d9b0bb99124f996bc663c52f8e5d904717f14a7e7229dc31116769a9185ace5b3563d46edc24e4dccafbeefa7a8e06a08df63cd808da91a6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373632313932373839"_hex; + sig_r = "018b88509839c9025991bfd154d529860131b66755273f0986aedbd4a9246e91e725d290c3193552ab4544ec8e57520a7c4f23e55d8d52291a8b40a51599a02b4f0b"; + sig_s = "477c1e75aea8be30f2bd7e9551fc5b4105378d5220d094ac09f1ab20a36bbcd3ca7ed27e103527d4f6c564c7604465092c16758faa524d37a04888b90b8ae9b656"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31383331363534333331"_hex; + sig_r = "0191a669dfe8d305edf8e4b81dc72bae04032b0d93076f7ed54d46d249704cae99ea33cbd960ee22015245f310a56b0c450c8fbeb785e3aa87b968270d21e8de2658"; + sig_s = "01e5455c1bd53acb7d5f4e9c639eeb92ce6615762181d86cf335af8a64a858102ca8de95808f20a408a6cbb7f878b261bae448e0ac4cc17834697d50aedae3b447ff"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343336383939303330"_hex; + sig_r = "01f19027cb434dbcd1b3a9220854ca1c200b1ed39eda51d2d6643edfb93f7465674644aee2c1c66cbd5cd587841a1c2eaee1178029822c94acab6ee634c0b633dd3a"; + sig_s = "08f6ecc30bab74b51a26d71bacaae18e59a659f9878a58af16bb35cf0fb5855d49f8582cd1be0a3d7dcfba99edaea18cc2be37b109f7c2eb10ec4556f75ba66acf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323034303431323232"_hex; + sig_r = "4d3103f0c7747f5f7155f5c28b5a7757b10fc648784116438888d6402eb7d35049b240840c15445416d52da0c7bb59f0174d47d666d5ab219d4d821192618f40f4"; + sig_s = "c22413a33604e0bad3459b89cb7a2ad0c023feec18bff9cd6942fa91c78a92610b90d9f494500a3b6552963b07ce6a640b44ebc1dcbec365d715120addc1b4687a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333337313139393735"_hex; + sig_r = "b2081e6830ebcc22d981fe9cbec81bfe9a4dab9c1ac1bfbd199226e0ffe0c5b9b02a9c710fb219616d741200551c202f538e8ff20b6afef7acca305308a12445c6"; + sig_s = "0aeebc6603a567271ee33c405219cdaf33c6b809d888a0f0c1c22cfbfb6cde33bc6fc5b5af12c952be0b4ca5766a0f9fe7aff69c97507010e2b29cad41f2751905"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363935363230363738"_hex; + sig_r = "0105a9c72463f7031c7303ebdafaae233e8a0092cf488595124c00d8bd19e6b851c6040186ffd0f3a803b616c9d8fd46000bfb6f62ea86d566cc75725db6790f43ad"; + sig_s = "04a06ca5033dde4b771f78ca3bd74469669124b99bed53359b1ba394640b4459008bfe368ea2ea5c45b7cbfbb6a14d9dc02bf85515ca118ca8302a3b6faa33f548"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303933303137373437"_hex; + sig_r = "66357c2698c51b89824fafdd9c7df6f75191102e4b59a92f3a91939a236ae1f656c523c2f4c5d25f4d26fef34b73e43505f777bf808e86d29d45b5dc65b2bebac1"; + sig_s = "153498ffdbbf4335cff891ece1cac19d11b5b5b83775976167ae43d52ad905f8dbea9369e8f30b9764ca4bf88e0a67aab97d2db687b22c2c7b313d90c77d641fb2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313233343137393136"_hex; + sig_r = "80fedb219a9123098db3e48f31b8c850b0ac0c88e47c328e081857f1fa8dc558a30aaa04ccaa2f788cd0b3a5ec6c441ae9e816c7207011d789c334ba916ed81453"; + sig_s = "01c29e1f56aebc705b611a643b839688bdbf6f684faa7efdd2f86cf5a2afcadffc62a35505b421bb5f55f688eebe49b70eb0bf4f40e366a1039cdecfddc58934e576"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373634333530363837"_hex; + sig_r = "db5b252f41b8139da572de931dc1ef569e49fa9021f66234693d08292922def384acf8a04d044d07fe7c548f1f0bf6388906bfa83b154014f7db2bae29444df37d"; + sig_s = "017e9b0e27ec4c00a7e64467a203e21254dadc0a3dc381be924215af50c80ced936296c0aae57e8ace74c534ea749d061a8b7e1b5c85aa71c6cd36b30e2aaa44a5c9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131343137323431343431"_hex; + sig_r = "de0b76360a26b366286d0a95fde0ff2ff24adcc63a2d2d45ef8c1bc8030d673cdbc2e274e343f2d6befb603cb8d6a7c739a785dbe4d974c4fd25a226e89bb08abe"; + sig_s = "011a248975f286d128f1bc916829c7c59378459f61ebe7a46acbe3394c71b00e60779a87ee210ca042696b2c6476d1ed83002bc8cb4a72a7c06e62dae167dc8b16ea"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323638323436343933"_hex; + sig_r = "01250f78140faac9b131e0a85eabdbacf6b999460c918f1eb8ed0154bd64dcd4609d5856f4495b4f428b93c2d58c162c3ed78263d83440b9444197daee103e2e3565"; + sig_s = "be4536433ef008015ddf0badd9464ee873f90a8132ea906e95a5e8d0c0ed9540f6e27490adaab451218d1771dc2745a9ba01ce8d9b008737cda0e4a08c1e69293c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373234373936373737"_hex; + sig_r = "01e667880aba13b0dfa45e81a8f534c691893150ce1d6fa543f2fb2a14a9dc50eead2f8f45336208637765c61e22732b8375619faac8eccdea37fdf0efa9497162f4"; + sig_s = "0120ed36a00299f68318fa56072cb39a1e9a6fbffeeab047bc315ad6ff5f82dc433126faebef1adc6d2f64339239b248898c963ee42f356fb25bf11fead790d28f0d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393733333935313139"_hex; + sig_r = "01d7113e1691c415b3c8aa1d662ce75ac9e54c4d5a9af698b338a2f5cdc77a88735ddbdc155192ad0ac8a8f4b46a861d0fd9526f696bfc5c27823aed612d6c80799d"; + sig_s = "01f4a09f3a975ce4d237c0e00fa60ca34e9be2ab2fc7fcde811e49bcbef086654f97a67ddd075f68137ba467560e5f72a4dfd23d123e08004fbafa9dfcb5319f09a5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353037303032373036"_hex; + sig_r = "01e948d76ca9fca0a7a99cb56c8c24066dfd0577d8cf0f154b7520ea2f97fa94fc791d21f5ad0f56d9adce2bf4c259698a642b03d1115b7f1ecd9804d30124e8c252"; + sig_s = "6d4ed5c27e6ddc80b69802e81f4da4108bf93ca082a61df296f15557dcf12b5d9466fbda02bf5399b175464a7b23866bfba079b1b112bf06b36723fd611135c47f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33373433353638373832"_hex; + sig_r = "5ef361042a5dfb8057e99968fa8dc5c32e1e6fee6a923e8ca711c4851b1bab8c6dce47631c69a22b6d5744380f92318a38738df7f74d3ba06be2df0fae32d3b9e4"; + sig_s = "019988d998bfc270b68e7bad761e99f9affdd96478fa9d02cf04269ede6d604b7680a9dcd8a3f589b989c06fbe251c490b19f3c297a41367f1f6e2e39e2c4ca19251"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393437363731323438"_hex; + sig_r = "01b80a6592fa733ce77b3f48febe5b178c287288a976b857a4a020f07516577184a296fe37c3b88d3cf20e00b5c53d5881f2a21980e3ad3e8c0e358e363c4927e323"; + sig_s = "8009c2401db711677867b898225217997005bb458d6c5109c56fd2ae72d3df8b8e4c4d5f5038969230cef0134ce17ba19aaaeaadbb3da7f16ce4700119c8d91ccb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373235343434333234"_hex; + sig_r = "bc3785bff1e5c9bca6d12d303849487f2d8159ff5df782433f3a616b9fb49280978aa88d940d0428097f82a26ec22246e64f675a5118c7ba67bd69f46fa6852c59"; + sig_s = "52469800e0c50d7a580a67008f07894376c3783395b7f41ef468a29fafcfc4a68b2899669603ad858fed05f232cf39844f2d8606355993dde9a6dac14a6eb70bbd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35353334303231323139"_hex; + sig_r = "01289d4e5db332d13be1f44462020f3882e0a626814e5a7cf388ec8453ed1f921bdc3dd2bbc614e4f1be52bc0baedc8f662f7769a41aac95d7a1599390fd900d7ef9"; + sig_s = "32d876eae37c73d79073c9ab8e756d2bff616464a733acbc26d474d00caedf091dd4b2e99c0bc060f0d3d393a3272d76949f091e278bf371234832e23df8b15ce3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132333031383133373933"_hex; + sig_r = "01300817e6783f704b2edddbd4d016bf45a80ff06845058d3fd9a1dc1349ef902bbfb69f55b0141c1f925fea8bc9e35f44d72b6935cc7d49eb2da1f1b3097483a9ca"; + sig_s = "e53573707d4533f65231a6d0539dfe5b885c0126021022de32f3a4199bb1d470cff7fefafa95cf9b31fc43f3326f3e6e64c31498bd71dd8306592cc1d987cc0afa"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39313135333137363130"_hex; + sig_r = "018571d2e78c0fd3526c44ccf5d13bff203d1d60f8985e977395bdf8a842691b82d035809a071ea8556ae1b71acc415f208f4555165806b13758d8c03a692084c7da"; + sig_s = "015ac3a64b46df043658dce21c333df7acca6d9ce3161469d005b3017c3eb42159333c71161e8576cb0c83184e5c513b13f43ee665d7fa8363d809060246526eea94"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383934333937393632"_hex; + sig_r = "4c186d723b97360ad18329e4effe6a4ca80c17ed4fa8bc1137ca0d261bdb845c24a018a960c13dcfdfa94c739fa5390b0943335703b7adc0e5c6d97fe0f3231334"; + sig_s = "017a446f9f54ff41cb9bdbd02d236b4d2597689f99528a3a57cd10e5ee38fc9584efa5d80998c29d47796f02d20a9e7b493ce87a60448943bc55134af171c9162a1e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31323333353833303333"_hex; + sig_r = "016d8f256b29c501aab1f2442c367ee5f64f7e9d8391ad399ce7ad3a84f0656698474e3c7219e35641a9f67efe6d85a7d5e4502011cd61eb6b501007204aa1aaf0eb"; + sig_s = "3ae01795cead8f70af2b225b8b346c6ae0a9ae048b7768dc86c9cec3cf0709f54b29f99fd2eae87f0178dc266b554c779b0e2726753232b185a1efdd9b24dd2319"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323131323639323536"_hex; + sig_r = "01fd7c9737ab2cfb8044ecf512617fa199a04f4900a0ed8e6113c5d2fd19c7544279a29a1edba9ee6c0aaba2257fe19deb4042935754c78ee17aca930056c18458db"; + sig_s = "400658f9d136e0a994a4219485e2b6a3bf36aadfd6927c14aeada8ec88ca0ce7a169b79860f7dc49b59d9cf629f5fe1d07a4eea0ea61beebb65615736fa3f1ba94"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303035343833383634"_hex; + sig_r = "01109ce5f94541c60c9748fcb55f83ac9b351576bc92bf21e6a989302b076c869b2300fbd717d6c08b1ed619be256156248ddc33258a7ea58ccdcb223072278ae58d"; + sig_s = "016f9eff4d78ad496290e35710754437ec0a9b30a3be091727dd256802fccfaac8c6f53aab0c39adbb4b34433fcc1f221e8222f3389c0d646eddbc07ddf0450631a5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333536373632373235"_hex; + sig_r = "0154a404a6cc2a53aca70381b3223396947dd17eed27d6f3c0b9b6da00d82f6ea4f584a522f8ae4c11cdf86f61ad12a431c6c38855402f87b6c37ca278e6cbbc2f83"; + sig_s = "cb11bfefffe6559f084f3ad3fcc9c1513c2657f231847da40d2e5f8b2596a57955360075bc9bb82effa71aa1af9485be669ac4b3fd107c4f81071ad106d8b068e8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333239353030373630"_hex; + sig_r = "93cbe3fb6d4d3d42428997ab1ee236228878bd91f809b1a00626ce3806480c298ef4d43d2623c2a58d3daeed0a4090d0513ebaee412e852b2479f693da458a94e3"; + sig_s = "0120c5822abe92fcd34c6624d71e98b8712173ac17f3d663eedd1c1e905c300610778abc54ac6f790602df4e2f4b84ca35cf1b5cce08de341b08db82dfdf87ae6650"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393237303834313635"_hex; + sig_r = "2bff1eb4d4a3ad9676ea4e171ac832b4d1174b46cb4b9c7eb3cc4f8860795d49a1fe3676f085a44232f4f24c1368fa0538d0ef8e64be8cdcb835e2c23d0064a162"; + sig_s = "4b73fd94b41beca21416ce3e451585516713751235e20c04f90e5d6458ae382cd50ccf9523db05c7179d9aea6b7400ae83d28ae920f6701ea0dad7bc364ed59d29"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37333032333538323838"_hex; + sig_r = "016dbbab105266a78d1df8e195d854a4fffd3d66bf17ec3f96e3c2c5fd26b2c59a156078aeacc5832d81cc6c86396f471cf8d4dc4f2891b43b0b4980469782a4f09a"; + sig_s = "01a9d5d04b820d5be931fde08801d46a27d3e7fe9995aa0970b7acc739c56e94c524e57e5de386fb1002e76d17cc84584e677f92655a0fce71b03703d4474ed477f4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3133343733373337333833"_hex; + sig_r = "012b83531b8b74c699a3a340cc133b559b0bc4abc0eda717962b7f68eb05f382307279a571760a88b6c11cd0c060a8603eda021038784fe1fbfc199e038a3d8eb26f"; + sig_s = "13228ae6c8e5682cd4ebd1125892dd95bd31bbf50aaef061614c4715a90f1db89d38bc35e4e2529c71acaa26ed5ab1f49c892c6f987015320d29359d2794b86f43"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32353031353533363839"_hex; + sig_r = "01bc7ce250d5a075177b749d919ca1b08d27d0c34d900f36c7f2ed0bd21adfd0be63c87463d547ed630a351d46615940b3f2acbd4cb8c3fc3a533ae2d0d5bcbe94af"; + sig_s = "b6306e0c0a3bcd7f96c00eed9eb0576bd9c649caf9055607ccc0febdfceabb6a33fe805cb0193fbf8a36dcfd76b4260b280dbac821cbeba5cf594e565f5fddb896"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33353335303430303239"_hex; + sig_r = "3f3a8f128b0c66454badb41115199c6f2a899d51fc8706c57dcb6a0937015e7e2c404534c0ab9ad4d5ba135f559dbe8ba2b95fa6159ca8e6a11f4470b92d3c7ead"; + sig_s = "01ee116f82c612b2bef7b8882492a8b0779da07768f72b372635af930c18362a2a4aadb19d1297cc8051968588e1fe273970c298ab63ff1a51f4ef458c6642eb5f4d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343230333537323930"_hex; + sig_r = "bb6fb4f81fe5715bf8219a486dc94f89f685f89b69c026eca73a653910a3ac2401efbbd4c5e5931e03bc5ca3e34cb6b1f9f7e93fcef688c6ffedd0ae8a5372dc04"; + sig_s = "d8bdba9909f7f8199c85e65692fafd9e52091be6dcb98affd42b17c6eca1f60f9fe68ce5e5a3699cf968a1b1c094d7e83b0f9266a04aa3319b459c259ee3bda13c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393035313735303638"_hex; + sig_r = "0172ff9d99d166998b9d3c752c72435a3c88a6ec6ccb88cf3cc0b67b2c90a635a81ec08bfb9e5213822b23f2a933ce1dcd10b74f962492773046c9a2caa0398a10e3"; + sig_s = "e014f3fd3b0802902c85f5b3ba39453d44b123c4efc3fd3244bdc5a135aedaa758e661d09ebe7af1b725cf3bc656f9a86646512fa6bd5f239574036d285affec4d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363133373734323935"_hex; + sig_r = "6f96a2eabd62032864758c284f5e691a274aeb5474a96aa183c41d43b6321c985207fb5480c7a6de8d316ff82fd97c9fd710e014c94d6586125e2416a60e710f85"; + sig_s = "01facee5bf81d66206d08349646020ac237970f7f695309cb6b2a16ddb464c21da01317c9074cebfed530250f818e3619740783d007981324d4f3761c72e2ccc2a60"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383733363733343931"_hex; + sig_r = "018ce4b4738dc0d0206ebf7e804ee800467cd2d174aed6dcf556bcdb2c138cef9bcdd321a94979eaad8b7ff359c8910e7addf06671779aecca0f779f0de148fe4817"; + sig_s = "01b495412395cb659112efc8acd9fd94fb5ae2732a4dc923d641ff96d67d72486e9f963a9cfa680fb55791b7005b7dfc8d7a30072ce5afcbd4213b0a184e8eb05e06"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34333535313036343035"_hex; + sig_r = "605e9fe2651fab3bc3cd356aa1bd6c866114eb14fd0bfe40fb75071247a8e7e5cc8c375a1b32ab99754b200018f964ed34f509612777cc90129a030c670168cc29"; + sig_s = "3c546cc8750c5675b150f4f49303ee22acf38539d6d3ec4acdd30fe57a1f9baeb62a8d8a42f56e5b95ea4908069aa5bb35da7af074c31c450047f8181c181c1454"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34353339353735383736"_hex; + sig_r = "011023b80c9ce34888acd9f5265b9fbdd18a7c87302d22b64231cbba16578edf53ef4cd7b4ac29f47e13c31444eeff405c89891b462c9ae3de7d1076e1137c613e21"; + sig_s = "010097adf0b6db68a90390247e0b761044d271f9a10fa17b7d1ffb433bda77b0ca4e1fb7cd5b2bbd9a786a82b4b5d2049b520f8b8fc1c5ad6c9bc99aaa4b4ffc37ad"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383933363633323031"_hex; + sig_r = "b6ae707a764b79c5e532a138c72d2bf6dcadf17d045f722a2b5401e099ad67249cbbd0b2c7103080b0a3c1ccff47b58b526b1cda1a125a62650638cc71ad5424c5"; + sig_s = "0193fbbf26a4d3a37565cbea7096cc57d6c93670eaddbd06956dda8ff8ec5fba338c449176e45baeae515e9bfce4b7323b4e3162a008819c23314a15757831533c7a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33383036303638303338"_hex; + sig_r = "016c0113463959f1aec914b7694d6228ce5c8208515253f52232b416108bda0b3de7d678175d455694fd66f49ba9ccc9f9a32cc368d38b606dc454dab9fc411ecf20"; + sig_s = "27009c48d3402075e8bb2869065ad83d662594cc9ce4fdee42aba7639080d7e7fc507c04c6dc45e39840a321b74d695b1e6d95411f4909aa98383d5b102831243d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323332383137343937"_hex; + sig_r = "b6ca0c0e3aa951fe443180120e5e86e958d12d2d0ba40d047b16eaa9cb2c164acecd0cc20e7a6196bc68771b3ac5f82909bff29de560eb9f39e8faf6d7047f8173"; + sig_s = "01c50102f66d6b0255aba2ef758e5d1f148a9a579b2f2bca3ba3d5639f64412c2cc444937c84c69b8dc47885e9967f024e8cbfa7560c730cdaab72eccf93c3035271"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34303734333232353538"_hex; + sig_r = "1adc5909ccb73ced388d8cbed6aa7535cca6086f52b0dac552e6191eed513a19b0ff5d57d306d0c8b756d700dc96f189cb552d707766eda4cbb855e542a91eb147"; + sig_s = "01a6821d57714bf3805e8a28a65197463c09597b6c2fde00b64521f7cb6cd567b33ee344e9677ba423045ae5f5b47a39260548dabd6f961482dd4fe45fbfdfcb128a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363130363735383237"_hex; + sig_r = "f6cc5a98e84faa07fd46dcb0d057383d01ea7eac9e3fbd9f7d462bee76da988a0eed44fd59da6cf992c086bcf1092a3f3d0c9d373297bccbc0a1a25d1ef1736fb1"; + sig_s = "684733926ff39e177af57a0a3b4531cdd19b0c5f717f741d82ea493a09c310026a19386cb95c06ea7b346a2d90c01df02c6997c25dc0b89cc578ed4b0bc7cf3d48"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3137343138373339323133"_hex; + sig_r = "01ea2fdd9e045483942a46017a75cfbcf3e22905b56de335375b6a72443949c3d8a0af587b7dec02f1c61f679205d5c1f76adb3aaffb93a20533caea83284f3032c7"; + sig_s = "017e31471262766142ffaaf2cd9939d96fdb81fab2629b24f394c58966b9df0d464967e8b73cf2030de62d4415ad4c3cb5568d8c4d80ea8fda6a3196d6782338001f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35313237383432323837"_hex; + sig_r = "01556547667d7bb076541f9ccc96f5d4948bf1a49472e78c949b3cc1024515c2f4e8fb93410dc75f961fc89df82cf7781b58f7803cf8ccd01d3733050c0fd57de1f1"; + sig_s = "01c395c774afcf7cd9138c2f97bc8157ad5eea934ee3e976fc0ae497096c6f7424903a64cae5babb13f25d53ddaf762fa3bf35649b748f86a12992383d9ded2e21dc"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35303338363930383739"_hex; + sig_r = "01db229a7e00aba5780017a0ee2e579ffd069be31d8358736db31d2881dae942e12d3fa0d2768d5bab095cdc03826211b48bbc2acada67e463da26b685a5e6d8a71c"; + sig_s = "33679983c9b13c3235eca932448d95945b3a16048c1f75708c054c3f36c87babce0e5db864ac5b63061011d2dbd84b2f239e9b3810ec869de2c663164688b0a7b9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33383737303432333937"_hex; + sig_r = "011cc7f10ba1f52a7d74a20955c7f327b3951acdc4af205d0ae66eaeb1b9f2bc86f98af26c5efc2240951194d4ea77a5d605afed96712556005948b4666d5746c4a3"; + sig_s = "86c3bfd2ec110d4aa0f89f78b9cf93161db88e3777ae0e986ff0248f7eff483bdf4c58ddb5a70863bb0355c3ded63856559cebe87ee71112014bb44f905c699e1c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333231373038313738"_hex; + sig_r = "5cb5e2b95fa6447a73e57455326571cbc604e9e54b593af792ac4f3add9cab628d8087d2da79c217c808ce000c45b86555beb6f2caa3ee7c86d7bf3c5a4f8f99a2"; + sig_s = "013c057b5a8e2d5c66ed0fe4b059fc9a2c218333835188dec24cd52c1e691a745c087d199f5e08911d798741aa0d716c20ed24baab3cdfe1f5a66403152b0ff31776"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37363637303434323730"_hex; + sig_r = "a4d6b83cd0b2ec187c7543b5493731a99f5ae83303190f122f893ab7c6d8c6a25b46aae1cc1b4e84a13bf52f3b3a88a6b0d17df6f1e2a83ef68456556a80b46995"; + sig_s = "3ed11506c4638677d48b4ac940504083b4cac13bf53319bb312c24cc9dd85d3d13ee63022cbb8dc123da8fd926e6f0e23181308d00f81eb10c584e9b3f4eab9bb5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31313034373435303432"_hex; + sig_r = "01a09b6cfb57008a004d719ed63c45e4b0e97622a36ed2d2b22dde5c633fb714f0279108bc44e94614c9956ae9ff22c51cd847e8ce4314e767d33a01fe62e5b1fa1c"; + sig_s = "0acdba06f7227ca1ed8d0365a9ac68962026e33a593ac08df7bca7e596a5d6717667172ce494fcfe3a9dde26f545c86bf11f8d91ca8a410efa342d79217ec7f094"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313533383730313534"_hex; + sig_r = "9a544548cc696921a3b0e98201400bbeaf37876f45240b508bd193211826a997fc66dca369de89ffc72ad9c1a67cd9b15651fc34807e7dec3043230e65b7cc9882"; + sig_s = "015bf35d1ab035a1fcae2e05b13677ca2dddd95a553d319e71c59a823421ec6b05f659446a026072f2dcb9c3cb62b1fa302d43754af38dc681a6809db16e4c32865c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323631333835303439"_hex; + sig_r = "db87573f7cbfa341b96ceb4bbc79b959593b55cd8f638ef4b5e589bc1664ea91f7473c9d913a0901330784341a366314b30495a45a88c8774d985b4e5ffa915108"; + sig_s = "c039fabd667c40289f8a065b0b43e807a0f7f51f7767501588031588fc57317a712cb4217dfb45fa905c8c7b5dc9a838ebb974b5a5b456d08ad6b1d79707c54257"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37353538373437363632"_hex; + sig_r = "29cc57f41ee48f6d222cba402727e0eee262d67f922e4c0488c276960409dad40d7f719175eb009cc7088cb35f3aca9114c71915b1158c78fb5101649497121e5f"; + sig_s = "b1c22f956b33fb228f7dc12e48baa527762ae6f4c229a4162c4753cac39827b959c4b0b7994b877bf0901dff5a6d4e9757cfad14b0e5b7717e1d0f54c335d08a7a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33343939333634313832"_hex; + sig_r = "598f0072da616419220ac9408daf79cf4feb4d0d09fc48b3defae2e34c66b88aecff56f95b422131c1de20205df2a8d5ba554db78eac388a267a36335964c7776f"; + sig_s = "016f2735e142d4280ce39254a4d0f8fa8f4f7542f88fdb1a08bd7975011950a9166b291de602193ffbc56adfa4e5212e8e8bb24ddf80a94d762d8a671851dc6621b8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333639323733393835"_hex; + sig_r = "01025c2317f1e414e14a5b41c7645bc1c2d057dcb23b3b6ec5bba84adb50171cca89f806091d1402b61ead88bf1df50af1b97953244e2cb4278639e4bbb74a040d7a"; + sig_s = "d3ec9a1e19ce0fcfd09c65016e96500f95a8a7255191b95e11e2649e2efeecd928d29a1f540935e0528828a49867af990ff941d1765cf868f08504ac12e3b4f6a4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343933383339353635"_hex; + sig_r = "010d14ed8dea7292f11c33755145fbccaa0d99c79813ca0373e18d4fd11fb653b456392ab09db6087035dc3907617fccc5b040d21a675d0f63f4af74af8c7211655b"; + sig_s = "c76242ece39dd3aee07cf60210a6575a0670b2821a0856ae2d8505b58ea6570a69ec5ee3efcbd38573acaeed2c6ca3d9e69c08e204093cf8f647089632ecaef7e7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32353334333739393337"_hex; + sig_r = "6196bbfa16cf1d5ac3aec198d097d113453d7df5ea535b6eb61ac387858d179f6981f64d9bcb60a921d6764d3324eb9692542bb18b0b5400d985bdcd940426b4c6"; + sig_s = "01ffb4a363ff951fea35487f32dcbefaf04e89b73f585598de4a4101c7c39804bc787d92d74210acf86f5a6d03e878ba5f5f5d2724abca0c659f343c3d3ea5764577"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383334383031353938"_hex; + sig_r = "ab2cae0eb0f847e8b17e986f21be7572985e9f037a27f82b7361a7771af68ad2c94e70bc70c051202b00465f8be707957914562c0a350d7b8448867f39b8b7f2c4"; + sig_s = "01d5ab664b4f3b0552bb84a520c9ec94ee8d6be4b8b3369e10bac7cdf4ea7c969310fce183ee855e460053d30c5e2da82d13a06e03c2f961b79d6ec777444b5647b0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343131303537343836"_hex; + sig_r = "01ffa079d25bbdfc6ea73a3601d834de5c5854f97c3571f10c7727f3142681aacbf14c862206cc02362ab629e3b3e34994a68333d8f6382985b84b5da5984fc9f46d"; + sig_s = "c4b5a3b09d990f51cd33e103e7f77b524319000d2ef08e9a10e532ebaa36d9562b36afffe35c3baba49643f04966d31a9989b25e2cdda65c89c238f083ea4f8c26"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373836343638363335"_hex; + sig_r = "018706d81d28ee89ff9bee8ae0a13aac7d3922943fab2a8ff8d3df91c396f03197a0ddc002e825b229e39a2ff10529f935d85085fb0a6a8af6eb6f9e10c9d260687e"; + sig_s = "bb9aad24e5a92d7dc3ee6e29ab441efaaa4a6db4e31502ba8e9c9190eae1ee8040198fe8db5fe8b5a0228933fcb309d7dff4ac00dda2152bf3b1f8e3874c9bdc2f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303534373733373638"_hex; + sig_r = "77b04bdb6f839f14de5ce476af1f26e1e39c8653141e4499149a8b267786917096cbcb7a72b0d21a3894abf165b653bcaf6075974e073214678feacc10557e0f05"; + sig_s = "eda59d6d49bf299d3eeaf5a2b9a232f7de5b08e144bd359d663d49730985584dcc091e86977b77845f4a3e02a01f485f7cdb891968012dbdf4352339abca4966dd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393237303137373338"_hex; + sig_r = "015de07d01e25e26ed3069809031e96cf318860495c15a244c42bc0c1151c0a2ef7cb2a2841f0841a890c5c7211585fbb63850c09f5b4a8c28f60e764207a00ab0bb"; + sig_s = "ac1abfb9f8f9824a1ef744ba1299d295848cbdc98691984ecce0473899ef3951a91dae6aecca52a8ab9e04d57f77bbc178e26a31abbd8dc3103742ac0414a9db40"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303531333235363334"_hex; + sig_r = "dfb9098e386dbe6c49b45d834c06bb331912a4015dd2ac81036d8547fbd69a98d55601c97901c417e33b6eed5e499168cc14b34fb120180cb0b6e11f638182ce93"; + sig_s = "50214812721b288d270bdbce361d4c5acbad454521111d2adb1ea4b371df5c380e4cbe19d0e780bb2e268a46957fb496d2719ae9516d41e70dedd8f9a1f7e7478c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34303139383636363832"_hex; + sig_r = "3a717996fb34063e77e05a8755eb90dc39f637ba6f18e702e8d049e18790338469cb916907cddc404f73abf047175086de9cc512cd46b9510077ddef8ed60456f9"; + sig_s = "3d4067f4dd3941fb46c2e3d1e13998ee7e42d3265255f4a680fec372e57fd269eb843e6441c74e552ca9690b1007c16f339137c48d8e4b321808558907736a589e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130343530323537333530"_hex; + sig_r = "b915a03331a4ef1bc8129d56865bb5158167666c5539442d96e417884d2a41b330ef63fb13f66fa77cc6a300e29e8535cb09305ab3f49d7c464d7403c54a428ffe"; + sig_s = "01a3b5ff1bf1c0a19fb268a016bc19f8747d2a0ec06acfcb7564e8b673551300dc0c6988a8d57d2e69b90f45caf42f2769ce54691c24f7d4ccb322dcb01525606052"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333236393538353830"_hex; + sig_r = "77572850ef3a79cd9df6946e1ffd372269f3a50515b9f8f61b82ee6d29af25c5ab17e05394c14620f15c7d047870102a991322baad29b30465d6d1271b3e85efed"; + sig_s = "4e070c594fdb84f678beb2be1de5aa45ec36ea3c9ebb37a25769ce01bf90db3f2458737138afedc21dd51515241e8724e9a49af12154a278d89db898f66aa10c36"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303734363533323431"_hex; + sig_r = "c71690b845e4ee1e91a8452c65a245860d5c13c13f359896af8b22466901a999b033ba49c4f3d9b2b496bb03d1f44a523d64815f3db29b262cb31889df5680613d"; + sig_s = "561b5957008a469c998197956ae855d77c2c3bebac91d307e9a9d98bcbb25a97bd914165e08b9651fd70e0a8215c50ce941059dd39cdea01b3520337b43e5c8f2e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37373134363833343830"_hex; + sig_r = "01b8c5100a6021116c8e988c66611acc9da7cc5ec621f95df537d8082ee3f5c07f7171a8150ef45ce3f3dc802a8911205a5106b963a52ea6287588cb0dc1d998ead8"; + sig_s = "01ccb6df7546f4061f14c6a0950e0fd38372e0c42588c6fcb3354247398d19a5c91d86617595c385e93a087b84c7ff1fd6c4ee4fca2fb111662788dbdc1bc5217bcd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373933333831333230"_hex; + sig_r = "01de9edf9e10b8c65452f8ea07c57f01c2f2ee6828d89bd4bceaec4046645a970e85b41cf7f04f3fcb357e532e0814d0b7c8fbe1e073d555e3fc13a18bdeb8088858"; + sig_s = "01b091f6bf09385dd2d7a2209637332be35e1c7efba0b80a97b268b5e6d50ad2bff662ec74fab0434890a48e39340a494f45a7de4b886513829854de83ad9abbdc9a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34383830363235353636"_hex; + sig_r = "010ea1fae566aba575e06f2e676777f0f4b832ac65474c00cb4363a7e96762ac557912cf22f737414fc386410d2140a07f2cc604759a4e50ca6d34eff5a9babd1868"; + sig_s = "8711b35d2a5a6dd36630d0bd0b0c1e85a11057583cc87f59bdeab74fcdaf407235d68d24bda26e6b86645ba31301539effe8e51818e6c915b333cb868ec35a62c2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3439343337363438383537"_hex; + sig_r = "224f2a6797d31f669a725a0be5c48e569f313bf09780aa49c8430b2ed3e28bd82aea9a46fddfdf9ff6d8be9d50dc6edd9021a1aa8a8707d19fbbb164d3f2f2c967"; + sig_s = "aecdd04885de9bddc60d84ebbf9e868d28542cdfccf7b1a306cb188e18986891cb2537a804ca99b8da8b4a8862bcb842161b33477afea8f224f4277db93a4f66d7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34373038363839373836"_hex; + sig_r = "011e71fbb3bb894f71425475862000567c6f58170fc2b121e1783da56346a46113e1779203fd55f5be57fda0e7a48d46d1908b8033f87b577eba64e604e29ef8693a"; + sig_s = "01ef2a00cc4f978bcf8a0cca6bafa93a3204ca0c9bb4ed684ee89a569638e99d84cb470f51fdc3786e1ad383c5a90ae49bc1e7e7c14f6bedbabf1f09a42567e302a2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303239383732393531"_hex; + sig_r = "014867d547dfcce3333d412a7e177451c8fc67295ea0a3fe1bb99c1f517e950c4637464a8d746f217e5ea2d2e87676a76b8df889364a993af971410b2a652bbbb18d"; + sig_s = "0429194561d54794f49d752bd42660856de51f473086380ffd33a856cb8cedf6d2af61e9084e1fc7f6b0232ca5b8343d2aeb82ba32c7810af1f1332d06aadae8eb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303137313930333835"_hex; + sig_r = "01df9b3881756775ec1f0ae5de26f7d6f8d563c1afaf7942f3059ce75ccf75a34a0120955a1e0ebdd89de9b08b143dcb62e40a711a37e6408721f80e560a17f2cbc5"; + sig_s = "012d7eabe9560bc23bd62266ce1bee7ffecda8c39edf7eaf5608338e2b546b689d2102e29bd3064ef670489c8599ff902b098211107edfda5920eed9deeeacb8023c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393536333633393339"_hex; + sig_r = "019fa4898ac932313efdfca7e720a52748d11df0d00a2a36bd6c12ae037c8921598368141dfc14d9b4d5736b0899774f51142e109c94bfab196eb7b96c2dcb621c98"; + sig_s = "959ff6ea8673daeb5383357d0be542f64a0385bd7ac3a13cb3ab5c30f08f58c16c8b17d25f73298245ae2a6e060af590b4e2ad870d13a3ed14d61376e3c378a32a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35333030373634333530"_hex; + sig_r = "4953aeccd2b35bcdf7990ca391d394d198ed627de0b4b5783fc12e20967ecc9729fe6c9ae51c54c566d52356ef4fea2d8da4423cbe5fb82d1d2984a2b6f20ef42e"; + sig_s = "01092dfa2b04a5e1b574c1d907f66e2484aa772c936f2ad3c03b61f7d01290ee849d3e3d528593a304bc2f645dbc3ca83cf2119588adc29860e72a30b1eccf895dd1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393334363634383434"_hex; + sig_r = "01d9a16289b154bc7b341ab5f376df9d09acd1068b67bab090307042962bceae0199696af36bab0f647906ed7e0a5627c961217e53317ca0896bc650df96e9461f5d"; + sig_s = "01ce2b975ecbd5eaa28883ce90560b27b4c66a284c501e57ed4ce589ecda801def1d15106cd8c830ac1c00b529e4f46e188ec5f90ef650f520b1cfdc33c6ea1710a8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3335353435303535393632"_hex; + sig_r = "0136f562aa082b535fd5657052a62e794eb6e1b81881ee2bfc41832dd7284be075f5e7e369de8f7bf2660c81e690ab9ceff89750032579f2f19715f6faae78b59509"; + sig_s = "784aa162e2ea1ec60811b5e4fa29907210f3af5148f14b35e641e91d09cf580cf0436662118c9edea88a08b7d88d3562294a0c326a44631b4210e6422d01a0ff82"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333031373232313038"_hex; + sig_r = "e076bb4455463845b37d0ea66560171847d6601df05b00d3ac292df7e3f348b6fed892ca07cb9c9a8a66fb1e33001906e68e73fb4ed223f169447e763183e8e8b9"; + sig_s = "018e69c337db6f330128dfa27e413fa46681741581452989e530b686406581852a62f0281a10cfdcf10287a58617555e54216be5911f2eca50856b416987c112d808"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35363137363931363932"_hex; + sig_r = "01b5f54a668122d72e4ca9db26c4246dfe4bd9929f196d76daaccf0658e75cf360ffba84be8ec6a8b4454917c921b68f1db202da9152fae152feed4c795172f6e3dc"; + sig_s = "0144c3580c1ac9a80223b2b3f4b67bf224ee7cd2e2f9cc89857bcdfbafd05694208b87a1fa040e33211ec9b8f59dd6e8313d8d9c67292f3f845cfefb197973b1f5c8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33353831393332353334"_hex; + sig_r = "0115239e7d4efe196c90165cd12f4992c03ac4796adaa6efe282b9dc269a80a27dfc09efa3f3247dd8239de2444c76786bb36967bc6c862778e0088685c6ccdd05f9"; + sig_s = "01c560b07ee45e916dd9d0d7cd03be4ac14183f1725a4757291af193a9cfa44f0b979ef27047915a3c2da505c411491d243de19b604b1d7f610dbfcf50ea79099093"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3135373136363738373434"_hex; + sig_r = "018ef019e7f54e6475232d253a6af62a0a1079fd74fa0f1c0cab921f09ce07d22a80ef7235255bc8af01d6f487c2f48aaa59052555c66fca89a3d3fd65a5c215d953"; + sig_s = "01fe467d44a3b55133286673417d4d4f9f42b6e5e49fea2550ce98d1b441f57711d8fe4ebe1f6664a023bdff61f8abd7b2eac163dd1e668875055b9a8dccb8537682"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33313939373833333630"_hex; + sig_r = "aa9c6b87c3de041deb72244fd3b2628f310da41493090a7c1bd9af654b0ca793175e2e32ce623dd7f8671085066cd1cf4e7fb60a573779b142a20704d33831ac52"; + sig_s = "016b84d9f21150dcd439859e714fb23142ef8a16259b520621156fd04052cfd5022bd31fd0dcb4a1b0b790cee745de38f74f3dabf4d63c71ed2147f43851fa747232"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373430343735303832"_hex; + sig_r = "01bf9a7c27c58f163d27ff91a10093ac5dafa525c39aed530eeca981c578dcc1ee962732e77093aecebddf8d81daa923477941396938f211811dfc34e4a6eff2ed6c"; + sig_s = "eb3f6b2f40f9ce33dc679f1787ff6c00143f946bfd2b6e10f358b88ca9146a4133ad4356efe0bc1863f9f9475d58f99f6aa87f88d0ad2395699c09615c112c12ed"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343137343336353339"_hex; + sig_r = "3702d9eb114d84ce30b036b068a829e16882e4e73460b1884fd734c0a238239fe2dabf1f623e420c94973d499987d497d38f115767a5205119735c7198f5cd0aa9"; + sig_s = "4e72a80ce8a9fcf312f1a58c6d4bc43a32d30869c5e4c5d8630d547cc22c02eb90ef17d8e9a588355b6666341ff70a24189f9b6d042ff44699f18e7794f61ae590"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31323335363538383839"_hex; + sig_r = "b981f4cfbc9f8f7123c5a81098b1a2b2b5ebf4cb3ec332a78217d049669f5153802647e3b888199405e84c571c149e5c88eb20e855d2d4511a737baf968d498a60"; + sig_s = "01c75e5da7adc47363e0c10d0097679ac8135624844a54bf838348da350688d775a171c4dfd760c13dd606fc98fc71c9721ae2ba76658f9dae84ee32512d474d4a91"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343239323535343034"_hex; + sig_r = "015ba3c5c8a7d86775f6445bfd6ac06e4c40323862a8754b1ba092bf3cec10d247b6a2edc599d914bd2a5aa00ab5a1020d4897c068e569dc9f412dcce1a758cab208"; + sig_s = "baba7f93ce5cfba1a28e5e05509d95371cf1466e34e8b8c6befa4bce7e59e6a2253b63c0a7b472a61bd376fdb09700ed0f7348e2187c8fe4ca87644fecc6e3dde4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3531383033303235343636"_hex; + sig_r = "4ad0d674b3a91adc8324994b3bcf1071a9b39ff1f493f272518623cd09025be1dc0d6c987412e37942c0ad2d0012c51b8dec7b7001681723b8a92daf919f3afb2a"; + sig_s = "01039fe951958b044b84db980853068f645ee68834fdd1ca904b5181bea15e57c18a6859d56a4d12d89a441b47a839b680a0e4a089fbacd1ce6d7d0b3ca7edfd0510"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34343736333938323030"_hex; + sig_r = "01115c5bd71bd8a15cdae52b23da52080175279e49193c62980e2d2559847a173fc382e50fc63e1fd80a8fc9272319be5f97a2f8567bebb65ae5f5fdbc539071a653"; + sig_s = "57ba29f8107a3e6f737e983abbdeae230341b06d6d865d1c0603c23f319e3f1c6b02b59ca1e263fb3158da29e762846a02cda628e53d41258fae403683863b0684"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39303630303335323132"_hex; + sig_r = "01dd8801b1ed5f0960ecc399bc9e30d0fd83033d7128ffa3826675625dbaf327e294eaeb7089b5e8a8c307e637c79f749d93f9d8f834d4913e31f27d625711283f5d"; + sig_s = "011e6377d6b68e848ff2a71552d8347859468566cb4896cf79ee5bcf91f75e93637dee313b47e4f9e7c94f8869a81238441b5739f031c9c4d4de5c79340717e369b1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373536303533303938"_hex; + sig_r = "0197edd550c58d5b3331febe15b9ec78f4f4d2ccf9cba462f341f0f8e73e8372aa6a3d8d2db17f2ff33115754160277701298db543575560d8b11de14836ab043f6a"; + sig_s = "7a5e1749aa35b07ab0ce97d9098f3c89b1a69919f8ac7513991169c07ece47b7e383cda503a5b004f1c6ca85b0a2c134d52c964988cd6b19821faefa35f1fcc3bf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34393830383630303338"_hex; + sig_r = "01ada24626706c0dd8962db4d745494068506d39a4ae6413e980f02d3c0aa1d66dc8345a767afa1b9cbc0bc6d9f6efa215d4a22f7b1b8094bf835262828a39c226d2"; + sig_s = "01bcb2cc554765df59067a24081f6a2982c37b89025b80f20255421b5bd68b0e1da5b60446640a58e270f7349a9a48681d490307cedf659dcb09cb8962830187fde0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33363231383735333335"_hex; + sig_r = "a5b4ffa61d97713f9512813ffb68901d216eb649167780ef6fc7b0dab626b8a6beda7b0af3ace07c4281ebc6dc9db4e14a1ce2ef0616d599f8a3e226ba81b7adee"; + sig_s = "b2d7ceb21ce8c72b4a4951104c93df65ea8fe5176f8b3e6dc6063be1fc005f59098b0fbc790e34398b2a5289a5c5e1487d8434e8af0ac9be5477d7f571f5b0afc6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36363433333334373231"_hex; + sig_r = "0107d319831da7f253b044e229a58ef5eb2d7029382bea1a4db8095673e072466e4d69693123ffc06bac6f626612cfe760e53dffce3f643fff7cd85eb3aa2d6d1705"; + sig_s = "012b0acdc6b84489e6832ffb25d3c980b40922959e83e81b7f3998015a6884a7d26fe211108ab050affdfc689f4e82bf98ae777d242030619fbbc38344336ceff3a4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34343534393432373832"_hex; + sig_r = "d296056a992da1d912dfaf564e49a4ff33946adee320926f606730dd4255dfa941c1bc38059099320525a87e283859d0ba99472a8f59dc4f3d8d4307e567c3e914"; + sig_s = "cf38b5c76aa99b8818f7728be518b5159ba1b8e1037b359fbfd33b2a2da3fc86e4b9600427f1a622bcd8ef9dc3fc916aaa8d81b288ae42496e0155d52347d8ad7a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3230313834343032"_hex; + sig_r = "ce546b84fd4ed2ca5cc412da1b22ab12a9a6f0cd26119e9400a71437a2551d948627f253e8d805a43c1b53f4e49d4ac88767aa20cae16e4824233ff8f8dfbfb5a7"; + sig_s = "015fc68020d9c71f960d6253eff0a188b4f01cc075883e8a529839b77ac89a6698140537278b0373292c300ebd48a276d5d40a7ec572a397e856bad0b8b6bc3fc4b8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3538313332313733"_hex; + sig_r = "79c8514c8cdbd8ad3af8d89b46694745282b8d7b26ea4deddd778ea9ce8079e0cbbe2ce6891a138f023053cad1f2d59a8fe5dc0111c0a5091b239d00f02bb97fd6"; + sig_s = "df02700edca68bb6917ec75b0ec106ff89a4c0c74989b058e147cd23aef9e541b951cf4fccf70c110458e7c1c04adb7f082d3170698fc1962668ff6e277f3f3636"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31313833383631383131"_hex; + sig_r = "019e552fc9bdc4dd34f3a8c902f84668be067137fb013a4911a4ee72dde4291850fa3d82cd841e3cabddcf9a114fcf3eac5b3dbce74a1a23474b360fd0f65e7c28ff"; + sig_s = "f8fb2289cc3b66129ab6cec2decf9431ee781b920e2c3c58897ea1797827b1dc4e0141bdb223ebd5dba00bf603aaf6fb5b7ea8cb36798e97c4bf748cde9ec709c0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393232363032393036"_hex; + sig_r = "011e97a758b809597aaba432324a361d823c6e0769903db9029c996104ecbc56dc5944d604dcb9f99c24edfa042a49ce8f5cfb163ed177c574a6ca289880174fa9b6"; + sig_s = "013ea7dbb8040c05f761e00abaefd2ea10ae0e998653f77779418c41b3bf58d6d3326d963e14797c002a2651c44c8e578aba9b220af427a033a3b47281653fa953f4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393735313433323037"_hex; + sig_r = "0167be329c69775e5b9953eb6b1fcfb5c7fe266718692e2319c81bdc03699d49771d4407023496070dfc19d9b766972429be1421b701b2579a773e0fbfaca5958865"; + sig_s = "0122b728309996f36b2300d97ee1214bfaeeebd954e25aca3aca2b985faae6a79f0b5ded50866468160954663c9a7afb4a8a8c327458491554d511b81b8c9e113d32"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333135313136333833"_hex; + sig_r = "01ba351c69ead837ffb48d958d5f44c4c054f67cf79a4dd55de33fcf81c61b4aebf2f9a0aa3ef3c51b5db42b25ea221372cbd2a95638274fa377de06cdafd7ba86c1"; + sig_s = "013ba85a1343e41677f97b2020233ca419660163188345cd8baffbb39629868237b7c7cb297d4ca6150fe652139af34dd733ca20276d26895af1f1476de2e504c691"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333236333136383132"_hex; + sig_r = "d444150b1bdb12f9b40a9b4b7368d3f083bba98dd5d580e4df8767159b144f1e3b0825e80b8c2bcac4cd35b8692c31dc001f1bd63c763e4791d95d8bb641003b5d"; + sig_s = "fc06f26a7357b675b39c566a9cb30a99053721fbbd48bcbcebd463e857327b8132842bf55a22b76d4848afc2535d473c8993e49aa2bfdac2344554c4eb0df0c9ec"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34303239363837313336"_hex; + sig_r = "e06e110f7db2367e9927568838ebc5982e90d5aa09c442e2c1073027fe6237230625bbca2495a765fac5b35ed0f1da59b70ab9af366697618c112ec38cd8546130"; + sig_s = "b1afea64f3612903bc3dcdcba4a2137745b168e8db230fb4a5027c99daca6dfb8b6e40104f82bfad536a5f85c9b43f6b9fc8f4dd7f1119a5eb7b2834bb24cfd80b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36333230383831313931"_hex; + sig_r = "77bed86ba5729d867876dd8f2de6e6c9bee584505b5d471ccd0a9a54658a7dbd88e6afa938da50cf7e7afac1e06758eb0f999efa46d439bea76dabe0b08fd04a5b"; + sig_s = "d67c25f1ece420b60eb9a60fd9590f84d87af37db4a39a20a6dcc96aabc92aa8197d836e2ccd20e2739674f5f792258593c6009fb02d3e5e348ba27300b5d372b5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35323235333930373830"_hex; + sig_r = "01a7796c913ae8f43ba70a5a405d3ed87aae144b62ad261f7074a228b440b07375ce41d5a746cd296e1232f185c3be9dc8f275cc3867eae1e80008a880e5581b8b3b"; + sig_s = "4c6d7bb94edff76cfa8a11599a86783ab63304151ffe49985b1c3c39b36d03451da0726ff28be2567ed4cbdcab9b5697d4e6851a624790b3ac6410b0f895339c8a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333439333933363934"_hex; + sig_r = "adbb3974f657ca2e8e099d898817c62959733b8808b7125f872dc1942bf63e50cffed2d598d70a9b59131da79c55b073d49786724701e6810dc540e2f6760610c0"; + sig_s = "4ed5139909989c18608a2dc05a984b328ae8f92d0baef270ae15b7f97e9e2df780584d08ca285df39352b9631cf8e1866c42f1b4c4c0a67cf4ce7d101a423a21ce"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130333937393630373631"_hex; + sig_r = "2e537b14ae1f1dbeecb0cae036b2cfd921d78174a020be40d07f29478194f832b8af3915a5be2e67fe54404066bc434e0b4636be86ced86db2315f2ea5f64f15b5"; + sig_s = "42bde34b1f608f3fcd9da30481f8edc863fde24fa1f679833e9fd35281cf78ac42c7f13339a9b798ece954a349b84206fdf811098290dee904c1bd704215c0b1b4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01c22f5cf1065e9501aa40c802a58b944e8747d0dc332cd040fc27f1ef18a1af20caef9d53d6771ac8ab9b9d46799471feec8d651f1bcd120740e7a6218ba2634a72", "018281452c5b0f2aec6eb143891ef7775748c889c03e7712ab2d2c5c614234122ecdf2ed25526e5189fd3a90ebd17825b9ea5edfd7214358e6cd99814a40504e4472" ); + { + // k*G has a large x-coordinate + auto m = "313233343030"_hex; + bn_t sig_r = "05ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf5"; + bn_t sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r too large + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01f974fbc98b55c4d39797fe6ff8891eab2aa541e8767a1b9e9eaef1f94895cdf6373c90ccb3643d1b2ef3154b126de937e4343f2409b191c262e3ac1e2577606e58", "6ed880d925e876beba3102432752ce237b8682c65ceb59902fd6dc7b6f8c728e5078e8676912ae822fda39cb62023fa4fd85bab6d32f3857914aae2d0b7e04e958" ); + { + // r,s are large + auto m = "313233343030"_hex; + bn_t sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386407"; + bn_t sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "29de1ba495032fe2f4b03173aa8edede277d064324ff416bd652a123ac40a6ab91e189fb42c5c67ddeba359873ed559652ba2b8378508c69b3eb13d395f11add84", "2ab8b1c49bc1c079d19fab2dcf30f77e1d8e7ed786669149b254d7feb89fad748ce8c9937992fa64ee025f7aeb6aae8c86ca9221a5531c232a70e6bd0c11644e6a" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"; + bn_t sig_s = "95e19fd2b755d603bf994562d9a11f63cf4eadecbdc0ecb5a394e54529e8da58a527bc6d85725043786362ab4de6cbc7d80e625ae0a98861aea1c7bf7109c91f66"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "016f831fbe722a5b11ea60d4b63c1bb88616bbb2249f3cffaccaf849791e470447a582090e7add34b5031a7d9aaaf64b96e1da83aec7980b2acbbadaf9a145a8f4d1", "010126cce70be1a8204e418788993cfd9da4bd26a799d42184386cdb0bfecccbdbd30f93a1e2ac19c95bbd34347e0d2e2b95c30f31ad5958a3926485f61d6bff2903" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"; + bn_t sig_s = "15837645583a37a7a665f983c5e347f65dca47647aa80fd2498a791d44d9b2850a151a6e86fce7d7bb814e724ff11b9ef726bf36c6e7548c37f82a24902876ee19"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01d8c20c1248ac77878a328190f9524a770f0c99f0d689adac92da66e097fce8f55d2311c9eca17a01a1140ac4237caa7e99c4ef12b16ed3945d40479a2d74afc5d8", "15d0590ac9c19d4a1ebd458990ce7601b6fed26cc031ea5b39f770a7111044db2ebc3d6fa90aa171155ce9376e215a932be0897e09876af544467de7d5f03124c6" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "01"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "011f1481b54fd859c3d4ba500d2d5d222301c4907479d12bcdf1363007c5632ec51fdd6569ad174f4f9648555e24cc2a47c0753214ffe41fddf874a9a2141c4134b3", "012d283c35b7127fd1d5c5d0a73127f2c1ab9056205cca574ba075189a2da2eb4750f19a97b96f87a58aef96c38f8dd54104a33988b5b988747112596279fc7a612c" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "01"; + bn_t sig_s = "02"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7130346b01cc8256b06c469e974c5d1a73218c7fc76abc73fe49f3c7141d9b3528c856975468cb43ee45461a2ace7ffeec29624d1580be7e75a10dc8fbbded6e98", "01619ff433bcc4c6379306591c3f8fede365e7ad9d4c0cb566aacdf82c92a504f7fbf77a54ce4e7ba6803b9d421230d4f3ae4f2508508e86b182a009cd4d4b861339" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "01"; + bn_t sig_s = "03"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01f4d8885bf9f4ecffb1ff62cb6ca036800136b2aa02325e46786b6a5f4c4ebfbb1307af34bff1ba2332cad41a417cddc0a5ce3149a988c70aec8ed168b9749bb043", "00d7d06746ef7378545cbc6623073bd56b3a1563d853add995c196cbfe7995bb6082f9bac0bfae347b8bf15eed00a64f3ab02eb70174b9e0122179b855523e725f1e" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4155a72953689b0ed5774a6002d6a01b92c56317b69d73d795a5b5c53ea63f10fc047ace93fc4be8502438427afb60518ed8a21ebc4227e37ab8cff0e08d5c759f", "0165850bbe0f9ecfb1ced3db1151efc1cba15c5e41c28ee5b2f1f625cc090448b857479ccf4acd8931a279a2c8a7c49037a17861e0155c579684e65396f49dad8c3f" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "02"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "015df085716909d94739a3e83563b62f4c4048f513ecb1881db106eb1fc22cbc9132f63c8d785687f82fc4d225bcc5d8a7860023166cb6aad4f6b42ab1f5593febe2", "0107dc4b11405bc81e808ce8679c5ae76c9cc0e490c0fbd36bfd4639cfc2915ee2647a13e89de894d01f0c6f4a31ba4675a9d6441d75c5d755dae210717e372fdf96" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "03"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r is larger than n + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640b"; + sig_s = "03"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5da0bf24edc565f86820e7b599997b9bffc4cb570e2ea2c759050bb9eda4aa5f0703732e623881e3edd731948270fbf0c6b8b8173c0160588a09a2958b1fded11a", "01a99959c1072e4928eb4b4420c55a596bf46ebe0e2f7ffe71149031aa4f8e5e2d4463eb19c117500b733bf73f1684c8ae1999771494f2149912e6cf922fc455b17e" ); + { + // s is larger than n + auto m = "313233343030"_hex; + bn_t sig_r = "02"; + bn_t sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e914b3a90"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a72460b47647cf18215020a05ddd57b6b7a1fdb59589ba54572596abafd9413a3645622b78de90f02ed27e6eaa66b88e22d1edf86dffc00945c453bf55d9561be8", "5655d43e58d4dddb71176716492177bb31c673e9ad1d6a68c00f7d7267002d00e3f203cd4e5d882fb4f6a4da4cf1653934940d8adb162fdc6d3863cfbd7da1bea1" ); + { + // small r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0100"; + bn_t sig_s = "01efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7ef87b4de1fc92dd757639408a50bee10764e326fdd2fa308dfde3e5243fdf4ac5ac"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "015894e001912487ce160912d6e8ac66a8a7449fe56d06c02e1e52a04029e74cecf0655d7257cc73f68f5929ef5a6cb3b0e689cbb12df439d0932dc990696957a0cd", "7f2be8ac8168dd28c429e45f4f3127f17e1b1f081be900e1ca8c72e354d7e11198cc73d6d6f9542170441be58e4eb0ff34356896d8dedda4bd7596b6b2af2040a3" ); + { + // smallish r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "2d9b4d347952cd"; + bn_t sig_s = "0100508d073413de829275e76509fd81cff49adf4c80ed2ddd4a7937d1d918796878fec24cc46570982c3fb8f5e92ccdcb3e677f07e9bd0db0b84814be1c7949b0de"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01a6518eb0c8bc48d8c6dd8deafca4164a6c45cff282fb321365e3082eb49275447f0efde82cd05125524f31a3a3e0b844a489365f33c46b3f86833f4e61ae15fb6c", "2486c01f530c53fba83b76f0d74c6afe83acfd567b17fb13e13d205b28f2a562300e03cc170525eb05b3d9d02f0f69eb9b8551096b67bc2b0a202ef1366d31bb28" ); + { + // 100-bit r and small s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "1033e67e37b32b445580bf4eff"; + bn_t sig_s = "013cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc3393f632affd3eaa3c8fb64507bd5996497bd588fb9e3947c097ced7546b57c8998"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e75c5dc6fb8f88c1090a0c626ad8cd3800ebbf84a3a7a9ca11f3329bb4ba341890310f2c05c25a604a956abb325aa5053eb3af7886e83c6836e96a02660810b6a4", "50c49bb8c84b748f6aa80d7f69c12315bd77ac4b2b998a5d63af5ac1b1a6b62400017ce6c02cb8e66704d86739bec5c64bbb5e5df782df6ca1ed3c53f13c5b7096" ); + { + // small r and 100 bit s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0100"; + bn_t sig_s = "86ecbf54ab59a4e195f0be1402edd8657bb94618fab50f2fe20fe5ebbc9ff0e491397ed313cc918d438eedb9b5ecb4d9dfa305303505baf25400ed8c20fc3fc47b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00fe436033507264c0f6a8e0bd76035c56dfcbea4660aeb8865e0845a4e9895e8394b3fff53428bb6e047ad4d53edd47fb10a0d5ffa10a09b31ee45f2e5f370b0da9", "72fdb3001eccec7ed1d32b560f53f00dc7d1d06111e79f98793872e7b15e5ed8ba9e3cf35e9a5521b893485f6b508d6b3524b9f11516240bd2d23efd37de28d720" ); + { + // 100-bit r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "062522bbd3ecbe7c39e93e7c24"; + bn_t sig_s = "86ecbf54ab59a4e195f0be1402edd8657bb94618fab50f2fe20fe5ebbc9ff0e491397ed313cc918d438eedb9b5ecb4d9dfa305303505baf25400ed8c20fc3fc47b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0e117d46e922faec0482c89f289c8fca8445e77f456261704c567aa012d655301e4ad9975dea5549cfccc69dbf162a56bad4519cd2c32c169aa41b8df366f3fae8", "00e2d8a21fbb54f84fd5395b648996306c8ba7c2d434179ac999f1d46098867975ca2ed83026b96a7a56caaa0dae8e81901eb0db352abc4a34c4ee6a41b26f33fe3f" ); + { + // r and s^-1 are close to n + auto m = "313233343030"_hex; + bn_t sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138638a"; + bn_t sig_s = "015555555555555555555555555555555555555555555555555555555555555555518baf05027f750ef25532ab85fa066e8ad2793125b112da747cf524bf0b7aed5b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "013480c06fdadf5f1479ad7037b6157837f3cf99e537106bb7357889c01d66468f4944256543ade8d8749f33c5a9fddeda53f0f6c3b90716e59027d6cbcee535806d", "2739b1799c3b15c02d2590ebc021ffb7a254faa59f6003c8d3d2589b78f38f1d7ddfb1369527e3335b6047f20185296fda1c1d6d36420613df0f569b68210e9225" ); + { + // r and s are 64-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "9c44febf31c3594d"; + bn_t sig_s = "839ed28247c2b06b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "016874eadefdc972faf9b4484f1c1e2753f1230c5274f32addbeced69f7249f895e0e5c18ff52f416c5e235a703b8e8e4efeb7d8b3d5732c9800c8a46c18ce1b9165", "01ffd7c9d50a1070ee6d42959ee52a667bf4b611d12d1f2f9f24956741f06a7c40b576f99fb9561502fc712e1cc7c461c698ed3784257c750a2a9f0a77afe291353e" ); + { + // r and s are 100-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "09df8b682430beef6f5fd7c7cf"; + bn_t sig_s = "0fd0a62e13778f4222a0d61c8a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "015e73535bb1b6d8d9f3b2b18c9c67837775f5cc2b36f9363443f987ce15bd50a77c63e46fd87a6a2662643e312197b72a07d9ff89466d1606e2f40baaa4a6a5ae53", "3a6c94384f0b1ad7f48419f10b82b0585c230b70bb2739a41fa4a1da28c68f2b80ea0c90e332dee8284589c619c88c96c8d668f384da1bec04caed7d54809fd6d2" ); + { + // r and s are 128-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "8a598e563a89f526c32ebec8de26367a"; + bn_t sig_s = "84f633e2042630e99dd0f1e16f7a04bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00bf68baf7347cbb658b39763fd71db89575cb9907450c65e46bb280f82579e26138b10440cae13fe8fb4e74568484a68ac5e9e648078eea8529e69d94e787437889", "2c887816f2e39acb9c5fa5e1d546319cf54c7b5e0bd18e840ca1ae8eabe776de62ee22bd9b5e1f2bad90b31cdd46a284b2339460fc2743bab35fbaa4f26d5f786c" ); + { + // r and s are 160-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "aa6eeb5823f7fa31b466bb473797f0d0314c0bdf"; + bn_t sig_s = "e2977c479e6d25703cebbc6bd561938cc9d1bfb9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0128bdac640b4f6fee289691b4947a598690bb9e6ccf3bfd0782f61def532e290a45d7202bd8424119b5774c4ebceb7a746f884a88f096bb322743e94b28e8aa5b10", "018716996903048af17d152bcdb9a1ff67aa8b148e025b5d4edbd75faf9595712fdcc7cfa483e01f3a6576727bcb35649d482e18b7e4c4b4e41dff4be3de92488f94" ); + { + // s == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "01"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // s == 0 + m = "313233343030"_hex; + sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + sig_s = "00"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2ef59eb8b0174fdc6188f1a5258a617a2acc937af7323d0ba83f266e0553e51f471da8aa3f45f445e1f6f29eb735b37e2be3c0fc75408cc4bbf61ce8ca83d122a2", "0101cfa1496a3e76016eaf3ac7494cfe91e491d47ec4b38062d417ad4d3c9f2ba83d63b2508f7ac397826a763eb476ae4dc98b71b6a1a5a540707fe65492c82c6c5e" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "3766c66283b12cbccb593f39d32c356cb4ab940931bedf5d8053458cd26d03b1e9ba364d2056a8c3c7fd8b8f47ab8277adee9bc701ffe1fabde72a01dc098f76db"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01874de89fdfc5be598ef232969e133f2394a48c02af2468871d4382f006277c6895f22619f90834a3260f60ecbf00bbceb9b247580a8f7c2670368b7a354df50e2e", "3e3056d6a8c00ae890b92c6ad1d129faafca8eee169d90f489e54ee3b868f27a666b54553928f5e16d300527ec842fb9cc189fe53e6475909bf4214a6922d88383" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "1acee0a06a4b00e9da99cc1d47fcb1158787578728dc13cc74a95e51fe1ac074f88613bcd4d717c3206c2a73c76172416a94110b9141ad243ba87b51a042d45ee8"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00f1569c62e9e0985fb4915f81ddf8ec08385a2664bda729d515170319a99c15a35cc9737142478c63fd89cefcbefac1346a7ffc1cc6ec7ff541e5ba98285ce91f0a", "00eccec98c5aa3295ae18427c09001e0ec370bc8b01e499d6530421fe446ed506736075c520abb739cdc2c7c2f244853f0feb468b86693e8c79f4cf89c53358016ea" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "0ce1ddfffbb3185109966b647419ce8b553a6d70d6c73013af778f7b211aadeac70511ae766f0b74961a1019ffa18b3d42056fd9ed4d5fd982be75291f2532bb02"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "017c7e5f364d8461d93749abc757f6a4094672c7beece89a082b028fe2611765104f014362ecd1ef83b6bf338295e2380edd58c45700e480474e5a425fc1ab7dc092", "7deceb1204031af3e624d764bbb3c276ba7641fe4dee3a02db0f060f703eebc36ac1f7ef38dd20f9c6b55084dd6739f0ee63f55a6921927ebb1136749ea22a5790" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "ded82c833933ca141a3eb8fd1889f2fca4679437d28e9f867afeb37ecaccbb555dbc61ef83b3f7d57c6b4ac8ea27971716e6a1a0534d7f7ea1fb7197d1c4a0d5cb"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0fc19339dfeef2923aae541664d44b672bac1c5b66691ccd1db942417a4f256667de89b3b9465a28ee0d3b0545abbead2e5d3c73576b51dbe21f9fd341b4cfc6c2", "0154c51f5d096e390e1b96052fdfffd964b80b82807e0fed55464ed8760bc512d620292168ed4a26816be3639a29eb0b01d851990a4d6dfed82e3fb7ee07627ca8c0" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "72ceb39ea97d82d3aebd01ee53d32fc02bca5887fc0a5fe373b7a0d3085249684731fd8157b3743d40caa8a7908699bc223d0df57ca11f6225f732119431b86b9a"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "019272b5e17d6fb21d7acc687c43e708f2ff1e2ee86ebac08bc18361efac7e0e16c28b0986685a91268906adb84026168fa7c082356cfcc8bd9ddda9f5b1cc45019d", "010bc845371a869df8825cb38e3379d4cd101e56ec10b0a64ef60154d789b4e1060a647df2d40b9cffc6d77359416b070e2ac7ae07b43bceea38310f286bf766a24c" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "1834d4897e360d3622607611d64c4338039f8f7db00891bf5930711b2cf7d47be557b283d20aa85d9c5d2e472fdc59a35ff4ac0985bb06fa284838026cf0ba8571"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d8d8afe178015ae9cdc7e1f4e44d750110b75db89387fe07c9251c04efa723eac722bbf47727d2cc18ac35d8a67c773cfed33555ab1c4873761edd694f84c788c1", "2670616086a98b3a593c3d9e71de5d783768bd64359b6637f1a1edab2cb687795821f205b45bf7d909be64f8ac5985033f8ddb56e2d340af7d51cd8ff5ca23d545" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "a9c260ead3d423c0e8bd225f41ffaea6ace17b1e157b98ccf912c90865a4bb74169ff49b4b0d62e0772905ca62b0bdbda232955a3952cf3b83f50bc5f6ae33ee4f"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4985a546019b7bc7762d84505ecb7933ae7285b43e667c7f3fe6c60b3c283ab0a74e6ef76459069dbba574e2f7044a5ad35382ed96c6d657f3f98a41a686567cdd", "17aa5585f9959b11ce65b3dd8c5e44ce8984c87efb0d31aacb9f666967502080c3c9ceea205a13559ee10f38f5b860c099987b20feb275791b8f33ddff321a6de5" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "2e67568c48766d91884b0ecdebb8d9a39a359d77bc97063c625d6d3f1dcaae81cdfb198f4655d9853273bcfb60477cd0a1e435fc8bb93f8d05a20fb977e50cc434"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d1831a366bebf000616692e8c3b7ff21a2f7407ef7b1d9c5eda3618e8c4abe8ef634827ef2e8b2819407d4ad95ebb6c3c7806b27913a485151e9cda3e82643526b", "6b520da556ab0230ca5f3c01502f1d5c5f9640f038b7a01bcb917d9ac6548bc9b33e8e7481fd177ee096e0fa2ea1d719ea4bfb77e9aaf3cf26aa1ffacc887aaacd" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "39e6ac133eb88e5b5748ef6806e750175b100ac40e3efaa891ef7ef078c9d3f2cbfe6398dc776f72cd2f904f2067c63df677f3d8162cce1de557a5aa4db6561abe"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "74607f955058ed6319777f331b0b6a3fc2ac2032ae581ad4ad79bc660cf3e3f66a59bd8a1e33a3599ad666a6da6c3211aedfe9b727817864b873b371bed646c896", "01ac3745b4913e52a846c90f3fe20004f98e74ec250facce9ccb986833e85c4ed9c69d0ecb7b696c8649872f2a41114dfca7c72d642f9f75a895d0ebab7c31a3ef7f" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "6531ae6458fa556c74ce671a556e703038afd8f769c398d080be8fe434accae8dd35e8a28545297310992dfc74efdbcfc3335e0b9f9bbf970cf4361213eade27ed"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b1c259c44fb789216d00f11ae050cf9bbeb3fe61ff1999c0cc90f89925fa6c9b53422ed04b26052728001c1ebd9a8a711932dabdd52d708e2726ee050f12c6b898", "010cf9956328a2e2a769745222f794daa253d52438157b26bc06e8eecb3d0fdedb6e2894b65e489ee376b95098bfd4f23f7eccb6072264d880a272f6c5c469cc02da" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "7321260c7e56e586f4a7b9b47a18613f833097c0cdebc6fe488ae05d1c1f37a3a98f2e1af140e7fb1d2318c50b3b984bc4066bfa55fd98db18ac649ee7e47cdec6"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1e582ef2de6a6eadc18a59b269f1c1359f57a64106774fd6e8c3ea9035c89c73d8c03330ff60dfeaa44dfa381d8b39b96f830ee7ead41021f4c188fd31e7c821ee", "01393512582b57f23da9bc8b64420f434aba31668a9dfa7fcff9c7c2e61b710ccbaf72371dabc85cfe297ae18f265797d9f309bfb9ec01b115c9ade396dee39b1b14" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "4f27499640288c52f93a87795bd7a0b83c95dbf69a5a3b6ef62f1308f2b9a817536173b45e687646255958f0cd08e0c469e66495d4e040217af2fbbd1311d21711"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ddac43dc59c4d2df16d5fb1d3776089cea56af522589e63c197688fd7bb30083a773491d8ae2e57455c81bc6d3dfce0c29d0bcecec87401fe4afa60306540ef216", "00cfb6872bab68b90eb73d705696cf8515be016c18719e5fa6f69185d0bf90a2266519e9908c8399e2570f71ce362bd8c548042e590dddcd86c71690700dae40cbb6" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "40484262d596a23936806ef21ba6192c72023a535089ee524e2a32f61c7497e58b4dec0ae58178f7b6dd3587fa3124a4ccccb49de353541f610f7d3c97b63db11a"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d03348d958f78b30cb3bdf20503aaff4aceb5746390484b74b2d3c0c043a0ccd837a93fc1c41955555511e3252d54dd090d74a6928a358397ab5c36e117aef5eee", "09fa5e3a14a7614905177e948cbe8e0c3cd9e36cc62f5abc2e761697c838cd8b00ba7bdfefaf9b768c47ad5b5e4b20f15bbe72b9fd3707b25cab0027f8c3b71a88" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "7fa623ad71573766571b8fd4ae0a5ce82b3805ae151a18515ef607f2228a95bafdbd24acde135cae5f3f899caf0c5efd1a4de2c53878dccc09f2b7a263c2844e3d"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009e84afd4b44689a9830d81d5d65ff7adbcb422e2b51b41c6d75b70f5db9fe596d49aee84b467275c3578db23884fc809f4e9ae57b165bd6dd1069cbf7044937566", "01e38249e834d3a58bed41bf100a0d9a964cdac10f19a9c3d0e43175deeab9595cfe343e008ff0be63d78b3fd1166ad4c4ec66a55638cdd779a7c50571653d618f12" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "54e096bc1b2ee6f5fa7d65ce54077cd07a379a7d1bcbf85651852fcc62037ac50c6e64b8c6c2cf8814653af7b87d2752e6f3af0a3ef75ec7415a58cdf2990ce4c0"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "438f4f62297e21524d237da20c89842c608e319f1ec5260a79f5ced18519bbfac425a4e72fc19fcdb8225ac86f81e29f30d6f5f3ff32afbf0d44191731179095ed", "01e9581d305a505fe6b6142b386aa8fa0eb13f87eded898a173f1a09337487f843e7daa7dc24132ee35942645284239bdfc7feca911e76d10ebc50fc71f4c5cc23e6" ); + { + // point at infinity during verify + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd28c343c1df97cb35bfe600a47b84d2e81ddae4dc44ce23d75db7db8f489c3204"; + bn_t sig_s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + auto r = false; // result = invalid - flags: ['PointDuplication', 'ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00eef2fd1df18de7e98b0c5b8ad244704c1cc4ab7cb8fa91617dc564e96fffdd91ac15cf0d3b1ee3aa97ef4e1b34f9e33d12ebd96a3b98825244494d5b2d5aaab241", "01e064096439d4e090db8a9facf5c17eb2ec888a8ddc89b72eb16f059c6e2fb05c1d3cdba1bc0dd06ad322c2597fdcd696acd7f09417d76088d82a439babffb9c7d2" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd28c343c1df97cb35bfe600a47b84d2e81ddae4dc44ce23d75db7db8f489c3206"; + bn_t sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd28c343c1df97cb35bfe600a47b84d2e81ddae4dc44ce23d75db7db8f489c3204"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "72aa33a0c180e18b1b0f86579b0109d629a865ff67c68e37c81bcfe3d14401c58b995a90adec3133de53eca49ffca323f1e067546c27b9d7e559fa4c605f20b2b9", "01c2a21f93a82d61c279a0f27875b735a7b702150478c044d4b4c1f6121a4c0b37dd9c75031080798653c1dfc9a66aaeb94b4fcab22113222050a6fe6121bfdf1420" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd28c343c1df97cb35bfe600a47b84d2e81ddae4dc44ce23d75db7db8f489c3206"; + bn_t sig_s = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd28c343c1df97cb35bfe600a47b84d2e81ddae4dc44ce23d75db7db8f489c3205"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00cf1dff74307192b773d12b275076ef04b1807e3b774bf2e28dffc1aa5eca395ca525a9dc6cd2d4ae7e93cbf981e074040ffd2d86fc6b82038b850537143847e4ce", "015a9af9c2f60552ad141acc2ea27ab73a1772078616c3017a441f16e417d93d88030d5351fbf1e6ae9b0c243636d3fb74de920b292ec550f232eb90cdbcca174d20" ); + { + // u1 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "342dae751a63a3ca8189cf342b3b34eaaa2565e2c7e26121c1bfd5435447f1c3a56f87db98089d208c89e902bb50ed289995ee7ccf6d6e6b1cec4aaf832d3734"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01d0435963afc96eac099639a3e23383462e505c83955f29743ed244e6b76bb6fb080118558e63a6c632d3be9ba173dfe46fa7d9c761ce619055ad1c4321e142e8a6", "018065482a1e845183854103d7c97a37f31aa73703aa1eafc5a774d52962041c35b25ef4e98a9c5b48bf0c91bf16df0c2f2d1685aa4b414383e0654a9e43c0c60458" ); + { + // u1 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "01ffcbd2518ae59c5c357e7630cbd4c4cb1555da9a1d381d9ede3e402abcabb80e36ac16ffa82726f94af34218463bb8b8a7a21fdb3bba2ed9439e836c6f0e0b2cd5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1af6a36318d047a1ed36849109c3a3661235e693dc0a3bbd76ddfeb7cdb13e79e7f36eaf6e412bdd44c4d0f9914b4696137212127913b9c0b3556f808f54710813", "30246a78fc9d73335ce9befc2be236c32e947efde654481bcb7763656bd9c250c2e1f73511811efdf2c01332cffe2498b8b71cf50126fa0f8b34c8ed2d9631894e" ); + { + // u2 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01cfb15a18fa029408a4dc7e1894df30e263fc428a872d8b1cdc222c4bbb31ebfe7a24897e514c1c51ef4d7a339f7638c2859a00d7d0390ca002a6ed0ba7424fb6bb", "01ed010d62df4069c1020e0be488768879f1e6c67a0136889080c190d0d6930f2c4097d75f89dea3659785c374a91588dd6cfa2f9e296e7084ad60c0b4041a5476b4" ); + { + // u2 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "015555555555555555555555555555555555555555555555555555555555555555518baf05027f750ef25532ab85fa066e8ad2793125b112da747cf524bf0b7aed5c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "496260a48fd656a3acbd4af6876d5864ea2c8b317f0448c5ae7c74160d64f303aba83cca1160860028c2bf1508b5af1109de5f740dd9e287af8b7b32ac1f2ea905", "00b08409969c1e066f880742b0606469dce29c07ab5c84bd480f57fa701d868fa399a49a4ba1fe4ecee198a648746273129ff7d02cff2abee672f1775d3ae0ec75ba" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "11648f7c5e213698d5d89a66b913bc4e38b721f642a0cb0b40954716716d50968c7a829e8802df0ad9834dab93c5a462dddca4d445247a23b44ec38fd66467bc"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d522117fe95568bf988ae0fbaf5be3d46ef750361f16189becc63283e6939b36869556c7ebd90272dc4f0bd054f8505c3d01dcdccc3f6538830d9c5fca9fc23b07", "01c7a8c0beba04b4d62b01095a220fbb6878c91cd2a56eb7bba569a5fc0b42964117ebd4faad3e52086d505aad8b9f0096e9d67f51d505aea87cf61ed33a5efab4ef" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "426fb6fd3c671a0f7c7d2c3cac25b966e6ac0ea9eab99d07706245e9992d1d12698fe266c59cebc214d545cf57aca1d3bb80cf3946602712411941191134201a9a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3293db60a2a4b219a531caaf860169f52d5ef06d2f3c185fa4d2f6e3e34bd67926948f8397d2b4a98c06ef904f184599dea82da1bb383b9536ba4717849696a3fc", "116bbc57ae85d57a0675eb7fae131afabbca5fd0abfc246bb0373d006c797ed4fcb27ead00574619c3c5622ce123d4cf670fbde3809b8fb20392a03a20c614894f" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "012f3be6555b95d6a3787dca53f1687f9f23cb121b235cf654c7e1631f52dce04eb8e134c875b7bcd817309bbb455457b9a8c96ac395f3828cce52a0d73baa292d7f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "140cf342e8957593fa7ecfd1cf9530574361364e2bd39df5fac1073e938fcd8b87535f42b230515189204f80fc2c16b40c9bbf252dcb8d77fafa81242e929015c3", "01cc5e15c329aedefbd8accb680d12d76ceb74fdaa70a61aeb79cd2211f2baaf85aef7f4099af081aca2a18b5126df36a02728a50d6bb6904ebd3a0591b56206ce9c" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "d0c7db4562c9a527ffcbd2518ae59c5c357e7630cbd4c4cb1555da9a1d381d9edbed2712adcc0e3bf3c0037a7bee1551669c288188cdf5f66be630de62069d0cd6"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00f332fb45734adce50c95527c0ad83fe0965addb1a188a4578737037982b435d175c9e520793e7e8d832b1a2eb3aea271111a4b2b87ce9d1d0cf0eeb7e45a51241b", "01aabda82f880782f9d76480834b12d60c8e5e1c90ef75242d815eac13425cf07ee77354ff707098bb7830444beff8edfb4812c2961279b412e5078ef147db4d490d" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "7db4562c9a527ffcbd2518ae59c5c357e7630cbd4c4cb1555da9a1d381d9ede3e29d92d74fb34ffabc8ad75ce5cc26bd5d0436a30dadeb208853218f027af0cd4a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01dfe31538bfdeb190ab46fc8836c0876897e956d40e6bc3b2c8afaf979f52b5c5d5bee0d2ef386ab0e59c8278b91be12ce437dd0a9dc1f9ac0807cae52fda502669", "016ad42dc451c2cad7d5b840d151de6cceb158f3755f76d496b959400f7b7b4779c167c4c7adf96cf53afc4dcc6f0e9f6012dc484c2014d1e82f09dc2be96ab1dac7" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "fb68ac5934a4fff97a4a315cb38b86afcec6197a989962aabb5343a703b3dbc7c53b25ae9f669ff57915aeb9cb984d7aba086d461b5bd64110a6431e04f5e19a94"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e0e7553de34d89d37da9ae8eea572beb2a20445bfee82d145fae50d5d6fabc37895c47ba09bfb4025ae961e58155ea868c343431fc939161a10192f910385082a5", "01c8c38c30dce71d50844617c42263df60e29694a702b315be202cf5282adf8170b8a94ea78aa9241db17efdb8a2539c2b71da884211b2b4e45b49ab9192a720c734" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "0162c9a527ffcbd2518ae59c5c357e7630cbd4c4cb1555da9a1d381d9ede3e402ab8bbd93e12de2778bb0e38806ea1c2db3bbee7c3b06e36dfb0c192cd9a8e395d4e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01968ec94f16ecd9d5da1eda6db099b3b79ea1e08d39e7748637cb13c96836f64e0f3227a2ec7563ef58b27bbf18807a6e39cbb8092244ff3f4a3ee9297935a2fa1c", "011640f819fe9f6911f0c8a54f972e9444f8df518fa778a0978bc6e64e1d43b24ebb03b4ece0099a125115ecff3279b2cdca15d6e4e7d00f5b1c9db626a0196634de" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "f208d5b19d30a200d6986c210681ef2bbcb3fb0166aa66ab55cd5dac9b50b037f9355386f8cb08743980f42165f567e5d41ad492b7d8c43a7b848fc0f0ed591530"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6c7518061f076c33c62f0a7494b619c08bcc2782cd99ef6ab6f04545fa17d8c545bac600c1f91830225ddad1a71cabbb8afeee7d80cf537f6e391049dd70c32643", "01f6bfbaa4244b80f062ab7a66a1b6a707de567cf119b46aa5364cbe396dd4b749daf156a84c02b2c25a204dd47d7cfbae5ba394a62a82f9390145b898cca14bc0e1" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "42c736a8baabf2b4176c7d010f8fc17ed981ddcbb2b8df40abc9b37b5d251fd3c8eb361449a0c33cb9d5f63851ce3cb76dc1aab684a94417a52883de9bff64fb27"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "013d7ae4676db161db18cf231eded0e3dbc1b23bfa353f1cd6ed8c472d1e6fca9c963d0fe95243ce65323a063386cb173a02c65acf07b3beaf349e89a612a07065c0", "012990485c9033cec789ec67989516b488e5246f27499a26c4f30489f4a287435ff55c638d1d2c7e28aeec1b08233d1a8cbfea9b6762efd34e0d387c512b12966e6d" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "016db3214ef7a2afbd7189087133217bc55cf3d8c1dd84021da2290495569e8d259289d8203c2245f281513eb96ac7a5aea41fadff0d2ee7cfe2df3eeb2dde5be815"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a0c75547630e9ed64cc1e59725a3072b231b28c586080966db67800636e4b4c217162c8d03a7ba0edf49669fdc682a355ef90947d7e394406296b354722636e005", "01df341f469c7e460e87aa96df2c90a7774e7532fae10410e932262937247a2ace6512e0f9a37f9547f4a8fe3247f093018d000003917c195c1d0ce5b36ab613b9f0" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01fff74db841d0ef64b39513b2cca37621d8e3a46f04deaf9a7a5fb55c74c74957af0b4946347b2e26e6130a5a732d26d39eccc7774e670a0a9ce1485556a606302b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01a714661c4d299f540f291a07f2deefe6145d9f7a9ed492f8539b9e0b29a0d24bdfb71a89f53c1620c8ada2e06fe98ccfe11b988077816f0a04cc338d52266632dc", "0193c3b9c6658381eb61e0221e002b15cc622984550cb0289fb99636d926ccba6d6424dc0d39579f39743c821284849527b524a8650a2914cfdf3b11deaee453c8a9" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01ffee9b7083a1dec9672a27659946ec43b1c748de09bd5f34f4bf6ab8e98e92af63c50c04e5372cb760a648b39d6344016d5dd924e44477cd8b0720f38ebad3fc4d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0128f58edf565a7a48e7e40a66dcd17476a609ea0a2768fd3fe64c8d1ae82d236f6704ebe5b64dd03e59d52c4a87aecd342019899e2f06f30b090c862b325273dd12", "00cc34bb7753bc1ed8445b9450262549bab049161d78129bb273ba528eee2c4050040be5d30ecdd65d5fc01866a512de1519a2f60d80ff522760a16bd3f67c03728c" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01ffe5e928c572ce2e1abf3b1865ea62658aaaed4d0e9c0ecf6f1f20155e55dc07187ecec395f32b47db39870cc799612f3beeead27a21e590792cf991c6cfa1c86f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00e0a499117991efa71c57c12cfb2cd253fc5a2f04c30fe247cf3496f41c546b5c36d962a186e4f01135756e4eb0d8021dd06e0e728498e773922900020e8ca191b6", "008ed0c9ef71c85b0d2a2b18d6517ba9fdd4ca5247dd2cdf033720b4c45b6512a3e83d1bb0ccd7167b405b48f548edd67ea1abdfab2969f758f3cdb3f174edcc4552" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01979df32aadcaeb51bc3ee529f8b43fcf91e5890d91ae7b2a63f0b18fa96e702759995da7fcbb7637415833de4725b0afbc829046a73e8f6a3e8708472d1db0c8c4"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01969b92c818d09e66fc0d1dbaff4093b934f72fcb6a45b13a2cca89d6ab4ea9294987ada9dfb8abdbbadbb879b6da74bebd108b9dfbca74ec56cb8ba9d05cfbccfc", "7321b6ea2f1640675e339feec4d93b0bd7f3dfa9c633c7da4ec05295b7b5fbd38d6ae348af87ba99fc7a29e204fe864137f9946efb7702ed34d1bc5e3458a31807" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555554"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6b6e33ab1fc74e112d5d7d279ac51b67427181454806ff33bdbdc67af37ad704b521c74dce1f9ffe38e253dd152b1c108a37db3b3fbc40a2e76131d0399bc0011e", "00c2d36db9647c3d71d98606698dae0afbc8dbb648c9dfd4e2ca523ddc72a0bd95e7f6abc7e6ce11a2c40123dc1cc985e155887535e2907a905d8d51e9d3ed01330e" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "9f57708fa97eba94c6d4782cdd4e33bb95c1353bde095232e3e2bab277bb5d2b48f55a53ffe928d034c29970a9e5f384a003907d3d9b82a86817cc61fb17f4c59e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01c0a09793e65ca31b1037cdcb9da8f8e0a8dd648a6a4f3d8cb98398dce856cd7a123da290e665a8a12819846e8f3462eef875abc5fadf8af9466ab7cca03ebeb4eb", "01c37331f2290f75ccd68b81f1e30daffb63d2319d8481272a7d65f9e4e3ac8ff34db0c403f86a6ea990436c66f24489f5f39643ac1046e99e11db924978d0e3812f" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "68d98fa90736eff3e90f8fcfe50838b6fa0bf2cde77bc51e3f41019c8006f4e9cbaeadce7dbb44462da6425be9cfdaecb234c41749ce695be1b5ead2e6b1205f35"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "62d009d1eeade4561686275a42e64e26cccd4bb6aa7385a61fa366ad56359a209fb315e738d64a9a88ae81c77bcf585de4ab41f258244e3749b56e6b284047fbd4", "008e58c40bca682bd13221dd61cd18485c1f831c2dd9e22525c127bab56f49741f30f39bae9fd74533662b883df06c15bc673919b36abfcd48f08c90f1b4042908e2" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "e97ae66bcd4cae36fffffffffffffffffffffffffffffffffffffffffffffffffd68bc9726f02dbf8598a98b3e5077eff6f2491eb678ed040fb338c084a9ea8a4c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00bae91802d593acc94727e46d1b777887be8a8291c99689de4bd4b790b5d4f7ab7569f167d6f5d236f13ec04ffa25e8a76723d02a44ab586cb2f4c7433a27269281", "0092d7569c829789ac45f625c72d50ecaf38fc8f7e82e5b89a986dcfc912225609018a6d618df087096b21c67c00db983bed0b0fbeba7a934ad2149cfb275c4d582d" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01ae66bcd4cae36ffffffffffffffffffffffffffffffffffffffffffffffffffffb3954212f8bea578d93e685e5dba329811b2542bb398233e2944bceb19263325d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00bb394e65fc89fabb9b54d97e4f6133a9091a74f0bd66b1fe77b0d7cae16e98beda1907f70c37ab300af9dfcbfe01d9aa433e1855159b663a653d973c92a0a6a01c", "0159494aa3b06f758c0df70d6244e6001543e0092fe2e4d692299fc442a30d37f834c478b84b58dd357830785404a3e0175ccc65e2e77bcd3751d59d7881ea88c077" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "015ccd79a995c6dffffffffffffffffffffffffffffffffffffffffffffffffffffc2121badb58a518afa8010a82c03cad31fa94bbbde96820166d27e644938e00b1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "014e96e622ab11d843ed0df286c2a9fe40f20027ba9ab34c645de827d1867f3ed4045c781ae9d09424e8f77ef57422f52b38caa2b999e6cf1ead157a8834a5655679", "011db6f3c819fed7b71d766b41905304e61d9f19fc9a6c49267bf2181023e667ebe3465f5521cb1a1d55a5e2722e700c1624dc2d4c9653bcdce8b6fe793c568b35b7" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01cd4cae36fffffffffffffffffffffffffffffffffffffffffffffffffffffffffae18dcc11dff7526233d923a0b202cb29e713f22de8bb6ab0a12821c5abbe3f23"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b7950ea9ebf9d05d460d451dd20d2b70916e258f58d0b550e215d160fb23bb5696efc9457ccededd93cff5f49eb2ae1e27e93fe9f463cdc75f12e317bf69935b7b", "252c57f7438c12484feab9e78180588259b17cffe1f613bdef0bfb4dc33584ab3566eecbbb9626d67546b1b246323d3317b7e68273fcc6053eb16fddc0c5de8295" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "22e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b9c4c3f73cc816143fac3412b62de4c63db08f8c57e4c58c31f1b457ca5e57e20a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01ababd5abee5cc082c9a4cd04721820998f21303f6fe43566a858563a23d8431bb9cbf5db84b0be4ce95cc962b78c7713374a34435f84fb065984b98fb2b486d78e", "0eb4914193029be32044ed049f06d0fe4d7db7c9938600237dfaee8643ea0f2a157e57198d5cd9020ed7c2ac952a072bd4e82a211ec1e20f22e871b81556db361a" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "010590b21642c8590b21642c8590b21642c8590b21642c8590b21642c8590b2164298eb57e5aff9343597a542d3132f9e734fdc305125e0ec139c5f780ee8e8cb9c2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "03b406bd7905cf188d2e6e3079dc66eac8411fbc6d1092a02cdc5e9b4d3eb5054a1032ff2fffd194413b2dbb95ef78262cad749195465e1a52f1dcfa858df3f90d", "01ca7a0dbffbcf6d74209a0a334d607c39c79aba96152d32ac3693c490b2a83d87b30428f418794b80cde96fb59b5e9030557d2411445c337411047f1d628ac23e2b" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01a4924924924924924924924924924924924924924924924924924924924924924445e10670ed0437c9db4125ac4175fbd70e9bd1799a85f44ca0a8e61a3354e808"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009faf51f370945040e6609734445807a42bfbd11e24455e9c8da44df7e9637c76b39bd84dde33bf2c66e315124f6412fc3390aa2127d1d7c1803e32e10e8f9bd0dd", "0189b5ecb618bfd16cc67c671cc6da9724796e10350f8a15f9e2192d8d32d27e2b69897b5c61d3fb71b1c72146d31dceca0e4204abb2404e81ac664ca731fec6fe80" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01d5555555555555555555555555555555555555555555555555555555555555554fa6dbdcd91484ebc0d521569e4c5efb25910b1f0ddef19d0410c50c73e68db95f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b99ef22bb58cc25edff6c197315f418dd66efe28bde5e25b3b696d6f9db1b1a017b4f269af407b8b609506080f29eaedd4cf7087e00b599dc5e4d2a8388867204a", "01b999ffdc2b3c5819366c9295e1df5c6468e70396c7fa8c9a926caebe6a1145b115c107c87d106f384f283fe2d2aec65b202745115a14ee506920d02a645ebaa7c5" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4fc31322e69da41162a76abf3a1b4507ae66074633446f259661a61c93be30eb5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01b261cd6f287105804bc2885d5a59e791712ab6b9f14fe6ff712f5f4dd693c7b01c272156f895b84f74c6718926baa5f55a73c235351746ec99f0898bfaa24bb4d0", "014b855367abf6f742976ff49e834612544bc983a842e56e0dc9cff9289c64f40efe350dc6301f848ed7c741d3b9ce824ebc779fd1e6c068cc77edc009aea1666592" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3f6475303719ae52bbd2bb4606f8dcb862cbf38bb8545b7c0759d6bd8355f260e10459f788b319df203c3d41558fd61a1770bccdafb355861064acb5c19e022165", "011423d9b472d31faaffdfbd6a3e83f7c8e79ef1bed35a6135abe93e3994e17321c2e8ee6268b1767c29671a43e5bb0d99751e137937a1db4958a3b29c3ad76cac59" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01346cc7d4839b77f9f487c7e7f2841c5b7d05f966f3bde28f1fa080ce40037a74e3001a2b00bd39ee4c93072e9963724941383cf0812c02d1c838ad4502a12c619f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ee030cdb40abf70726866681f7b7fedc534190929c05a650bb928b894a5bbfe9577eea83c6331a796fa27ed9fac95d9ecacdfef6d61c925502b0afddc671463549", "0155606dd4cab19330c57c2ee740cd9c7c88bd88d95f840f315d525379dfeb7ea9bd3677b2185b92957f374317cc6124aacc8708075c4c05c95cbbc355bd692c3708" ); + { + // point duplication during verification + auto m = "313233343030"_hex; + bn_t sig_r = "90c8d0d718cb9d8d81094e6d068fb13c16b4df8c77bac676dddfe3e68855bed06b9ba8d0f8a80edce03a9fac7da561e24b1cd22d459239a146695a671f81f73aaf"; + bn_t sig_s = "3ee5a0a544b0842134629640adf5f0637087b04a442b1e6a22555dc1d8b93f8784f1ddd0cf90f75944cc2cd7ae373e5c2bac356a60ff9d08adfcdba3fa1b7a9d1d"; + auto r = true; // result = valid - flags: ['PointDuplication'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ee030cdb40abf70726866681f7b7fedc534190929c05a650bb928b894a5bbfe9577eea83c6331a796fa27ed9fac95d9ecacdfef6d61c925502b0afddc671463549", "00aa9f922b354e6ccf3a83d118bf32638377427726a07bf0cea2adac862014815642c9884de7a46d6a80c8bce8339edb553378f7f8a3b3fa36a3443caa4296d3c8f7" ); + { + // duplication bug + auto m = "313233343030"_hex; + bn_t sig_r = "90c8d0d718cb9d8d81094e6d068fb13c16b4df8c77bac676dddfe3e68855bed06b9ba8d0f8a80edce03a9fac7da561e24b1cd22d459239a146695a671f81f73aaf"; + bn_t sig_s = "3ee5a0a544b0842134629640adf5f0637087b04a442b1e6a22555dc1d8b93f8784f1ddd0cf90f75944cc2cd7ae373e5c2bac356a60ff9d08adfcdba3fa1b7a9d1d"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ff928f93a654fca5db79158bf8a16960b77729b0663eb72f319054d453c171794e66fa10438beb55416bc89663c8a4d23c645417f7a3d23ec88358d674ee7c50a7", "01ea26dd23b0b878125c75e3a524801b4b58d0eb7513b3ae7b8b6080a2f2b9286bfae256b5b6571ec3d72fa814aa1d02f1610529c41a68cbaf78783738bf961e3681" ); + { + // point with x-coordinate 0 + auto m = "313233343030"_hex; + bn_t sig_r = "01"; + bn_t sig_s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "19eb6b28ff90f9d4987669186ecfd84ee28325831404d2bf61d31a8fce2f79435e676d2ad09498f813bcf343e929205b4c3941e5d9d1cd18c0f398b1e6dda08891", "0153f6a8b606b96fa0178af70d8d591a2825fed4b6fbd23e37666f8a25df1d37b7d08cd0ed367e23e97112371c8ea0d737b6f2b13a19abf6a2359fd055d10c4e0d89" ); + { + // point with x-coordinate 0 + auto m = "313233343030"_hex; + bn_t sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + bn_t sig_s = "66666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81401"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c27585d9eebf4e8907b799c96ef0915953b2ad36bf450e018862062c170e2fa5110f4b04f172c3dff5f6bc5d756ca3e91fdc408b579c870df2b02a09f43db7ca16", "008d713c42d9f1d9b7b09e0253bfbc1ce88f7579986210f7a8281009817c163cb36b6e940acc38e53a88efdc34982f39d785054a48d06facf3ebe455dac6833b527c" ); + { + // comparison with point at infinity + auto m = "313233343030"_hex; + bn_t sig_r = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "66666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81401"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7da8b570bacaad47b6c1c87934ab4542ed8629303b2fe2167f452fcd0451995619fd175b4b4d03766901be3baad5afb87ba3104584cdebaae6df6503c18af70793", "6b2f42d5f7b3a626d2745cb597ea86c95bf37c0609716e186d3b8882549db5c8476b737421155706d6f8b753323700492cec0c8eb07d1f0edd341aa0a50a5f29d6" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d"; + bn_t sig_s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "21664b32e13f605495abdc32094c61e78370642b4a8e66e316ae850d32107952198ff9e029777066b60b61b8733ea87495644cc790dd7b15ed9e952aa709d49923", "52ca4eea9d84e07ade2ba11b1f7ceb47d6b5bdc6dda6c1a903cc2ccab52c4b2d4311f28744cf6e660ef86775f76fc047ad1c08c10fab72d7ab61f5d83d01eae795" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d"; + bn_t sig_s = "492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0197988b90bc98d04bfdd1aff24cf20528e22fee172ba943d88b8e1b1cd59e32ec51838fdd22e6cabba0b2e87f1153b9ba521d863050d14d838e3f77568daf73509a", "46a063538fa6eceea045d0f6f2f9ebebd5187e1ebcbb2d762d89764fa17e15991935b57c606d6e0e1473830207ccdce9fc7a5644b9c559ec54f078f4ef53049c3a" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d"; + bn_t sig_s = "019999999999999999999999999999999999999999999999999999999999999999950e053936328c7855ffd6676d926e1e402fc4a1606e169fbefc595f4ba7605007"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "016ac1f5d968be279c2fe892cac70574297758dfe14e177fc5156c726c27a329227adf29ec4df435f68df6680fad993cb8417816406644eda75c0d871d24bc982fee", "01c457ad39b11fd7bab53bfa64019e0464b84300a27e5ad8ad676e0d57f6f4c198c64f9cad7dc9ad64a7e7d34c1f81cb9e11232443561acfe44c7676f8347a438e06" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d"; + bn_t sig_s = "66666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81402"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6e11f2d1f855bb6e5c8dacc10256788eea73667362a4ce77a95630a7adebcdfe570c9eeb3d2c4837ec63bd6020426600396922eb210819acdf89c69d3792fe232d", "0096effa4c755ef75147841a90289b63930ea696e28a39278374949e7656f2f76fbb668571e00f81885331b5c9f8ad4e61446d14e2d0cfd584c92e2f9f75575acef2" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d"; + bn_t sig_s = "01b6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db68d82a2b033628ca12ffd36ed0d3bf206957c063c2bf183d7132f20aac7c797a51"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0091454ea00df332bf33fe18dedaa20abaa330d95c4758c785186237f8e69d713563a457b4fa28863c0ea1f822f9ad6f3b678a8544a3c6337997c962f63943c1e1b3", "01e120a9b5aa72a9998901e8db2cedff456071ce1702402d9292041b9ba4ce3bebd4498baa9708b73305eeec4722c9782d5b63259f9a30c821d1eb03513600a45f8f" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d"; + bn_t sig_s = "0eb10e5ab95f2f26a40700b1300fb8c3c8d5384ffbecf1fdb9e11e67cb7fd6a7f503e6e25ac09bb88b6c3983df764d4d72bc2920e233f0f7974a234a21b00bb447"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d8926b405be46226d55f0c50c9fe7982ea9a4ce6dfedb745cd716912c6008bf0ff3705d5640edf04dc71346b6086b7bae476ee702908bb3f9a5815931e3d680189", "0116b45cf3739e7f3d69629e10f19f9f53c2d01f2284b6e98db0cd49f45887170ca0656d1c75d4505836ae3087e3c1187158a2774c46911361a34e5cd1e7dd9e4734" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66"; + bn_t sig_s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "016559fc4580186d7c1e3e05e75305c6da336bc3c9aa8f999cbafc719d6f4dbf62ef91f1859b2f61463a77e43705208e34d648416349e4741ea8e5e779a37bd4a5be", "00a808ce498afde58cfbbf5dfb77e607ce294ce0d036873ead04c08d5fd1fd5d44fcf67e680d77727aad682a7a418065e26b2aeae17523cfbf50b0c178693eb35373" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66"; + bn_t sig_s = "492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "1c31a43219d7959db2d48bfc30142d984303ac33b553b61906603916b9e09016ce6764c1816ac3a0ded1c5f160f66c9fe3bfe5fb5220bc4455c4bb2b568608bfbe", "01068731c675aab1443fc937440b6e2db5cca4695db6da63ec2fb94a0aca567b38e555383a0246bd397451b0a902cc147aad143454a1f0c1166286feca2bfc12fb7c" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66"; + bn_t sig_s = "019999999999999999999999999999999999999999999999999999999999999999950e053936328c7855ffd6676d926e1e402fc4a1606e169fbefc595f4ba7605007"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "014ac0270fb277eb45c8d3d7e49149ed14087c80c91b140e4fb1820ca4ef48b27e4266fdc1ac803c76e5f636fa4d4625bbbdbcf05729fcff600abab20b8d1dbc16b9", "01a29aad56862835b6fff258a228f612a4926fa667587ad2f2ff3f5d63623870121195da66be32427f28a6493355590d7abf033594b2a1dc812a45e6c83c4c45e71b" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66"; + bn_t sig_s = "66666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81402"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01c4984462ae091f6a3f81776997038fc47dece0dfc9abdac89bed4f6dddce8a676e8246cc3d92d8528281ab0c4a7b4f2a4d02327cc59739bb8e8088f2ccbe15034a", "0132bafddbb84aa5b8fb02478ad4c1b4d893224f0357d7dcd4713230baa635637e6b90e5910c128e40a32e88f1707319339db2a1f9774eef4c3de95583b14fdaaf9f" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66"; + bn_t sig_s = "01b6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db68d82a2b033628ca12ffd36ed0d3bf206957c063c2bf183d7132f20aac7c797a51"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00fa43642508b0547ae7940582bc4baff4a88e26785ce904934b8246569fea474f1c5f91c2fa27a7a4e858089457399a41245ed61ca4c0a402c7ca89d9dc21e2f311", "0154f0d19aa4997cccb211a85f6717b54412179c2331e1f3998da55fb0bb6e2e53470332f6790f2ac036ded0352b2a33f14ea3685682aed64648012940759ccce2e7" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66"; + bn_t sig_s = "0eb10e5ab95f2f26a40700b1300fb8c3c8d5384ffbecf1fdb9e11e67cb7fd6a7f503e6e25ac09bb88b6c3983df764d4d72bc2920e233f0f7974a234a21b00bb447"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66", "011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "342dae751a63a3ca8189cf342b3b34eaaa2565e2c7e26121c1bfd5435447f1c3a56f87db98089d208c89e902bb50ed289995ee7ccf6d6e6b1cec4aaf832d3734"; + bn_t sig_s = "492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "01ffcbd2518ae59c5c357e7630cbd4c4cb1555da9a1d381d9ede3e402abcabb80e36ac16ffa82726f94af34218463bb8b8a7a21fdb3bba2ed9439e836c6f0e0b2cd5"; + sig_s = "492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66", "00e7c6d6958765c43ffba375a04bd382e426670abbb6a864bb97e85042e8d8c199d368118d66a10bd9bf3aaf46fec052f89ecac38f795d8d3dbf77416b89602e99af" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "342dae751a63a3ca8189cf342b3b34eaaa2565e2c7e26121c1bfd5435447f1c3a56f87db98089d208c89e902bb50ed289995ee7ccf6d6e6b1cec4aaf832d3734"; + bn_t sig_s = "492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "01ffcbd2518ae59c5c357e7630cbd4c4cb1555da9a1d381d9ede3e402abcabb80e36ac16ffa82726f94af34218463bb8b8a7a21fdb3bba2ed9439e836c6f0e0b2cd5"; + sig_s = "492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a", "009b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625" ); + { + // y-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "ec15522152bd082e8511a359e9c4fe2ec0e2e9971ad9368a35c3e9a6473c21d9597ef84d7217d38ffb090ebe308b6274deabc760ffd060d19d17e52cceaefd8a6a"; + bn_t sig_s = "0134cf6ed48b9873bf81ca9673aa8b0c06538fa999b59b73f7176339662f399278f3e9c70848c6e8f3ec639c287d21032a285310dfc5e570e861d7986b48139d9c5a"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "44a45dbf0c4d34cd9b7a612e8afcf36cf3ca269d64dc0d84b6f406b7c6781a02e24d5ebcb7d3595ae5a3c9f3a3fe18fba6526581deed81e4d74a1c77a85635a394"; + sig_s = "01e15d5a81aa0fbbb886830939e43fdec62cc3b64819e384663a51a1f193f0e16afdba98e1690f8ebb978a5684bd41e4dba7a74f21f71caab59d88afd0ef20946985"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "01acf1333a1d8860847e0b0f93b7822ad6c380d2aef10d2036294631a3cea154c9d06e980d0586aeb9f72766f50c35f707dedac887c88ce76eaf6b57a628af4e2648"; + sig_s = "0168d686e958d31315313548734de94e45e47e836ac925b83ad0bfd919a87bcc09b3defcefd0c2f10b8ca4d705258f34eed5007ed72fac4c2cccf322d7f6f39fdb51"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a", "01ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da" ); + { + // y-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "a80553a081456c72e432aa6cf46a24571d9978e3af4f88ec8ffb2d5ee804b4128bc124ec1154e1f628f27f0fc3cdbeec39cc5baffb04ab112af1283865ec577908"; + bn_t sig_s = "7d31a19909b1b7a2314dcc5eb82388ef2e4e8acf0dc6de6d40cc3382c7d8b00227eb929b3b7d522438b0c4a652d1ef8eba9e4d4e91e5c7b3d7947fbc9640af1083"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "016ed83a23e3b31ee7591ad101167699e7f8d1c448ac2453ef29ac02928028b2d9119fa12ff5ce27f582642e7ea8fd4e991b5266caa9fd70079f5a23c06be1153f97"; + sig_s = "bca1632542b3ef53951dc45e49c263ed3d09e2afa27a3bdc9f42083056bb3d65b8d4e95507a4f054a3abacf6f6f99234d86b698dd18c5d5bd3e9f86ac1b018a4e5"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "01eedb8deeb89366c66f53730afbce113ad37152691766d3e267c45d7ccd7430ddaa7ee5c870153776fce1deed2b7cb11fb06abf02d6f18c01e0b832bb97d7bb157d"; + sig_s = "d9256266e952989dd515a8c7540049f9f8d66451b4580dedc736f6777e830216cb4c7bd9af029d4046f3ea747d5d104cad16f20e2e65fa15c7feea9c35b9a380af"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "02fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b", "01993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5" ); + { + // x-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "014dda0dcac3d018a298b7d6d76e3c16a0ce01088f126f413c113ee2eafd69baa0c476c84ca0ffa9cb7b28008b5ea117aabf71e5c147ae46a474303a6c5e967c7f01"; + bn_t sig_s = "01696a0251cc9c50b9ca9aed6786ca4f55d5cf866b0300eef84b3edec1c236890e482b942dc0e817fa23258da17e1d5f77d367f0ed1d5b25cdc483fae5863790e6e8"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "4c5b2e5935dc9303c76b6b4cb8f30739b56fa4880f8fa58b5d4573cbd29d4cfa76239efd7d45fff8040b48d93867b8c81862f029c967f46667455ba715f1a5d15a"; + sig_s = "0168672a6fd60214647864a7d2715ce4890a1973c2fba1c02c3c4f3fb86e4eea946c46c09005aa5280f01c9be720ba37abd55c445cc1d9f5c3797fa27246d77e1c1c"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "016f2681a03e8d6cdefe9e3619397c6c951dfb42b04258f0222c36f810933fe04163a2c4cde88ce9c716b105e4d76a4cf8e84a1b0ade010b9943383b58ca4b03be98"; + sig_s = "50fa6b6be2fe3e66627a5091839753566ee40892af040d3840612b83323a0f0350ad22bc9611d41f8d43ed7d26be53220474feb8d34d01c7a51b17f41edbef5694"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca63331", "01b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6" ); + { + // x-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "0f90341f535c12fc02021c81ebe2f9de8ca33bfe264c734bc946cfd82bccc7200a8b85cc0e3d31d84a002a962bee609813b486bfada692fd9385daa0af9a6d72d5"; + bn_t sig_s = "01b46889a27e6538ca39d58d1e1a097c8f1b96a3b947dfe28afeb9dfe707370478fa0bea1217e1030a5075582d90e709d752d8a30be0c26ac2b5f429360f5062e82f"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "8a51929349b7d9848df149e203a50d2c35a8a3ab12bfdebdf6fa6c45a05d75112c5d8f7cb60d615ee38eb4b98de1b8becf7e372653338e5db3c227db9edff36d79"; + sig_s = "01de6b675b626f7008bc0334a59bc163e64eaab23d75dc9adca3258bba2dea3cb4e21d062bc835a65f3182d86f1e0b5d3853443e362063d313afb3cabfe0035dd18d"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "019677f00b7d3182b2cd2ea615c6819864e9a37451564190a81d63947a6335059188d4b9a8cf9841500bf3eb49c09c4c4d330a4f32938ef7c7dd1cd4b80b76dcf50d"; + sig_s = "018237771c8f4c00d420bc264078822ef2fba89f8dd65e0f8824cd89318a16c30611cecb0f24f142aa4c51c074dac7422d8cd78dd0ac40856940f81d916a55883784"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd491349", "08bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff" ); + { + // y-coordinate of the public key has many trailing 1's + auto m = "4d657373616765"_hex; + bn_t sig_r = "ebad623d0aee1d3f17a782297155018f848c38398211b0969ca0cc96771417d44e2894e9aacd44516c3188f7278ca6e5a13980ca943b8cbc8b75a5760b1b40de9a"; + bn_t sig_s = "a4dfa438c8b53c33d5600aae164681b791f4e3a49cf82ef253ef2b40f2c361fbb42211cdafc5315f93937b70615e17a0b81960a894e466a17c9322fed55c7d55b4"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "13c33ad4251e52d9e6b12322a1794f4351b135c722b093dda22a1dcc885eaf3473e09af4307fc294db2d3f02649ad325898223be200c65a076d6fec1c4d054b0c8"; + sig_s = "9d78be212bd11cb5d36374a9743c6772196fb7d029462cdae5517a8ac52b42caabc5452de0a4904f05d5db20279e5663ad7cfe8f04efe6485a632458dd4ae1cb7c"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "019c5d65ec2257ece62f146d9c61661789151ccce3a045c60a03f2034eec2e84eb54414825529b9e1bc6c19581e3ab827166ff4e4722bc10447bbff9a5758839b826"; + sig_s = "0191e1bb04a72eac5dec7c021bae1fc37d9bc81e0acdd09ae63464009a01751394a8593084f634c191045a632073aae56eb65d88ac1ac6fb309dcbcf76f22ae652c9"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = sha3_512( m ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } // End of Google's Wycheproof tests ecdsa_secp521r1_sha3_512_test + + // Test vectors from Google's Wycheproof RSA signature verification tests. + // Generated from: 'ecdsa_secp521r1_sha512_p1363_test.json' + // URL: 'https://raw.githubusercontent.com/google/wycheproof/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_secp521r1_sha512_p1363_test.json' + // Note: + // Test vectors with flag(s) 'BER', 'BerEncodedSignature', 'SignatureSize', 'MissingZero', 'InvalidEncoding' were not included. + // All test(s) with BER/DER decoding related errors were not included because they're not part of this test scope. + // + // Algorithm: ECDSA + // GeneratorVersion: 0.9rc5 + // Header: Test vectors of type EcdsaVerify are meant for the verification of IEEE P1363 encoded ECDSA signatures. + // Notes: ArithmeticError - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.', 'cves': ['CVE-2017-18146']} + // EdgeCasePublicKey - {'bugType': 'EDGE_CASE', 'description': 'The test vector uses a special case public key. '} + // EdgeCaseShamirMultiplication - {'bugType': 'EDGE_CASE', 'description': "Shamir proposed a fast method for computing the sum of two scalar multiplications efficiently. This test vector has been constructed so that an intermediate result is the point at infinity if Shamir's method is used."} + // IntegerOverflow - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified, so that the original value is restored if the implementation ignores the most significant bits.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // InvalidSignature - {'bugType': 'AUTH_BYPASS', 'description': 'The signature contains special case values such as r=0 and s=0. Buggy implementations may accept such values, if the implementation does not check boundaries and computes s^(-1) == 0.', 'effect': 'Accepting such signatures can have the effect that an adversary can forge signatures without even knowning the message to sign.', 'cves': ['CVE-2022-21449', 'CVE-2021-43572', 'CVE-2022-24884']} + // ModifiedInteger - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. The goal is to check for arithmetic errors.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // ModularInverse - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where computing the modular inverse of s hits an edge case.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['CVE-2019-0865']} + // PointDuplication - {'bugType': 'EDGE_CASE', 'description': 'Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.', 'cves': ['2020-12607', 'CVE-2015-2730']} + // RangeCheck - {'bugType': 'CAN_OF_WORMS', 'description': 'The test vector contains an r and s that has been modified. By adding or subtracting the order of the group (or other values) the test vector checks whether signature verification verifies the range of r and s.', 'effect': 'Without further analysis it is unclear if the modification can be used to forge signatures.'} + // SignatureSize - {'bugType': 'LEGACY', 'description': 'This test vector contains valid values for r and s. But the values are encoded using a smaller number of bytes. The size of an IEEE P1363 encoded signature should always be twice the number of bytes of the size of the order. Some libraries accept signatures with less bytes. To our knowledge no standard (i.e., IEEE P1363 or RFC 7515) requires any explicit checks of the signature size during signature verification.'} + // SmallRandS - {'bugType': 'EDGE_CASE', 'description': 'The test vectors contains a signature where both r and s are small integers. Some libraries cannot verify such signatures.', 'effect': 'While the signature in this test vector is constructed and similar cases are unlikely to occur, it is important to determine if the underlying arithmetic error can be used to forge signatures.', 'cves': ['2020-13895']} + // SpecialCaseHash - {'bugType': 'EDGE_CASE', 'description': 'The test vector contains a signature where the hash of the message is a special case, e.g., contains a long run of 0 or 1 bits.'} + // ValidSignature - {'bugType': 'BASIC', 'description': 'The test vector contains a valid signature that was generated pseudorandomly. Such signatures should not fail to verify unless some of the parameters (e.g. curve or hash function) are not supported.'} + { + auto pubkey = curve.make_point( "5c6457ec088d532f482093965ae53ccd07e556ed59e2af945cd8c7a95c1c644f8a56a8a8a3cd77392ddd861e8a924dac99c69069093bd52a52fa6c56004a074508", "7878d6d42e4b4dd1e9c0696cb3e19f63033c3db4e60d473259b3ebe079aaf0a986ee6177f8217a78c68b813f7e149a4e56fd9562c07fed3d895942d7d101cb83f6" ); + { + // signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "004e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645"; + bn_t sig_s = "01d74a2f6d95be8d4cb64f02d16d6b785a1246b4ebd206dc596818bb953253245f5a27a24a1aae1e218fdccd8cd7d4990b666d4bf4902b84fdad123f941fe906d948"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + n + m = "313233343030"_hex; + sig_r = "024e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbe97b3367122fa4a20584c271233f3ec3b7f7b31b0faa4d340b92a6b0d5cd17ea4e"; + sig_s = "0028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 256 * n + m = "313233343030"_hex; + sig_r = "02004e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ff640b034634da00b7719d0f7b8d151daee2371c709e0bcf89b1846ee184874438f45"; + sig_s = "000028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by n - r + m = "313233343030"_hex; + sig_r = "01b1bddc11bc17347621c4ecc6003d861a7d07d3854f08e4421bc241c8b538a0040b27d9a7f54eba8ad17ad5916eaed487e87fb8786168eb5b51e438bd675558ddc4"; + sig_s = "0028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1"; + r = false; // result = invalid - flags: ['ModifiedInteger'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**521 + m = "313233343030"_hex; + sig_r = "024e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645"; + sig_s = "0028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced r by r + 2**585 + m = "313233343030"_hex; + sig_r = "0200000000000000004e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645"; + sig_s = "00000000000000000028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + n + m = "313233343030"_hex; + sig_r = "0228b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba09a7b6ac4ecd0410b4722ca75ba197a403a0a1f9ee0e7b391b0649fda1d3969eeca"; + sig_s = "0028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 256 * n + m = "313233343030"_hex; + sig_r = "020028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdb9af1b06bc12840a7e05b6effbd682c166aa584338db1fa5ef8bd18e7418fe09593c1"; + sig_s = "000028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1"; + r = false; // result = invalid - flags: ['RangeCheck'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**521 + m = "313233343030"_hex; + sig_r = "0228b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1"; + sig_s = "0028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // replaced s by s + 2**585 + m = "313233343030"_hex; + sig_r = "02000000000000000028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1"; + sig_s = "00000000000000000028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1"; + r = false; // result = invalid - flags: ['IntegerOverflow'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=0 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n - 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=n + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=0 and s=p + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=0 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + sig_s = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=0 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n - 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=n + 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + sig_s = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n and s=p + 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + sig_s = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=0 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + sig_s = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n - 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + sig_s = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=0 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + sig_s = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=n + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + sig_s = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=0 + m = "313233343030"_hex; + sig_r = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=1 + m = "313233343030"_hex; + sig_r = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + m = "313233343030"_hex; + sig_r = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n - 1 + m = "313233343030"_hex; + sig_r = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=n + 1 + m = "313233343030"_hex; + sig_r = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + m = "313233343030"_hex; + sig_r = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + sig_s = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p and s=p + 1 + m = "313233343030"_hex; + sig_r = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + sig_s = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=0 + m = "313233343030"_hex; + sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=1 + m = "313233343030"_hex; + sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + m = "313233343030"_hex; + sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n - 1 + m = "313233343030"_hex; + sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=n + 1 + m = "313233343030"_hex; + sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + m = "313233343030"_hex; + sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Signature with special case values r=p + 1 and s=p + 1 + m = "313233343030"_hex; + sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + sig_s = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['InvalidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // Edge case for Shamir multiplication + m = "39353032"_hex; + sig_r = "00b4b10646a668c385e1c4da613eb6592c0976fc4df843fc446f20673be5ac18c7d8608a943f019d96216254b09de5f20f3159402ced88ef805a4154f780e093e044"; + sig_s = "0065cd4e7f2d8b752c35a62fc11a4ab745a91ca80698a226b41f156fb764b79f4d76548140eb94d2c477c0a9be3e1d4d1acbf9cf449701c10bd47c2e3698b3287934"; + r = true; // result = valid - flags: ['EdgeCaseShamirMultiplication'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33393439313934313732"_hex; + sig_r = "01209e6f7b6f2f764261766d4106c3e4a43ac615f645f3ef5c7139651e86e4a177f9c2ab68027afbc6784ccb78d05c258a8b9b18fb1c0f28be4d024da90738fbd374"; + sig_s = "01ade5d2cb6bf79d80583aeb11ac3254fc151fa363305508a0f121457d00911f8f5ef6d4ec27460d26f3b56f4447f434ff9abe6a91e5055e7fe7707345e562983d64"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35333637363431383737"_hex; + sig_r = "01c0832c973a455cac48a4439659aa21146036c52ec1514121c66714348a1c0e2c7099a2466d9acb49325a0cb509e5dff2efbcd90369d3027cbb7dca58a134278d05"; + sig_s = "00a426c063ab5cc6af20dd1ba8a519fac910183561598e67c0929e25f9c3aaeb245c5647fba21e30c103304dc6f49e6dec68a7833533e4e5448240bde023fe201eb9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35363731343831303935"_hex; + sig_r = "000d01cde64dda4dbcef1a9b924779598217b97eb688d9b4a4fd20d1b81ff0bb870abff1b0db6dfc3762f27c3954f230a7933d9ea397a972caac5ed2183ec72716c7"; + sig_s = "01c6530fb6b913005f81e156be89b3847701829fbb310d8a4c761212c6d2f8750174f2bf81c238fdde4370fa87de320f57dbed96691af45cb99f3daa865edcdda59e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131323037313732393039"_hex; + sig_r = "00c009c74ec707252325d78f4e7f14be28f56272be17c0c18c90ad4c07322cef4eea444c8feabf41a213e3e846f8ac8bb7750d49143069cd01877d530bb981f1a85b"; + sig_s = "001f1c27ef97f434a8c2ff315dd39d909709775bb3c7588243bdfd8f7c866c49b3369719d5b74a47924bbce57301675e2baadcec438e07e6d532aba664253ab09550"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131323938303334323336"_hex; + sig_r = "01d3b17a34b19d134773988c434a9fb7f22a57dfb4c4bcca031e213e1b9a56db0ecb2f3c54cf9b1b6e5981369652de37337a7a7d7ddb54d67b067bbce01fd7fd2808"; + sig_s = "00c90317dfa061122557eb3899939924a8ea3cdd886e0f2e5f2c384b65b1a40de5f00fd9fce889fc313a6a9d5f0a9cd3a7b89b7ba8e97807031f3d1e3f9c103f0a10"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39383736303239363833"_hex; + sig_r = "00cdca5299e788600a3ca5938d4a4c5f42b5eea3cefc990e67af95a4449aac0ab50e8fc4778efa497223cdca07c0e5a5920110f3a87afaaf265beadbb91c00d13464"; + sig_s = "01a92b9a5570b42f91ebc3d8ba272db9241468154783548d3fcfb6ef46c9e037bb6217af0a31ef952c27604629ad5775e7695c63efa138cee8326a51c1b04d0c658f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3230323034323936353139"_hex; + sig_r = "01660b0ed15d5f63044cb189e1a405bcb591c37217d0e000008614b152665d5bb9353a3826854a8bc6ebed423b15680e4340a00701b17bae24bd399bcff7e0438bfb"; + sig_s = "01c47f2f5c6143d2eef063757114aaeb27827b6a8f675d1825dac7f4548cbf78a37eb9621a29e9b14cf61fc6ae49e7e6e15350a4b90a4a897ff69b0c59b69508ebc7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343531363639313830"_hex; + sig_r = "00364684856c7c02bfb2ad2de603d10883ca93c122d4cebef276467a9b7620fb530e4d05d07c15ab948b9ce7682561307913b64ea6896ece1095dc64369f1a9d5c0d"; + sig_s = "009e6db2ff96d9d71150440fd44992656ca118fcaf6bd04499314e8ba61a55a8790aac023ddb68600fbd7ed4cd4decb176e8bd7822ea31d75adcbdaccafcf510c26c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303933363835393531"_hex; + sig_r = "01a317e49014f1bf3afc09cc048531010e2144b662cac657e51b32bb432d274a730b535fb2de66fa8ddd26faa3f46e004389d25517c56e7d8a1d39563b0e8c9c215b"; + sig_s = "01ad2e1212e1680b660a1c07f54addff575c8c8298e26a14c516f517fb5f966a2b383aa46a483fdbfa72711d60c0f67a2c03d63d2626ffe271e0ce353a4d4b09bd5e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36323139353630323031"_hex; + sig_r = "01c09b29fc4da04e9b86097bd6d6806aa969ceb37ce52eeac5e9518d27541c3f30c00f113d9dd3b007dae6f381896d43fc6ddfb3fa256a36529b054e416ed6380599"; + sig_s = "0113e5622cb1e4c4bb0842f3d396d7e660241116e94e8120a602e3d2952701b1a11415a3d8c503adced160450fd13157ad147d2d65d77449458659350e20a545602e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35363832343734333033"_hex; + sig_r = "0078f4a2968460ea8f64a938b3a97c914eb0ccfa94eb08636efee9d5ad8668ce1c9099573abd146df9e7b2ccaaa1a25de903f85962849356a872e88e545babc28974"; + sig_s = "00f2729e9593c9fcdf5971b21e367ffdc87aa7520393527c6f68ab512b88b839003c1c9952b04f2dc74010a31071ee20a9fb1c7e1187d04de71b3f4327df128ccd43"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33373336353331373836"_hex; + sig_r = "019faed147a76b65779d0989e1300802844c9ba09f338c5e31a24d9ebf8f0b0b4c21f59d369ac10e315fa2b7605b0f17a9c07cf6ce4c83838e58333a3390142d79d0"; + sig_s = "005f4de71fdaced1e8da86efd47ecbdac6a6ffc6d69df71da7ceb5596475cdfecea3d00f074d2de89e0fcc05e3231d531f0d38f2b7c6fe4ecf67a0cdddc21d0867b8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34373935393033373932"_hex; + sig_r = "00d0b144350a2128f042bc1a27f6c021dad1ec031be8f1d8304797f9ddcb742974aae209f014980174b9d4e434e3f53247889d2da4b767593179cb4eda47e7996430"; + sig_s = "0184d3416dee35ba8807703a91ac927096c10959a05cbffd8103a93a9f20a11537bed7a645f32295e4abce493579caa4e2242060cc4d58b2414870e98b9336795787"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39333939363131303037"_hex; + sig_r = "0005257a0f45ee2ae5cc30283d23c47c96f6deaa3ac1473e8e8a40eaf61bc4b0ef8bd18d11983f257ec4b1d8d04e76a122b5bbe1d31065159072c58fd9bc3e983768"; + sig_s = "0122dba50d0eb71bdbf092a94a7ea280412906e1f849e91dbd5d8158e3fc6cd12e20461b77653e3df2e45b86883f81071b33651ae1b84cc8e7c365ab8d6a36d1cfa6"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303837343931313835"_hex; + sig_r = "014f624af9d8096fe7a290651d23ab260da64e44b886fef4f3881d0d984d3b387fddcf65b1fa1dbb239028fbab4a1de6ad150cc8a4e4db0a971bb8bcf01c4728ff98"; + sig_s = "0105e3b55db0141c06d9854096cc0f73415dd2b85a331da50cfea3bbf648bbf8651f61f2cd09386b62fbb8ce67248683c260894d9ed54d6667ae02978e38ab99320a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323336363738353030"_hex; + sig_r = "002c952d7e61e1097cd7f709e62ec486879b380b63791c146b545c064e65b3060250d00af279cf15eade67384b28594db542845fcc6574ef5d8d5bb8a162e0350a00"; + sig_s = "0135ac6d1cc05b095fbae28b652fe5386b8689e21a14990236d3ada7ceeb0c12a4f774bff7b81c8d07572b0c7985364c5d31f33271f0ac3a2afb88b46bfeefbaeaa8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343438393937373033"_hex; + sig_r = "017919eff78225e1937a921f98f5d153cbffa03929819f228ee013f8e59549b04b9867006a8df25a93a6a25dd1d3f540239a8ed14047ea00811da9305ec515ad000d"; + sig_s = "011fb873bdae1757801e575c5df62cf82a1881af3cd6ed17dc50edbe6c5fd0f4d31766670b2aa572a9e6547b36142afa8464d0be4bf41930629dc04c85e01b2ee8e2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35373134363332383037"_hex; + sig_r = "006ac9b370067b13ac2b57f35d6d9b1faa93b9b068ef5ddf8bde3a54024810aa2226560065b0cb7501df96b4756ce1e1fa607f86a942367894a1f7728bd5f22cf177"; + sig_s = "008b47a9e1370c9f5bf4677d554c00e9ac3ea7cdfc78836ac53ac710b7f3bff8c2297780c69a9fddb80e03a605e5e48a52e52fd35f41668cd9064886366fda206086"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323236343837343932"_hex; + sig_r = "00c4bcfff265cd32442220976ffc7e4ec09181d694696eb89af0cb2d5a2dfc3876deb3c6adea168965200c355c3bff5e47ab17ecc44c8434333280796d3a183449ea"; + sig_s = "0062debe91550f8a760eaea309f48483c65a52c7e88a83867c31730cbc6b0a64d4c564bde67e6539af787ecfd18016cde46ddf91740f58f6ea6ec80b173fd1c47ad0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35333533343439343739"_hex; + sig_r = "0174d744ddc631fcf8202fca0ab10f6d96d3f7552bb2a9ae5ac573634133f61c59a120fedbc39cfb521ab0cd572afbd5147981090d1dcbfe902e03f0c0579967b581"; + sig_s = "012f59ca927c4ae331d2f667fcd9ec01b0b5514e2ab5da0561ea614431dc1fcb761c351cd1211092720ebb7074a5128f8019b7c18e048d5ed3573ed61686e9713f72"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34373837333033383830"_hex; + sig_r = "019a513cfaf871287340d8a51d2f4348ab4096c5fe244b22add38ce433e3178e8ff5b2df0fe74a1ba40fe8341f734c71f9a1177b41035777e2da6b082e0b566690de"; + sig_s = "00d0c43eb33a817c3aab30281c593c74517ee84e958b114395ce0b31fcf30bb8f5dfe60dbc7f6f14698977d8e0516a9274a5bd71847057e006fa315fae6922eaaa55"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323332313935383233"_hex; + sig_r = "013204800efcb40ab09ae4137325a3e8c468edae91880a51616ba61f3ef1f72fd89feb956bfb39818d827468bb4475110a04779fd6bb3def25c61c4ba60889ed0ff7"; + sig_s = "00704b7394687698c8841f4875d40e5b3c914f154ccb2b54466ae163ed3410f20d0a07ac5f90c0c31271ec8a524ca2dae4b8bc4f6e1ece173ea907890693c5f2190c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130373339333931393137"_hex; + sig_r = "0180241cd2e6163158a39599890dabee99c2c86b88accd2b04b5a72874fbdfbde0d18143c4d78e0da1abf3796b238738840d60e34775a8ff810d58a9bb3559a3997c"; + sig_s = "00bc396c2ef28b244fb8e004bf5361572ba1fef6fbe081ed1dedba4d9af78deee126599f75a0a9d0f1b1618ded7a0c5e672e40917fdd30582460da3aeb1e9c4477d7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31383831303237333135"_hex; + sig_r = "01485fc03fcd629fd4c564775ab6969bbc696b5b0f38141b69f86e052e7fe8849a64af2dd37a2adf64672f20bd6f97cd32f0efea51aa22064c5f10a3911177e1979d"; + sig_s = "0180fab473ff9d726db6d266541a0bddff8610e4026d26b6c9abf972eaef477d50670bdd3067c9d711a8346e16869147751e89b4ea75bb00ece71300cc3b80cf8899"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36303631363933393037"_hex; + sig_r = "01bea49b150a27026fdf848297b0491019f76abf90f3e6d782e3d3fa6caddb81b7ef58b27f1b2b3f7898889b4e2b6cdda7b5636177a27eb9a67b2055b6f21d262c26"; + sig_s = "00dffb13c2d5f746c8573aa444afc8baf8bf881cc4d0fca8169f6cb304f400eb3932666cd3758c437c9cad79abfd89c72a788505763aabdfabf8903ad4a70d9ec9f7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38383935323237303934"_hex; + sig_r = "01d56bf6f3758f627f470706d1d28c28fbfcad6dc30465cb285a274fc057f791de73ac30baccde044473fa9e3dce6d395eadf98d1f97259bd851a1eb6f3d31d2d756"; + sig_s = "0033704b4ad37300a96682569f4f7fea3e14d6e1f65864663f39aa67f40b5c949f198d5de9f2ac2369bbb9111c89b393199537c6c08ed7c02709c733ef7660113d53"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353830323334303934"_hex; + sig_r = "01554035ba84b051d50901c622b98be4de0123a02928dffa7eb13b0403fd5e255f226505e15694956a66a878ff581173d123d1b24eaa85c5fe46d8973a55040ff405"; + sig_s = "01b016dd6b5176ad8347eb9802dd7727e06a29db33cc946f809a42f9193040692b0f82ebbd04eff9f099b7f75f8e45e74ac00a51a9cd4f2cbf5f03f4d2bee99c24eb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33393635393931353132"_hex; + sig_r = "00293e8d6775f3c14183aecc22f608e9013d7b15dad167bb38a1dfef6b373619f1ba2751d77b43f643f68643cfdb5c04a8ed858bfcf3858a681ae93bfc7cd7e31438"; + sig_s = "002c7d96db7dbbe347bab9f6f7b88f48cb32ab963248737d2c901b90d64591cbdb0f0ca7a14557f8a50fd80d402f929dad141141f1f0c85d9414b32d1fd4d796e6e7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323838373332313938"_hex; + sig_r = "00b16a9b3aceece85908125f96f6cb6b1afd0ef04171936b3766f8e43beb340d382084b33439f775a29a83945da8efc4190db1343e87d8c0ffb97aeb3be159d90f59"; + sig_s = "00e5c2bbd98e449bd0bb4f75a07f1a88dd63c0602a7660f4acd33937c4913a9c16ba44dc5808892ec88a4255109a7bc5b221c07e6a278888a9712fc2a25b374427e3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32323330383837333139"_hex; + sig_r = "003b47a8ed52f5b0566365313520bc0b6e4e4efb3ea4176ed7a352c4b2f8bffbdb0148ff44f3f13d9e5e31b1cdeae097574aad8bf393c54a5c842e749ee87a74c6b0"; + sig_s = "01d3f484e9e224bda9c8f10fbb74bbb62d7a18245707f4eb52f17dde793892c16e4bdf504960fba55da487f542d412b1b833f6f46336118618fcff69469c83963777"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313239303536393337"_hex; + sig_r = "0128b8988bfe9287f82ac97be507a544b823e85cc2813b6929e63699cff85a40283076028e7bf8d24330f89adb96bf24a4e183a898e679b36768909574e7d4733d61"; + sig_s = "00c18aae44e6801fc2e3d9c7a20ff9d42b46e4a31ca37772f8c46ce65219b195ca23717f816e1fed51e5b6f9a0ca12c3cf81ae7fc9cc6946a88330b2011ddd160930"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373438363536343338"_hex; + sig_r = "015edf1fa95b17159f762d68c1736101309e80fe5b2c4415609a5ac0837fe5901f3c2d3d826a43b1f8cd1babf494ffd96cca1267950188a924d4e1bf7f68189f27d3"; + sig_s = "002e8697efbbf53adb7cb1b904718fc71eb2561f331c209c50848b5bc50bef77c5c3487d285bfaa3caa14025cbb71bdbaea6911e3610335641d2799c3fd75019f716"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37353833353032363034"_hex; + sig_r = "0161f64bbe93fdc0e61134cfd4c453ab740233b436179351aa68a3e38a83400d86ff464d7ceb7a51f541b86eb2f12e32a879b3a29bcb92e08cd50e74f86a0ed52ae9"; + sig_s = "008f6fef49ba12ced6696f4f6d24e6c68057a84496d42eede630199e9bd06d91363542a9776bfcd6d77fbae422e80fe466edd2c2c5e1f5cc79bedd1a7becc1a12660"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333237373534323739"_hex; + sig_r = "013a6faccc1c06cb5dadb2cf083cb94a7181fd5cbf3954fdc430c2691248fcfcd13767e32491f00269b549cae93777ced0f7b069440726adde7605d4038d7b5ea4cc"; + sig_s = "007622c9065f4c49a6f8649073dfc6a827b897b6984176b1a09d151b9733a68f6da746c47427cdeb3be075da4a351ab78dd5e472cd98d1586edd6ff2a11c6c169fbb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373735353038353834"_hex; + sig_r = "01899609e7f7cd2ef14bfbb1cb9ba9283ae11a9346a34bef23b1c249da2e76a7708e0f2f97f819e4e25b0d5227eeb85aa593c3fae9398a7020f61ae1606945d13841"; + sig_s = "01b8d5e9c4f030295447106d2b5c80cc2e7d4e36b458a90a08f505df62d2234e59d08187385ba5501049b34e12ec92f7839a18361a52a9a0b6f6a664b118680b53d7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3137393832363438333832"_hex; + sig_r = "01ddc69d1508021eb560db39f3add8a28dd7fbce417e5fa1f4f626705caaad72b634868d01dfc474e926c97927c56ac51f9bdcfd0e7627be35cc300a0cdc083b00d4"; + sig_s = "006e862caf9f2df11b0a46104e78865fbbabe30bfac0b1fe7f99badc11746a288c1ff27f6fa2aaba6441bab0372af906eef083ff03ba466b896c9344cd396dd46dbd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333936373737333635"_hex; + sig_r = "0117fe2c21f282c7e4a8415e9c53c254514eeeb0adadc771adbc6d21a09add4f17ea0c597469488238be795f2e187fa016d590535b4ff10c62d2246aa17bb013f9ee"; + sig_s = "003c9f1590ce7a68fc84c617f478188e71aefe8c74c4b9979b8c9196bcc262205aecce5fd2bb80c360d3e20da20e36c5ab70d810d4ba97d13858199d3a1c9c140c63"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35393938313035383031"_hex; + sig_r = "00be6b47254a3cf93e2e276adfb072256404744070d6dec83ef34e3e6c119206422bb275e61fc47053ef7b2af9e33aca8f8b2e4938057070eb6ebbcf82fabb44a5fe"; + sig_s = "01061ef80935ff6d0e9f87f3537b639945acf50c5d97d30b4b9c347e3f5f5ec02b15a376ae754d64b2efaa811b3d12a0fff0bc689022025dd2f69f2f4b40dda8687a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3136363737383237303537"_hex; + sig_r = "0130b6fd7dec5cb6f90a8b54ce7b58c61b013d0aed7c4a26639de80aeac3d9e3388e9f87e1e6419d3f0339af324e1421b5d130317ffd9d8be36500a84bb41d026cea"; + sig_s = "0176b460a3eae01d8aa8ccffb0d6cf4d1595aa697c65510a1197b97343c1a6234552ce9d6d318c5f20f48bec0dc311dd62eb40058f3cb22fa958edaf9ddded191a08"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "323036323134333632"_hex; + sig_r = "00a87de42d827ae1f55d6fab3277c7a9fdfac3af22fe47e52bfee34fa1ee3e765095fff20175becbdc94b4a5ad3a149ea7c1bebf4d45370e6b4404a0437d8fae264f"; + sig_s = "01a3c1c5186d8aa491b4623f5765a388930f37bb8f3e1c0db508983585b9090b3aaf22bb846e0fb6d915b5811ac55e4d6cb08f605cb84deb55ab7fba2dde8736b1c4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36383432343936303435"_hex; + sig_r = "010e46055d9aa087f1c4b6056319cbf17a0694fe073266a3f30363030e345a4bd461acbd99d1261fc05ef3c9a1c37afba6e21c2d513ea3d4709de5586810d7d29ec6"; + sig_s = "00d0c95c7e97a94efb44aa717cd6ebe82de0644e32676d197351f128ee8d2b223ab476d3e66014ecc003081f7040c578b8984628d6ec80733f713e26b2c98cb4ede1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323639383937333231"_hex; + sig_r = "012c04d08a7a2d07403aba604ea85ec23a52b52786e7fce04170e867be6146eea75a7180f5d4f3b82a204a3c996811a1e61a3e76ed209c22428b35c51fe60f3bee1e"; + sig_s = "016f2feabc25733b0a460463b9933e6e4ae9f4124cd0ad3785c77755dbf0848ec1cfd2ab08b960b556870fa00388d23d9a9fa3112ac3e62a0f342d58fb1f0aa81748"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333837333234363932"_hex; + sig_r = "01ca9532c9daeb80d0dbc07a4138ba62a6bab8c88b9e1e2edf2675132eb97cfb26f4c395f3b9d1d1275694956b34c3ef72cd00bab86777465b9edba29a41b0114c62"; + sig_s = "0140eb6dddff253a7ff5b032d82fbd18e481a376fe242f6405b81b57165665c9bfe61e25cd3358245bdfb8de7632de72ed20cdacf384764096c8fe3a376563a348af"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34313138383837353336"_hex; + sig_r = "00d609e1f1cc1adf5889dc6deda441682e760be08932b31592fef3ada143fb4940e4ea75ae519e4fb0769c4fbd33a52b183a21d0bba1ffa3fe50fd11f75c6ac58ff6"; + sig_s = "012400cc4ddc24ddcd47a6d639a2abdef29a65d4fe9175f51b316f4bf918bc918879495c572f8e98364e2e1aa0d4d53ad29e803a4470d94dd06a982a1d041bf2b5dd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393838363036353435"_hex; + sig_r = "003775a7e61bdda9a3a990ba9fde98f9d81d4b03195547bbd0658e1059daa00da9270671b2fada1bbbf13982f87c9f3f26dda5cd4f24de63bceb5fd9390163c58d26"; + sig_s = "010a03e4ba08f9e2b6915a6c0b83156b00f59efc5417394c51ca7616b58cf91ab7166d8459eb4eeb0d57146ed6560e173faf354b4390817e0aafb38294df25992cbd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343739313135383435"_hex; + sig_r = "017ab00a30c88faeced3e4a10f9c63785bc29e9af4499466bd8880827cfa580b6171f4a20f36487f7b94592946bca4162faf65872af6bfb1919e6b026c14e51e2740"; + sig_s = "01927515f6489e9b7d9cbf61e103295857c8131320217e7a86d3f2fdcb350da5b42c2dbe173fcb025d14da239d7d610de8475914748573429c9590d3594f4fa3aab3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35303736383837333637"_hex; + sig_r = "003b2ba1509aea9d42d400400033952a022fe7e00c7ad65c39a2f76d41130aada99c3cdfb9cf44575a2163de29f097beb9bd3aef9334e6fd0813dde2a087f938c5f6"; + sig_s = "001afb56087dfd5cb4fff6679a114c340f3a59f6b3e1813373bf3ebe30cb5e8b285a5875d1b5a9120db80f70310201559f89bb1df147961d1ca4fcdb5e8e84cae082"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "393838353036393637"_hex; + sig_r = "010efb321a347625343f5126ed8545017d799eb103c75558922eabe44211e8fd834655dc2ec5bee9bb3e44350eb6885e0ab974730222e55f13ad27c066722fecaa25"; + sig_s = "00d62e3d7ff9215369aa7da818db302e49033875010b2f9b73d25ca5b9bf2c62ed756686230cd5f4a37c1fa881c97e623919fab827de5995ab456a1fd7ac7b85b1f8"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32373231333036313331"_hex; + sig_r = "002f778cd552f54da5f567f47e6979872ba130dc0890172bf3b3bb952f03c64bc8783abe9f056d60e1667780f5ea88f59ef33c735d540561a197d31fe34853a60a52"; + sig_s = "00bd2816f06372f2e3f2582d53e583e133a551aaec04ddc2fdb7b8131787e73e4295ac28a9604a2402ed5b272cc03be57dd4a7df84d9ee24cb0c2bf124ed927defee"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323034313031363535"_hex; + sig_r = "012a459fffea70d3bfc13e9ea0abb10aae3910df604997cb5e4bb0548abd852abac6b9a32418c3b5ed4e7951ae88eecc0a2f1065caf24c6a814674e95682d9b493f2"; + sig_s = "00e2abd05c585e0c213a219a7e7d38b810d252ffea67650d4d1994a41c2ca325bb964920c6c2545381c45ca3e1eca05e00514b366cb0e1e49b8c236d383b260b9cbd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33313530363830393530"_hex; + sig_r = "010f2653d94aa28bcbd667a5013f9b283d8487c44d093ee47660329398caa550ca9c9388c7aadeceacac1507e76590afb736adb3583f54f31ae25c9c717ec9f89b5e"; + sig_s = "00494448a7ffe4a4eed84b4602781ecef77a23fed116b1b791b8d2e4231b7ca2a7b6f06d132705932d446e61d344714ee24014fa5bb144a96572b3d48d038a55ad68"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373237343630313033"_hex; + sig_r = "00c2da48552c39d94f5a45427ae9dcd891b65cca33e624ad2532ffa333666b241d873336fab7bbd7b4c193db4d865cd50f0c1d8cb5c14cf3f089ad42dd43cfff634e"; + sig_s = "014f2070dcf860b96a45f2a6061e4ec2a6ad64d7d0e9fbdb25aa93b99941be280f5c70c0e32b6234df545bace7341af94c140c865d44fa8ea7ebe0fe53bda44645df"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3134353731343631323235"_hex; + sig_r = "009bc6e74549b48a1e7c181b179687fb27d6e9acac47ec34b1b8bd044d329320544e4e568e67d17f4cda2f0a3fe303d561a11fc0c981ed9be2fcc6d397a43ad49e10"; + sig_s = "00ff295e43fec5b68b00ce8044434bcd17af1ba04a74556353e258d017ba26bed67f458fad5dd8e7d2734d56f59928c2419441a9e8c0573db3586ca056951ca935e0"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34313739353136303930"_hex; + sig_r = "0020963638d0b058494254efce57778ac65e5f23491f7adfa72e4713b7c03946b543c014d9660d855246f308085eeee495cd831b7dbece47aea48e90433bd0fe8184"; + sig_s = "0161a4f4977fecae92d4f67e56f3338c7a9b820b5e05db1f28d05d71f7e5f36bc63f6edda4d3c1b2d73bb8a30c4d745b73e634ef574cf47656a372e3eb42cc038850"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35383932373133303534"_hex; + sig_r = "01bcc5858597ce8d4dc5ffa6be33f7d804f2f8ef59c5db9301785e0cceb7ed57462f455a465710c7414570c9a35a3100bd15fa40e3ec350d1f75406c2a25885e9d76"; + sig_s = "0043757d282fd1d44c253f9a05d8142c29a6d63c0a1f5508431bc9fb9b60a38b7f414e730e0d59b7b709706a67022e1922fe88b182a57443c58bd06a69ee7814bcab"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33383936313832323937"_hex; + sig_r = "01240120b97ea67bcbd0e412d87137a13e347a870a2249375fccf8c004da35e592620774160e7b82aed1f57997fb015a764d014d4be1f389e5499777054576e7bf00"; + sig_s = "019f157ec3a2410853274bc4d8e7565e9eaa5dc47d5e515abc86c22fa6dc215482df5c0e2b885f37baef3a6ae83daac930617a5fb37bb03ce40f06fa4ece26cbb11c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38323833333436373332"_hex; + sig_r = "01a7536d55876f8392a6eba18f075118c273015844eb3536c727c004c1bf23067d57e8fe31872f8bf839640e80e06aba3c0a365a268cabc2da96d84550a569f17f9c"; + sig_s = "00e840b6a7cba718d91103faa134c2f63763f3b6b91db7ecbd3b10f10171a875712cb9384325411beca9a3aa87aaae3902c282d2dedaa1cbddd40ccf0d29975df22a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33333636393734383931"_hex; + sig_r = "013f72be1c331214f45007ff72ce54afce1c910a90e4ff3d176620ff3ca976c2b62d0cdf5d1134290ee97440715531455dc29818828094d366f959e1adc7d7e98ea4"; + sig_s = "01e80ac38ba69f3e53116e5432fbdb3b1e7ea1b43e5f86d1c0e3d1c469442dbb406ffe524f0685f71e811d94a9efa9ed38ccd9213f983983035f2add0b8f2fa4ae23"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32313939313533323239"_hex; + sig_r = "01aceaa6d567ddb39ba52d297e60e4a814c9b476cab568c09d8ace878d846218dd2b5d2a2461f0d5a56c12f0bd803e3253dc5b387b94e86589cb1d0cb809c7071125"; + sig_s = "01b1fb021b10b593cf9e793cf22a88bde9a4b92f9e218094f270b093e8c6c95aced43d097bfa3354e6b98d195c599c2e6f13351c63c28967e08b7e497e120665c663"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35363030333136383232"_hex; + sig_r = "00f6ffb5dd786326041e74564b719d38924a28329868177c13463cff90c4b09d3d2dbc011281cc78aa0e5e8656123bc50605601a547bb4b1761f852a120ea46df9df"; + sig_s = "01a407fdd445614a16a5ebd4ba075c6c1d7564f3cfd477d6b2620abf18a5bf78311282ea45b9bff813f24c3c7854e6091c8055144f9592fbf2e456421a41c555d7a9"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "383639363531363935"_hex; + sig_r = "01a15af4d5ca3deadecd75ec1baec31c8d43fbc889466475e6c23106db4e63ab69003f56d819ddfc5a673c8289f9e6df806b07af57a2541af694e6489734c8eec837"; + sig_s = "0069c35433a3217fcd738a65b7da9e81cd81f04f0ef060050b9c843e9e808d8b8175f3adaefa105d215ea9a46bf415fe2ac180958fcdd878d54f8d19d23e11b76d1a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36353833393236333732"_hex; + sig_r = "00ba899f94841db6c33b850867c8906b436be3853640dbfc863197fa1e5a55ce25240f2be498b9bdcfc0a89dbdca192d8f84ca3c44e5e0ee6f83e7900e085e1bd481"; + sig_s = "0086e6d558de8d8f014a85cb4a5f6908627e7a1acd70581d9d9c7d14df44d437aa09e5a10a0b760e98d46731f2512ca1b0240c602b5f0a2030485e34de9c6cd08e7e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3133323035303135373235"_hex; + sig_r = "008eb5c92dbf5e00888b85e6bf6617017e97c04ae950dd731856b9dfb20e0c0e5c54284f411231fed1d071b321f78618d2a75c139663fb9db3435214cbac5a0dcb4f"; + sig_s = "01da0dd29d4728fe6331c8e2ade5045b1237664aed157db2a6cbdeaf5abea81324e28920a1c49c334b1226441f88e1a7f2c7e01d63e950d4378f08973db16b2e6161"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35303835333330373931"_hex; + sig_r = "0130779f943df098ddb5315cdca4b731c83472d589f4ba4d32c172faf6b3a9e4154c0517fcc5c432eb269b0152297f6df490ece59496bea8047e2f32d0b5f91e85ef"; + sig_s = "00c9eb0b56273114ce2e553341247da86b813bfd65f143a5562bb1c874ff970523836bcdf390dc196e67dd75cd28112ef74afd51b1fb35333be0505a012efebd4e22"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37383636383133313139"_hex; + sig_r = "00593f0132f7b5c282355978a2cba73fd3bd5ce3272066d4ad9bd8bd8b3e2be0990071b3509ea445dd155cf97e294e2b8d1355809d880e10700eeab0eb8ebbaa4f09"; + sig_s = "0107eb3d5ed75cbb9bcb9278f2266c14c57cf703cbd8f7c7de45c51f0f3baf1dff6bb92f1cbf89ba649677bcdca776fc57f587ce714e2e43e6cc523f0d0a286d38fb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303832353339343239"_hex; + sig_r = "016ded17fad10f945e3d953b4fd3b72898c370f15164bb7712673385c10bf3929bea293e08bfc30029a465138ad47abe604df807b31707fef55adf3e104920038e3b"; + sig_s = "00b76b212d74e4b6eb994d926e9e796975235fad90e339a21a329e6eed3fe96b6d3c0d5426e8464c4a9ed5cbe08eeb5e490f72e9e0406c0d76ad076b476d07c0144a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130303635393536363937"_hex; + sig_r = "01f8624ffa5a6aa8d9d04ed1c2272ea55f5271ca2cfc9aa6a3778a0b8a230f611e5d65af18d8251a0cc4ace663878c33205239ee7e8388cc0a040ea51515072e3f61"; + sig_s = "002c1e61197229f40e840ea37325f3bd87a6cd32d080bd61bbde4b072cf7a0c8a89d402cd9235c26f19a084ddceb1cc0bae4006251ccbe10de3954e85a8c5efaf6cc"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33303234313831363034"_hex; + sig_r = "012b01c6601ceca9e58e8abb85d1f6663df70cee761a756b77e45294f09ae609a6b76cfcd67f60e47a3494cb85511e33d92a8d297a1b89e9a9038c0c5b78c3a3d4ca"; + sig_s = "010ef5d2fab59bd42e2e92a2fca7a975b959dfb372519330defc8fa8954bfcfb397ba939edb6a944a2ce9f6fafbfcda6092cddf628801f6dd8cd40cad4d809d5c1bf"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37373637383532383734"_hex; + sig_r = "01c54a330b9dc47eb88dbf60c9ee49f2c7518c0a78baf642c74105fe283fa4c357ff22931ef42f92d16d6a0b806ef718539d21cad71955a530e21cab49a56f561673"; + sig_s = "01c2cc32c5a4d335c48d0cbb0407fb7e4729c57251afbf9534c5309b94e6aae13614a1f2514252f48cc7f143ee761782f8dcebf2fb490e08fdeaf570a7ed9d287da2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353434313939393734"_hex; + sig_r = "01467b4511b9d6601da3557b8ed432c14a80e5999847be136c756a88dd5134689b5ab70d0a2e8fd8d6141e2b143282f98afb93b7e17609522dd9e64c9e4a31c7c34f"; + sig_s = "00f50ee66a1dfbf86167ba5968d4ee3506a7cffe0f521c1bf830d0867241e345d319e77eeca45858bb3062acbf8d100bc6bfd3127d57a7e91a8199e05052b8ccf304"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35383433343830333931"_hex; + sig_r = "007af90f6227750f917d65b1c60200c755158bb783a479be6877c59ed89ff595fea3f3a4137591aab23826ed385bd6156277364b5d603ca272259083e6e9ab5db3f9"; + sig_s = "0070842eb62c894935b82da15ca611d9d754ef57859e0c912c0358d0820f4940cdf5360f116a7547a81bf65617f182e597eb1007e26c62838487ca021c3829a590db"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "373138383932363239"_hex; + sig_r = "00b0169e68062caa79f99ec0c72d83c4d0fc2a1c818665cfed1aba3e684392b9a95afb82ddd1de49e3fc3cb3889b4f5a86a7bdf944361db2cfa57021a7643fcfce95"; + sig_s = "0115ec784e042436892c6cc1bede0f4b7b6eb24b300b1f0c674999a6da816dbefb2d53f90b0dedb962a085e5209fcea50311130800d2a9249d279c7bde2f88622512"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31373433323233343433"_hex; + sig_r = "01de4ed1ee81d5cffcf8256a06858cba5eb925ee68e3ed848ac98071b6e30c3b44b102a2de8117cce5b4f9e42603225e0dbcb3fcc171d1492e7ed8bcb6ec286c7de0"; + sig_s = "00fd1e93bbc8b8adeb7864a2bf8e29d6f9c0966fe3d543525bf268b57cd6fa8852bfe0d2750726d5445560f2fc211aa7859dd3ee10078ef907e49cd64326b397e01c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32343036303035393336"_hex; + sig_r = "01fcafa62ee6275443d7277fc46e4c30b4db845ba45b5d6b54faf47bbf921f825f6fd0f23a38c0c7f4debc33add282afad1154c8707b6e18cd65adcb07d32915b462"; + sig_s = "0087a27b2bf3c35d18fd397e0cd7159516cf563b98441e030bfde93ceacd2c4e41228b7b33443ef0a351ce553d6d1d71c12092df796276175cd779b8090c4958b391"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363134303336393838"_hex; + sig_r = "0078989628acfba86d4bf28beeb9f44001fb8f2d8e245320a19efdede31eae3ec8b496faec30c85e8f63f8ae06046fe1d1575321fa04953e460f6b1386dd5df94edb"; + sig_s = "012aba3349732e21a5bb27d7d6facd8c7688b9d0d0271d6a077f9d6d82db45b5456b767f4b9f1a80f487031f9c0b3ea833c63fdf9c6a25e6b424c19c2e55305d7a0f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32303935343235363835"_hex; + sig_r = "0014a5a46a3ba415f6e8c566ca1b15fa2055649687b1a9fc84cc0fa8631296898fe014e0d45927e4271396baa4cfb3675669b16e76c339db3c0edaf61337e8bebe91"; + sig_s = "01fb313129757f76754b60fdb1e4077f9fe3dd62c8bce52190cfeb9c03021cc92f6d7d1302b8a84733486bf769ae94d3db4b60b6df28fed481d3d7c510299f0c319f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31303038303938393833"_hex; + sig_r = "008a3250eb5f28b598c4a42890d25f6af84082d4376f84f1717e5112a76623e6fe0d207c39463d20bb86341bc26c9f68bcdf794671a01f90465025f87a8c52137edf"; + sig_s = "001ddd317f6622d9b032223f76765ba6c9116ae4b43a1bd357bc9db6fa62f0867dc5d8f781f08c1cbd49b4424fe8c22cfd1dcd07cfde7b3598342442589825aa67f7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353734313437393237"_hex; + sig_r = "0060ee161741d5cb2dd0ff2cf9924aca0376b1544681627a31688e4d8b3b63a01adbb417ee113b9ba8d4d13b7b4e1b14b51a24dbc3f099b068d916aa94862ee081b4"; + sig_s = "015caff8d30141e1c163e3ec62b7e14874da624a6d8e0252d8e829860e5a49d3732321b625262e5c9b1ef348c3e7cbb1de8227513f320637866785e97e1931d35ccb"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32383636373731353232"_hex; + sig_r = "00a1ef8229db9f45da38ae3b6d601110611e209878bbd03ac2a6de65e8402957c669a115e3f02d085fe2d031c61324b77052ab346b4b1a437b58062fb36f9d56cf45"; + sig_s = "00cc5c0a3b68970279ae16880f6ca579d0171a827e99a46aa82b9242dcc09cb0b22a44ebcfca84293e6d21aeea492f00ba3157c5b6e2e4caea6a1c09c824720552f2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363934323830373837"_hex; + sig_r = "005aa0c8a378c4e02bcc2f56c2c365ccee424e2973c28f0daae8f4c3f0d90b421fefd456e749087e0c667c2a7147bc67b90c696244f216b4d9d7418eadc7d06ef1d2"; + sig_s = "01e28914bd341f526b041128f2d251131d8b2c65847e541d65adca3442962cddb2a71c64fae39fdd56e41686ad632f99c6038d8de0b3aac4045e0a961efdbf4c6a22"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "39393231363932353638"_hex; + sig_r = "005a05f5366c8b8be28654bc39a6671d1b1593495e445c07c995c3be3e168ffdec92e44288802fd455007f8746570d93b5683e4d40e9d9e59de539f0e62bc40d92bc"; + sig_s = "0187a47d8f70adcc5e10267b8fec89d7011d9985427645aed19a8efa2d1189b469cb7aab1998e0c1d2fcac5a5054d79d2ec1c9a00b183dc9af20f555a1140be2dcef"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131363039343339373938"_hex; + sig_r = "01e213bcb8b960b1296ae176993b2449bae556b6d90df2f07fb08ad8fd60e3b7fe6c73f9c8a7364417611d60119c550261c54bbca8d61e264130ab90187e27d22dbd"; + sig_s = "0034f519382cfacfd07b0a6f3aca117c13d2be725d2f9ee4e5f88739c99121e63ed7358046bfb1575fc73e1ede8339e46c5139843e52e9184bb8c579061a154a0b8f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37313836313632313030"_hex; + sig_r = "00ed11ac7efb1f29ee64108a5e2606fa9af3bbc12d1a952e47240d5236df64f5b2b77a0f7a0a73d30d0708b5b23ac6d584bf6997d8851623793655dee8774549b829"; + sig_s = "01e1602a2cae7d3212df47eebd12e2fe404851201101bbde702be9d74d040ed998e79a09ebf6d055f94473b1f8d87c99aa165bdaf0a5f270d46caabb8e88bfa54103"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33323934333437313737"_hex; + sig_r = "0007123c45e6e9338bc9fe225cdd96c5ab36cad5c06163f44f6bd903c7594e8068ba9bc89f652ec31b6e1298766b246c1f10877f1e3ec9829b0937b8d36e3c1ab2b5"; + sig_s = "01688bbaeb188b5047be6e8023b14fb121eb1451dcb19f814f5f4dca55ff95128011e3bae505a4d22166d00cb7cf14130590335ee923dc5db3e736832a128a067aa4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3138353134343535313230"_hex; + sig_r = "01264e3cc4fb802aa221d0787cd0cdf44eb6568982a00a6639f15238af36e894b14f45f06f8c2180fdeaaac77f674e056d1928cbbdfc4b2ceca0b35345ca07bfff7f"; + sig_s = "005c2dedee6b3aa096fc47ba0991a077ef4d5df20d8eff1bf8354412b171f08a98cea1704c8189a7951b0e7a8270ccb285b8db8e35285ed926b19c1eef07fdc05ee5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "343736303433393330"_hex; + sig_r = "00ca3814747888751794b0488955e2aee07e5fab4b9872074aa7432698e7c83b8079773734df1bc752548a218fa59a362e0657b77ae7798ef4a7a3873256ea59ec67"; + sig_s = "015df8f1f16611c960d56647424b97936c8a06f62dc3a95d66bf4aa378d7a9e17d2afb53565780025927e6928f5313428f1d6708339787c8f460ba18457d4c0f521f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32353637333738373431"_hex; + sig_r = "017ba871aee34a893c4ded7a2a546da0d6867d428497b80fca7eea6e51b73d6411aff7609743e6242b6d4d3736ddcc9ee1aa12c8b62de5382e5c33d1fc4853e3e47d"; + sig_s = "005feb9d9f8fdd44622e4f9effe73fd9b467d355fd6b8de205527f722ee2f5a15eebd59ccdd7b57da26cf953f78886db5a6e5bdd0d56c9bd47ba2271f77687a64b63"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35373339393334393935"_hex; + sig_r = "01840793684765410baf26b66cbcf7c36658d6c18a2f750c1225520e9f3a7c1b890583f321d4e48752c3b3116dfef733ee386c52a53402acea77cfad1db9380110e6"; + sig_s = "01b51985a306fcdbe3692181106d7d6308873912d003946992098bc98b4261fd78869ed8218849459780b6079f6899a47fcb9ea4874d1c08fab82c6f1e9c9aaae245"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33343738333636313339"_hex; + sig_r = "012276720b2725ba556d06be39cd16ca0a0351d8f530913c4f0cfb71fdda74b83f02febddc8da0a1f0f910d37d3f5332c027d7bd4c38fd08ebc770bf125207864954"; + sig_s = "00637e70b06045a86e2f329f907e079a785d7f8649541860322fb8b64b9736363f90156b9a5532d808cf2af33b87ff970c02e648dc4f1c90ff0704028ec2c2d9a82d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363439303532363032"_hex; + sig_r = "007aade608b22c77245734fc5c4be8737ba24dc2ed4321b58124ae46a77ea7befaa5bcf166cb966aad007911623af10925a324bc3c6d06f24d0e2e7b2c7b8468b8ee"; + sig_s = "01e9913a412300b3980719148de0bb03826184aabd58f19659aa8ca18045f36c73c97df3d12b921de510ffa96ceac5454b801c86c55a06b2d771fa77bca784332c39"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34373633383837343936"_hex; + sig_r = "01eefc7b6c1468ffa7d60b8408bd44c64a3ffaff298168c5016c6f504031867ea14ae48c661b8124418b4ed6ccc32df6bac6d0a485b1990236e15676268b7868d276"; + sig_s = "00515d48436afffdb65caed737116a861974b734bd1903e37dbbc231a9db37464ed762e364cac8b32f1546d6de37979fa05f8b80159a0f747d9470291af6569d6d94"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "353739303230303830"_hex; + sig_r = "01271b912ca055040c227955df729757654aa9bbdb73c61ba14155220e4e7132319f6fb0ee94f2fbe160738f1dce2ad690845c38d962db4fda1598e93270da84a2bb"; + sig_s = "00b8907f041c3b19b9234ab555d0b48325b0cd330889a53276a1e913bab892b9c05cfa889005b14ee2730220746aecf12af911c5baea4be377ee76c0eeaf47b7a712"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "35333434373837383438"_hex; + sig_r = "016a813db0f75f9047fb11f3e19fc1688c29328a54f56ae30c1c9d9378537bfc40c5719d084e49a3b4aea255f5b7f6cc775492b5371e6b67b2d6abd5743e10fac709"; + sig_s = "01c258ffd830151bfd41ccdabb86b24af846612788b361c196d24e997ccf3f17d4452f63d32851a483072e6908095e5c49bbc241a0417749b097bc1ca0e4d127779b"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3139323636343130393230"_hex; + sig_r = "00156a04c22ea5bdb7871124f1117301d781113ac4c9d4da05fea536e983d9261d25dc97006f8c78de23c788718557cf6f98863994af2086f0be3e8aa8812dc3a11d"; + sig_s = "00ffca96b04c56a4a6ce5d22b36e44d3b974d520e7f7c0f9d69034f9e59e0bbdc43236b3e4bfb0f6bde8802cc5cd6022cff166f4c488d64f38d44e3c563da31cf6fe"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33373033393135373035"_hex; + sig_r = "010913540ad73ceef7314d1758264e1d1525a371a7b9b3086971599a6b749be4d6ba69269b089508f6500dd925aa89a7c7cb7185e0cca7d2ee5664f22845d961e317"; + sig_s = "0135256c79ea5e5768fb3a55e2899b12219b8f68953ccd98c710b6a13de0f59786f4331845e65c7dd6340023a5e280206ca31416058f395fff4bb5de411ff66fc018"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3831353435373730"_hex; + sig_r = "01b5051ca0dd3b20df7d8c5b92cb42b8a204f92fb4e58c612f43d3800de8c0683c427e832ce622156747052b81bfbf6ed5fa177b6d47858ec8478f6c9ca7948fd511"; + sig_s = "01fe5710fac0e9d3e2b3b83081b28b194b822d0c13397bf1516140cbe3faa52e908848f69789a741b9cd54d703a94577fa813e2f2c75834807401ca010fde5328317"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "313935353330333737"_hex; + sig_r = "008d3c8f8e7ab74d49e16a4c7db3a393fa9567777e373313667f9ce32b1b5e648debffedfd2ff5345ca1b8154c18c8b883957d911e41336285f86261c3ee225fdedd"; + sig_s = "003c51b84c2c9a3feb76a6518634b6f09c0dde8a9d08dec0b3d66135cc1bdb0a80fd69636104af69de8f4062646b29fa3af685ec82704cef706a18c59ca7eca0fb56"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31323637383130393033"_hex; + sig_r = "01195625a64ac11c4fc1fc479ef80430eb85c1af77f8a197a17e009569ef6c41ac6f35850755379f478d8928b154e3baaa29e92b481ac04dc72f3728b4f088ff37dc"; + sig_s = "000d55c7067877dd1302fdc6bb69b7b7c024e4cf3a0e924102d744ac52366d9d76d5855d3da228c4b67bc7bc4b2a14e7999962cc9bbdc517fc24a823abf584b8f56e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131313830373230383135"_hex; + sig_r = "0026eb68bc0fb7664c35bf5762cd532dce33b0e396e97d6f4143dc6e1e766c836e27c069da9ea1e74e0b03d030cf8a81490508c1c728f86e59282df94de8d8a0dcaf"; + sig_s = "00a9fb584b712986f19ab7568693df278cafa43272dba400ff333cf48b5556e6e78353a665605c70b6fd0f18f30b850e1a47cda42c4c924bca80102e6793be9a8698"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "38333831383639323930"_hex; + sig_r = "00f3d34e36f9754dfa8eafab160ca96d91c7f4f388ec82ac33784026bb6c6a035719eaeec3ee511fffb22dd5d6ab819e6c6387192d6c3a6e9249ead565157e323f62"; + sig_s = "01b5786b1d662d26fe9f69c370d2bc18882abef693c8f17100a02725de7c9f03602fd53a9208b573b3b7b0b66db971767bde835f9e8f42ada201e7b7391b86fe0294"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33313331323837323737"_hex; + sig_r = "00e69c833b604075e9b28a2ff73a56a32e1a247ef9ae01e7a0e471f6015c2b86eb864c281c8c93d2acf5653ad05bafab2f58027f37513eb8569f50bd475e770e9a81"; + sig_s = "00b9c9d6ce09b53025bfcaa7d172ae41a9b636aa4b80a930931fc99e5e2aa23306f19dc57399b0431e72440a1f4ec7d5ca902f0f7b81c91de85e469f992fdfd4c52e"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3134333331393236353338"_hex; + sig_r = "01c6b8b5cf3c4dd3d62391f18e97eef3aa6ace0ae2c6fc97a561cb8e49c087dbcf8135fa433b566b3385cb57202f1b12164fe62765ef73b72a94e7a57870989a4981"; + sig_s = "0185944434b83a0d0fb4bcdce8ddaadb30a1e440815e7674562df9c8bf711222208cc346b9665d90abedb437912391505dd5d26f0178e7c063790f5518f47d1b05c7"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333434393038323336"_hex; + sig_r = "009f351a41d5375b8993e90b8d8a65bf01d52d14aba1dbe49cbb4ea823804f2b533e0c167903c8bbc593297c18f309798a544787d598074cbf56ef0e5022520912ad"; + sig_s = "01b892740a57204186bd5f434f72d1534b4289f8f7114cb7b1c9cf4541d754f314448cc32deaf35608263488fdc7596f7481ec098b36f8e440829194becc746c77f5"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36383239383335393239"_hex; + sig_r = "01fe24ea831199e31cc68ef23980c4babd3773040870af8823a19708bd0229adc1ce99d02e4d95224101e3e974236f54df86051fa1e9fd21380432633b2495ab782a"; + sig_s = "000efd1f2a281f967e7b09d721581356a714c499f9b14f781992eb9ae7a19f6825045fdc6d9d763f44e1e7c91480a678a1d8ecf6d66e76cea3505f65ff78cff15cbd"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "33343435313538303233"_hex; + sig_r = "014c6ee9de0a2a0b60c981831e0acd6636b46ae134fedce61b0488112663b24e1d7e74e227fea883d26b68f21e4135ba0e2069bbe0d9c6433c3908fd5b00182894b0"; + sig_s = "006a180a493182c6bc2a09d7e17ff5d62015293f1e8ae205a16fa09042b0a9af6794cb377f4b8b1175fcee5137c234900f735c484feb7da4cbb405cf9e5370fe4f49"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3132363937393837363434"_hex; + sig_r = "01044a45853ada17ca761acc7df6d1d380252cb0fa66124d9278a5ed8a4a60453bc71de1dbe32b0261165948823c461c7c1eb1714ec1dbf66fd602c7a47446d1dae1"; + sig_s = "00f8b27f7c71e37e4b440d2c86f1c1d50bf7c53d3878ed27e7bcfbeb902f769f86d6c3e8820b99f890050f0dbebd2132e84626c5b16a8c7ffffc3a30ace69dd15a11"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "333939323432353533"_hex; + sig_r = "00676a381b18d05207cddd73b44e4dd71449985c0fa7de1fff43ca5155139a1a09e5e3fd754d86ebbe32f6609f6e906d48d24790e494343c61faa90bfdaa4f49fdc7"; + sig_s = "00fbc1c891bf6e368fccad51cc9b2c29e8e92b658e88c0d23285af269aff6702a55a0ab16807e5523b6637bbb004727f6f55c51ad4cec8c924f9c1feb24601aeddef"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31363031393737393737"_hex; + sig_r = "013c9a575382ff6881c908fb5184be7baf38edb0b06008592558efd57dd8fb9993c893800a6ac8c6d2e34ebfbeff43e63263f133868d0ac7a838f69aff26d60a3849"; + sig_s = "009d22ae7bca8a75a53214c3eece437fb28e05b076ec704d751a28a7ed7e529d5c5338be8c724afa547574a17f70510b2462748a53678e39752a688dc8cf39e886c2"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3130383738373535313435"_hex; + sig_r = "01071ce5a19a09aacd43c7cacd58a439dcca4e85f94ea1d48a60f298ee01bb3eeb11d5daf545e7086486f8e4b518a15be69620ab920cf95c5c15ff178c903124fac3"; + sig_s = "01ad6eaeedece9a7592bd21508b2720f1b8c4bf55637b1e8a5ce5359775b980b21eb1d33e8ebf5c0b3d7829152a295b8a9a1343c25350e35f709936accc8ce08b0b1"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "37303034323532393939"_hex; + sig_r = "01bdae499160f4cc6cd163cf110bb1f9b421e8786a8ef9297e4b98fd508a1d14c50617c8d1a3de94fc8bd6c38055e4906b20fdcab6ef7bf9e7e5c98ef3e83e38ec3b"; + sig_s = "01ba867b8ee72bb7304ff83fc2d734749447420791d5609e0515de4e05fa70a83385a853cac6c47a075c8c61e4b65b9774574101cf4e081770f83ae1b7e727010ba3"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31353635333235323833"_hex; + sig_r = "0000269fc7ed89e554aa52b3875dc00bc140c1937d4f1b32e29da41ff241cdb9bd3058fc148f905982b8717b035e0db00ded7ebcb08572ec76bf0128411145d73091"; + sig_s = "01b4bd6bc4ba7befd5c305e018448a771b71fa1a11b3a2c6185dd6b8477c35eaeb4733fecd90f38ecba628f27c02f809191e993e1e7ff590383e2ec2afd08020b267"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3233383236333432333530"_hex; + sig_r = "01a5cecc0e572f5ee4eed6755d3230ec5a933c1fb0e35ae771a1fcf0dc880e1c159dd5b6d192dc377505048b7188de3feb815a81a4f30d9226cdc85f751dec1a0410"; + sig_s = "01ef4a743e1e16f0a60201cc1060625ede6f0936e7af90b42736281e89fe7f2de6aa3f25c68576da705d8b3f6d5d8a34d3073307ea198d1cc8d72a18ef25e90f31af"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31343437383437303635"_hex; + sig_r = "01a92b43f57421e54d2528d305e7d5aac9a708e75a7d6fedb47908a4e3edcabdd836a2c4e8436f3b7b64895254536174d88c6dca143699522bc2dfdeebcbf38eb905"; + sig_s = "0093b0b99a89de72aca0c03e12724c2be323577a4629cb47fdda5b12b61ace0b9fdb97549d3d2a1dac15da66ba6389ee54cbc82c995b9f3aa3ae8474f4bb4b52da8a"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3134323630323035353434"_hex; + sig_r = "00a0400f255174ffb8548c29f5faa70e806bb6f6ca08a08753c85c5d145a555cc8e2df285af9985f2e729d4a99a734b7e7fc95560d546a067fda03529f56b2fe66bc"; + sig_s = "00d7fb60271d22ecb5d8ec904a9df1a416be706ce539e34650b8fc514d1dd7afebc1344c0c68c533c5b20ee249a77c075293b2d7efc8731c2e3619be59da871bb083"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31393933383335323835"_hex; + sig_r = "019207c7b645aa45c2722331f46e094f2eb0052075b8ac9414ad77baafd01d4d1fdc68344136fbce01edfa5627bfb8f3c128abb61072c74802192e89137c68d0cc31"; + sig_s = "00ff15b0218f81f0a848742f683cb4d1b7c517efdb8fcf8ac6a35e4971b35536851ed68de40a6e1a4a23bddb5b42efca23b91e91959a4f7e2afa196779c96c6c654c"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34323932313533353233"_hex; + sig_r = "00aaf119702b9985354bbe3f6b6cda8c46151af4202546dfbe04d5f0ffd18ebe7b29d616f1c40376a412a52f4204b5a13e7f3e4304ead566fc41bf4b5fc0b84c8a2d"; + sig_s = "00d599deafd4fa2368cd072b854a3d53425d06adf3573e886b81248a7328a546ddc41caed38c6b1ffeaec9a98c940905cbffa87b936da980d4a9003da41e0c59c92f"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "34343539393031343936"_hex; + sig_r = "006c09a59e71cf34f983f75dbb4724c4828a93021cee8fd7d92af6941ca8efc9c5ddda7c49a0e1777225782e09313e3091f056122e585c4eaa689fb2fdb1cb7848d8"; + sig_s = "019f0c5ff6b4638f4c33916db76f9d078bfa8f9e25ae00348e46bb32d777aa26155b82ea73a9e4e2f21f6a65c73ed6c6ab2101cef3524d45b9fc6ea1292f1986acad"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "31333933393731313731"_hex; + sig_r = "014e791c42f3998458c5e17f895d25c85cb419195d65e5a0b9a42cf13ddd36959c73460f54aa840d2254355c6ac626f440cb3a84fba632262c9dc5cab31be7da106b"; + sig_s = "00abb97b682f01f45168403613a7e2ff82bb4a9fc20952a35d935428f71ddcc799c6d9085fe3230d72261d73cd082e8108523da7ba0b1691ad6ea63f5f4e8e8909f4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "32333930363936343935"_hex; + sig_r = "013ded35ddff2f97780bbc60b8cec89855a35183a48f8fa6bbdc183994bf89021118cc019629df72112b2c529c023e7a5cfce253f7fdb49105d238680b64275a213c"; + sig_s = "009c92e7a0f71608e8d8cfab3f850f7fda1a1a1d056e72254469afe5ceec3c718e6a462e1346941eb08c105501647502c1a810a29df8b208da6a5b296b2bd1e98137"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3131343436303536323634"_hex; + sig_r = "01d0d29756ebff02b71674fa4eae37557ccd51a036fb1eb0b7121b405e7fabd60592927d805b75815af1bca6e9d6c5484225bdd0ec7a40735da972fd5ff645d86f1d"; + sig_s = "008b9fe55357dc118070cf898973a64e7554b734e900c675541e20332a260ca51a23248d9b8f47ded811cfce556a06a71ba5dc5b873075f264a6843e675caf06a534"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "363835303034373530"_hex; + sig_r = "0165fb993f39d350ed60c8483dd6e4e6736591dea974ecd8ab027d3839b752322ee220d40bb6fc0b0d5a8c42928bde50f659b18f51f42fb2b1aa4583892a9114a0c3"; + sig_s = "00a8816c09d47138bf662da4ba25caf44e24185696d4914a7de2b2535f73b9afbd3ffa9cb0a86a115e4d9ac5be48cf7e8fe276466abdf17127bcc7aaf4d096008ca4"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "3232323035333630363139"_hex; + sig_r = "000b901c88ea699e715f6db864e23a676e7f7f2415ac1f850f2dde1ad0d3f9c92e8c5de66d45174d619955fae4b0dfebe49c583506481d28d30cbf58e2ac49f370c2"; + sig_s = "0144c97b688b9ecc07b84c68095267e17e48232922756609e9859d18d2eb7844ec925150c39f2b3a255c882be705e0a8e30e68e49fe7914dbcc3ccfbc1d467050f80"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // special case hash + m = "36323135363635313234"_hex; + sig_r = "00abbd9e77ef1e2a36c6b06f063d93effb8e852387a94bfdf8359b5c18708f90d9f4e9749fd45347f637546b08733789c988fda4f0309551bde813a0bb1a232adee1"; + sig_s = "0191165d58d153fec68f5cc83bcf5891e2e0ca9681204876e872453e9ebd45870b6878ee437e4d833c6ec54337b779acbf9f8202df510d269a710d0c43e4e07b040d"; + r = true; // result = valid - flags: ['SpecialCaseHash'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "491cd6c5f93b7414d6d45cfe3d264bd077fc4427a4b0afede76cac537a7ca5ee2c44564258260f7691b81fdfecebfd03ba672277875c5b311ea920e74fb3978af5", "0144a353a251b4297894161bae12d16a89c33b719f904cfccc277df78cea5379198642fd549df919904dc0cf3662eeab01ef11b8e3cb49b51b853d98f042600c0997" ); + { + // k*G has a large x-coordinate + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf5"; + bn_t sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r too large + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"; + sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "015f281dcdc976641ce024dca1eac8ddd7f949e3290d3b2de11c4873f3676a06ff9f704c24813bd8d63528b2e813f78b869ff38112527e79b383a3bd527badb929ff", "01502e4cc7032d3ec35b0f8d05409438a86966d623f7a2f432bf712f76dc6345405dfcfcdc36d477831d38eec64ede7f4d39aa91bffcc56ec4241cb06735b2809fbe" ); + { + // r,s are large + auto m = "313233343030"_hex; + bn_t sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386407"; + bn_t sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "336d5d08fe75c50946e6dddd36c550bb054d9925c8f254cfe1c3388f720b1d6500a90412b020b3db592b92ab9f68f1c693b8d1365371635e21bc43eaadf89e4e74", "01d48d60319dfd06f935fc46488c229b611eecd038804ae9f681a078dde8ed8f8e20ad9504bcf3c24a0b566b1e85b2d3ed0a1273292ff5f87bae5b3c87857e67ed81" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"; + bn_t sig_s = "0095e19fd2b755d603bf994562d9a11f63cf4eadecbdc0ecb5a394e54529e8da58a527bc6d85725043786362ab4de6cbc7d80e625ae0a98861aea1c7bf7109c91f66"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "6f8fadedbae63701072c287c633f9c0052ea1e6cd00a84342cc0f626210071576abfd0875664b0746cdaf2745effc18d94905b0fc9d2cad4ba375c0ea2298c8d1c", "0150d128cb62a527ae6df3e92f1f280ea33248711ffe4b35c1b162a9508576860165e0ddc361d96fafcd2ff82776c743b9cd6845db61eb56739f5c4ef561e6c20d8c" ); + { + // r and s^-1 have a large Hamming weight + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"; + bn_t sig_s = "0015837645583a37a7a665f983c5e347f65dca47647aa80fd2498a791d44d9b2850a151a6e86fce7d7bb814e724ff11b9ef726bf36c6e7548c37f82a24902876ee19"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5e7eb6c4f481830abaad8a60ddb09891164ee418ea4cd2995062e227d33c229fb737bf330703097d6b3b69a3f09e79c9de0b402bf846dd26b5bb1191cff801355d", "01789c9afda567e61de414437b0e93a17611e6e76853762bc0aff1e2bc9e46ce1285b931651d7129b85aef2c1fab1728e7eb4449b2956dec33e6cd7c9ba125c5cd9d" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b420fb1fecdd9cc5ea7d7c7617e70538db32e6d7a0ad722c63580f1f6a1f5537eb50930b90fd6fdd9abd40015f746d2fd8adf945a75621407edb6863588e41979e", "295108a7e9d2191a287fd160bd24f498055dc9badbd61c6a89fede27b4f9d479d86a20b6dc07c90f008ebe68a0e0cc15a4a03b8cf990e4ff7ed6e3892b21c52153" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "32b9a17c201aec34d29b8c2764e7c7f6aeef10fb61bf9837117fad879f8c6a22a300006d2018cf42b25898ffc9a1bf507352e59e6a52e627cda160e17ea2f46005", "317a89899b7cb3a0d33eafa02b0137a0fb1b05102b22b676f35b9ff6c050ddee9f185609ffb7f5165a769e440792b75044a43e838690d13f884aaae888bf5f86f0" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "10b17d53711f5157f79062c0e034a43b63a8b9893e6032961a2914b78a63658579c6c069d3e03f47017f45d1c883724fa3d492aad8cb7f445b4a3d14926be29c24", "00a83583cf3b5b4e9e1bbfa0004feaf743d7294d6cf4bde726c0ce013db32cffeceb7d01d1af3fd2f214e98e6fc2e40e27bbf675d766f2ecfda075f260cb530b3a29" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "19b553db7e685e34f50662436258a16cc2fc08bcdc5b44755aa24f1e9948e1da4d15e2bb14a2612c1990a43a7b8b81c0be2f614daba72abd551f78ab998f4ff541", "010a807a820f580b3b1f824c664d7d94f6850c167b2c867e7ac7b8b4b8b6905e2c09df4479ce2073f0bc83b73fd9de254aba29f6b5485385d9f647b3e57d475c6502" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01daa911a9f08107cc86a60ae577b1e8a6d898d5a8714610fa5630b5096748c87ff3de68fd1c29695bb632380c335564afc1e82dac15c790775dc6d3a27e0f5ed97d", "0094869cf902444247d35dabc6ea924953d859a0b2e74b303c3a02def7ed51cb52e9aae611b6d6c9a488c561957cc5dcd652b42c121387d164fe57af38111226282e" ); + { + // small r and s + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + auto r = true; // result = valid - flags: ['SmallRandS', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // r is larger than n + m = "313233343030"_hex; + sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640b"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01be3fd44e342b0a202a55ee167c4a98ae61cd5f7a02eb138774bf48075e966edc15054cb1e378ceb836fc648f3038243ed250f515dc8e7a6a129ec413aeb983963a", "0197a4055e496aa30e5233141c16ad5342cc9cc4fde6c4982ab6d20aa6b0124b76f16267bf40e0f14e87aff05720cd20e3c4f9b201252d61b4d64f3a3fd61cb186b4" ); + { + // s is larger than n + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + bn_t sig_s = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e914b3a90"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "68d7b518214766ac734a7461d499352444377d50af42a1bbdb7f0032065ee6dc341ccf231af65250e7d13a80733abebff559891d4211d6c28cf952c9222303b53b", "00a2f3d7e14d9d8fabe1939d664e4615c6e24f5490c815c7651ccf6cc65252f88bcfd3b07fbdbaa0ba00441e590ccbcea00658f388f22c42d8a6d0f781ae5bb4d78b" ); + { + // small r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100"; + bn_t sig_s = "01efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7ef87b4de1fc92dd757639408a50bee10764e326fdd2fa308dfde3e5243fdf4ac5ac"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "011edc3b22b20f9a188b32b1e827d6e46b2ed61b9be6f4ada0b2c95835bee2738ec4dc5313831cce5f927210a7bc2f13abc02fa90e716fc1bd2f63c429a760ed2363", "0118daad88fe9b9d66e66e71ce05d74137d277a9ca81c7d7aef1e74550890564103cc0d95d30f6205c9124829192e15d66fb1f4033032a42ba606e3edca6ec065c50" ); + { + // smallish r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d9b4d347952cd"; + bn_t sig_s = "0100508d073413de829275e76509fd81cff49adf4c80ed2ddd4a7937d1d918796878fec24cc46570982c3fb8f5e92ccdcb3e677f07e9bd0db0b84814be1c7949b0de"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "012f8b9863a1887eca6827ad4accc2ba607f8592e5be15d9692b697a4061fcc81560c8feb2ae3851d00e06df3e0091f1f1ca5ec64761f4f8bd6d0c2cab2a12102444", "0174b4e34aec517a0d2ceb2fd152ed1736bc330efca5e6d530ea170802fb6af031425903fa6a378405be5e47d1e52f62f859f537df9c0f6a4a6479a0aadafe219821" ); + { + // 100-bit r and small s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001033e67e37b32b445580bf4eff"; + bn_t sig_s = "013cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc3393f632affd3eaa3c8fb64507bd5996497bd588fb9e3947c097ced7546b57c8998"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008aed779a32b9bf56ea7ab46e4b914e55c65301cdbe9ea6e7ed44f7e978c0365989a19a5e48282fb1158f481c556505d66ff414a07003ebf82fca1698c33f2884c6", "00a62426993ed5b177b6045e60b5fa1a1f8ce1ad5d70e7bc7b5af811dbf86e651f9ea02ec796ab991e1439bf07ffe2ac6052a8a0b0174d78a9441aaf4d8fc757d80f" ); + { + // small r and 100 bit s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100"; + bn_t sig_s = "0086ecbf54ab59a4e195f0be1402edd8657bb94618fab50f2fe20fe5ebbc9ff0e491397ed313cc918d438eedb9b5ecb4d9dfa305303505baf25400ed8c20fc3fc47b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0093697b0378312b38c31deae073f24a8163f086ac2116b7c37c99157cfae7970ab4201f5a7e06ec39eedbf7d87f3021ca439e3ff7c5988b84679937bab786dbe12e", "01c6987c86077c05423ac281de6d23f6a685870e12855463770eccabc9f3a1d23cb2a0c15479420b5dd40fbdc9886c463b62ee23239df3a8b861c3291d28224f6057" ); + { + // 100-bit r and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062522bbd3ecbe7c39e93e7c24"; + bn_t sig_s = "0086ecbf54ab59a4e195f0be1402edd8657bb94618fab50f2fe20fe5ebbc9ff0e491397ed313cc918d438eedb9b5ecb4d9dfa305303505baf25400ed8c20fc3fc47b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "019a9f1b7b7f574a021fedd8679a4e998b48524854eefbaae4104a3973d693e02104fa119243256e3d986f8b4966c286ab8cb1f5267c0bbd6bc182aeb57493a5d5b6", "0158b97eb74862fbca41763e8d3a7beb5fccd05565b75a3a43c2b38b96eb2ccff149c23ef1ac09fc455d808ff28081e985f9e172fc62d0900585172cfbff87383595" ); + { + // r and s^-1 are close to n + auto m = "313233343030"_hex; + bn_t sig_r = "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138638a"; + bn_t sig_s = "015555555555555555555555555555555555555555555555555555555555555555518baf05027f750ef25532ab85fa066e8ad2793125b112da747cf524bf0b7aed5b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "009b0ce9009af6a1acfa001901a4e94738d222ac7d140321cbcf029f9460f336dfd0655af02c3b98c421eee88648629e205c8a7b55fa41f51ec8cf855be632ba5ae0", "5304f9db29a81c82379f9e48d5ee47a469a450af8b737fbd93a6b9d813afef84ad3b92d5a5d06d96c90c05145d3fa8fcd335b2e17b1673534474cf9ed1c62ccd2f" ); + { + // r and s are 64-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c44febf31c3594d"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000839ed28247c2b06b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "56f677b935021e01f7ea71842c2b76479e807cd3fe2705b85ffb9e103788201282f4faf503502e85c695df022cf4ecafedb361751ada93f161c8e00a26f4bb988f", "7886ff30b81ffe355ecf0961f0e0deb775c1002758c6217e02d7b6c6eaee67a7d0f94c40c8607308eaaea840e4dfb57cd0539a4f2885d1475d43429b8cabda559d" ); + { + // r and s are 100-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009df8b682430beef6f5fd7c7cf"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd0a62e13778f4222a0d61c8a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00dea73c158a271a3474eea33025778112f45a8251be96ae8c01f832b7e4e241fd74249cbed4486183cd9f622f5436f8d7aa6967bf93ed9dd8e12831f82c1939cb5e", "011ed960d670a15c33e4b0e77a54383bc3d475bc48ca7686b8f0d2dbef972a840ca2b9d03073e3cae697710a98cf5adbf243c72382ac237693f11a713c2a5772327b" ); + { + // r and s are 128-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a598e563a89f526c32ebec8de26367a"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084f633e2042630e99dd0f1e16f7a04bf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "011e78c7a24d477c1887ce80021d2db7c93b00b362d60e33926b2e872fda9619b4c5bb024d84412c959277445d21a6929041dcfb9467fa0dadb3a01a26a1a1ea99", "00802d13be68fa3360b1ea81f9319f2c861ebe336a3138e4f2e8ded1a3a8ba7d6c7064dcf84ca29e1e64125f375123737455eee95c9a5c2e4eb543124f58399c3813" ); + { + // r and s are 160-bit integer + auto m = "313233343030"_hex; + bn_t sig_r = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa6eeb5823f7fa31b466bb473797f0d0314c0bdf"; + bn_t sig_s = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e2977c479e6d25703cebbc6bd561938cc9d1bfb9"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01aa9f3a894b727d7a01b09c4f051b469d661de1e06915b599e211463319ac1b7ca8a6097f1be401d70a71d0b53655cdf9bef748d886e08ee7de2fa781e93ec41a26", "01ba9ea67385e19894fc9cd4b0173ab215f7b96f23bc420665d46c75447bf200ae3ac7b42bd9b857fd1c85cce8ea9c8d2345e4687dd70df59f5149510735bb9c7b64" ); + { + // s == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // s == 0 + m = "313233343030"_hex; + sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + sig_s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + r = false; // result = invalid - flags: ['ArithmeticError'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "3877bf6711c3c088da9b4a18e6e9f5d2d6611fa56d67b5664a142a744aebd31ab4b85672fce0eed8006fec114afcd1f6eeced0c9751ac62a684840f7e0ba2928a1", "4055ce08f42ce5aeeac80a2536e75dd936785e6e38691092b030cd2261f5ebd9d1529a8cb85657d95e30febd37a7f5e523fda7780d56e27570ecb626a2570661ba" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "003766c66283b12cbccb593f39d32c356cb4ab940931bedf5d8053458cd26d03b1e9ba364d2056a8c3c7fd8b8f47ab8277adee9bc701ffe1fabde72a01dc098f76db"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "013527482d58bebec6847877dcc18fa7e60c5fb2461b10a2907bb2bcba14ebdc4e708044387a80b194a03c6be62062f4a6cb8d2f33df3071d227ef1e875d8974ae4c", "012b5396dead33bc276ad1fe88709448aadde543d70b644acc5766de7e98ef91b766430e0a809a9ccd1ce859317d477ffedb7b10b788de8ca2cd9f0ab6b4a6db0e0e" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "001acee0a06a4b00e9da99cc1d47fcb1158787578728dc13cc74a95e51fe1ac074f88613bcd4d717c3206c2a73c76172416a94110b9141ad243ba87b51a042d45ee8"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0f1a645168cb60d2de1a58ef3ec87d79dd60c3771cc6d5323e76caa7cb8f326aa38571c74c6c45830d3bcf00517680200e1af7afe0ea69e7a4930e51f67a9a30ff", "015141c86ff3e6cd8dcd3556974fe45dc0fcf6a9b6ef1e3635b0f444628ae8dd09d7ed7897701163a012ac37057f911673e8eb662431907859731850abaca59d82af" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "000ce1ddfffbb3185109966b647419ce8b553a6d70d6c73013af778f7b211aadeac70511ae766f0b74961a1019ffa18b3d42056fd9ed4d5fd982be75291f2532bb02"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a2a67b569a113f13754483464a249b28f588cd71b87bb70373d8c6661cc862a3ed4293aca92386742248783492d524a429f404fceb3dc88711a79040b48b80a173", "0171075214d4547e37f94f674747a995046a8b8a6d7b307ebad9adcb03eba7f63daf925f02c7220da107eef3e4f19e668fea2718aa5c9d2deba1347a8128bdac670f" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "00ded82c833933ca141a3eb8fd1889f2fca4679437d28e9f867afeb37ecaccbb555dbc61ef83b3f7d57c6b4ac8ea27971716e6a1a0534d7f7ea1fb7197d1c4a0d5cb"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a2ee867f515fe3a4cc539711d9539e0db9e85a49c9a6cd65634a4eb0824da585a353e25e04a3d7bade0a676622c078f7422f38cfb1e9d5b2bf031a63d2d037b4d2", "01fd9cc1f25c07963d3b246c016a3e4f260a9b5894f5fd9261beae302ee64250385dcafedddf9871072f8d94c9a654ea364bc6c15115ac38ad3694303f2cba014f59" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "0072ceb39ea97d82d3aebd01ee53d32fc02bca5887fc0a5fe373b7a0d3085249684731fd8157b3743d40caa8a7908699bc223d0df57ca11f6225f732119431b86b9a"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008a0a0f504a308b80289ad4b9e8b741525bfdeab4732286b291c9e3228ae8ab60c1381462f5569f65cd770f5e9b395229445ea5e23622e9abbc6de460db98703dbb", "2290f4d20ba24e3d9279dc0f3e5a5e104d6b5d44731dc5180fc04afebb8a805c752afd022cbb8952f3cff2795f778298713ba1b76e6b78e5c0ffac44ca8b3c769f" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "001834d4897e360d3622607611d64c4338039f8f7db00891bf5930711b2cf7d47be557b283d20aa85d9c5d2e472fdc59a35ff4ac0985bb06fa284838026cf0ba8571"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008903f9a991de771e52ed5e5936626a5510f0b412a5b76156950ac545192105e03bae9bee413b5dafa9f7460934fba63470c992a63817db1dc9d853a6794c12264d", "011f50d0e1b644e47e02863a28233ca5528bbb56b97f25d87f2e1c9edd3c7e8b5f60b600d0e6fa901ba76b2fa4c66f5b03c9e96b774940a09e01ae17cb2885173e71" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "00a9c260ead3d423c0e8bd225f41ffaea6ace17b1e157b98ccf912c90865a4bb74169ff49b4b0d62e0772905ca62b0bdbda232955a3952cf3b83f50bc5f6ae33ee4f"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "010ec0b19ae35ee4eac34047eb1f13cc442c31457d28e025e3f75308916ebd7b8c0592481c39825e6988833f8e953ac47da830e8f49c0980963daa93c2d753df865f", "00bb702a4aa002162a1c7a7142404c159f7243a1ac809b59d6e420080f358861ce0d8af52d3d376f27ab7d778da4c74b1f8641bdccaa0f44e33695e022e9e5bb9641" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "002e67568c48766d91884b0ecdebb8d9a39a359d77bc97063c625d6d3f1dcaae81cdfb198f4655d9853273bcfb60477cd0a1e435fc8bb93f8d05a20fb977e50cc434"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00d3f0cf50e9a4a6f1bc5468754c74bb6e7a7198c010ff73d37d36533c2ac55e46e736def95eed3c51a7ef357c14ef1ab7f4a3caccdc38d5368b9664bf952583e6c0", "0160c26745748b22e5cb748348e5dd522099bb4b31d047d451fa492a2ae7c8adf349d4e5ef0738093f5099a6a334722c87cbc65fe5318d97ae0fc30459aff21cd306" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "0039e6ac133eb88e5b5748ef6806e750175b100ac40e3efaa891ef7ef078c9d3f2cbfe6398dc776f72cd2f904f2067c63df677f3d8162cce1de557a5aa4db6561abe"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00f1dbdff93371aefcdb1ce696e46be28cfce9dca1b1ce220930612c0d9f64b32405a5abdde91bd19effa929e62791a3c9feaf73d6d707cbe25bff9aa1e0a438d52d", "00b789a0920d47787e795895ad9fd4c6752d521ce33fd19248e415c19c54cce95d54bffc3e55165104bdc9b0810f67ae1666b3e6ef5286ae897afdba2be4342d7e3f" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "006531ae6458fa556c74ce671a556e703038afd8f769c398d080be8fe434accae8dd35e8a28545297310992dfc74efdbcfc3335e0b9f9bbf970cf4361213eade27ed"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5c9bc016ef6611449a430392918c530d8308d4e628275a5d2e140bc82e3e02a36d03031fbbc62e0109f107564df27c5c47e868bbf92edb3a3d1080aa0b6997a13b", "159b04a43519ef8148d3832f76ae3d0d6bd5828759b8a64f0f365053c15473d61df1634e80f4e0023cfa97d71882289d9d86a32ae5380d21289d453599490b142b" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "007321260c7e56e586f4a7b9b47a18613f833097c0cdebc6fe488ae05d1c1f37a3a98f2e1af140e7fb1d2318c50b3b984bc4066bfa55fd98db18ac649ee7e47cdec6"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "019dabc758b8c0f680fd1c9757ae0e54a9bac35fe0d3666a4a5838cf551f78cf152e5a98d1f36bf533c15b478d292d084e42137b5c32b9cb1220745df41fde5da0a3", "4f3da3ae65b24eb8f61e934a35b3726ba4d71cd2b2c0692f58c24f96ea75193dea76bf88574c0c70a1ce6eb490aa69a9d5bbd299f53dd1e25ef7f2bef8779c3a52" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "004f27499640288c52f93a87795bd7a0b83c95dbf69a5a3b6ef62f1308f2b9a817536173b45e687646255958f0cd08e0c469e66495d4e040217af2fbbd1311d21711"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "35016d85e577a5bdafaaf2880d2d28daeebd64607c5246741fd952f78fc05a4c290fc689a78f09c0fd36fa3521bb1fa67445b559cffb0e59d65f5830222ad40ed1", "200cc3f2c981daea884444669a6036a1caa85a3bf7420beee18c65a33c11f32d31cd9e356f712af3800ffeee331e741d319daab97d9280b173a6869b94740d8d36" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "0040484262d596a23936806ef21ba6192c72023a535089ee524e2a32f61c7497e58b4dec0ae58178f7b6dd3587fa3124a4ccccb49de353541f610f7d3c97b63db11a"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "7d2b510d12496dd5cbb1a14b74f8b671c7ad6180d2154dc0a0334178b054105418639965c70251c28b831ebceae05d8da4239b80ec91f807a301800b709cae6ea8", "0145d7f61e14b464e6014ac14c9ab71754e5ff41b569ec9e469368010ef7fb7aaa20c859f9c138a79969c46f0c20c7ea205585bb513d79fd5ae6017797d930f74c97" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "007fa623ad71573766571b8fd4ae0a5ce82b3805ae151a18515ef607f2228a95bafdbd24acde135cae5f3f899caf0c5efd1a4de2c53878dccc09f2b7a263c2844e3d"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a41ad2be45772bdce5f3872f654e9320026726d3642fd8edc560363fef9ea1c12d1a5067ef236fbf4e22772e2066a818ed0de0976721ddd18446283506b8ea6e1e", "01a65ff3118f6c27595a01b387c6486a24ff38d59a757cb0a06cb0a8b8e1fd5adc2d1c6a3d4047ec2fc3f8d4e61f23a10c1bc87280692073cbb6d4774722e658f815" ); + { + // edge case modular inverse + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "0054e096bc1b2ee6f5fa7d65ce54077cd07a379a7d1bcbf85651852fcc62037ac50c6e64b8c6c2cf8814653af7b87d2752e6f3af0a3ef75ec7415a58cdf2990ce4c0"; + auto r = true; // result = valid - flags: ['ModularInverse', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2a07f13f3e8df382145b7942fe6f91c12ff3064b314b4e3476bf3afbb982070f17f63b2de5fbe8c91a87ae632869facf17d5ce9d139b37ed557581bb9a7e4b8fa3", "24b904c5fc536ae53b323a7fd0b7b8e420302406ade84ea8a10ca7c5c934bad5489db6e3a8cc3064602cc83f309e9d247aae72afca08336bc8919e15f4be5ad77a" ); + { + // point at infinity during verify + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd28c343c1df97cb35bfe600a47b84d2e81ddae4dc44ce23d75db7db8f489c3204"; + bn_t sig_s = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + auto r = false; // result = invalid - flags: ['PointDuplication', 'ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "4bb904073cb6da9e5028df54fc22cf5a9d5ca73a01feedd2b4ce43b87bfd4300a72bdf26b146b2e7b506c03c7a0ad4a7e3e67204dddca9b65d43560ffaf9bfd540", "012b8895632e0406b78463fe1bc5360a3cf796fddda9db2b18ca9171558e6158fa4b0b1d0461d9a46b9b958d629bd62a29ee3942238e0fa83e932a66abb1b50c5f37" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd28c343c1df97cb35bfe600a47b84d2e81ddae4dc44ce23d75db7db8f489c3206"; + bn_t sig_s = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd28c343c1df97cb35bfe600a47b84d2e81ddae4dc44ce23d75db7db8f489c3204"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "016454afca385eb53eaeaab711537d95c50e01268b100a22656adf5cedf68b4a78a6c14a70245df707f6565ce15948c2e38e3d90e05dda3188ab43a73f30dbc6bda8", "0151dca6dc5aec84fa35c79f21365993f0b267ca486ea66c2186a52a3fb62b53501ce2822d4691fbc25cf27adb70734071be523b9231dd8d33a401dea00cf0ae30a1" ); + { + // edge case for signature malleability + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd28c343c1df97cb35bfe600a47b84d2e81ddae4dc44ce23d75db7db8f489c3206"; + bn_t sig_s = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd28c343c1df97cb35bfe600a47b84d2e81ddae4dc44ce23d75db7db8f489c3205"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "60daf59638158ed9d3d7e8428501334764162f9be239e168fae9af348c30a7be1cfa4d9636c3bb621d7e0aa71446f8d4a37f2d43274a4255b226f612382f63152e", "016e48300124a636b206fad4d0355862a852623799afee941e864d96dcbf55b801cabd6249b6f567506d5a503e7d03b4764c70fc44c5365f32c3603678476d62b09d" ); + { + // u1 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "000043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "51fe6a35a85070c7c29502a87672a38153d799aef734226b64d8fd3398621701117f0af9d9afaf6dbb8ca3007255dc79b0f41ed552512cb29207b15a01cdfdfaae", "01a16c61277586356efadcb24764f21f574ef96f2caabc3f47fa66fb8719d7785824061c2d6d7a4bcb851540e62b2f00960b283eac7808d1813ef51b46e1149d3e4d" ); + { + // u1 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "01ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94fdcdefd78dc0b56a22d16f2eec26ae0c1fb484d059300e80bd6b0472b3d1222ff5d08b03d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b4ffc0fff087607ad26c4b23d6d31ae5f904cc064e350f47131ce2784fbb359867988a559d4386752e56277bef34e26544dedda88cc20a3411fa98834eeae869ad", "009d6e8ca99949b7b34fd06a789744ecac3356247317c4d7aa9296676dd623594f3684bc13064cab8d2db7edbca91f1c8beb542bc97978a3f31f3610a03f46a982d2" ); + { + // u2 == 1 + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00809fba320fe96ded24611b72a2a5428fe46049ff080d6e0813ab7a35897018fe6418613abd860d1eb484959059a01af7d68cba69d1c52ea64ad0f28a18a41fc78a", "01108acc5577e9e8962e2a7cea0bb37df1d0ca4050fb6cfeba41a7f868d988dbbcebc962986748fa485183f6b60f453ec8606f8c33d43767dddbbef8c412b2c37939" ); + { + // u2 == n - 1 + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "015555555555555555555555555555555555555555555555555555555555555555518baf05027f750ef25532ab85fa066e8ad2793125b112da747cf524bf0b7aed5c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0145130dca77d9674dfceffa851b4a2672e490e8fba8277622b0020e2fe9101e76933b0c01d248071f854e9bc523733936dc0b9930cbe154b9a402f681ee3c6cef6b", "0d0c94b2ad28556643aa3d27523048d227a1de82f8a664707e75394d21da181bec82e1afb0e627539531affa849a2409bcac83fb786c351c88bac2fb2e4322e54a" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01556bfd55a94e530bd972e52873ef39ac3ec34481aebdc46680dc66723ab66056275d82bff85ad29ac694530bb2f89c36ce600ad1b49761854afc69ab741ce0294a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00ed3e09809fe5985818f90592fd06e71d2c493d9a781714c9157cbafa5ba196b987fd49ae24274c76251c70b9f7970f1f713ad274590a702f463c73a0704831ce5d", "00cac278297093bd9f9ac2d00bef3d67a01b43b28b9f829407264c738117438300c7704772976916ea102a776262ccf4222cc348c34aac683d8f00179a348323babd" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "00dcf9e7f441448a125b96d72b989d9f4dac7508c7e036f6080d4758e736f5e0636b0ff503f128a98d08e0ae189921065219d2cc3aa83e3c660ca0cb85e7c11a24d0"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0ac2c5a4c79309a5132d5d7494befb3905d33fda5f80eeaf63775183aae7af108a3d97f3a441532cf6fac47f6c898329d69182e1fa07ce45997ebec3781c9ad741", "0173a5b6b80a8b73d30ac97e1a4aacb773c1ad692c5ea63f68e373842782bd677864ff656cf8d1e6ec1e58e9a83856ef92677555916749fb95e800ae2e011618ca3a" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "0066eb57733c19a7003cf8253279fce41907bc4f127153c4576dd4814f8b335a0b51560b4447f0382c69b3fe509522c891f0eec3999ad2526835f33ae22a642843af"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01eb2a353dec6b460fbda49c67f431190fff6f195639c226ef8fefcbf191d72529a12cc5485b282a52704c1fd84529a1aa0ad794f96493e299718d2618a1b83a526c", "01f704604d5b2b94a42bfc3ab93317d66a54de15258337433fc96a965d8e2d056fd1134b7989d7b3f709adc28227bdabc11fe2f359c6a6e5111ab43379ca25b66f2f" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "017106d1131b3300d7ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc79527ac09f0a3f0a8aa38285585b6afceac5ff6692842232d106d15d4df1b66aa8"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01e43dfecc7e6caad03d17b407322c878f701c5add6eb2afcd786ff3803622dfbb6baa01246e1ea059f7b78842919b2507daa9e3434efa7e8d3ae6c35499f82d0ac8", "018b0e4d6378222a07ccdb4214001f97b1a503d1aac3ab925ea64faa9c739ba04ee3480b147cb07f93edf40b6856a22f4159c3f5cd6c9e7165452907c8d02fab201e" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "006d1131b3300d7ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6ab94bf496f53ea229e7fe6b456088ea32f6e2b104f5112798bb59d46a0d468f838"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0141a4d714628c192b8ace1a42854da06e0e1ddb82a07618e4efb05d7095cd1eb65425078160594715eaf59fcb41c9e573fe10298c75c9e9135c775ca73f63d13aac", "0089524b475170d4391cc032a0543ea22dab60ea07538f3a37607f0d4ed516634fde545e2f0a6ba8d0d2fe6aded0a771b4b134a5a280e54799fa476ef0ec87d44e1c" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "00da226366601afff780ffe082a0db8e74ea10d4864a5f6876c64f5e78d6598fad57297e92dea7d4453cffcd68ac111d465edc56209ea224f3176b3a8d41a8d1f070"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0147fbcc65d4818e029e0a3af13a1f7c90f0605a00cd0781200eb656a591d669a787620e6fc8cc594aa28a0b0f2939ec73472c494e09cecaf5f331dafd32d5ac31c3", "75432bdaeecaa0bec7feddc298c565723fb669ee76e38a4c5ff1701f1b38cda9dc9ac43bff18da2047e4dcd80c05a7bb7e7464829d608b68176b04c87f409f46d6" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "011b3300d7ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94cb85df5e6c1125394fcd34f6521ffdaddd98f88a99fedcedd9384288bb793cf2f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00b5b1c3998589b25c96a700bbd450d04da1f273df8053767a3b03ed1a763ed089c0de99bcf54d49c1520d3a09b845296f0445b3bd5b87918d3752cf651e0ff3007b", "00e896380876b9419c56096914ff6eec01aee247eefef0741895f14ee280f360e11508c37826af82cd915b9002f046cb51008d9ead21124c591bd8265d1492b35ffb" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "0161be37ed5f748e06a89d72c4b7051cae809d9567848b1d8d7ed019221efb06ae81e1264ce49c5d29ee5fe22ccf70899002643aca7b99f57756f2639b6d459ae410"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01aadb41fadc35cf6d11a7c7d01d049b74b37677f04e1bd3dc08450fabae28adcd2d135f966616d283fb18a5e69eabfe7ec41e1a0edb3682f1d39f2af64a94d602b9", "014ae81ebf5e3d2d0529479d4ae8eb05f4b42e519608466ad69e7662d6e9b236765f9be535c058f00f0866bbb4b172ef47a03cb97c58dde5750344bb293035f8e97e" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01e9bbbd64270b9668f7623ef7cbead5483eb07b883cf39fb6884aab67dac7958b0e03144357b9433e69adc696c86c63a23d35724cbd749b7c34f8e34232d21ea420"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01b706fc3f4aae5b86da261a66fbce47eb3b3e1e91544a40a9989fccf74154bbecac042dbbbf411a39090058b62c46fccd1d5eaba0c4879a688ea5fd0a7b4f9a0b4f", "01eda01930c6b22745a97f2d59e182598dfdfbfdb463335293901de7fc9d49cf55ed7fcf5d767d4c22f89f171b4137c8415c3ed438089270c41f88eadef3018140e1" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "00924449b6c96f3758e3b085c079714f11f28d039b11699f0e9b3e7c553c8fc6c8f5212fec5eac3068713b8ec72fc6e2a90872b94e161a89822887f4a9bd5c9efd74"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "58a1fa96111bf30be76c3b8ba4435666677b6dd05031b5c4a840e1ea81f6025f70e1d395ef63cb59fa71e3674cb678f7250887f5d734e3ec377dbe3ae637d24f82", "7a4eaf02cc57e658b5b9fa08ee30e0ef5b3429bb5a10438b0e05bacaebc60317010a334d7f896028aef620f5d9c7cabc38306e032b1b91c2376c3fef3e455a10df" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01554a01552b58d67a13468d6bc6086329e09e5dbf28a11dccbf91ccc6e2a4cfd4e6a2c5278791c6490835a27b6f7abb8a690bb060de3deb85093d3ae16482c84f64"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "303ba5ef90b05110002fdf74d2b8d4c7ab189c64004859c69d7c4730fcacb5f4d9b761ae987d1f3b63bb3ecb78aeecf4a04ff60f5f367a96ac2da8da27a3687a3e", "6673d0d4ccd4c3ce1abc9980fd1885002c3e7b86078214caf7f0962fa51e116363032d7a1b93c92a4d62827549d5a33e4e6b9b6c2ab6ad9c2a15e410c5b1a846b2" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "00aa9402aa56b1acf4268d1ad78c10c653c13cbb7e51423b997f23998dc5499fa9d2f403c78b645cfba4eb78f595fe6d6f01dbaaf803f23ac263bf060baa74583abf"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a94eea843a5c49637041598e30c381f7173bf8cd127f3caf5c16cbc728aa4d99173fb38d6a1b1ec21e40336e8d802249272b0ccbf4f8c3636ef66290a81b58fa5b", "01116c23464fad61df8d2d5d1250a5a4c427e9c58e2cf1d059cdd88a7c34984fdd22a4cf18411e1b0224d444a5bd39d5fc97fc0b3648600f19d6ab80aa6a7c083a17" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01ffde03ff820a836e39d3a8435219297da1db193d79e359663eb56654a7ee6f7eb996c8ef12f62344ad211b71057928f96ae75b58e23026476cfc40ed0ef7208a23"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "014f71d2ca5bd2051336854657f09a1fab14c7f2f7865d71bd3fa354bf27b69dc8738972140553b525658b6fd203cc05ca0822e0904bad21b632e0de74a2ad3f0e72", "4525f90519f9497425460b31cbb69ab3701a9ea68aaab72c6d65d364d0f0ed4d0524280f113bd69ef1ba9825202b10287a088c4bf30debecb720ac0739ec67434d" ); + { + // edge case for u1 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "013375abb99e0cd3801e7c12993cfe720c83de278938a9e22bb6ea40a7c599ad05a5d3c8e5e5d7b3e16a99e528ef0ce91be0953cb1a9adf757f257554ca47ab053dc"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01d2ecad921dd100a8dc1a7b824b0ac6c9b654ab179833c2881ce237f1b8497ade851302cf50ea5ea169c2a50c0c09cb6ea539a7290a0f3437044b7a2e9ca8d40500", "3fd5651535dcba1f331981c216a1c7d9842f65c5f38ca43dd71c41e19efcac384617656fd0afdd83c50c5e524e9b672b7aa8a66b289afa688e45ca6edb3477a8b0" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "005555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555554"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0165d67972a48fddc2f41c03f79ab5e0d42fd0992c013ead135c3394049645e26ad7c7be96510df59ba677dc94f1146e8e8e8fbe56debcb66920639581956b92b4d1", "008aeb66ee0be18abaa909a973c70b5749d688f8e2cd2e6e1613af93d0033492d26a6e82cfb80ac6925ac6bc79b984f73e3ebbff2f223a38676891c1ecd784a8a789" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "009f57708fa97eba94c6d4782cdd4e33bb95c1353bde095232e3e2bab277bb5d2b48f55a53ffe928d034c29970a9e5f384a003907d3d9b82a86817cc61fb17f4c59e"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "018cd11252f0a434f446d3af18518c6b84cb0b7bf33758b4d83b97c2a56e0037b54d57d2b0b842e9c17d70504e01896389c066db8f2bfec025259a51dff514668308", "01cca54365156c59e2c73c17664f09fcdcfd5b910f9ab48d0899b6a7064de8b80fc7a992e47ee7f23ec82fd80179a19f4cf89b4c02b7218f435298da5d322a982c1e" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "0068d98fa90736eff3e90f8fcfe50838b6fa0bf2cde77bc51e3f41019c8006f4e9cbaeadce7dbb44462da6425be9cfdaecb234c41749ce695be1b5ead2e6b1205f35"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01d6329a8afdea27cf1028a44d19c3c72927590d64628775f324514c81de301aa9be9c775c53a6349d1cbd5ecfc7bd39b373e613a10c1439441b141430fdadac168c", "071342d63dba901b93bdc444a1fe2ec6a15108bdf49eb1dfd218373884520d84bce03c5012f5837051cb8abf6a0be78dfdfeeb3a5872dff75b3f874faa6d2243bf" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "00e97ae66bcd4cae36fffffffffffffffffffffffffffffffffffffffffffffffffd68bc9726f02dbf8598a98b3e5077eff6f2491eb678ed040fb338c084a9ea8a4c"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01c963b64cdc3ecb1c35cda5ced9419ac146b060adb04c638cf6b66658013cb25e915a6ad0055668342881ed27f438b50ae4bb86ae3c7c02b727a130c77bad698008", "481bfffaead856b4137fd4268ecd74a6c2d4bd6cd13998ce7f0e828b220135d8df23253e681dc90673e0537e7590769a2a441aaaaa3a9901c4fbe44fa9513951ef" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01ae66bcd4cae36ffffffffffffffffffffffffffffffffffffffffffffffffffffb3954212f8bea578d93e685e5dba329811b2542bb398233e2944bceb19263325d"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "5dfbc867d53c57b2945502b8e56d96ca2d4d485aa33452200a2f4ba16042357976afeecf3e63b2fdcd5cdd76076c1a73e496caf9d6de3e8831d955d138e05884ae", "01e04aa0b5360a0d3badd0120fbb8cc42a38bf1c61755d00858e40e4b10da4ea2575830dc92e312c20af2b8b167d7a58d178661d48cd932fe47a4bc7145e620ae22c" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "015ccd79a995c6dffffffffffffffffffffffffffffffffffffffffffffffffffffc2121badb58a518afa8010a82c03cad31fa94bbbde96820166d27e644938e00b1"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "78be6c43e366cf63ddc4235e8b969386e95012fbca5cebf1b0a6fe3c03c1257df7cf47b002eb6c4497f310bff6131b5ccb54fd0e8ee7fcf6b49d487e1b54508f68", "009b61a547104c8516e0dc35d3d17659ca098d023b0593908fe979c29e62373738a3c30094ba47105a49edbc6e1d37cce317b49d2701470eeb53d9b24dce9d809166" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01cd4cae36fffffffffffffffffffffffffffffffffffffffffffffffffffffffffae18dcc11dff7526233d923a0b202cb29e713f22de8bb6ab0a12821c5abbe3f23"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0093f68961005f3040dc1a8ff1416c917bdcc77f1dfa85506c3bb62dac47f7be9529b4cbe57dd2c19e860bd2a0db71d47ef1eca8a20bfc3e0bc5e05c8303001c1960", "2b9a3d45f2f5120fee06445f0d34e6138e3ac5b16d2a22f0460cea258c368ca9e478eb7b8253e7c6f2f7250fdc7dcd7243761f8d56f2350ac51e47ee063f41da31" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "0022e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b9c4c3f73cc816143fac3412b62de4c63db08f8c57e4c58c31f1b457ca5e57e20a"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "2d2d7d40bf17c4e8b18757e451ddded95e6b1007cd144809d21af31353b03038372c4af204d4414b71060b48b3a8439c632809bd33c4736263044405a1ad766e36", "00bb0c5a8848f93fa3e85376b012bf064e303746529a673b852bb5a969c24c0156a8dd26242d0aad4bae43e23631b01fb9d050f9744b59f3b52b1c572217a1d70588" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "010590b21642c8590b21642c8590b21642c8590b21642c8590b21642c8590b2164298eb57e5aff9343597a542d3132f9e734fdc305125e0ec139c5f780ee8e8cb9c2"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "018ac11dfe62d1f2a8202732c79b423d29f43bec4db6080a220796a10f2685f92c71c7f72d9da0a8acb22680cca018eba2e8ba3bfde1db9a4ef3b97da16474364e96", "5aad3b286707bd3ad07a060cabca49c53de4f56c05a0a8de40fd969d7d4f995f7c6701fe5c5321f85318b98be66251fa490088fd727da2454e00b3b94dc6e1241b" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01a4924924924924924924924924924924924924924924924924924924924924924445e10670ed0437c9db4125ac4175fbd70e9bd1799a85f44ca0a8e61a3354e808"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "51b2c3e0494564ed48ed3479b596ea4078240550a3c28da33d71d259e8e623e37ab43f396c49363f31c8de8a4644d37e94ed80e0dd4f92c3df2106e2795c2798b8", "00a530d5e961f0696bbeb962aca8e71f65956ae04cdc22a4ac65146943e99a4a2fdb477df75aa069c8dd37a5daaea3848079a6a7bc03e0faa3d65d42f8053db2078b" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01d5555555555555555555555555555555555555555555555555555555555555554fa6dbdcd91484ebc0d521569e4c5efb25910b1f0ddef19d0410c50c73e68db95f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01ba31a6f9c2d227da57de00759e2e844d607bc9bd92bcdf282006884dc347c9284f0dc0623af1e9db22117364a7a80a5b067efa19b204dac8faf2230d80b704addc", "00d88b761cd3a4b0947bfc17e204b4d751f76880a82c9b7c6fd93ded55883c995002d8b8bfff1e021189c08d829d16b088f4fb39ad9456eafbc77c20353bc0f3c038" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4fc31322e69da41162a76abf3a1b4507ae66074633446f259661a61c93be30eb5"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0137bbb48ef281133849ed723f5662a19fff9cc7389a0170d311bd34f4dbdc656246db695ea0712d8aceff9d1d0ef7921ec2e3f8b533e4ca122f9f7f446073889334", "0163e4500d998095f60fa3fed4149d2d9b5b018e03eb5344efe8ffcc1c7d276e7401a4df639c4ab108820062495471be7b29398aadbae440a9bdcd55cf0bb5d96f79" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640b"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "726dda8b7b6ed25f97f1fc6c3ccf554d60fc71e4fab2a578286d32612e7f3e669faed0b97619aef2d5aff9c8ffd987feddc0d6c38b7eec028191400874803f498b", "00c0b8870c612e06c13c57ed6f7ef3d53b5e5fa2db62707b034b5ec13fb47018e31da7ecc991d575943468d701e118eca33122cf6d394b8a6ec0f45bc09701603a26" ); + { + // edge case for u2 + auto m = "313233343030"_hex; + bn_t sig_r = "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"; + bn_t sig_s = "01346cc7d4839b77f9f487c7e7f2841c5b7d05f966f3bde28f1fa080ce40037a74e3001a2b00bd39ee4c93072e9963724941383cf0812c02d1c838ad4502a12c619f"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "016fce9f375bbd2968adaaf3575595129ef3e721c3b7c83d5a4a79f4b5dfbbdb1f66da7243e5120c5dbd7be1ca073e04b4cc58ca8ce2f34ff6a3d02a929bf2fc2797", "0083f130792d6c45c8f2a67471e51246e2b8781465b8291cbda66d22719cd536bf801e0076030919d5701732ce7678bf472846ed0777937ed77caad74d05664614a2" ); + { + // point duplication during verification + auto m = "313233343030"_hex; + bn_t sig_r = "0090c8d0d718cb9d8d81094e6d068fb13c16b4df8c77bac676dddfe3e68855bed06b9ba8d0f8a80edce03a9fac7da561e24b1cd22d459239a146695a671f81f73aaf"; + bn_t sig_s = "01150b0fe9f0dff27fa180cc9442c3bfc9e395232898607b110a51bcb1086cb9726e251a07c9557808df32460715950a3dc446ae4229b9ed59fe241b389aee3a6963"; + auto r = true; // result = valid - flags: ['PointDuplication'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "016fce9f375bbd2968adaaf3575595129ef3e721c3b7c83d5a4a79f4b5dfbbdb1f66da7243e5120c5dbd7be1ca073e04b4cc58ca8ce2f34ff6a3d02a929bf2fc2797", "017c0ecf86d293ba370d598b8e1aedb91d4787eb9a47d6e3425992dd8e632ac9407fe1ff89fcf6e62a8fe8cd31898740b8d7b912f8886c8128835528b2fa99b9eb5d" ); + { + // duplication bug + auto m = "313233343030"_hex; + bn_t sig_r = "0090c8d0d718cb9d8d81094e6d068fb13c16b4df8c77bac676dddfe3e68855bed06b9ba8d0f8a80edce03a9fac7da561e24b1cd22d459239a146695a671f81f73aaf"; + bn_t sig_s = "01150b0fe9f0dff27fa180cc9442c3bfc9e395232898607b110a51bcb1086cb9726e251a07c9557808df32460715950a3dc446ae4229b9ed59fe241b389aee3a6963"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0110fb89aff135edb801a1cb5bc49525b81dc74da45090d228122871814f489fdcb02ebee46b703e6b4e6af56c5024422b31fd4252c44d0bfd29d945de782d98543f", "01ec425b4c4928e12b619227f1da6d0a9675070d9c5b49ca523050acb718e62643b0e5801543b76dc11f8d694ba09436d8391b477ad2c143ec50c2384c4f688512dc" ); + { + // point with x-coordinate 0 + auto m = "313233343030"_hex; + bn_t sig_r = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + bn_t sig_s = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01c693a3fccbc9f625284239c2725f2a5c90b29b7ce3d07730f7de6031c9e74446d217888ae023aae23df6a4aa153f58c79597d57f42ce5c1354e5dc43a5eb311e13", "015f99658443b2e39c3edcbcda70707fc5a4d39545eabe354816d09284a6265e47ebf0a47355828e818a767f8452a6d18451e0e3817a896ff404cb1611bfc4c4b4a3" ); + { + // point with x-coordinate 0 + auto m = "313233343030"_hex; + bn_t sig_r = "020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + bn_t sig_s = "0066666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81401"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "017d7bf723678df574ce4366741e1d3787f834af9997b41c8260a074cb1f325d2bae9f8565dc6b51b6cb02dceeb5a1b774ee8dd7057c99e2d94c3c71299a9ce0f1b0", "0162c65632fff88bdbb17ce2525ccac8df37c501ab0e6626e273fb6cf99000424344c0ac539c9fd6c4f3d28876b257c010d347a45bb010cc058443843a758328d491" ); + { + // comparison with point at infinity + auto m = "313233343030"_hex; + bn_t sig_r = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + bn_t sig_s = "0066666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81401"; + auto r = false; // result = invalid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01e06db423a902e239b97340ab052534ead37e79412c675bf0eb823999e6b731040bff2b0e4fa64edf3962a328921ea5ae4e8f4079eab439e12f92335dfc4863c07f", "7ee9f0ecb409cb133c0cd08b85e840b076f3d615e1ef1393b5222338b227d768003da5f3ba1f72f6654ca54ac11c2ba91a6cb5883d6d1a82304ad2b79de09215f3" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "00433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d"; + bn_t sig_s = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "015053744d53811dbed8880f38d3a34578a7f1c172ec65bd8ad8183ba0ae10093416107f3c942742bde60719949b2c4f026f43582125c99ed48cbc7c5a051a5a7448", "00b36d4c91a2b0367c566b2c12981ce0fdbc3beb983717403f69bf4264fc6182478af0b236ff120bcfca116924c552abef6663b6023be1986b70206d9bb89b5ed298" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d"; + bn_t sig_s = "00492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01fb2e26596cc80473917dd46b4a1d14bd9a1ca9769dd12bfac1bff17cdc282e74c73a801ec1be83edfe4bfe9813ec943ac151678f0a9a0bf27d9ef308177eb0400f", "019e03a5da3da67e6b8d068dbdacf091b9d5efadaf63f4a7e9c6b6ed0a1c9a5d3cbc3e0244d481066018fba7674a2b59139a5656780563bb4618014f176752e177e0" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d"; + bn_t sig_s = "019999999999999999999999999999999999999999999999999999999999999999950e053936328c7855ffd6676d926e1e402fc4a1606e169fbefc595f4ba7605007"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008422cea9dcf8ae01f7a157888f018a40a66461d3566ec4a4dfc89ecb3c2404be734d329137d630387b012d033221857d5bfb290fa8027640b4063072a3e5b14c86", "25a219e724b81814901a677a8bee9b716b33b16a5b65f2272956a46b5e8683dc896984309ac79449657a1895c9f62bde99c7f5e24ed2defbc9f8dde35ebd0bddc1" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d"; + bn_t sig_s = "0066666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81402"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01bc19cf4b94bcd34114ce83c5f1a7e048e2fc4fd457d57e39b3da29f4766acbaef1c10cb13c796a6fffb56d6a392e47b6c74522df7fa02754c33d95b1a9a3c92a15", "00f5744c2bed308cb4f41b512e632cd01d270ef1a0d3f47ea780e73c6a6c9ea6a996faef4d282896c64fa50f5b04e204c56b504bc122ffba7aea4574d7d7ab6303c0" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d"; + bn_t sig_s = "01b6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db68d82a2b033628ca12ffd36ed0d3bf206957c063c2bf183d7132f20aac7c797a51"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "017b0ebce08b09f21e30d15e0edd9fcdf24ab4831ec8a65a3d1e38f72b15f0115da6ed1885e42fcfae31c0914b71e9df2cd106adc039a82810a92924dd154dc05da3", "00c614d1afc4f63de3803bb5490a34e1e2fab9eb78422b21d377fc0d7f991b938c22f4d7dd665f8dd21fadde43172a55f80d05cc4557b6663f9e7a3fe490d25c5531" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "00433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d"; + bn_t sig_s = "000eb10e5ab95f2f26a40700b1300fb8c3c8d5384ffbecf1fdb9e11e67cb7fd6a7f503e6e25ac09bb88b6c3983df764d4d72bc2920e233f0f7974a234a21b00bb447"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "04c3ec8d7d23ce74be8b9c7c27be869c23bafc6874ebc44f47e107422ab1e75ed09bebd7cb1ec4626e442bcf512a25c5ddde26eb08ba37506461830cf9241cbe9c", "50a1bc08f4ba8da1d641ac3891823ab519facd4159768b1c0738f0e23450f374e4d6de55cceed95722be635c5dc0023a1498862f87bfe61d77e20e592cc20bb2ca" ); + { + // extreme value for k and edgecase s + auto m = "313233343030"_hex; + bn_t sig_r = "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66"; + bn_t sig_s = "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00a7c8204f2864dcef089165c3914dcc2c0896075870ca0bc1ce37856f80f23815b0c8f2ec05145c421049e80ec1e7694f9f04174bbef21bc0972e559cf222de7e1a", "01ff1108c28f01b703820e1c0187912962ab23109618dfcb0c062ccee339002222a3f7dd8dd21675b0e20908fe5855ea876d6a9e02c5f5b793d38fdf79fb83603ea9" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66"; + bn_t sig_s = "00492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01802fc79fc8e55bce50a581632b51d6eec04a3c74ac2bf4fae16ce6c7efef1701d69f9c00a91ad521d75ac7539d54bf464caeec871456103dc974354460898a19c6", "722fc1f528506618b1da9f8b2edbdbdaf7eec02e8fb9203d2b277735a1d867911b131f453f52ccc4ced05c3b1bc29e4d20f1e6d34979faa688ce8003f79d8e0c95" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66"; + bn_t sig_s = "019999999999999999999999999999999999999999999999999999999999999999950e053936328c7855ffd6676d926e1e402fc4a1606e169fbefc595f4ba7605007"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01beb0b4c2e494226404fca4ad505ebfed13d184b1572683215b16173c29a4475aede47f266e0c9c4143137d3e0001f9f0148b689286a7c64e229458b824ed765836", "0130205169783ed9ada9f3a193027ae4e21829ad4a71d05d969605c04f3231dabab03beb2fab07dd8323d7132755734f4e6d1fb43fc8a63bfd244160c23efb6c1429" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66"; + bn_t sig_s = "0066666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81402"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "0121e59aaf26b8301f4fcc3e0a563c4104ae00b47c55b8945ce749116fdf6761d768bd50ed431e2b51e646fe4fe7dc2985b6aefa7f9441ea11840d2ace2f34293cb1", "0cf1e1a46d4d637216e28abd124cc641ae7a673445d573856bc2fec58d86e5ed63bc2a7f2049234e335a7bee95bb2724fb1480c97c38cd0d296cbcc113de3f135f" ); + { + // extreme value for k and s^-1 + auto m = "313233343030"_hex; + bn_t sig_r = "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66"; + bn_t sig_s = "01b6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db68d82a2b033628ca12ffd36ed0d3bf206957c063c2bf183d7132f20aac7c797a51"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "008e859e66d1237fdc928a4b954954fef565d203a0731d065d9df41a4fd3812b1cc2487053ea19ce839d200845952f80d80698771d83ccc1fc7f236dbee4c76b2bb4", "5a04b24c88cd40233fb43c59ea5cf2cb9510d16b1168bc126db64aaf9ab07a7453208fde079095966272bf03bc3312c9b9bab8c795ae375e8a0e8dd81c924e7c27" ); + { + // extreme value for k + auto m = "313233343030"_hex; + bn_t sig_r = "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66"; + bn_t sig_s = "000eb10e5ab95f2f26a40700b1300fb8c3c8d5384ffbecf1fdb9e11e67cb7fd6a7f503e6e25ac09bb88b6c3983df764d4d72bc2920e233f0f7974a234a21b00bb447"; + auto r = true; // result = valid - flags: ['ArithmeticError'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66", "011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "000043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc"; + bn_t sig_s = "00492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "01ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94fdcdefd78dc0b56a22d16f2eec26ae0c1fb484d059300e80bd6b0472b3d1222ff5d08b03d"; + sig_s = "00492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66", "00e7c6d6958765c43ffba375a04bd382e426670abbb6a864bb97e85042e8d8c199d368118d66a10bd9bf3aaf46fec052f89ecac38f795d8d3dbf77416b89602e99af" ); + { + // public key shares x-coordinate with generator + auto m = "313233343030"_hex; + bn_t sig_r = "000043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc"; + bn_t sig_s = "00492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8"; + auto r = false; // result = invalid - flags: ['PointDuplication'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // public key shares x-coordinate with generator + m = "313233343030"_hex; + sig_r = "01ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94fdcdefd78dc0b56a22d16f2eec26ae0c1fb484d059300e80bd6b0472b3d1222ff5d08b03d"; + sig_s = "00492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8"; + r = false; // result = invalid - flags: ['PointDuplication'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "012a908bfc5b70e17bdfae74294994808bf2a42dab59af8b0523a026d640a2a3d6d344520b62177e2cfa339ca42fb0883ec425904fbda2833a3b5b0a9a00811365d8", "012333d532f8f8eb1a623c378a3694651192bbda833e3b8d7b8f90b2bfc9b045f8a55e1b6a5fe1512c400c4bc9c86fd7c699d642f5cee9bb827c8b0abc0da01cef1e" ); + { + // pseudorandom signature + auto m = ""_hex; + bn_t sig_r = "01625d6115092a8e2ee21b9f8a425aa73814dec8b2335e86150ab4229f5a3421d2e6256d632c7a4365a1ee01dd2a936921bbb4551a512d1d4b5a56c314e4a02534c5"; + bn_t sig_s = "01b792d23f2649862595451055777bda1b02dc6cc8fef23231e44b921b16155cd42257441d75a790371e91819f0a9b1fd0ebd02c90b5b774527746ed9bfe743dbe2f"; + auto r = true; // result = valid - flags: ['ValidSignature'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "4d7367"_hex; + sig_r = "005adc833cbc1d6141ced457bab2b01b0814054d7a28fa8bb2925d1e7525b7cf7d5c938a17abfb33426dcc05ce8d44db02f53a75ea04017dca51e1fbb14ce3311b14"; + sig_s = "005f69b2a6de129147a8437b79c72315d35173d88c2d6119085c90dae8ec05c55e067e7dfa4f681035e3dccab099291c0ecf4428332a9cb0736d16e79111ac76d766"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "313233343030"_hex; + sig_r = "014141e4d94a58c1e747cbd9ee6670a41eac3c26fb4db3248e45d583179076e6b19a8e2003657a108f91f9a103157edff9b37df2b436a77dc112927d907ac9ba2587"; + sig_s = "0108afa91b34bd904c680471e943af336fb90c5fb2b91401a58c9b1f467bf81af8049965dd8b45f12e152f4f7fd3780e3492f31ed2680d4777fbe655fe779ad897ab"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // pseudorandom signature + m = "0000000000000000000000000000000000000000"_hex; + sig_r = "0008135d3f1ae9e26fba825643ed8a29d63d7843720e93566aa09db2bdf5aaa69afbcc0c51e5295c298f305ba7b870f0a85bb5699cdf40764aab59418f77c6ffb452"; + sig_s = "011d345256887fb351f5700961a7d47572e0d669056cb1d5619345c0c987f3331c2fe2c6df848a5c610422defd6212b64346161aa871ae55b1fe4add5f68836eb181"; + r = true; // result = valid - flags: ['ValidSignature'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a", "009b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625" ); + { + // y-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "011c9684af6dc52728410473c63053b01c358d67e81f8a1324ad711c60481a4a86dd3e75de20ca55ce7a9a39b1f82fd5da4fadf26a5bb8edd467af8825efe4746218"; + bn_t sig_s = "0034c058aba6488d6943e11e0d1348429449ea17ac5edf8bcaf654106b98b2ddf346c537b8a9a3f9b3174b77637d220ef5318dbbc33d0aac0fe2ddeda17b23cb2de6"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "007c47a668625648cd8a31ac92174cf3d61041f7ad292588def6ed143b1ff9a288fd20cf36f58d4bfe4b2cd4a381d4da50c8eda5674f020449ae1d3dd77e44ed485e"; + sig_s = "01058e86b327d284e35bab49fc7c335417573f310afa9e1a53566e0fae516e099007965030f6f46b077116353f26cb466d1cf3f35300d744d2d8f883c8a31b43c20d"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "01e4e9f3a7b800de63407b8703ac545226541c97a673566711f70e2b9ccb21a145ad4637825b023d1ea9f18e60897413711611a85c1179bff9c107368f1c1b61c24c"; + sig_s = "01de948ee577c3d4e4122a52ecccac59abb6fa937dfb3e4b988cb243efe98740309452ba013112b225b3b1b1384d5f68796845199a2602a8d4505a331b07d101188e"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a", "01ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da" ); + { + // y-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "00b6cf64861a2b16e33976095dbf45a592c7c24228c4a1dd727f303d5eeb87e5388ad05c328f824c40abd3e6ce003fef5cd59dee0069ad6348ea6e57f90f6bdc0a82"; + bn_t sig_s = "00228181c180366e5451dfef3593ce664804cb42d5a8d5046b816b3daf6602fafd9ac2dc24b8c93a10024480882558b6ad3d9e905923dcd0fd2a11964754a9b46b8f"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "0093c8f766827d6dc15c810fa30433153a5e742859205ee8389fbf695c8840dc917440870acc5b160087ffd0cd9a6081029c60a7c26d5e8aa9a0570f4efdeb13dea2"; + sig_s = "012ec3bbf75a0ad3df40310266648a36db820217ed7fa94e9c8313e03293ef4f6a40e736fb8f208ad8fb883ca509d48046910523645459c27829d54431463b2548c7"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "0152388c6da66164b706b41dd4dd48176d6eaf6525f876ef0ff2d147f6966ebfadf1767fa66d04203d3ec9c937a1f0c945aed953e34be444c219fd3b94d3277aa652"; + sig_s = "01658c1e5b2e563a49d11c883d05c491d628f0a92c3e3dc8db9a4c8d5f0dc846ac22af8b3c5fb5bbe2cfa98614dcffd87de1cee2c5912a5899505a0c5bcaa513e2c6"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "02fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b", "01993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5" ); + { + // x-coordinate of the public key is small + auto m = "4d657373616765"_hex; + bn_t sig_r = "010e89470f981d2c7c5c96587121a67323bb96ff2427739d0d885ea277293efa3b25c0bda04d81466198a3cbfc441f1b1b98f6bcdc2589d9d91a17a7899f70d0461e"; + bn_t sig_s = "017351b0da8c8d0e4aa0974669d190fa2f90aa50227160594dfb55755002365441de17ea42902128a6f81e554177ed509c0cec31fd5053fae03f62ff76579ba92bda"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "011094ac23ca46a3e2b4ac3baae6504f1bfb3ddf2db9ab40eda32d8e0a05727998f8552a033bb05241e826a86a1d03014eae3aa5fe1a45caac1db3e8138b9cf59068"; + sig_s = "0147edb15a5080ee2f929f78b6ac86604aae51b674fa46eaae7fdfd90bf64d6189341155f4eba937eae74c9e480eb4fb7e6aafd4285e7fc503ee6ec20f0b1415be06"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is small + m = "4d657373616765"_hex; + sig_r = "01d876ae174da31e128babff9f1d15507660bdc7958750844dc4f4291f75a882a22f177f704be6067bf7ce8f06b8626d971e6ef5dcb666fa975c1e11126e04fccce2"; + sig_s = "01abb12630a68b669e6ad2d8d62654d75dfbc6b54a8e3a9c915be663e080ddcc348e57a10e2b1dd9f03e1b897796ad889b075e5919dc5bf37a112d92c693456e6457"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "01fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca63331", "01b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6" ); + { + // x-coordinate of the public key is large + auto m = "4d657373616765"_hex; + bn_t sig_r = "004ed692af1ed1b4bd5cea3aa8ddc6f3f15d8a6ee0016fa0e8eb958580e7421832ecc0e387c34aafac6380bac419ea45c42ae6426af503847f22c49c2f456338c1a7"; + bn_t sig_s = "007aceadde02ace1668bc1a3360d34e125afde230f536c154d91e6c876bee1d34ae06edcbbca0c7cd17646840913164740b12e2e224fe3ef3dec6fd84a81b581c188"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "00e01094048fcf7a1e2ec66faedffc40f48c9c93514325bde6b4958d80f0413efde7eec1dc6de65f96009c069397e51da2eb1729efa287afd5552b25a9e427a6d836"; + sig_s = "01489e7e124f66942e642de992e60b3a86fcce576767719390c3a312fcdeaa560a7fbb0cabb35e05a6d6f3499160fd2dba12d29b613b16dec7494c950d65fdf11fa3"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // x-coordinate of the public key is large + m = "4d657373616765"_hex; + sig_r = "01d296292213380de133dc66eceb8bd857a5c468afe855c05da9db937373b51f9020ca11353415da76bb6af997a486d2370e31adcc0a4531952a3b59428678ee5943"; + sig_s = "015979a3c609c2c2099ae1b290da3d613b248e3a10de7ad770dffc82fb33e74fc3207533f97285cf4557a6407e9a775e59efeaee4264b2634933a6baf8c406f0c4a9"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + + pubkey = curve.make_point( "00c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd491349", "08bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff" ); + { + // y-coordinate of the public key has many trailing 1's + auto m = "4d657373616765"_hex; + bn_t sig_r = "01ef8f785c51a25ae2cd93487b5c848d4af133217a91f51359c966e7538e68743578122df5830002f96f6fadb5bc44480e3b3b2c804e4c51cf95d059d5646c5cef21"; + bn_t sig_s = "01ba2276cc003e87bea37c3724e58a0ab885f56d09b8b5718f674f9c70f3b5ecfb4ad1f3417b420ec40810e08826efa7d8ad6ca7c6a7840348097f92b2de8d6e080b"; + auto r = true; // result = valid - flags: ['EdgeCasePublicKey'] + auto d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "0155978adc4b570d897511f5ecfb65a31947e6e989da17dea716625bb3fa7b92b853623eb0cd9ce2a5e2b4d8c1c2a90ec04fe79d012576ec728a45c5ce47c6d500c0"; + sig_s = "00f79fa8b94ee282a3d1815892cbf15d7ebdf62cb042c76bb3c710c23e32b75992cc249d84072198e4ed63d72435a07d2ed76f278d7399f61a5b5c997f45692fed22"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + + // y-coordinate of the public key has many trailing 1's + m = "4d657373616765"_hex; + sig_r = "01a2af29c58184ca861e7cd931f39cea064b199eee563f241cd5ecf6ebb2ade728f1be23cf007ebe8ef0c42d99f9f5190f6815446afc3043a820d7daf27e86b83b8a"; + sig_s = "01a2acd1822eb539383defff8769aad8bacd50cd24ca7aa6670671418110177808c3f4fbe6041b9cb898359ee61e04824adedd62b39fe5791907a20586333bd3c76d"; + r = true; // result = valid - flags: ['EdgeCasePublicKey'] + d = eosio::sha512( (const char*)m.data(), m.size() ); + test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve ); + } + } // End of Google's Wycheproof tests ecdsa_secp521r1_sha512_p1363_test + } + EOSIO_TEST_END // ecdsa_secp521r1_test +} diff --git a/tests/include/ack/tests/ecdsa_test.hpp b/tests/include/ack/tests/ecdsa_test.hpp index be7415c..dd6d317 100644 --- a/tests/include/ack/tests/ecdsa_test.hpp +++ b/tests/include/ack/tests/ecdsa_test.hpp @@ -1,14 +1,26 @@ // Copyright © 2023 ZeroPass // Author: Crt Vavros #pragma once +#include +#include +#include +#include #include #include +#include +#include #include namespace ack::tests { EOSIO_TEST_BEGIN( ecdsa_test ) - EOSIO_TEST( ecdsa_secp256k1_test ) - EOSIO_TEST( ecdsa_secp256r1_test ) + EOSIO_TEST( ecdsa_brainpoolP256r1_test ) + EOSIO_TEST( ecdsa_brainpoolP320r1_test ) + EOSIO_TEST( ecdsa_brainpoolP384r1_test ) + EOSIO_TEST( ecdsa_brainpoolP512r1_test ) + EOSIO_TEST( ecdsa_secp256k1_test ) + EOSIO_TEST( ecdsa_secp256r1_test ) + EOSIO_TEST( ecdsa_secp384r1_test ) + EOSIO_TEST( ecdsa_secp521r1_test ) EOSIO_TEST_END } diff --git a/tests/scripts/rsp_ec_gen.py b/tests/scripts/rsp_ec_gen.py index 77a4a29..290e1fa 100644 --- a/tests/scripts/rsp_ec_gen.py +++ b/tests/scripts/rsp_ec_gen.py @@ -5,29 +5,35 @@ import collections, enum, os, re, sys from typing import Dict, List, TextIO, Tuple, Optional -curve_pattern = re.compile(r"^\[P-[0-9]+]$", re.IGNORECASE) -curve_hash_pattern = re.compile(r"^\[P-[0-9]+,[A-Za-z0-9-]+]$", re.IGNORECASE) +curve_pattern = re.compile(r"^\[[B,K,P]-[0-9]+]$", re.IGNORECASE) +curve_hash_pattern = re.compile(r"^\[[B,K,P]-[0-9]+,[A-Za-z0-9-]+]$", re.IGNORECASE) -supported_curves = ['P-256'] -supported_hashes = ['sha1', 'sha256', 'sha512'] +supported_curves = ['P-256','P-384', 'P-521'] +supported_hashes = ['sha1', 'sha256', 'sha384', 'sha512'] curve_var = { 'P-256' : 'secp256r1', + 'P-384' : 'secp384r1', + 'P-521' : 'secp521r1', } curve_sizes = { 'P-256' : 256, + 'P-384' : 384, + 'P-521' : 521, } curve_primes = { 'P-256' : 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f, + 'P-384' : 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff, + 'P-521' : 0x01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, } class TestType(enum.Enum): Unknown = -1, - ECPKV = 1, - ECKeyPair = 2 - SigVer_ECDSA = 3 + ECPKV = 1, + ECKeyPair = 2 + SigVer_ECDSA = 3 class TestVectors: def __init__(self): @@ -79,12 +85,12 @@ def normalized_hex_str(str: str): return '0' + str return str -def parse_ec_test_vector_entries(file: TextIO, offest: int, type: TestType) -> Dict[str, List[EcTestVector]]: +def parse_ec_test_vector_entries(file: TextIO, offest: int, type: TestType) -> Optional[ECTestEntries]: if type == TestType.Unknown: - return {} + return None key = '' - dictionary: Dict[str, List[EcTestVector]] = {} + dictionary: ECTestEntries = {} entries: List[EcTestVector] = [] tv = EcTestVector() curve_name = '' @@ -146,7 +152,7 @@ def parse_ec_test_vector_entries(file: TextIO, offest: int, type: TestType) -> D if len(key) != 0: dictionary[key] = entries - return dictionary + return dictionary if len(dictionary) else None def parse_rsp(file_path: str): header = '' @@ -165,6 +171,16 @@ def format_var(var: str, decl: bool, indent_size: int = 0, var_type: str = 'auto str = indent(str, indent_size) return str +def get_hash_func_name(hash_algo: str) -> str: + if 'sha3' in hash_algo or 'sha384' in hash_algo: + return hash_algo + return f'eosio::{ hash_algo }' + +def format_hash_func_call(hash_algo: str, msg_var_name: str) -> str: + if 'sha3' in hash_algo or 'sha384' in hash_algo: + return f'{ hash_algo }( { msg_var_name } )' + return f'eosio::{ hash_algo }( (const char*){ msg_var_name }.data(), { msg_var_name }.size() )' + def tvecpkv2str(tv: EcTestVector, decl_vars: bool) -> str: test_str = '' indent_size = 4 @@ -221,7 +237,7 @@ def tvecdsa2str(tv: EcTestVector, decl_vars: bool) -> str: test_str += format_var(f'sig_r = "{ tv.r }"', decl_vars, indent_size, 'bn_t') + '\n' test_str += format_var(f'sig_s = "{ tv.s }"', decl_vars, indent_size, 'bn_t') + '\n' test_str += format_var(f"r = {('true' if tv.result == 'P' or tv.result[0] == 'P' else 'false')}", decl_vars, indent_size) + f' // Result = { tv.result }\n' - test_str += format_var(f'd = eosio::{ tv.hash_algo }( (const char*)m.data(), m.size() )', decl_vars, indent_size) + '\n' + test_str += format_var(f'd = { format_hash_func_call(tv.hash_algo, "m") }', decl_vars, indent_size) + '\n' test_str += indent('test_ecdsa_verification( r, pubkey, d, sig_r, sig_s, curve );', indent_size) + '\n' return test_str diff --git a/tests/scripts/wycheproof_test_gen.py b/tests/scripts/wycheproof_test_gen.py index 4da80eb..011096c 100644 --- a/tests/scripts/wycheproof_test_gen.py +++ b/tests/scripts/wycheproof_test_gen.py @@ -10,10 +10,12 @@ #supported_schemas = ('rsassa_pkcs1_verify_schema.json', 'rsassa_pss_verify_schema.json', 'ecdsa_p1363_verify_schema.json', 'ecdsa_verify_schema.json') supported_hashes = ('SHA-1', 'SHA-256', 'SHA-384', 'SHA-512', 'SHA3-256', 'SHA3-384', 'SHA3-512',) supported_mgfs = ('MGF1',) -unacceptable_flags = ('MissingNull', ) -rsa_skip_tv_flags = () # Skipped test vectors with these flags -ecdsa_skip_tv_flags = ('BER',) # Skipped test vectors with these flags -supported_curves = ('secp256k1', 'secp256r1',) +supported_curves = ('brainpoolP256r1','brainpoolP320r1', 'brainpoolP384r1', 'brainpoolP512r1', 'secp256k1', 'secp256r1', 'secp384r1', 'secp521r1') + +unacceptable_flags = ('MissingNull', ) +rsa_skip_tv_flags = () # Skipped test vectors with these flags +ecdsa_skip_tv_flags = ('BER', 'BerEncodedSignature', 'SignatureSize', 'MissingZero', 'InvalidEncoding') # Skipped test vectors with these flags +ecdsa_skip_tv_comments = ('r of size', 's of size') rsa_schemas = ('rsassa_pkcs1_verify_schema.json', 'rsassa_pss_verify_schema.json', 'rsassa_pss_with_parameters_verify_schema.json',) ecdsa_schemas = ('ecdsa_p1363_verify_schema.json', 'ecdsa_verify_schema.json',) @@ -22,8 +24,14 @@ supported_schemas = tuple( rsa_schemas + ecdsa_schemas ) curve_sizes = { - 'secp256k1' : 256, - 'secp256r1' : 256, + 'brainpoolP256r1' : 256, + 'brainpoolP320r1' : 320, + 'brainpoolP384r1' : 384, + 'brainpoolP512r1' : 521, + 'secp256k1' : 256, + 'secp256r1' : 256, + 'secp384r1' : 384, + 'secp521r1' : 521, } ans1_error_tests_to_skip = ( @@ -36,7 +44,6 @@ 'length of sequence = 2**32 - 1', 'length of sequence = 2**40 - 1', 'length of sequence = 2**64 - 1' - ) class TestType(enum.Enum): @@ -225,11 +232,15 @@ def parse_ecdsa_verify_tv(wptv_json: dict) -> Optional[ECDSATestVector]: return None if len(wptv_json['tests']) == 0: return None - if 'key' not in wptv_json: + + if 'key' in wptv_json: + key = wptv_json['key'] + elif 'publicKey' in wptv_json: + key = wptv_json['publicKey'] + else: print("Info: Skipping test group without raw public key") return None - key = wptv_json['key'] if 'curve' not in key: print("Info: Skipping test group without curve") return None @@ -249,6 +260,8 @@ def parse_ecdsa_verify_tv(wptv_json: dict) -> Optional[ECDSATestVector]: for t in wptv_json['tests']: if skip_tv(ecdsa_skip_tv_flags, t['flags']): continue + if skip_tv(ecdsa_skip_tv_comments, t['comment']): + continue edt = ECDSATest() if 'comment' in t: diff --git a/tests/tv/ec/fips186-4/SigVer.rsp b/tests/tv/ec/fips186-4/SigVer.rsp new file mode 100644 index 0000000..4ae1a27 --- /dev/null +++ b/tests/tv/ec/fips186-4/SigVer.rsp @@ -0,0 +1,8032 @@ +# CAVS 11.0 +# "SigVer" information +# Curves/SHAs selected: P-192,SHA-1 P-192,SHA-224 P-192,SHA-256 P-192,SHA-384 P-192,SHA-512 P-224,SHA-1 P-224,SHA-224 P-224,SHA-256 P-224,SHA-384 P-224,SHA-512 P-256,SHA-1 P-256,SHA-224 P-256,SHA-256 P-256,SHA-384 P-256,SHA-512 P-384,SHA-1 P-384,SHA-224 P-384,SHA-256 P-384,SHA-384 P-384,SHA-512 P-521,SHA-1 P-521,SHA-224 P-521,SHA-256 P-521,SHA-384 P-521,SHA-512 K-163,SHA-1 K-163,SHA-224 K-163,SHA-256 K-163,SHA-384 K-163,SHA-512 K-233,SHA-1 K-233,SHA-224 K-233,SHA-256 K-233,SHA-384 K-233,SHA-512 K-283,SHA-1 K-283,SHA-224 K-283,SHA-256 K-283,SHA-384 K-283,SHA-512 K-409,SHA-1 K-409,SHA-224 K-409,SHA-256 K-409,SHA-384 K-409,SHA-512 K-571,SHA-1 K-571,SHA-224 K-571,SHA-256 K-571,SHA-384 K-571,SHA-512 B-163,SHA-1 B-163,SHA-224 B-163,SHA-256 B-163,SHA-384 B-163,SHA-512 B-233,SHA-1 B-233,SHA-224 B-233,SHA-256 B-233,SHA-253846 B-233,SHA-512 B-283,SHA-1 B-283,SHA-224 B-283,SHA-256 B-283,SHA-384 B-283,SHA-512 B-409,SHA-1 B-409,SHA-224 B-409,SHA-256 B-409,SHA-384 B-409,SHA-512 B-571,SHA-1 B-571,SHA-224 B-571,SHA-256 B-571,SHA-384 B-571,SHA-512 +# Generated on Wed Mar 16 16:16:55 2011 + + + +[P-192,SHA-1] + +Msg = 0f6be792b3525f87712a85e6ca8113641ca236b1e7b2446edfc081d08e9c28a7bce507d61caa6de3e66002a6ddc020e257353fee70773ee38381cd82e5014ea446777a25bc141da38bb74d922c61cde6c3d43116cff5d67564476e6de0366a99fbba4b811c66ff851f51b25f1db87a2b6a33da0d3e94335b00620754a20bf19f +Qx = 1de0280fbc9fecb9852b43e5ad9afe9e7913785c0dd26281 +Qy = df29c3aad5cc12e09c92dd90f32ee05f2b2522ded35bac18 +R = 5094e6e7982856996dbdd8c2fbec21992426213852d2f772 +S = c44050cbc64b739f0c37851da5c47e3177054ea0b843fdba +Result = F (3 - S changed) + +Msg = fb4f3db57655aa3016d07985c77eb95ffb256cc50d661fb0f30a31aef1ac9968353d6a5d7fd1a3930b88a9297e4d0e744106faa900114b67204d315d7052df8e34991926ca36e9a9933d0cf9f328dfe03b8dea1261962f6a9c6c895f16349e9af319b61390e892abf2326e4ee148ba16f75fc4744f021598f3c09f0c07fa8f66 +Qx = 70ef83c08dff35f0184fa5cff46c182c40c91766e527c624 +Qy = 06fbc81ed89fd491a83fd0da13e50ffe17ba97c404ea12de +R = dc848500dd3825c8d5990536e78355a1318f1a2c7713e7cc +S = b1c2660a11652181c78fea1720b366cade205356bec12b3e +Result = F (4 - Q changed) + +Msg = e3225e4675dd7f95a127c6efce7dd6e6882cf6650776ab0d3dc10a0d1af817b57932422a3282a4b3745197cad609c32834b58b5fb9626035a590664f30c8bb2dbcb78f5b6865f28614763399235ddc2dadc3d41d938008fcb1ee161ab7c5e027c9bcdc78a0fa7c4c674660a03723b38f203490b22876c3fc316710a681e9db70 +Qx = 1a1ac87e30b5d4a66817ca61373bd3e92f0b76508f5af2eb +Qy = 22c6ced9da726112cadd5f521314fda7dd795590348dac7d +R = f9f9b48cee34fbaddce974dc219a70edba13f27781c33a17 +S = 066fcaf44d85fc1a462f1ccc8ac2eec7bad3fa63505722ae +Result = F (3 - S changed) + +Msg = a71f34071adf6f2423e431bb89c0ddf886b9e845ae8086fcfeb4f2f92c8160a5f7f4a5a0fcfcfb3dc4ec2203feabe5d7bfeb5796e4b05a434e7f1969895ab5b6e14fd9f378d2ba6838fb22b60c30848041db05fa0637916ea3367f91ba22e4491f2bc39692af0d2779df1fcadcbec27427216b4ad365a7354d0ea29ca7405902 +Qx = e0639c2bcca7d6ff0a461fad25a308068281a7a766594505 +Qy = bba2c15abbfebbc07d56e7e7938b852e55bd4156cb8bb485 +R = 56bd4daa093dd0aa7553e6484c551d3d59d9c297a9b48ed2 +S = b9dda8aa39d6be8064a916186dbe91fde9e9343377f01b10 +Result = F (1 - Message changed) + +Msg = bf826447a665165a837ed32a13c49e3b57a9e9bce263d1492bcc418b0eefd4093032b62ecd27f1a2031af454077f7858f1e3970050e9b44b98b388b27f3487fdf27adcaae07dc7ab1913dd7983a9744063dd01e976cb818cc7c3a838b50bc55588d41240d97b714d2c2dab550814724250a5a478ad445e154bc8950f8f1aaa37 +Qx = 72a83b1ee3f83034324db4377663c933b4799564b2335bea +Qy = 76b0c9874b94daff7e78881d22e5fcd53a3ea2afd0d118f4 +R = 161e7d162dbeeb5f8d3393df65fb6a136ad867ddd3b85ca0 +S = 301cdf1284766043f9a0cc1eb2f2a21538dd8e618cc46ff3 +Result = P (0 ) + +Msg = f3b53719057f9834234133022f7cb2dccaa8adbfd3ad5e2fb0f7c1ae2a1f8dc2f1b57563c23c438cd78da6d4e7ee601d38fe2f856deb735406d52a4a3159c5e25583497521a2ff3ac59af9e6c530f2ff0f89fa06bbef69df84f0a0f75ad1c437fbd40026ee96b3eef840b5f1db0b9dc8626c76d6f49cefa2cbbb7914f2eced0a +Qx = a523a664117b5df1b9a5c8c6207e38734e71271d0de424c3 +Qy = b4f5ba413184d4fb6e9f91dfb17a0c0915a60c7892ca76ee +R = e49f9a94c4154847d76250e382c48e08e8e844b71a6f0426 +S = 72a40febae3dbef7e2502af9a0d1680099593f86ead4ab39 +Result = P (0 ) + +Msg = 5654ae47eceee7ebc310b5a0f2cf6415d18a8a032f6d8291c57728c39b0d99f80509898c78383f23ee424d6c2435483bcdc5dd33c5584e071c26b7ee3699f8902f3de876c528fa61c9e7db4e104324efae99143c78c8d105a65844eac8e367562d47f656dc73b73c4ec8fd1d2cbab57bcafec7b28aaa812bd21054db8cc63fc3 +Qx = 512c2d323afae47d86b970e620d643a6ec4b0357e21fc321 +Qy = 391f2c6530adda5f2c3b6f168ff81229b026151c1abeeb62 +R = 83a1434e4b2f71e5a0c3c57587b6e94e391f8a8306d018de +S = 9709214e1724a13c37c080d4ec6ea44cff339869731f08e7 +Result = F (2 - R changed) + +Msg = 1087e5ca344f89933472316b1c5f2e96f2ecf02814b1ad3842996969485e87ae83cec09f93e98bd008f2e49ee61ff14991fd41cd93a8df2daa95245132b759d4370cc2fa594e70aaaa70fa178474dcaa105e239ecc92f07987926b08cc2004e0defd2268811f66fd08355e559f5298def1cedf984c2d52de2205df4117b04a2a +Qx = c43d6da5e4a58bb05a0ebb50f5bb3c3128bc31e07ff95c2b +Qy = a8815058936487d59fa756abd024f44f5f349ffa9a6caa2b +R = 2190ec68223d6a88d43b5ad840ed5a9a8ecc4c622ecbee6a +S = 9542ad83d0508c358b5898cc375d288525a06496a571cea5 +Result = F (1 - Message changed) + +Msg = 6d807ed1c714b046588a57e4e755708f04ecb879730c49f2621a679e0c9a50230a0905873eba8cbd42bbe4b5ca085a3a0f14017bbd9f2765764e551180c5472b4c21d11bbc1cafeed5a8765202d81de2c4178793f797a08c3b5601526aa16e252260f067bceab1ed6468d4795bf96574dd6971321fb275a5a6855e8659b64ffc +Qx = bb3ed558d840e89336e9d69ee294eb91801d66e3af7acd00 +Qy = 17b991605489d6a0154bb944db68c4731aabe3efe8e8e4aa +R = 1b5e8edd1ea737d270757571a22239444e8cd6e8f801d7ba +S = 10724a626fb874608ddf350336036a5a5823e975fb0f8938 +Result = F (2 - R changed) + +Msg = 8b44f92646e6ec2e7c60422f5c78080f7448d0fa639ad91042039082fa3711b4515b9d10e8384485533a1ac3cdf77fa45c435c4790fd94f589a76a1805bfab1259528e9734ca1cf206c5c430934fa2c30971384bf6c109ac43c7f335086a618f6fc93bcf976f12fcf66e627275594cfe3044382276f5dec0c0cfc1d84c65a08a +Qx = 09b987c0b19cff63059833750db6a43c6ec9ae043d6183a0 +Qy = 489e72e62d78f20d53c8e86f4bdd7270113c92a09fa16b45 +R = 26aebb41860e18925e1fb56daff89160e6378a00cbc7822d +S = 6e4761dac179ec2d1307ffe93e55381225e5ad8506cb3aae +Result = F (3 - S changed) + +Msg = 22a0c4a4bd59810da36b0765a74fe3e4dbc042eb1df3e8ae916e97c4db4687f085645471f53189d33bf0ce63c7f6d0f65f9b510db4189ecb17d5b0e49f7eaae2d3ad2c7f40af1ac0196873a6b2867acd594f7fa227b8cf72eda770fb15037ce46ddc47ce4d870f26a96523e6f52f6fe5ee6bf64a6546cdc6455e97db099d5ae3 +Qx = 0cfc734884e0aaff06a65ab398003f516828e801207d820e +Qy = a9e38a6a3025f782d1c12b0522e0beb6c8667d2679025526 +R = 8eb9b1ed1781e0fb2f6f167ce21b2401165b9f755a3ca4d3 +S = 79d6461f36d9604b04e8c570ec2690b135b2efe48f5b9cd2 +Result = F (2 - R changed) + +Msg = 79f284dec0c329b2f48e534324e51eaf1f1c32a17159a55f2b1387f0df46bd7f9e9f48bd96dc0efee06d0400b65bfd683c8a231fb22e3c6fb417370d1d0291ec2949d33c4a0fa40037451c42029c773092df2652f9d8baab312ba120a61ad75cfe3dce779a8a8df90738999b9da203e65f72a95ba122e17239e164345cdfc89e +Qx = 3db70ceec7d35c4af73ea364c1b192887c76feb75f3d8a4f +Qy = 92c94044326a6e6877a58b2800e66c9708e168f8456789d6 +R = f205a1f23dc9dd4e4c4019c44cd42628eb825ecb3161db4f +S = 2be21a381e023b9fde00738e3514ad7e2a42139040970934 +Result = P (0 ) + +Msg = 374b93bc6b6f40ee4d741fbb8b2a0b807611267a4f8f1ef2fc1d263a4d68dca534ed70451ecdcda3d849101386f5ac332fb557d935fe07e20f3e51db0e3497faa2bfee5a6d02ea956d09f70e1b562cd12d675ae943b37939b753b593aea78f767bec0ba0249eb71490e1ad17d7261c8816b8140d77b2144bcd5b24fe3773f20a +Qx = 27d4d2c617add5ba36d003f4441b60b8021131eda49d0d4a +Qy = 789835b870bef5db4921eabb36d84847ae7b6828b6d38165 +R = 867cc808d9502b6294a7ab3e8f389cb8a10d5cf2f241d482 +S = 7005408173103c62f2c8e2ea9b5c2d71f5855c51b8afb45f +Result = F (4 - Q changed) + +Msg = bbb9cb23e26f2548bfe5630e191be33efb0ecff0d13f3794c050dc07761364fdbfe601aeaea68bc85757a0e564d833984611a9b1d0a82b8305f857cdc30c53f218c8a4ea566c5a159d81095b109fc83f013d0e62f77b608d6565465d228cd29028153e977f4f52252ef6b54c723b15ae7cd975d499f471f073e356a20e5f7576 +Qx = f8b9560f3a17e6488ce0795f8ae4be916b54bf4285363c60 +Qy = 93c97a1f837f2370857af7b8a1567bd0d9ad2db1a5c3f1a8 +R = db31361c14ae97e40764cac900632b77de81f9262f130584 +S = 8154d879e81ccda96624aeee8c264d0208d4d81d695d14b6 +Result = F (1 - Message changed) + +Msg = 867e68b6924140b1355e945e13949e2a6cf53696a117612f8834681514b7048a8f8ad01c479b2c3897cdb96df792f33369ee7bb4fd0621897a2132853debc4ed153aff071ece96e379b1082a1a625ad1a69f1e01e773aa1229563afa038e841ce9933b5fa0f0201d3f12d05ee9c96e6101c7d2ca38db117ab2e0d97bb3991d51 +Qx = c33c7d40ca5ac462ae4a373f07a2470e6b3c4c46c7878847 +Qy = 5d34e0869a57d0a502576f81558a462da82610cc68186bb9 +R = 678d84cc22a740371ee41e9d7cea508f52642d9fe5b9188f +S = f5dfe56c5cc6593f99444a96396b0586d89f8d2836775a36 +Result = F (4 - Q changed) + +[P-192,SHA-224] + +Msg = 448c9b35d6a3c01c048b7faaf7d92be7ec115c52488272c8e106edb4613467598d018085eb2e3ed44a811f6758801987d41089b424fbba1363d329ecb42722aec4f6d3b564c567fff84c717cf4d3d28072132302b96769515b5b21e21ce3ffcab51787490f7a0e0d6680465aa8fa082636df80aeea1b86ff5f1722c732228dfd +Qx = db451fd9249d57e49e7baed41c20208d8a02e466bde80ebf +Qy = 6deaa3380aa37bc6206b69ad79e9b863d9bb50970ddd8250 +R = 4cb5a63d5d058a4ec5cf6fab413d9d56037e323e0b34a262 +S = b28a9b101d74a518ac7196701320c18921013bbf2498782b +Result = F (1 - Message changed) + +Msg = 82b24590d32dabfb64299e54c11f017c77a3c148899d09b322ccb642aaee7546d420a1db33660fa58df8d36ab0ad2d5fde43c91723e7f40969011431f98a2571f941eaeb2dfb57e6b13998bf44736f7154c26b8cd07c8b085b028828d4afbf7a7920c4ac8178d42dbb976657ac4286b30946da1d32d06e19c7be2ed5549567ce +Qx = 07a0a7bf4089f58c77e883701dcb4a1ece3ffce62e1a110a +Qy = c1233449b78d098636a8c94202edc7a564b98a5970b96c51 +R = 6917190e7db2c23d67b49932d2f24cc2757ebdf60c79b7b0 +S = 140b660e7b8447467b725c2b9c8f2df1d65ed4925f9b60b0 +Result = F (1 - Message changed) + +Msg = c249c142ec49d38fdedc33cfaa58b025c0ab36329794d8db65bb9ccbaffb930a9003ba70d07dd2d96b9e263c002013a34bdf02884e40267c07b2a6203374eab04182b57d19885b193be288cb3394b2be1d13fe3a613c3ad5e4dc15503573bce0ade1637fa7f60c72e90e399ecde75492774366a68451f8d65b9a2c37d3a7e74c +Qx = d1648aa094db4f1549561dffa7215007bf81739581fbfa46 +Qy = 44d9f9bb70ff41d86d474ee1e5c6bc561632bf082c0be9cf +R = d20dab7444a2066aa93815217ea0b0d0c2558680e77829b3 +S = f635ffac94144753fa062ec393a795cc9323c4914a3023e5 +Result = P (0 ) + +Msg = 3b36a25d15c00bd3258f33bc9f5929524a2f5de3cdc2108d56caea9274e7b78036d34a198139f267a34b7997842e65a348cc5127bc3190944932e9c50559779bb2acb82645a9c29b044971b0a7245e4588db5e4f6e07e803ea5d7156a4445f6a26e625fcb55bd3dbd63d00cf9808ab601b8caaa5691bd254319433cc2381d66d +Qx = 7d0149399a41cbe032c352be3e4cd24ca8d2490abb5c6934 +Qy = e59a784d4037fc756921c23a9ceeefeb8b086fcd5086fd81 +R = 07e94f8f3b21196d18037d66d62ba58d821a02ebc00bc900 +S = a54e5eaf65479dd8d2d670ae46be3a985b6c6882d990bf1d +Result = F (3 - S changed) + +Msg = 126b03e7f9db71dc963fea83f50130b273ed0197fbde2e1019b10c0f8d4443f7960dcdf834b04c25a46d5bc178342c28f23e8c13ab404cd59a721f91cb56d6d7d8ee346259f7f65eb54a8117c2a37f89a0a0829bbf536194c21142f095a8a15caf5e26a8200f39419179e89b1531b5dc5954457f7d74f9990a607d0b1e60dfd7 +Qx = f63a2183941303f40049372b9b4162989db4d00efd7075cd +Qy = 39513f00897532519441629bb73e0a818263a802c145fa6c +R = 3095510a8b800aef0dc41cbb1791c6be17c72c5906beeab6 +S = 9df7906fb7c979a2776efc64c67d9943c51a0521a3f3475f +Result = F (3 - S changed) + +Msg = aec4a1f2f6d9d14958f9d367aac5a197aaaaa3170e771b16a375c9c77ab6101f36d9c1834ac27662bebe89828d84aaef76a88195d947312e0ae629ce2012ea090a2347c6a973398bf4bf98a6920b651fa37aef07a5defbdb331f9ca11ebb2378dc9e37e528c49bc184e6f1a678c611f39126d1f97454f9c0ccf74ce71111fa85 +Qx = 71c89736fbf6a64ccc3326b6c844b4d9a56b0ab88a40388b +Qy = c17e3424f5cdbcf06bc014cc0a037ba9eae42c8028aec6db +R = d74a3034753be92cf8430579538ad4ed29f1df16bdf42a48 +S = 030d316891c6f724baa9bfbf7b439dcef05ac937072fc007 +Result = F (4 - Q changed) + +Msg = 1b3a955979e2048964cfe18a624af4bf00bb054095d6fa2cfda2ee90f393b8eb27e3150f89ddf8697aa13a9a012eecbd3a995a24f789c0c464ff645fd2fcb0bc75e90c8c85948b96d3b178bd4900b35625cf43165ecbfed9cd20f050b1475bf94f2a858c867e276d2cc0b62f765a7d8915df41b9c0202faa6a60db81b2dc9a2f +Qx = 98972a473ca9f447da595a7477f424190305d9ede65055bd +Qy = 517459f0779289d5f2d21b0d84ed22f5e6b57bba0f754ee1 +R = 4061ada746f4a0c9cb34da5ca26ac1906ae415389adfec4a +S = e73c7d210a139c44238b08e5767e6ec0058b6f352f600255 +Result = F (3 - S changed) + +Msg = 2d4bb1a2afb768d2290ec18087aca4e0bd407c2a7fa8dbcd2711bb3e9f92c7b130c542763ebbe83e42461b4f59691bbcd9a78bbf295eb52dae65293b3d2cd74c30e6d3ba844f7b2a19d8630e01bcbccd2756329d95d7f74758e1dc2c19b3b24aee73e2f8dfade69926ae6715f2ad60096e12709053b4455b511d3b785c036d38 +Qx = 9846a96e6039ba7e4737a6efcff0fb4b536801d87b54cbd1 +Qy = 6a9e837d96227c39018de3d706de4d0717d731ae703a621a +R = 915ac6ea1207e165460819489916469d5616b97b4a66bc3e +S = 10e0b2930f94f766c9a49bb815d4e9f72bbe3fdbab95b685 +Result = F (2 - R changed) + +Msg = eec0e75e31df03f10f6b785f4f6234d5ed27f2a12c424ac25cfec496c43a57e72596d635a44d80b37647ab067567393235abe2a62e481f3b8956b51ab4d6f86f172800b53ecd042862c47b75e23ebf58a0884924fa5036d7b53981c4e1382f48de7d8242feb6496691801aafa7222ebe472b158672249f8c7aa34f6121c51bd6 +Qx = 257deb2da2f0fe306d907951589180e887f19745227bc1f3 +Qy = 047cf30280eb70d26e305dcc78307e8d9cbf1081ceffcdfb +R = 9dfc742c5e268b8ef109d4aa6a8b7a4c87a71dcd25898711 +S = d3727ecb086a3b9547c569cebb5105c1030e456761764229 +Result = F (2 - R changed) + +Msg = 1768c2c83be6c872bd7b805ed9ebf6e862a2fd7c543cafabb9c6e83cd68a265a553231924d1c2ba27a696e67296904dfdd020ed60b24f7272c88ddf6ca93dbc668424dbdf1cfdd91bc09d69068360e49c1de4efa38a6104ded5d67d7f498e6d76e3af80803bfe946cf15c9e4397c416b9116b792e021bff457dc25c4fd23036d +Qx = bff5d34be222cba05fc318407ba3efec0c5998bc1d0bc52f +Qy = ce02778e1ee64a23ad3cdf4ae72f0f1e4e8ad34cae1c364a +R = 3f4df6fad5697d3f93dfe00f631e13808a0f2f2e93142328 +S = b970f78ee94138ff4d2ac04160c8e2807f39586096a76064 +Result = F (2 - R changed) + +Msg = 89a613bc3e8e534327db9b89d42137bd95175dde5f967e53398dbd98997455e882c3c9188927ecfd41a2d5b7863e18c24cbabb102164dc6077224938dfb3f15acbeaa254b0e537032d48d015c01689b47bf5305034838cf3d233c9adbc41316ed0f1ea56fe8605351e49ee87a2fb5f5a0e94fadccf0e153b2ec24346723aed44 +Qx = 0e141cd6d7a5b34e58a264e465d135172075ce18fb5fc3e7 +Qy = dc96df20da2666987038615d6e83bcdf0d3dba1fb81f8f5d +R = a2648400ebda75a7c5887e2470da675949a6a953f403f0da +S = 50b64dda591105085f1261af389165929ff83d8e0b353260 +Result = P (0 ) + +Msg = 410cbffed21edd0a167d974749d288b1320a638bd08d43f7fad338952e371ad7840d20909c1d6fdd82afad20ed0aaf87dbcbf2bd1ec9795b82d87a40e1781a7aa9d28d4dc1d3bb95f08a124c77d7f50e4be54ccebb16eab551cc41adfcf48cb435502a9417f9ad9bfdeb4b47cdb99b2b062699e4475e27aae4e6a1056a511cae +Qx = 8c5f8edcd0ff9d916934b7efbbbe0e1f67abacb96902963e +Qy = 82d197e317b65787aad7095603e9b55cc8007f2b060cb799 +R = 107c929ef457541673abfcfa14488d68c3a82a97982221ad +S = c19dcada426e4504b55cab20c5e7bf3b618e9a6860e784a6 +Result = P (0 ) + +Msg = a1d75f51bd2afb919c1c466f828ed79c70e32630606d4d92b0d741eea462a82bf4576ebcf2d9f1222829d38e24b95103db72d085c7f9e592a6f47b099c3502edcdb8425f5c61f199d2daa93f1d86fb93fb087d3142caf7ac62751cc864ee3a34de23713fc762941bc72b19423dc0072516ccb267a45d1e839197d8fcbc50d6aa +Qx = a720dc2f4ccd9e97b2a360adab75c4abc91cb411e2d48915 +Qy = c93cf8378fc323bcd0334e9707d9d57b9c46cc21b8c1b32a +R = d59f6109852693e188fc35d2dff6174b5515955d0beaef6e +S = 793f4dddec07ff016fef28334ce80d061dd7b9b40c098cd3 +Result = F (4 - Q changed) + +Msg = 3f8ea9c33aec03ae7593772e792dc6e2eab652f26ecda64c96df9f6e67f0af76a1a1256394c66ea20d2a0793fa2c839fb22d58974b1dc34ad19a6cb6718836bea9c4729b7dd3ef2d0458c2ada4d967da5477624e6d7eabca5967ff4881d86c4b01df98835b2cb78748aa93f6835729cd0e1b6f949575469e8c2a2d153540e9be +Qx = ba4bfd9877e572bba92797b118d469043eb6aa2f0d283a7d +Qy = acf6dba3f95d666de9f5c9dd5f0d45072d1d4a025c49fb34 +R = 170c50a89346c63192d892f083b91dcccc9fdf1929c3bfd7 +S = b102ca878728ecb321b406090f12bf584b3242810fc7bf17 +Result = F (1 - Message changed) + +Msg = 82cddd0a7b5f4be10273cc8137359f17ce2c3be76d486948aac7e4c6d4d694f8d362cc09b4cf7ba699f79b3e96cbcd13b004956745ab8e136db995abe560eb619ebd0804acf8c83ae399e545faa8e2502231626c4627a7933ff61f6f7f6451e3973bafe731715a0aedd2239afdcd844aa7d545c1f641c12a5139a788139a3b8d +Qx = 8bcb523fd30bd0bf6bc053d1704d7669f175bfc3059a6b21 +Qy = 275df9b83f36c268aa760364b9b940558d94a5c5e6724f96 +R = ba4b932eb5083865a22bce03448e7d72b18df3185cfe2239 +S = f03cec955a946e342d7a5b0c9d040398d1107ddcc43b879a +Result = F (4 - Q changed) + +[P-192,SHA-256] + +Msg = b15b9c059c4cfb771e717d72bb1d79578fe58296bf20497105ca099feaccbe0c1283db5d78799f3db39dcd3591c8ffbaf096c84a864d10d9bed843b479a433893de945bc7b4b6f15a28e86f83875a9a223e785af3467d8efda2342a916d183bf30ee33fc4cc688b74a196ee0e318990fc09afc3471a131b240d128c6a28acfe9 +Qx = 001e75261da06eba07f3ee911276b4b6e25ee37abf54fa41 +Qy = 5da176ff885ca3345508bc4c917128b2c87f6ab182113505 +R = e5e6bb6133dc7dc8926d3705cbced15d5820a29e7ac2de8d +S = 46a6e3818a7286818250cea5a023be5b401b1026ea316843 +Result = F (4 - Q changed) + +Msg = cdf195592ed3a8d5a0924934efdf2c33c2b0f5d8c2e675633aaa4ec740a8b2861a90fa4e34995dfdc978b3e02cde5d8d63857cf091c926a3d9d15a5e61febc2977825272be1336e8c967989ffdbdaf5e1a23626e189c574251634fd894e344e11bb1ae39962a799a402101e24acb64e51555bc20feae97ee8f1a3d0ccc22bb71 +Qx = 711bdec50f8409b10fd2cfeb30e9e69c9aa27e3a535fb39a +Qy = 3e90f90551e7eb7eda11fb016b0a386ebf48b4b2f3e8f272 +R = 5e61c8445f402c0c16ddfcd050d2a9fbfe495537c3d76ffb +S = 09d0219f34b46c528d81d3d9c838253f942528e8f53329a2 +Result = F (1 - Message changed) + +Msg = 76f44a2dbb96d50840a37bcdb23f0d56e159bf4663c22c116963ada3df2431450019aa8ab922612dbe80f2d35b5096de41273f648edf09929a698c7e9028565afd16bd976e76a5a96360bf89a0908ce379c9f69c508c6cf6811e1cf5946e09a0d2d5a92387bd5a95aea5e1229b7810b5757bf88381ad2d3075e85cd47d28eec4 +Qx = b870597b4b8dc8fc07ed59b6f079e87936d56d0326c17249 +Qy = e54c404920cd530f0680d8aa2a4fb70b5f8605e6ebbf2751 +R = b53dc1abd4f65d5e0506fa146bee65ecb6cd5353830b67ea +S = aa44232f2fa6613f85fda824ded69e4137cdf5688c6b3ba9 +Result = P (0 ) + +Msg = df5437f01e4921f9c3c4d7bc59bce4090e73d08d7388077b3fe0c789374e917dc5bb0d2577703f5ae5bed27f26da6353b9ceaf694ded6576925edf2e8ca4fed2a14974a6a6550beb6e5478e90d221edd4bcad8368fb9f1aa42722f740fa9e9308d9aa14e34bcc177c60e32b0fcaef7ac8724335e746ce839b8c9c48593793cc1 +Qx = 795bbf28b86af380c2b080e622f92f81de6d2af41a39bc39 +Qy = 3d3bcfcbe704426e95d0edbf40eae25a259af239b00158c9 +R = 5a3fd911aac408cce41e0eaf42761cce155c5a6efe03df11 +S = 605ffbb146bf787888d9c3e45f79d0bc6959dcfacfaea437 +Result = P (0 ) + +Msg = 5135c1548ed1e3bf372a535eb60d156620a8aec3a93b6624a7a4543375678f29dd179f4f5f1f1657a61d487d039e5b81e2b7170a9a5299f8b2de495a4757589ec338a2a49a27edb88267c31bdbd31e50d609e936fba520068c71659ccad7f198e0e78bc418f015f27b7c474053db811b35fbc48b5c08a448e2e7687140769da8 +Qx = a4649bc7409284af97e8d78d3a71fc4c8fd2371f02735ac5 +Qy = 38cc4e81ef00d74d4e80d111bcaa492b57e7f981239bd842 +R = 3ca2c26d18e20f9ae00b9a00ecf6e435d456473e0636df6b +S = d2f3df485bba0e1049e7968cc19c88c7681f5acd6a98a217 +Result = F (4 - Q changed) + +Msg = ee934fdc29b8eb22eac4a296528068bed89adddade1c47c46dd328ac14858fcc8534aa26bffc611307d93b102e45902f795926aee4b362e1d07814f8ecb2ee46e486afd6577848f20d6a946f5b60d2533ef01cd7c77cb855a8786bef737f380a0580a579e58d07ded99e53f0ab385cb177bf8adf63a4d78b6afb18b4f610d5e8 +Qx = 8698b9f47ce024b0a139d1aee610c1d549aa3512a990b211 +Qy = 998be4c51c70d4fea9b2b2e274dad47175f9d68c8a1c28a4 +R = 13d7c9f471863cd4ee3ce5458f1fa436f12f50f965ee40bc +S = 8cce6c1787a66f30679b92de51cd3b04a0c1900bc1008133 +Result = F (3 - S changed) + +Msg = 2746f2ea08742059818e313ccf78256b33ed46ffc344163b99ad705ccdb2d9289582d5d324ebfe687c6f9454cb720ac91e533b6df12abb55386194468ca67b0d4679f7d0cb6d935fddbb92b3153588e02619510982068fabb86f065c6512fbb7d18c4b9f521e993217d451e05fb4dfaf757075870eb813ae8c634864d628be73 +Qx = 49a5fbbe214a0ff9e9294dfb9859351c70a9c4f5c2ba04b9 +Qy = bd96de36fc10d369b52daa08931dfbbe9f814ceabc3157dc +R = ed3b86f05b80274e7e437b365b7b5ae7af978b7014f76795 +S = 4fa8d7e87c9c2cea7b1efeb698c78c6a1233cd6abc2fa0ff +Result = F (1 - Message changed) + +Msg = d8ec0aecdcc7b92ac84941740ceadd176a0684cc291decfa9189a7e4522d5bbe4691fa22e615676ff945be54cbdcd7f67c4d7367b35cfe7461803be61580f7510bcab22c78d829cd119eea2a93f52ceac369fa4e211f9bbb49540b5f6c6fc47d47b9e48657433f96b15148441be0867a426ce5f14aba749f70850be630c5c691 +Qx = 22a848cf9716cb1cd0d9ca50cc9369c93ffb830642861e6f +Qy = 759ab99598b7d91540d456344c66a9742d8768a3ed2d90cb +R = de2d383f3498108b8096fd70f2cffc163dc25878c7f46ac3 +S = e20a35b3d4ed4df57aa3b3cd7b21ef6de04e378a47c410d5 +Result = F (4 - Q changed) + +Msg = 7dc617288592c896cf0ddebeca21d00ba759a1113b607e8a1c499b4c3dcd1a16f26af747ff0091b0200cf3947b0664476c93d33c0c9f303981c07d13dec34fa4e01642e9a581a32f6e5acf5e1a483b6611a32bd51193d80786c75271c6a6af013e980c8f39edb8efe2164d8a793f470a33428a3be281139e75cd26aecd8517d6 +Qx = 390ca1526943a85332c96aab75a10ec30fda9fb197ded9aa +Qy = 1260266139849659339e3cbb83a9ee3a63f45ff7b96266bb +R = fdbe0c0864213e258abbedc29dd359a4c58e060c351b15fd +S = 3dc705de56f9c1d6e7774dbb70dd48d34c891bcffbcc30df +Result = F (2 - R changed) + +Msg = dfb645308073ac30fc353037da4aab7655366b4b3b5e29e212415aa120b93ab3963f5a4d907dc5e6d75b8987db635422715602e6219e68459d2e935aeb1e90766d5a68981cda9c7809cc41aeb26fcfffc99dd658c45697614858369062c0f91a66172fae9ee73f1fc18a201099e95a5aa978bcdf91adfca344f0fd068e6ef104 +Qx = 94f19bada578f6659eb3790b5a914b38d68084659ecbbb0f +Qy = d69cbc24b2f3cc074fb727bb74bfb52d6fcc00959b5c7aaf +R = bef73286b737e5cad10c56e5166596c0007009dbe5773c99 +S = 3836d1676d8c9879d29cb164bb8fa6e003aca7c877500637 +Result = F (3 - S changed) + +Msg = df7ad85e1ce15317a2a7387799d46bb3a1aea6393ebefa7a706db33ec254c1b928de0ed5d91b18049976c9b255fe03a299d33a9a5ca1a21eca138e9f9514b3711722b95fc04d63cd212fb3473077729eb6c9a1dba1b00dfbd54490a02a618ca1418ef50e117ebe750ff48cf5593d6a4cf183a0f52f44a22be848b7b095ff666c +Qx = 6fb2a2b4bd1e07ff8bdd00aa5058e40261eb5f9ce0e23a41 +Qy = 6d26fec06f841e7604d1ae630754d958fd9a1bfd9c995eba +R = 0900c78216384c24a4bde4a2f520f922cef98d74c936dd98 +S = 75be2d206170358d50c486b7dee02c028ed5ad0a2d2cc79e +Result = F (2 - R changed) + +Msg = d9d640af97f8d495f4d4bb94669dc51f31d6fb1855ff5d9b36cfd966c60c0ac521fe0fef00d15ee7560c03bed240c15e19cf6bb43fddb95f201392020ce0bf1f2baafcb7c6561d501a55873ac0fe0838027e12b6c09f2809b39692dd19dc69ece1a36409a2eb11304e202fae854fec2e8a09c5c7bb251462b69022c3d23f9ee4 +Qx = 8109731205bd9e363c0521cddf94af58129af3f38d276f2a +Qy = 9fcf7695165bafb39c2d53b61c4ccfed3891abc6db1fc22c +R = cac3fe60f567724f7afb825aeda68c3b345b44ef3879dc70 +S = 4544b7d4457b61b66cabfd6174f2c5a594b2c0f300b0e8ea +Result = P (0 ) + +Msg = 67eb2fb28d6883a44f346129096f3462ca6376ac0e3d80d938335c02c445a4641de6b25f2beabeb74030c05f0693ed3f7a9e523bc7653dc2abeb05577f0b89feed0005500cb3cac2a18d127a9b4603945198aa3f1f5a722e29eadd91db13ece9bc9689372f889af9d3f88001f6db9134f023dc08efa5d625adec4d27a0f4010e +Qx = 671500a8ede439b9cd742c8794fd499ef2bca403c59c9bc8 +Qy = fd34570186c86181b938d415dba827bc1cc6be2da584bdf2 +R = fd14760df3c592d4b9296aad0c52c531c36b432316343de4 +S = 3df1065f0c607ced37f64b1f2c3d1bbabf82e40e2600c931 +Result = F (3 - S changed) + +Msg = 097e2ff20999ad70fb9856ac432499e47cd0d811e4455fec205b4e720b08fa91ddbd3a3b74113b4dc79ce8fb14bf4ff5d116fddefedfe637a0e1d8e392a82c36381acd15157ec61f5578ae4205cec3299573b0f280859c8d5d37ab117d7f3a1c38446c781400df8f74026b0f0d0e63e9295bbdcc6c2124becd2388b1d5c64049 +Qx = a49a7cb0672ee7420e06b09faade3cfc07183f50f91bd498 +Qy = 8a630afe02ead1036e0810938a77f56c9310c4ec6d275b0e +R = 6b4b1470700f7d568ac08d094747725e269dd76bdc2aa012 +S = c7054d95245290978e591e69c2bacf3f530a8600adf5e3fa +Result = F (1 - Message changed) + +Msg = a4d66967721d5b0485931397d3befadc2f7924b9c1457513e2f528014a36b218b965f3fc2c2b30383fa1e9291189fef3e9e0517f6a67bb83972a6576e06ee205e627ba052d2d0609553f6f17733a6ae788c8302d9782df81980450ad7519aad9af963fa8853fffe91fac4bbd9f59f0756b03ce2dc1234f5d8b3157cfa1ca3b64 +Qx = 459c430e054519c7eaf38c8240e7a186239cb2c8569473d0 +Qy = d67c199ece1f0a25cb861d491036c2f3770675abd909e195 +R = 237295b61f0af811c327f41426ac7269850460fe4393e216 +S = c93cc5e9e2460b3dc62274ef58057e6327ac2d8459527fe5 +Result = F (2 - R changed) + +[P-192,SHA-384] + +Msg = ec44388857a8c460707eb73fc6f11bc6357fb09a3586ca0f56e05b9a3c875194cc438a0bb5c7979a5d04ccc79912883438756cfe79af7fe59934d7f0f6fe800dbe516816ab8a1fa786965716d520e47620cff233667fbed9c605630349965117584b68285eb3d93ae965ef63102d98a8da1c5d043894cc391ec542f11cb83938 +Qx = 3be73b07659d052424e46e60f4fda52eb41f076e34e16b34 +Qy = 4f3f1e7e1ecc83bd90e71add8dd98a20223895e4cfc7cdf6 +R = be419234049bd75217b3fdf2c92a8760880931c2fd4b482d +S = 07eacdccdcc7233bec37e4bea1c4c018f041e11592e5327e +Result = F (4 - Q changed) + +Msg = ce29634f6379fe471377d8b91060224c89e6e8fe2ec3f0adb0879a6861a46002a0ede258eed1d6a962dc8873281128abb032b24e4dc28269f70c8708b3da822579287ccc7b057f8dc6997c5780c888172d356825d0b1d81c6b1db3e075fd0840cae0b0780c4b8cd0c4cd21da4de3a5cbc0e3cde7bfc0b80162c9b93a6ec490d8 +Qx = d94863aa85d995664c3b0e1efeeda533f1951176faf70c1e +Qy = b9404ddba252047ba0476bc7a13bd4a638176e88c116247c +R = 821ea159d7adb606b67e81c430d3102d66d3adfac6979656 +S = 01b4df62071c38e2bd810b267b10d37f5bbd0d9fcf235a01 +Result = F (3 - S changed) + +Msg = 8303b131df6c0092d737d0c061c4524011288220bcc3b904146c164af727023bce05a79a53a1e1112d7bde4260ac8ff04b68bbe6afe5f9a8da079322643cc4ff53feae747eff685c3c36da51dc23fca899143b59a4a6dcc110249907babd60ff4c4f9fc2d86ceb7a4f1bdfb05bbc03e1f456b82b5297e6c7610c9b50844a4021 +Qx = 6df97b643f9695b2d93a6a859eeb337c6985087a4ae7b910 +Qy = fbf79a786e1d37524b36caedf93c176cdc9a8dc5bc372af0 +R = 784aa5df684092d70e2ddc3c57c99705446ef416c552d24b +S = ac19927337f2cd3e76ac022e4537062ba252b5f68554bd71 +Result = F (2 - R changed) + +Msg = 755c8ef02263dcc3873c04b4383f1ff1e7e8327418a42c9d5eff66d9c0e5f02a3557be9b69bc307307c4d8d16398126684e33f5c942728a2dc11ddedb2d374a3a0bdf9aaf20291479bcefa5ee77f8e9965cf749b6dbdfb5a22f842c714605092f8ec4cfb887766b31abb10f1d996bc280a2d912e1c38ac6e33f978e8557c7161 +Qx = 9b17e7fc0dd000b0d5e38e111c3dd7df98584c18fa996dad +Qy = bc80a114e4312951a0342149e750241cf1f35fc994a54600 +R = 8c512f9a24cbf71bab2dafc565834112d655e7bd9efeb86b +S = 47661c172de68d177a5042f1a3661e7a91d6462576ecbfda +Result = F (2 - R changed) + +Msg = a00bf5ff49fb300d145a1aac00406c8cc07d510928f764b067a61a954ccd99f731e90a154563d6f7ff0c2a539f21c1620975f71decc17a0f52c5cf4c02eab34f7733fc14ed2f6829580acd240e1aeaa0630c110597c9863b49aa1fae6b489a3b2b1875c66de3e4568a176e30c7e54b53f019de3bfa5e76b857cacfa85948b24c +Qx = e5c8fcaaf51ef1c8b53c9978b316194f8e976fb836ea559f +Qy = 68a2a989d96db13fb87f55a44c037e3fb8d21d3966338dcb +R = 6a4792f94a5d2ba478703c8bb42514f7f2d771422ac8ff6b +S = 882edb5651224887207efa169fb8fcff96a50ee5165c3642 +Result = F (3 - S changed) + +Msg = 7745e768f3e70f180efba44948af91bfc35b2e84414b574dd917635b215b44749c13361092770bdba88d7b09c2dc958591868480c4cce117b7084da8677d9a469d27e9b668ded176e13958ab1ae413ee1b1b4ee355a5b07cd36132cb921e5177a79f2d35323634bc102459af0786cea1d6caa215f5b62f49f5eb9b453457eb81 +Qx = 722f246e140ad90de47f246b16ab946009a9905bc0d04ffe +Qy = 6e39a7e61e420c5260c82e45dc1608eb559e6a2ea0951522 +R = 41bbbd31d210a844487024060f769e2abd9624da50fdb990 +S = ca868ce943762770615b1218dd1b21e3d2cc93b5e97e2479 +Result = F (1 - Message changed) + +Msg = 448b0076730e95aacf91f1d82764747d9a5a9accd8327d6d5bd9338c024a2589ad09f7216bb187ad3e22a7e146952d77fc09918a159187b9e2d8e45866f07a0092c7484a47915ee4435959d5e6662acfe1290b1ee6229f9ef23c05a07ab8a1a6e06b07a84c20001d49ca931641d68f7c415902b0b2213bbb7df77dc2dead0d0c +Qx = 059b41befe4d089dd852fbc567806bd0a43e232a2ae0922a +Qy = 6279770311f4b57363ef27adf7bab7f273828a3a4c93ae83 +R = 07e81b35313ec53c627d1d1d01bf6fb9efabdd6be58b0b09 +S = 89f5ba7167373be6628ecf6efe15f4a756b4d829f9e7dd43 +Result = P (0 ) + +Msg = d140e1a4d5f92a41433cd5a5ff293740943ea700f07e2e9e3e80502bae76c2c4115de9c3d30dcc1e89ad2fb41f18be09124e9170af756cfd9698a077e5f50f205b37e3919da3790846a10c1ec9a56fa6870bee7f6b9ebca0a60e085b31edb0884726196aa1945c8f1a69a8aedbf5f36a45c9b6a31f7dcc720c6aa578d6c538f0 +Qx = 85f9d1376f78a82b4044fede433026876ab2f75312132b77 +Qy = c4c6d34efd2513d3fb98ce600d6375b29ab606e6b3f9463e +R = a6c86865c55fac4945cc3d37099e8c575fdf963a27c780c3 +S = 765e85a17f07b8eacf958057c14fa0e5b954726e0106f41c +Result = P (0 ) + +Msg = 4bcbaa7bd910e4fabaa93cf5b1fe486783b9bfbe4841dcfb2416704284d27a35392f876d32b852fc6c57370bdbdd4a702ccbd8394b361ddde2fc87acd6b35e25f2ba539a0c563b8b172e70dd4599cdb268264f63c976f77901389d38afe901f7f03b7882ea2f0a3e6658fc9f23e551954fb7aa406e1b52168f73ce157c654bf0 +Qx = 01f658da9f2606c87ad252165914d8b5d22e1f0510cdb6c9 +Qy = 22e8bd164ce92dee67c5ac6f59bc7d035d66056249e9d52c +R = c247339c92be20e85e1996be105abc5709ae9cdf960e9c34 +S = 5073b70b80a1306c86967619fa4e25462975a25aacce23d0 +Result = F (4 - Q changed) + +Msg = e7d491b751e25a6aa88274be09df04b7c16f9a8b773985c21222154b8671ac15eb4c38a29029695fc115a8b4b9a31cf248172b8130de52cd724d5a0c7e893ebec6c18476632ee26a3d0c9792f645992598107f23152bbb47b4879d332ad662762daade9ccd11b1d224a51250cd156e9f048ce3cdb45e02b3ddb8daa6c9c27e90 +Qx = 1ff048bae5af17b794717df4824c8f077ee602ae03e0c0f3 +Qy = d2ee41f4ea89816b8299c5e7cbc142d5cd212411c28a7ae9 +R = 85cf87d8e26949500b3a494e726a700fb84ffab30448b8ab +S = 5800ab6761708108b192b0e94d21856a87ab576bd58fa4d8 +Result = P (0 ) + +Msg = d7d651cea073f94fff84fe5117a8154a9792011dc49bd1f0edb9641fb4597c2b2a629d25061f98e6317e0a075ee9238fd72a056e8135b42dc90e6ec06d12956ebc9e669bdb2e89cde8fde759b06d0e9df23f23362cfd002d250fbc64f32cbbf2102180611b92dba6d05661b77689f0506978a8f8f0c3a91ea316b86ededb44d3 +Qx = 9903c60be9fd24456a28fb3f42a9ffee14f1242dffc94428 +Qy = 80221d3994c35fd237a088f61abbb1ff21186ca84ba60337 +R = 35fdc9d4f212103e5c6284737e54bd6dd392cd03fea0aabb +S = c29a44f08835e892179413c5a1edb6a3d0c1b9312f201175 +Result = F (2 - R changed) + +Msg = 89c87b4597f226458b0e688d06ba9e1743d5044275fbd03a37906cc062e9c24a2674867aba2335cc4c3780e32ee2c96059ef6992b81667bbd32666586955664343fbd6f7cb9fbcac9c8be060058d1437604e89c08856063ae3858ade95b17a53c299b8eafc9549f3bd964f837b657071c40abc44c0d169b6c7f228affa458507 +Qx = ff26fbd1e86a6904de3d8e2a5ec14c46e6e2211fd5343178 +Qy = 5579caf82a1c9c435e34266ece22b072e1caf388ffdf31b5 +R = 0180c5766381598fa484401ce3e6a751a7ca0121dc6512ea +S = f73e518a857c88aa2617d5f8f3671179a6ef9b2476837c2c +Result = F (1 - Message changed) + +Msg = b40ebfa518e173da4494c47b2975e8fbe2ba5f8d44ebe613af657a8fbba8e241393a547712b944edceb1b5cc66c4be1742bcb9127649089b46e1adb9c54b891b31603f2a7335b74c9163e69674b03d52e828cf8f365d3c4345d5893d1fc5de9fd008dfc40ecd49b54511d87badb407567532b17b3f820cf9710ed103808c700b +Qx = 8d936e46f3b7c3cf11a8d14c5c5ed3e158781619090d0ce8 +Qy = e0c22d973390dfa002c223f6e29aef2e2899fe92b74f2841 +R = 79e347e5c0a58ec86282672dca2bed3b179adaf80b790c4d +S = d4192c2f17daa781e3abe65a2fad6bf93676ed0237d7143c +Result = F (1 - Message changed) + +Msg = c24f536aa5768a8de22ceab1e133f463c4fcbb8125fb2328d555720a8379f96c4381e08980b4cb1ccadfe9b3b07e1d7059ecc1d5760d62b0db7d82982248667849a3ad584216c9b5734fc49220112be8476a27e5b05c675e17222df28adec6b5bd54aa8885a51578a4ce0a63c1be19f0ddad798c174273e93e2ef18263def337 +Qx = 82d7c815f6eb67df4085bb367dd37cbca765ba8dfe53766b +Qy = 6a775f59771c17dc7913b99d1e494011e5f70e07fac5391f +R = a2313ee8296616bbf43fa6a4cb264527e2b1c6b5f1edc56d +S = 99e28bcce86207969349d3e5dce69e15e6676697176bca99 +Result = F (4 - Q changed) + +Msg = 50f1fa39adf968e79c3837de5655cb05333510fdfcb3b31d108989685450d56ef4e8e4ba6638776458df27003915fc481d2623dcbbb819d467c314a31b62d2f7d0081e3b664c581cce759924e3547ff701cf55c49ad506735d1cc4e01bf282bb74e97c0a60f4404c0e9198e108d2fa6282ab5293dce8675ff3a29b29bd91d15d +Qx = d66647b504641814dc4799f3a10ad87b732e4b21448c3165 +Qy = dea92efe05cbffa93891d1bcf1c7bc66c2f4098eeff9ab56 +R = e926d720f48877191eb1ae9283259e16313d1c2cb805c196 +S = 01339d3bc7a7a21cd6facf352cb79320a4daad7f9a4d4170 +Result = F (3 - S changed) + +[P-192,SHA-512] + +Msg = 522b006f47a4448fb2b9ed691b9ad50eedf1b427381ef2b7ac84c5dc1e0b5751936413fa95ec474f19b5ec704cd02f5c3320a05c24556bad2ba91ba4047fa4fdfabfb823aa3e3b4b2d7f25887a6ce70641c708e47a2a6a6e5db88e7dccc37dea30c51b3943049bf49a2b57618ae885dcae2c24985f1a72ffb89ae00a267cae0a +Qx = d008c455eadcdb98234cb6ad2d9876b82c5b0c8867ba86d9 +Qy = 32c009ec81f8eeb99859af65e246d089d3a0c0cdaecef798 +R = 79f619e30cd68028263f107beab00ce2375c570a4be16487 +S = 82257c9eaf1e7ace39e2804e535d7df86158cf1c40425f50 +Result = F (1 - Message changed) + +Msg = 03efd1c7aeeda6bd391e1d9e2027a804ee217cff480e7ead7230774b12588c3f3464fe0ddacffc46f59af9b8330cb736ab7d73f96015a857afacdeea5831ba185c8cc21ec379ffb735b87a4b1332c3d5b0fcde4e4358275e5ccaa71319a2e4ccc13549111996988a4c4106b7817f7aa715cee1b83c77014183722d5755e1b563 +Qx = 28f4063b8f808a9642f2b04f794d61739b883897495cf057 +Qy = 9be6fde04d687ea2778f845f881b059488f916c3218f42c9 +R = 15f3e034340d6763ecd73515ddf0b92e383b539c97f78b37 +S = fa77e58f64141876845f438ac6da7bd4bf8dd3097a1f27e8 +Result = F (3 - S changed) + +Msg = c04cc98af74aa7a0af13c3491b7c02af7ce2ede05d652601f66a4c94275368551e2b512602cc8fda386d3dbe7c7d686b283cc700403b72adcf9cab1363659516d71d88528342fc8471c262f904961d6704117d20c0f693a75853a31dd4c661d2e7c4d29130f3ac490f505c8fa3ef378035c0e191c92481b0e03f33b117f04c72 +Qx = 8a3939d2b4b4a5b251d383fdb6450d818f6319bd91ee1b70 +Qy = 88c934f7625438d118ec95085851d56e4504e553c6701be3 +R = 4677fb00515485c96be8cd8556984868697edcc1170b2605 +S = 7a5c09c4c65085b9a25d4a2578aac167fe31404cf8dc5858 +Result = F (2 - R changed) + +Msg = f7f188240f38a1649324cfdbe91a45bc09655f3c99354730a87392b0af766bac56c5a90497ab1229236a3292b4b4ce5394fc3f8388d825ab842c05ef757631fbfa8f75730fc4b4264a880ae4a4f4b96fd3753591359818d8f4f4408b33e9886acfdcae287adf78fb44d0e247b325df6d3057148c941c8fc78ab138d085e46210 +Qx = dea419cbbb2c7be3b59d6eb4db9ca48efb4835eccf8d0a48 +Qy = 88dde250494bb6b910e979c5fb3a2fc44d41ae3e761fe85d +R = 302648f3a89aec847742ec72209ac02d6232fe2363f72fac +S = a1895dd201f022c17cd69dab9c5438d2b25f9368aa8b9cc3 +Result = P (0 ) + +Msg = a6d2102a68068e2648ded68d12caa6c04b956ddd5c1da911f43741eb03ddd77aedbd5a795fe8c92a2def697502805120ffc11d9ca3a3c64beb8f66dc9a75e0ab31e02dffa7a0876f68ae2932a91c7327d455d4a3441b72b33e4e9a8d2e59b3ca0a1f5924e574039e1b32434e38bda6887c879b62e960b7070c8118fd502d7c30 +Qx = 890d1844df633cfeb3f55324d37d0a8889f938e165069f72 +Qy = a24a3d5e31071b0ad8d77c9345fbecd1fbdafbbc4d015ec3 +R = 41e771f5e4ec73cd72cbf5bdf5bb466344af8a53f883e72d +S = 7722ad2164d5cd356e395efd26d715418142088e0d04ff70 +Result = F (3 - S changed) + +Msg = 6edce3582fdfdce10f33094cb68ff9814a69d7eb38e35685149d468fd8f4206a832633527a7b9203b72b00b420284fb4df351ed146e25dcfe9a2993c35c7f20c046df783a1d5e983ce0cfd0b02cc73a595b8d44df272f1cfd4accf7a6826b988f1639fed07dd6bb35c191a371f2f7ecbdb60d6405b66532bccd3572b8597c174 +Qx = 48798d2cd5e974efa4e4b341f04db38035ee7ca96141722d +Qy = f220ea8ecae76c7bac076209e0b87bb5709de17f9d02f712 +R = 4b402663499aa0d0dafcb1a7e57c7bfe13b4953875a47e3c +S = 317e518685fb7d5b801be9fa92587b6cba6b938e05eff266 +Result = F (1 - Message changed) + +Msg = 4b34d6f3f75888f88f0d912f39d83d35cea3289e865d3ce5580f746cb60dbf0316fa12a3ed4ebf7ce7e5908f30e27a21426ab1f1cd278d2e0f0b72f36da91efce343fc5f0c71373b4def3200928779832a20e64a6c4952609e3f1ae589854ef6542360edb4085eb7155c10e57103c0cbc785fb7ee2d1bb568b7bdaf2bc30b584 +Qx = 3e64f302334d85913234703619381bb0ee8d68e40334dd0e +Qy = 38e6ef6fe5c364f17ff3947e294613bd07fd25e46be9ee29 +R = eea898e0fd6b8dea2a316cdd03a2f1a9adf0dd5beb004372 +S = 0bd969fcc0f08281367b0b94dac13aa4737a0861e046d93f +Result = F (4 - Q changed) + +Msg = eee695dfb06970b80dc25e33b61332ba96c673492df994f776f17dcc40c47be1e6be3170b83771a677d2714fb374a7ee373b1633a3e22be19ffaa59741bc643cf854c211b7e3070fcb8f5ee1b605c6c85b6bbc5b6912302d3c2027bfd96bf6f6388af97cf54f279a366cf4a49f9eeae15a91049a57f35aa62f5e116d501b524c +Qx = d9524bbd5226618b144b93a5638f1fcccded467d835dee99 +Qy = ad88b84962b039f4dd895d296c10776d0802d12c19e5b750 +R = 3cefd5c3d18a124bdcf052219e684cde9c0e6afb0bb957ba +S = 12ea2874848061b39da617c7ae26edd5b2079a5b12ffd6d4 +Result = F (1 - Message changed) + +Msg = 43b6d9aee332c6dfadc52f39e2c66b68a1e63bb59dbd0c375668d49ac16345fb973008408fc9ed8ef7bcaa19430b0a3720d7a4f0c85fae55dcff4ff49b5aa1e7c36265329cbce8c8303969c05b6ad5ff2af0c7509d94a3aa57cd11492b87a4d009cf3fa1ae7d819886e6f6a08ee9f62e5e432f4852f52f175b1c37a7c427f6ce +Qx = 246560e2e5d4ebd6d8bb932fc5fedbe516159c1c7ee1cb8a +Qy = 3bc0a5c3b260ffbc7a89e8691a854800e249140767db821b +R = 7e4737cbe7fb028d44bb77c5d05cea5ca021a9711a08540d +S = ea0ca36333c1c273c649ab7f8a8216a9da22f9f35fd2ad0c +Result = F (2 - R changed) + +Msg = b16560c4aee6699872330bea44404cd0ecf9ba12fbed66386b78be5bad1db07fc5ce2c6a52cd9e0bd7f240cf75a149f0844d5bb5fb17fc4fc2a8c965ca2b6e3a4cdaa648f3fd479ef58eb71c4ed19de33fb35b79b0956ba2a17e2674dbf054cf3da30d4bf43af0088c584c636bf084ff9c4fed43fe922a9c31a618decce8a866 +Qx = 2d3cffc6aac703d224029d243036cae359af89fb24801481 +Qy = 00346a43ccc3cdcc37cb9b2757d5f88fede01a5ac160f253 +R = 3a844183d6a2a59255ef9105a6b8dbbd0662c227ee04be0e +S = 4f322c112b5cbdc7c23138ac51fb975cff8277676105e5f1 +Result = P (0 ) + +Msg = d8fa24457233aa834febf3bb109e6b0f9de4a4e095225dbae2f0f5d14513710188026057480cb30f2c2ee1bef25e86cb505128ac57cdd61c420363cd44acc2e87741afa74b1a239cc0871ee2dbb77609bc7ea42f883afb9088bdd46b3b887aed38e85a1a30a8b7d9f87cd17293c262f470686b236190c76606ecc0e94c28b305 +Qx = 74740b536f42018b2af5725ae02dbcecfa05bce69b71f7c8 +Qy = 67246d3970cc05ae53e77edca979032f97969f47a2ed7f29 +R = 6e6e9d0b4810e13502589df7a162557435c7dd93f0ea1252 +S = 9643777c24c7faadc32697e9d61039783974d6f75269a764 +Result = F (4 - Q changed) + +Msg = ba399e3d2259670289b099ebebce13ac6e4809ae9f17fac4a1acb4bcff3746152de31d4c197eb814930326fc501fe43270c7482f6d883fad829bb69eb463ea22ac4be74f58881ebe1266d6fa2a3ea67965d2422611b2c4b05fc43f2d4494518265f862063485531976bd6385f4f98c9781db4d0793233199cd58685913c8d186 +Qx = fce011d181c4d3c75043ab6936e2e9a7d6964ad47851e290 +Qy = 71b52d04ca114434be936d9518f05ef9791997e240da0740 +R = ee9a4782853080a2cb2415914dee9bb4245def81ffa83491 +S = a701084db2870488d00a5886f872b81c53552ef31f09addc +Result = P (0 ) + +Msg = 048aea24ac7ff5510a055f9e788979b6b6dc9f586583fb3fc6d0829b00fcbaeaef8688d46a97ace68772d8f127c2798d01d33e5affd5dcb12880680631a07a83d82d69eae255284695e7aa0d55b12518ef7a7ebbe13830dd891cce0f8b0eba7f4942900015f1495c0488b206c065f19c2b8fe85cab678cad6dd1f13c813d6b87 +Qx = a18849ec9c5cc10f8fa60ae614ddf2d2471cd2ed67f5e194 +Qy = 8a7e1a3741c91db9569b33f826807a072509791915f5ed9d +R = 828ab4e555665f34c68157a1c8ea0488a9f9fea50fd9d18f +S = b1b1753159967149f60c9692faa36083cf8033e3f5812715 +Result = F (4 - Q changed) + +Msg = f3d2d5b1f472d9f326bba6c1af594179ad3eeeff5009997dcd06209fad3a387b7005ddbdaae95ee0dc8d49e60552d0bef251caaa23b64510b14d2a13bb343c6715878aad13b71ec128a2dd947103117f2b1a1a5861be74510279be6e8752e2a159f25801c28acbb1795b8d12e787db85d1934664594052a7354091c2e5dd13f1 +Qx = dd63ce69012860466d3c65716928cb303bd9290e795d7e3c +Qy = aa79ced99fafac92050355d6ae261cbcf82e325559df0470 +R = 6e384621469ce1382811d25ca47cd222b1651947dd015d8b +S = 3b74dad20133a9eaf3e749af9fc89fad2a966b3bfcfaae42 +Result = F (2 - R changed) + +Msg = 58f30a4bedb114933c51e74eb75156ff213a6764cd65fff4fc6930879f7b631aa96436a1f5b6089ded7f3d6daadad4f63ac3c895d42f1f030f88adc5590e445998a632a600a70583fb63caf76f74802a3d7c7ee3ba19b7b29b73f5d6af37e983c61c14b7183e5e2451c7350f51e760da3aae1971d46e35386c74a6f0d89e8063 +Qx = d751fbe56dc3c814dc9322c9b4537675c7a3dd00ef48b596 +Qy = 8fddf41a1dbfce973d182576bd673ca9ecc124745bd436ab +R = dbf13e2cab03e0e3f9c5073b94c8957c8d4f9007065a5eee +S = 4b388402594f5b1dcd7d9510e44dfd10a385cdd944660e7c +Result = F (3 - S changed) + +[P-224,SHA-1] + +Msg = edfb1e8f6d45345d23b194f9b25c4ffdea45277715363fe47b964a52020cfc4e2021445ca850836340a2826efd84ed7424a2c09ef02871e5594dafe25d5631d6b32c385d9be2017015c17fcfde20a9cb2ba2250ca356bdec1770c810c22c647e8343f3748087759954258d856d6e2e5f13d8df4a07b3ea036cbf215c3099224c +Qx = a100d410ce497e991070285c439cd361a1a9c6c973fd6f5e1ba9ec66 +Qy = 0a8c3a2f909f212c84441b8c0030529cbd731304d86f771d89d7cc29 +R = 1bfcaab01e47addd4733369320364ad208169ffb15e6aac33c2d7c06 +S = 07fb33465e7b7b373feda2ea35ab7cc9477156a1335ecad942f99627 +Result = P (0 ) + +Msg = 492ca55d9259e7f277871d5380cbb2ef6afdcc3d43c13dbf2097ef01812cf1596294a9c4ebceb3d8879ab10eb767e38dc53a26f7e7cfaeb9cd9662514dfd3cf33bdc6f4050b76ac997fa1ad6b74220bd2ece8d6041e2d0ba58a76fcf18d1ac56d5574bd4964cf2cd76e419d02da74d08ff32d49e96e2e7aefb8b551490512599 +Qx = a6cd3d14cd5eb188a9f59d9c32e93d890558de382f6fba5ff5c6e395 +Qy = 7a76734a0afead9e5e4aba65f1ae353d6445b1689b5ea402de5f9af9 +R = f0f670963c3d2a3281d639f850f3781c6402d99a1bf07cd9f35b2975 +S = 758e84920c1b744502cd787cdd64ec58364ccc6917258a2580097492 +Result = F (3 - S changed) + +Msg = f7427ab6ee8be58a40de72ba0080cb12e140832b94ebb75942ec4520f424e363de10a450e56cde879ec9ec14a59976729378a56fd85da39b23f709f7fde308eed2aa5a4106716df5f2535a1b90da4e21bbe42101a7ae42ab238e5fa8da67b830d32650db6edd570d05ff72a02cd5bb1fd8a83051fd6446cae1b63d18f35ea186 +Qx = f5fe7875a517207f1336ec2bb4fe5cc7eb80ee2b0f8ebeff4c56e620 +Qy = 0b7ac24ea9092d03b28904d89714b517be023235abc9cffa297cf4ad +R = 88617e694e361d2cfef6b0658d444607fba030ad31fe8dead14db22e +S = 5b0bf37c4a583dd75d99aec20943ea02617cecdbcd295d35ed01cc32 +Result = F (4 - Q changed) + +Msg = 11bf93a16222dfafd6a0d440ae55a7c3e452a7997ff9ab26915ace29fdb43eb3fc7c4973eb134eb0fbab0bd3b5decb349f9a68a5467a028ee6da6e128dba88c0477176ab2e35e4b3f78686006b0fa0d27eee4d652d6094ec883ccce18472c3e66b59184b79d50e70acb15e479e91dac8be2fb691d370fb8507742796f38f131c +Qx = 8a6a77179ffc0ff5d412cf859cc82aa19cd18e5224ab997e9c2e46b0 +Qy = 3d67c177ca7cc12c7b05a3bf55fb78549ef5400a566efe8ae3580c9f +R = 107b7442e6569ddde54b5da55a9dac9bd348079358047a19a3de0b91 +S = 92359be39353cb263946294fb728eecf1880f50a43637f391d3e7824 +Result = P (0 ) + +Msg = 40e373d67cb0adc131ad0889d37cbc21ab60f4628cef59737596c99613d880b467bc2054f5851011a47b561ea7933a0ba8e8912b37f01e326cdea82165d6853bbd82cc28135095e705c83c9b1048d6f715832371bd94d1b59225809495e6237324ab5e9927673b38113b35220fc973f16cd7e2c69b619c11d1f592eb16a8aa96 +Qx = f9f23388d573562f29e7e7c9a98f27e7a1ff02d2d66e177c6506466f +Qy = 4545937caf1878fbacc34ca38a0e5e1f6ad2b25ddd796d06c8d12351 +R = bc1db32e437c67439c27db1dc607e3c505210c984bf707a8e87abb70 +S = b760f4943a2397311e54e888a1ad379ad9c45d1fd09b5389ce1a00ee +Result = F (3 - S changed) + +Msg = f9000b4b5edc593d1880ecb1b65e33bd011ce1bd64fc6310ee0a29ec2d3bce4dd62c42f66c5be97d02ccf562a2f108be312bd51f7be2b01b508f09c288e411d1b733309d7955c978a65f6ef0a4219d9f4131414226b9b4d8609728c772c0c5a0dfe950f51b16255471437ec73a9c8281d0c6a5cb9d93229c689d60f6326e4376 +Qx = 8781e5a98950092570d685964e9ed27760fb7dcff8d3b6f3c8f77151 +Qy = 9207cef64b7c2ed181c57337001f45f1e800e0d1bc8adac296e454b5 +R = 79826ae5b0297b9404829df0f02bbb7b8acb35459e13a4045c40f242 +S = 2a629dab19c9e5cd0a551a43851fe6d8409469f86cbcf6204b41e5b5 +Result = F (1 - Message changed) + +Msg = 882669d8b6ebdd3cba351fe3e3c81b32d168e8a672e087e94eb5942764e2f88e9702ee68ac73300cf68bde9b20e8aa654a3e13a23a07a361f6ae73759cd89e8e9243241c50c55b93b538140361af3c8d9e1e6892a53ea1b0acbb140597b03710e920904849119e62a042ff124c705cc0c8ee55adaa07032cfae698aacb979815 +Qx = 03c78c532b8767784fd45e75027abce3371181f8f54914811588cbb2 +Qy = 166c7b70e98fa11ac361d827557676ec07e553370a462b4fe502dedb +R = ff18b493b166d832c9c25ee491525e4c188ff2b804e38b5964941c48 +S = bbf4291db484b4e4143c01a284c03543bbdaa2db1f1c571f1e5a5e2e +Result = F (2 - R changed) + +Msg = 6d09ccfbe8d2f193cc86a18b54cf21aa8e43c9f930d411bcd6fa92a1e9689b7cdf2b4accfee9b001ad73f25b285048e2bcedff9f244623d1e7eee1ba3090da00af0c1c84e7a10e788cbf639637a29f6f5d722e633a6f725eb30b75c92a7d9ec01059ac2f6c71e93c967d4c83f1e6386825fed2f9b0f73975fc964cecced862c2 +Qx = 99fab11464484cee96d72dfcf0327d671787a2f6ee32f9b184c48fec +Qy = fe8ec3d660cfa3f3e09e5cfc2c3298d4de2f464416deb5b4a27ac062 +R = 714c48c143cb259408c04f77a38d6484e788cb268fc9789d5e871491 +S = 542793d5dbcabcebc83a809cca02b8e95189c93fa4e330d66d5a62ef +Result = F (4 - Q changed) + +Msg = 392bca8a136f925b287541605b9e1b1b9f6f3f8df7668d366569363bcc5818df90bd34d60ad58e06f60b54649f2022e7a02cb30cf9341d546ebf9fdde594096b40f0cc172900c6caf76b413c4a49cbe38f91ac26ae969acb3615eadc2307bb9e1a1a7021f32016ed3a79323c69ce4f0baa78d11e456d2a2156bfd7e9e4dd4ed0 +Qx = 014e8e57388eba32ebdce80df60c481e5c7758374f90a92e0a82f1b9 +Qy = d1aa8418f992283c5b6bb0461f05dc9103050dc55e0265e1c99b935d +R = a159b83e80e656f54f614e8437821bd87f6f13264ac8eca1b3ddde29 +S = b77b7bc8cf374f012ee15f9f9224a46a560a5b689cfc92ca4fa03459 +Result = F (2 - R changed) + +Msg = 4e4ee24112a40b75ee1801e66050d7de82b28c7eca99fb5f0f58a06deda310625d1ce0313e2fabffb45b553db6ca710f109b42f10cab843f8b7f8bea84097f3c2bd5726d9653aaa152a4f60bc823bfa0d2e6e39e48a8cbd14973a671f331f6d5b0a94aa80018810fc7a8cd13a48412c716951e8e3047b13258ca1920a52084ba +Qx = e0b9e3cadca81311923d6d6adcfc326b62fac9c4b8d61c5f960c88fa +Qy = be505338108f8d3f0ee80aefa304d51dd4a4035477934a98a6111403 +R = 8dba585dc3312056a7be61161c7af8ba8b538f0c125c80cf9af2682e +S = 1b5b1adac4d66c7045f3f79c3aa154a0274c4a994ac7a093e2482eeb +Result = F (4 - Q changed) + +Msg = 0acdfd131b2104c0d4304b7535490266df18e6f40645260fb7db86952b2fb40500a3aff55643cced61cfe48d5fe417e5f69fc402dbc55f19db19cbb06b243bd90fdc0b88bd1a4193e6b9cd8f936de1eb447a83ac9c98a0b664f0978811ac00d7fdec1637b9eb3b24d3325c9abb7f09f1becea8f3b1db4593ca4758b96b5a9b08 +Qx = 29197e94a3617e62d9999c859640871a4537a073ca4f12a4c324dcad +Qy = fe198969ac7cbe49df2c61c4cc6fa502c2207a7da10acdccec7b1cad +R = 261670b09afaeee71c590c5658e3f57d859b18a887f70fdeb90e57ea +S = d1d12c11cf7f4a9dd015ead4bd245793cb37ffee1f4cf109b7b68394 +Result = F (1 - Message changed) + +Msg = 2f10bc907f9c5a3c4da0a3a2dcef33ce6b5d43621b5f97c8463a7315bd7d46ce799a5d119a6dab8812d3791b00c10025c0f0a1c6ed9f1aa97c2ee1caf1eaf4b6ed66b66f8c2ad323422f0a03ca2ae5d6103f6bf85c87388a981a5799e7a4b3019753196321aaa93f84e4a52b2722e20e9ba945c11af4ed2b97f952a2178ae57c +Qx = 0fac352c1c444435e6aeb1d60f28ac773b0170ae902afb0944ef0a12 +Qy = ac3ca693a7c5347a074808b43edea94059e2b1d0571d935fde3f5841 +R = c33c7a4de313ff856d2f51cd9e3d173bd10668c296f0e6b208c036ef +S = e562d30822b5cc69713a57ce8c70f83827add85a06c88109505ebf7a +Result = F (1 - Message changed) + +Msg = 93a97bd8466a817495187644018c223a61cea5f461172726667d84f823eedbe942aa9f3d96925a3c83a5e5d7354e38c9692c61ea78bbf4fee6632fff0390741d60663670d2c3c4cc7bfba9c1a2e942ad54af36cbb11733fe4cab60fc156830b91231c6b195554e80a0562ccd04d829ddf85233313047bf2362629a8a6913262b +Qx = b0d4298e998b7d9d4509322a1ac974c6180956533debafd3d9e7f2fc +Qy = 185a64ca840d4b6a2800e72433f26dd523f97daadc18d6d01533f0ad +R = a5155ce53050cbfe84b67d62ce118c6004564087f2fe1cdf44e9c945 +S = b6894b050d77a3ff4d191ddc0c9fc7009a7472e31739949193d7cceb +Result = F (2 - R changed) + +Msg = 736264099844aca80bc72c838372e3ec12729369ddd60ce832994b55e8aebe4426db33618b10afe54368c58efa8348ecb9e790a4f07221336dd05f8a7ef55d45b4fb0c9ccbcee7299d43f9713d54576b7a774878fc8d5252b323d9cfc9af21d750e9b3efbf7ba7c81e7c33f25f6b6464c489b19513301e81140ca4af64f2a56d +Qx = 59996a4a06658e553fc2993f0f55e3fc8ca2cb52d30f882a37729be4 +Qy = a5f68f26ea6608fd1f350d8da7c187c7e70f23363177a5aa41508fce +R = 704ef49e0a43c61ef5b325899acb9d12287883a849976c8b9c950634 +S = 73da6e3a26d5c512405fc09fcfdf650dd8da748e6c3dfc05032d7a9f +Result = P (0 ) + +Msg = 888dc59ddd83b86f2f55c7e18050f06e1829a117e0447a2ecfbdec0680e6ef05461b4ba7d37555284ea63b02c4d2927f8737d3e659fd9f94e273c846f2524fd9adfb5b6ee31ca427f36adf429dee9d14c56cfa83bf9753b97b66659b61fa6a8a2beca250b279c1ce9721c8b0636cdfa5bcec493bc01e5c93fe9d910396d8a395 +Qx = a0cfdfc5a096b0b23ba6748ebaad17e60228b204aebdc01057a7154b +Qy = 9f6bd5369d21d88d7b5c3ce221af530fb9a8fb91e751cdb855ff32a6 +R = d68aa9048e84b8653b8ff3ab31bc73884c6ac7df1fd1bd3c38c16b0d +S = 38ce58afe5fbc6af892e06a4ddd978c745d5ec700cab825c11dd8fd1 +Result = F (3 - S changed) + +[P-224,SHA-224] + +Msg = 2dad0fdc03e9617e0de30b3108e0ef155e4e6c3169cec76622c16dc55fcac39a5fb002472072754e7885cac0e318b3ce0588559152a37e6e55effb6b8e19c45ac8aaa91fbd8cad41fd2a2d5af03841ba13f405b20a04585ac0e456502b9686e72e87e8ad7257d3d65781766c3752c6aa9a24d6f49052e753e2e31e155a35b7ec +Qx = f1eb36b3e1c96a18d87878d5fa8b79d77afce9d2ce40d26199f33482 +Qy = ae819af474f3efbd62401a407036505c5a2d60449274593865de3374 +R = 003122e976bac378c06ec95fd73290b067e7ff022d23493c40663ec9 +S = b99eb4220146a282c7a34f98a9a4fa38ed3f48ca2c7983cde2d3235f +Result = P (0 ) + +Msg = 26b7a6da0a0099c0ed3b297e994765cee13a77fbb5ac13c5cf3cea4ea7bb66ddcc58f85e7b65787a40df26a475f9e47b1ef92db42afdb3ad37a52d773c90f2f0d6e0d2549a2ad5de26bcedcbe6b7629d727216b89928b873841d31c7ffcbda4bd3055eba8e66416c3601eab01e3ae8cffa20d9a9e79eb31cf1084354f0a25f25 +Qx = 3bdcc7c6112cde3c0522f1a4863f1d7b6727c5bff67598ba2f1bafc1 +Qy = 47acb6b254e0e8747e0039de471d0dda443cb09a592c678717d83200 +R = a5aab7768f549f8fe3c7e650154c865b71ea5089bd6303bfdfd19316 +S = ee4989c4b96bcc802464fe44b2adeb1b3506755a3f4fb3f9252bf21b +Result = F (2 - R changed) + +Msg = a8423353b1fa176490dce5e9bdfc412ee795df653a746f04857ccc21e571037a3ec5ef9f89dcc8f733240d69965d1f7ad52a1a7b33692b5792f8ffc2b168efbaa87e4a5ee4ffa8f627a61f64105bb1f870d17eec20b6ea66719fde5659a7e6995985e38eed976c8442594631d345b58c084b203ce3d1869c2856f861d342c509 +Qx = 6d5bacf458cee3ded627d0ff14fd2aeb54fe1455d6daaf7bb43faeea +Qy = caecc8d3967ca1c8889607e9ed975b8a335a17c0acbcfbfed721ee1c +R = 80e7024bf30ecddf7a658785ae51cd6e5a23963c89ee96a82346d889 +S = 561252dc8d9280fc54da0046da494fa5e4b7aed213923e8b894a1ae3 +Result = F (3 - S changed) + +Msg = e9859a4fb2fe008ef14e8eb68dd00e06eb458483e54c3206385faabcc036f6e5aa5e0f28c0fb8a6cc345a0842e4cfb3240e9880d40665ddb75e893e9148cd0c11667f6abcbab2abfa63dbbc32dceba439a36bbefb12a5b242bda3ed58b7f00100fa4e0f8012f7d17d3e4d3210f0685817cd5584de4ae43655d9389bd70ace150 +Qx = 7f9789c729355516588a5c75cb2cbcf85a14c35e14a5d03b4ef920d7 +Qy = 49e95c49e62dd20f02ed16594f35ebf3415ed50e6efdc0c548101a9d +R = 3c7b664413c2a0e4682a9d1c88243a96196fbd03f72cb873b9bee8b9 +S = 8f7f81ee9d3a2660ab1d666bac6cc434143ca9b04ff638ca7b4aa1ea +Result = P (0 ) + +Msg = 79a8fe06daae39eb45bb989dfa6fd802e4d693d411d0afa264d4717e59d93b042e9d1755f759e92557c397fe3ceec807d65bfca69ffa749a559e9d5e54824d9fd75db8f63229f8c2ad0698c7cc556256042a02884bbe44ff71a54ded2247bd9121242cc2d3aaff5061e8f2e1d56bc5af682ef2739839ac31f6a6ad3ba47ae05c +Qx = fd3efc7108edbe155adcd8686d8605e811fa79756c7e2dc8c1c04212 +Qy = 59edea73a4e5f91541fb4cabce539afffa85b6b0113289f049ce60a0 +R = 4907884b8b7d0eb9a7b24420f69c58e3a17314e101da0280c0ceb130 +S = f7629bed92e5c40f35d7731912fb45a3cee06eab3d409a62997f2282 +Result = F (2 - R changed) + +Msg = 251a4f8663c4b225a4dd9333a173257e2534498479ecb3f7ea7f506d6bcc762c6afd07da938280ac132dd4dfa15d27468daa2a3c0779c29eeef5f5b88cc2333444c5c24a4362c0c5394d3898c4be9276debbf47faa1981b148899ec44fc7a4e9b09258062adaa18248908b2a5fa7ecb4ae0549d4b369ccd9176140f673db8239 +Qx = 8b3f3e31d9c8408a39997455ffe0240fe128a5f1be9b3a33a97b0910 +Qy = d74ac6ad8de2407887c335bd66f684454dee175a2af713bb334cb3fe +R = d28ae763c22f50ae9ee9fbe5bab682fd8d820b99ab70677cc46624f7 +S = d9fa54d0300a6ac74936e7a47fbacadcbb4b25ae3a5b550aaf53991f +Result = F (1 - Message changed) + +Msg = fd5d8331e5cdd7f205bdf2a8fe39c5dc43c5fd40c65d49458c82c39c779df0b8cdb003b0f54bdaf03c18739c477cb7c0eaa96e658b3fa5f580f2a524d944195b1644c3629f289a74a38d709be8e5d7dbc2ebae309bd0fc9afa69627ba185c9c9358ea772895a2837b950915ba46e88636c941dd1245d4baac6e132e7e09d7956 +Qx = f4fd02f3d224727e156a2cd7543483f3e35eb65219e32c7923f93ecf +Qy = e7aa734828ef326259f98e0e8c3f30b62bd3295c6d1af2c429a087f6 +R = 9f57e28f69d2ebd96f6d98903156a4e795730e09fb67963771b0a851 +S = 8cfe716488479e04500c8eccdc86fdd54ff00258639f7177169e2030 +Result = F (4 - Q changed) + +Msg = 0f05382e2df4484620756f4021557ff5e886ff2681a7c2902a8175a990aec3c3c9846f102deca2cbb192d15938f12f3f3656dc4f8201de114a742f94e79d48191c5080c2321243dbc97fdefc078080c3adc3dced963c67fdcc2f8a6ff4e678cd102de3f083743e82a126d41cfdd01b219b8b586786ea389a12b19223feb1c1f8 +Qx = 0fdb8faf52d8f46229cca1e0f22e869a91bd56eb6dccc547151f9c68 +Qy = 96c8d1946528bdd2c14c3a0a9c17a088d3f0599752d095ba9de9ffa6 +R = c53c0ce7d408278552a5fe5854c05641cbe93b1dc18eff1c68af53c1 +S = be7453a12693ce7812fe58746323882bc14eff972480b49431cb10b3 +Result = F (4 - Q changed) + +Msg = 826ca168835f0d8b3005f43adbbd6166160f7cea503836591a34601ce08e792f4efb9a856d88db5f668fc10662d58d5d391fb2ab35c446ef1559b23b896a2943feab303b5fc6b0b730c9a32569abe05cc4218d6bb9b47c33b1a0adc7f4e410d75691717abd395c18479fd3a0b6d172d1e39e8b792e7d1f4319a948318b18e2b5 +Qx = 240431da69703b32ba2ae501d2458b355b66170725806b45996db195 +Qy = 13beb5198ee00abdcfb2cc5454416d4f7c795e97a14bd93cec3f0a56 +R = ad03bdf64e3450407a2a977e1985853d6ea41568c3a394d696de6739 +S = 7b55db9abf2045e2dc7ccfa2e8fb501883c494662d400590c74d100f +Result = F (1 - Message changed) + +Msg = 36806354413189fcc8f2055352feb2920dfad22fbde0851c41a98cf8fbe77b2f5b9da656a6f3ed91b1ae01216ff856e0d7fc0e6bc3788cdf1815b4aad069500ba71bf106aa51f04186f68ac3dadf8b446a3f1c6dac5d4ff7139f9d3ed50f332e8aee278e17e1916a9df165ce7a2ee48333cfaf13d02f0e5939a3c00a6aeaad38 +Qx = 8c80c86f91b1e330f86f5177fdba839e625a27e8531f232efb10a484 +Qy = a24deab8978dfe7398f7a1da0633ff7cf5aa7b7365ce2d840ce81c80 +R = 0c422b292308f31af78b1261d12765cced1cf96a83a6bc3bd90330fc +S = db34f4462d0bb1927cc99273dc92d3fe654c85a3b53c6d74ed900621 +Result = F (3 - S changed) + +Msg = 2f266b2f7e52351c2b9bde5a10723e0a6c06c4f2ec459dd1e71cfebd8873d132c0fd721ab2009b6f7cd0f8e59f19cba0ba6249947e5da6047236a26cd06bf056b6e86440d5fd9189a462f0dbc2c9b2f6c203f6a14d44d4a16731e0ec5fbeb4e4510e8985fe02c37942df2edabe3c76901638d9d847274eb74e1e7740fe633a33 +Qx = 3a5d1b7ee6749630c9619789b256f6bad5bc4b09950cd53b78d5ef30 +Qy = e85c7ee707df680eeb5fd78451f7302ae653f96721443826096f62a3 +R = 671ad280609364b0e26c92b13891f677db7c83499d0a3d7b6d80affa +S = 7c4b9c5a3937d540ed8bd59e340c13f02313445e06b2bf7525f5726a +Result = F (2 - R changed) + +Msg = f72749aa1af0e818f82dfe5ef75ff693e8a9461fb035bc08181d42f372a69dd88075451f32857d255413923aa5df50f9599611683cc64d7841f8b98b2ac0941ab51c89f58191ddab16229a9716b9c0e2930f9520289215cda715d89a64655b23a71dd778685ef0e114cf952c1122a3fbb40d81ac7554b846158b6ec748257a22 +Qx = 350f59509abc9f7f9b35a8b80065258727a8ffc27e6dac635ed68900 +Qy = 634fceae493b200cc7680297fd940dd86a5111da14bed68c797ef254 +R = 13a302b200555a0e80584e6ede32c0f9c5a199125b219c3e8d0fbf96 +S = 13f1d7b0c87acea6290cd9d36f1820f546f83dd8d7d9abe9da5812a9 +Result = F (3 - S changed) + +Msg = e7275a54b159b1084d45a785be5e69f3e0105f730c67940865af20522e617513fca5d1d4a6ccd4cc7828802c17322e7e77548ec724696b1d18eb8167bb62d7d53a8dd5567faa156eedc1d71b1e13cd2bdfa376dfb456a9851467a660a9993ed5be5a72ca8d44eb47333f0c42c3cf8dafb17249a1877942ab0e40ea36413665d2 +Qx = 1fdb820003a2fe61deef2b68b92ac711abc76200c534ec3abc99a187 +Qy = 32f87d0554b6b5e389311fd3c86825fcd42654a0b6f5d4d5ba73031b +R = c03e551abcb12eadbc291b2d5fdd53bf725b785933e0766969f0355e +S = 94826a8753cb949e0199be3220b4f90318f1c835cdd67efc50df7fbd +Result = P (0 ) + +Msg = 2ce84eef2991e5e467471dc558cd3fe8d838fcc47b3464a402d4d26b20fadc7f2d3c58b4b00b9b307412bfce55e31952a84edf19c21fb6d978f5aaf0db90c9d90519a59e9e8990874f65113902d89141f7c849030eecf78065344240609002635d9718e658da3f62783b32299b54c63656da3d391cd29a117dea1109f0383e29 +Qx = 208dcc6c87e7c38bd914bc9b350602ff62ac62fa4fd633c1af5b8cd7 +Qy = 0263587c7692c8be1f78de88ed6dc99ce1198ecc53a77ae6cf98a323 +R = c12d3b396e1a894dfe4a28971ce4983547596879956504e1a3aed75c +S = 067b729ca23be6cd520fbe9b972b9bb3d00c9ee96832a5c35e20e0e0 +Result = F (1 - Message changed) + +Msg = 1dac9f1469ab84155753c7fff9d1c4e531aecdba9f9e10c8dacdd74750cfe47d498920c8c9c187de9b31deeeac09f735d2ccfe64b097349b0f3b870973593dfcab84e16ef7e6276f2c45238e49a96330a2cf7e8e5813c5f9484356b9d72d38e7c3e6f87efb7737ae1be70ac315d9b10758c40dbf43768dab9374116f50d8df6f +Qx = a66a652fa36413dccd72c83febedda051182dc5758a1466366197f5f +Qy = dc813a79e0fc647d8892dcf4f2132c90914a520cbbad65f458ee0fae +R = 809d1b4557eaf36b6eab3449dad56e61d572bd8b63d51b63af1b0bc6 +S = 8bf88226a463606ab57c27ed78f1b71ccd61732fa58b62ee845fd3dd +Result = F (4 - Q changed) + +[P-224,SHA-256] + +Msg = 2b0ae1a73f7169ff23d1b8c4804484434f06ca2d6b9e65630bd8c6692b85bcf4556b880bb574ab4f538410e9a535b2054896ee817b8c8412e82cb785444ad042725d01b9ce7dec1a821d9bf12d60538ac93a1b6e1251b37e62ecc15c92b7823cf08f0ca5665fcd84cb2c26509cfec97103af02f5a34a5ebe7ab43297af3ca273 +Qx = 8856fb8b81a4eacd971a954560018f33cbb71cc1fc243d03f63cabcb +Qy = 28afa26baf31b4d89de1dadd2289006f836f23a11383817ec7e4e799 +R = efccef331805e71bbf876cbbc2342a6bc4508aea7c691029c8396aef +S = bed544d09e28dbf01a30b2cfb61b98ad6201a9818f22b4f543f3e7f5 +Result = F (4 - Q changed) + +Msg = c8b10d4e5a1f5f6a3c0f4c15dc2dc84f0f36b219076e27bae6d26e3b4a414473186472ec793527bb8704f69285b96eaf9473085060603584bca5f1fce4e909203dcf0eb50cf05adaf89804c420e91d1226d9449bebf2e9b3ea7cb23bd094a0bb04b579789c800f58831489d25179db015d751e470c0b21c7ae03fc0e4a949970 +Qx = 34c5ff3de565b85bfdd9f0a8b3fb0d46f924c57b276bcc830a1ed580 +Qy = 609d22200ef38b410da77f7a8ff2f58448188042978fd9ae1b2b4477 +R = f0138024fe0516738f3bd0e0fec10defaca8c3b89c161a77489cf2b7 +S = 4ae0934266d9e3d64c2a12f546b132ba0f33ef50abc90e7ef5974805 +Result = P (0 ) + +Msg = 530cb88a9204aa1eb11a100edf1849d3cde94f52d03b5727cb6cf2e56647e61ae933131fc7017d4d1176c5fd637d40b93e04540ebcc24c429115246d51b412993444800ca5443bbfde39134e97c106c48a4f3316f5f4d9a6ebe134a10eef14ade3971d7c37e9331a91a394355c9521c415d03c550e28583ac95c06fc222c094f +Qx = 465afb14f4bf85022ac1f635f46c0b2f6548bace9352d32f74eab012 +Qy = 036371a3246dbf1069d2d268ca431553d1f2bf0181225145881b7be0 +R = 9bcd57a2fec2518903e4b13dc0a7b84bafed5c4908546e94ffae87ed +S = a337e06582f6b3973df38b93a0fb2a63f7774b62db50dba557e5cfcc +Result = F (3 - S changed) + +Msg = 28cc72daf7b4ecd0f2156035576113279c8f80f07e9ed65786d2bba896e4b5f67a08a8beef9150c9fcb97f21b25f692a19f8f68a2ee8a2446181394f3f0acc5f3698a9a89384e7b05dfd6b7f8eac214447a4a6ba8fb27756d70b34ea2d0cbee9aefd9279824bb33dc15894fea29e5c84b3281addea013d221bf8e5cda1833a24 +Qx = b8b7f923c05ec95ebd484db7c58d219cfd26ee6b66149631f25ffe4c +Qy = 6bda5f4f988784555a80b5494eca51ad2c7f88ce94d2090ee0c76fba +R = ce4d86bf5a7543d1cba8e4470a297e9a48d0096d7788c6284b1c0af3 +S = 229eb0636ee62508ce3719396d7577ed892cec70a66857fdee0d1fa0 +Result = F (4 - Q changed) + +Msg = 125092718c72614452a7a36425b759243d6d9995776bd2d85c7eb1d5f53f9293bd1d758331dd5feacd5769a666e3b284326610500c75345f20327689e21a37721d31c6c981372ad3f3ce816b9ae58f3ae9acdc47a8abd558b6790bf75d38b1db2c20d3378c15ef98dd0af35927bfc000a38ac901ea1b77868222d5d8de1871bd +Qx = 13e84ec2eb993818d7d78330855ee2fbe8ddb548a5e4198e2087b3b2 +Qy = c95dff249e10c506fb547a92ade53c61ddbb667c760e4127a1a7f806 +R = ed26f00ed696e114305c546ed04db5fc35efa43059c0d8bbcd418d0c +S = 6e16efbe9501e3055d74966a49232cd76b5d1241468788b4cc7378b4 +Result = F (2 - R changed) + +Msg = f883a957c5a3616645786844de4b0befef1c08539a5cf52de2e50934c5b01c0c2c5b2ff9fbcf4e8c3ec50dab9afd3cb6eabe231dd0af3ae0754cd7976e9c8ff7d9cb3337ad535e50e50ff792d4d50a455d6ba857ba8504256626b5f28109fc57af5331b043e12cf8992a73d7f8a1f71eb9e7c542f8622c8629b9b18f07adfac1 +Qx = 16c23c93699cf665a5da8b2d4baa72c36158d3433b1b945e47204b0d +Qy = 12023703e1b59ec9054ff22d15567b9f74058b47cc13f2ca08ab77c1 +R = ada849b673a1bd2949a8b4d8fdfc239ec53524a356d37da3c9d17ae2 +S = 698de3a3d8697c2e8e5b2c85fceb8796750c5b44154f01ce86d99e24 +Result = F (1 - Message changed) + +Msg = 2346f531399ec2a809645ed85ef7026f9387afe2dc3daa89ace4954061dfa071d8e80676bd3a83af54920c3546edb91f72d0292b0c782062af5c52ae81d14babe9bfeb26de723bce79488495321ac0ac0e00f121384edfcf4e6482b866bd784425aee5112a3d7750b87e132b2e895c74aee182f82b73a36c5de5ce2c94064146 +Qx = a580f9a0cd15abff8e1e712f16b0fd4142d0d773af3c657abc06c2a6 +Qy = 22c6286340dc072e64274209eda60503047700571caee64b4a2306c2 +R = c6fae06274dc052e482102520b49d4ccc4cb7eb8a3ea41bd3680ddad +S = 50d66b75a2bbd0468be1f9e61bfda85b6329505b0134d60846cbe4b7 +Result = P (0 ) + +Msg = 092124dbfb916fb529166b7bf32a5bb8f60138f0ef03e7eae7d98819b0f824e17564c4e9e44c58e7e36f58738ea5296721054c52fde1bb575ac48c38deca47fd6717628fef8af57e005ea19b6ce2f3100d2680b94bf53dd0e853ec62a7cc13de51d9b379858ad0ab4af9642c3d59e722f88503a02964570e0769d6a054370a7a +Qx = 0b4fb6fe5f6cf6adc7d28683628d4b9c569d21d2397533f5bd121a23 +Qy = b44d60a3414b9b7b6e4ad735ce2f9cb05593b0874ada5e65acdead4c +R = ab5ac2039b49690c6436793decb1a6a58ac34833a8091005312a93a7 +S = 98fe955cd836501cef78c7a05fa27edf2fb3afea80990028ff64e984 +Result = F (1 - Message changed) + +Msg = 59f731d3e4f276440ca3376ad71b23fd92b71d802a92254eabaa5da196c9aac6cee1f396b72f24ff2c8612534cebc1b154673a5964109d80b8844e99971370c478bd7db7f9f006715f6209361dd7f33cead36c74652850bd1f5b8bbea5e6cedf30c63d38a890e8d5c985057857379690abfa6726e588b61506cfa77f541039c8 +Qx = bae2b3634c7854c932551ece8dced2139a51705059503881a9239c78 +Qy = 094d5e455bc9296202618d7022512b0f9ce53d796c7294e6eb076a29 +R = 2fbdc7e9e98aed5dbbcc5b034e17a95209e2fe1b01515426b8b372c3 +S = f2b19226528f10be6ef0d27ec3703db690261206b7e42f93a691192e +Result = F (2 - R changed) + +Msg = 8c68a69665f640abed4c56656a5127b77708e43d1cf922d52bdfb94d71b6ab3cbda6c5216f1a8559c780d9313ece7cd9cd2535f7342b6f45c0f84e55c630e59145f1079817b880061592ef645b9efb7c29483a9548b5ff74ee9123e872484232c16bdf6cd3c074e8bc617dab26629b3eeb9bf8fec2970cd467caffc1c89d2a3e +Qx = 49d9ff4f4bbd4320b6806a7fbaaedd962283c766a6c130e4b62139dc +Qy = 06dbe8e7fb8fccf9758101ae46939c6fd4d3afc526ba6c8156c6b013 +R = 2d83aa59bcfc8a0237884826e08dbd78a56733598e379f2a9d51e9e2 +S = 485036c74618d0e665775fbe2d614a313c550f9826b955d3e5636fd1 +Result = F (3 - S changed) + +Msg = 57a2c4a14a3633e06077990e53e5f3af5e0c7779974d2bc0700001e5f43b5d9fda167973a38ec288bec26f8de3f7a601d1f665f854256059a3ea07e9213afa3039987d8501976b31473b434d449850642fa89e9913cd1ca445ff3d3e98936073da31524d265fe0415a96a39f0ad920ef60de0e83d12a73551d23b5e0474ae367 +Qx = 78451cca49655978b65d8ddd45ff367c47f321f5d55ddac7969ab82b +Qy = 25b77f820aa9ec93ec89d7fc84285f3f3deed496e0cd3fb9ee4a5c99 +R = 998789490e008ed11febdfe2981a55c733eb9739d7f37fd5c2a7ec96 +S = c3ec8afade81860ff23cc1e7d759d32d9a5775886ef17bfb719df4aa +Result = F (2 - R changed) + +Msg = 2aefee3eedbee09edcb8e125e047f0470bf50ac140b35e14b5108b4b227950617d01ce8c5177b3e0c60907c6100a7498114209e9c65a734bae3276a9a52d9c30e85446f04bbb2636b3b96d30a5a8455bdc90fd9f90f1afa8d943518e87cf8c378828fd972cb5b7cb67746b05fd1648ccdd6bece5b75435c4647efaae935d12dc +Qx = 18ced60b7fd9ebf76c3aa5976dcbdef40bd3e36033c013553043dd84 +Qy = 30398582dbd2004064f8055e7fe0fe8df11b2c9d9e2931ad12d09628 +R = f880143960e812464810c175001b5d39592fe63aab544deb9ca301a0 +S = 1e0657df071a25dd791264b411c8964688f4fe17ce024e659836ebe1 +Result = F (4 - Q changed) + +Msg = d79750680a4f6864cceb1e920b42424702ceb50d3a5bba9589f34f91659b4b366c4b332587363ac5d9e27431c1c379f6bd26738eec0f24b567b65a0147fcb6534cce0f6a30a5ccc277a1a34d4cd5d6d2034fc26a3d9c4e2fad5d388cee9ef0f895e8bcd5572459065079a5b6e954a19f621db3240bf6dd89368887d691244aa5 +Qx = 5d67c1fca848ba7f3d9de5b1894d3993ac4ebe68cdb0b49553b3b0e9 +Qy = 07c219a8323273c81f5694306d0dd1d133a49efce5003bc90f05578f +R = 767cb6b2efa7a40739830659b0cc24fe3de771d00104b3dcc0f640bc +S = f2e7268bc011d79d33f3551d2edd3c95f324955479b8e29e8aba629b +Result = P (0 ) + +Msg = effa3084fd4887512050c276441c4a6d4cc26e12135f34057d51e23143d8463abd00e7961fc17bfeabc2e759e803f4d0aa8ef2d390ab709e4c08d215028ff6557a76e5a60f8c27d5879c704cb05aae46b1bbfc4f4016aba8ff562840b59b2183dc21878ce2402b98d35564e4bec84f6fe699fb5a399f5cf357a5980f0c28f579 +Qx = eac72b399cb791b3ed25cb0a49eb157e69603197e0327eac5448680d +Qy = bdab3a2270066e74e8210eed7b5d43fba1e26845b6c037a8a7e2a13b +R = 55485947e9e3c194a29c8ecaddb18eefd16fb6919aeb0bbbd8c12369 +S = 6309a2cc7fdd9eccb32b86d5577aa54ada79899a9645f2e299630d31 +Result = F (1 - Message changed) + +Msg = 625a25287c4a928fd34f138b91fc61dc5b6fc73416c77cffac9239d85c98fbabeaaf75e4534ce486cd700c69a6361c62f52d0e8da0dbc26954b63b4cc10a8170e9ebc1ac69ccd399338120e7a81ccc41f179fb92279cecbb6732b1473cd51758e7296fffafc114071c11909dc456b37791e62ad0400e142bb7df7fa6c3862d07 +Qx = 17f741267bf3e8143046707d41eafc9555953fe5f57d6c035452b232 +Qy = c667554d9a55fc8ab1062203dcbcd2bf9769c696a295350cb28aa01a +R = 57408bfcc68e60ad000eddbfe6eccbe5f87b98c95de0e0a2e065da92 +S = 51249bddc149f0942be001b2f3d6f6d17a0cc36fefce147058944667 +Result = F (3 - S changed) + +[P-224,SHA-384] + +Msg = 3571050a4f57432393c59b90aa8ea1cc545952ae5ba682d26e53bee0c988e6dbe2be0ac9b125d6b80542f55aa0368f445efa81da7309883329250d37b3a383c6327e473a6f74c952883a0e5d7909611daa7d56f7e0065fa3b535d4415df7c11fe6105adf8a3e846167b1a61984f79cf6f02306bb1ca5a20f0934f7b16706544f +Qx = 3297edac34cb802df263f8d366f62a8b746c316adfb1c84a1c79c58c +Qy = 79fe82e87ef5879c12eda6adda198a662fd77afa6a1fb5696cb7da9d +R = 9993defdcf83965723c03e04ce6c33b3972cef3c449cdf1bc69990db +S = 553b22a4164549f16aa1a928eee74548fc141fd3c16f213318965974 +Result = P (0 ) + +Msg = 9ba60dc6e2cf092d7be9aed3596d6303d2e5e07fdb1c7cdf1d7f5de252d44000572847e49e50dbbe4db545a54d39b466d0dc8539887fd371ed23a4e6370577594f119cdace807e22283f8d036b0732fc3e8cbc5c4589e6c1e07e2dbe6b93fe79c8ccb5e5d11d7e49d03bf3d909754771a3c2ee23fa434574b4a91c0b0334632d +Qx = 2bc010527ea7427cedd213aeccf0c62dc513785888c6373740139d8b +Qy = 2e9eb7ddf027ff7678ca880511be147098b34d8e77acb4389fbc6e50 +R = 70a7cb04295a53b4a3a695ccb5d87856fe9152fce11987d4c43207bd +S = 49f4094368f2de9327ca2913ef940e17c5801e8f589413838831083f +Result = F (2 - R changed) + +Msg = b6ff3652e52d108a7592b3f0518d9f4533873f5b6239abe53a1b31928ff210ac337fafd96c2e804cc4782c1d1660378d706a91a9cb7af17226319a2354dd7b151d2103daa6bc6e1d924cf178b88a2b334b74f8a70a2318c595301cdeef883187d4aac43d60040818ba1c846524f7c79c48d8702c2cc25aae2c58082dcaddb03e +Qx = 55c6217adbefff6e21bfb5d1b75213ce7b20c900d514ee094f27ad0d +Qy = a68ae9f86eb9c10de3e7d9b03868518f33f571f85c3529d2902575d3 +R = c073fba87267b45853e693910c1de791908ca7a25c1716ec2d3cec71 +S = 6138c86daf1021ae4af0faaf0abd5958f93944d5b0d82c40214bacca +Result = F (3 - S changed) + +Msg = b80b5bd76363deba633311a9a10e4fbfbe332291acf309de9e2c81c678184691e1d3af65af94f735edf655e7e6ee8668762bbb1b32d322fe6b63d27a6dbf726d7f9948ddd90096d0f64de96e5219f83126a98e32925845968863236661739618252a3deaf67558729cf1e35f260daba73d20a9589d3642df95e3c3cd50f07ae7 +Qx = 4d0cab0dae88fa0cf53a2a6562934e0cf0271cc7fe54a30109a232be +Qy = 70835833cf9e1f989a18d419e7bee9eb5cef1fd145cf62c4411c372c +R = 3b8548eab4dc123e236133d826f2badbde96f92249f456e33ccc9739 +S = c82b2e41b9e2b21594cc03b1c0de216f183403c6025e18bb29bff421 +Result = P (0 ) + +Msg = 51ef637af24c3b1a8b4f9db24fd1c719c39e64f916002caae973375771b8be0b9d3059ca89e46fb7b9c4bb2150151412068a70f143a83d13144003b06ae8220f24d7ffe081222a6582d3c84acb30e2545a4700a40b9021bf14744997e707f3168e9f493064f40edfb4b3b8f96a94dcdc2f0a5662b704b466ee888ee3239a52a9 +Qx = f55a53b818b3ec4b4402a2c63429c1d78f2cd0d8d202e33812878a03 +Qy = 5a2b1a00615c56b4313828bd70526b12f402df1d40fa4900c994af8b +R = fa934f9fdb765fabb5693ccb1de4177f172a8de108805a48f4bb989c +S = 12994f2a26252742667044a01b509b0f315e8141629f760267b850e1 +Result = F (2 - R changed) + +Msg = 27b35786b40866c4e4a6e964db74bffbc95b8dbe985d1e01d0235796c3c9f757117ca5b2e5c3b9f4d556e9a4b4c8103d45180b269300f502dac26809010fa249bc433d82ed8ca05e12246b531c1d331c28aa7e2ef157dd94d4c5865ff9e8ac349c2db446287fc4c9e0f2ef8fe6a75f98f9af122de87b0b124c79cafbca31322e +Qx = 40a5c52dda7de858a2c17d12856c552ab820023336b9b4fc196bcd67 +Qy = 301e5368f59c00f15e6f3a91510444fb75a4ead8efb0778b4419e7db +R = 0fd8773fac425a2761b954c946020615336d3e350ae40743641917fe +S = d59f2b806ccecc444f9387f511c7f9926fe7f045c0ea633a51b7db47 +Result = F (4 - Q changed) + +Msg = eedc96f4e0e5a5112e807b441c259db053ac60d2147fc613f49e97c918e1dddb13159da9a5baaf236662a8cf5af2283a06784b1ac0fa1ba3dfd5bdfdfd2ac071aaa242e76e6e2f8e869c68de5fad18a35c1b4002d6f48ad85eb4aa6e31460b66596880455a0ca8215acc15915c529f161670b060478cd5d2886ebf4e006780c3 +Qx = 372a134eec0dae3322de8836b89dde11a69e0379a60b10343abd478c +Qy = 65921970ca8cf5a75f044db0e29802afe1726d18b3e07b61c768c242 +R = be6474845a42fd4e85b91238f1e3ba11cc88e216d295c1b07d855987 +S = 2724242ffb5775f614ee06eaa4c985358f64869ce4ae4bfb16b5271d +Result = F (4 - Q changed) + +Msg = 99d534c64e46c3008474358dee11e35c8c720893dc346bb15eb93fb14ccfd29469922c8b7c003d9dc6a553d1bdc1abbcc5a7f5ce9615bbadd943be0a10ddd797d7f1535e2e9fd95823b258fe18bcb901bd8ad4e969592ec7dfdeb71fa72d49bc6fc049acd0eb1ff986bf45f84515e2dbd9064fa5ee5ac22d69c77c9ab573a349 +Qx = 9ad2cee0d92b00b11157a18fcd752f43e772ede7a46475a50e7ad8d2 +Qy = a6edfae6c5589dc0db6353b8655fe3b0f7dab2aa8400cbbd72d1a572 +R = c31a40b6c245572457a19efac0da0db22b2a0818de716b6fdc5bdb32 +S = ed8204de94f1d92ae3fa6e10c727eea38d0e12b58133fda1a15559bb +Result = F (1 - Message changed) + +Msg = 51305882b8622e331c5f9ca55ac8c6b3fbcc7989a1e48b6b8b2356b34d79bc9b234e5b7d50964d312aa6a6995408f8f6bf095ae253d5209f19ca8c9adf5e16d30e0a382b86e37bfacc92cb5c4be46578a6f57e76f7674502828f6dffed63e2b17a3dd7064bb2e32a42493bc887d5cc271390a94592a5c7bfe494a148cc27f0c3 +Qx = ed071a20d76f81c776875f8d3307841d33b70523ea40abd691d55d21 +Qy = 34ca47d8ba0a984d0d728c4d8c6b9aacdded03c6070616680aac162c +R = c7a5dce4733a81bd738e0a6e0667dc1fade86db119e7f3cde57d6dc6 +S = dfb7f43343941cce331be27047b131617910f68393630fa53d137df4 +Result = F (1 - Message changed) + +Msg = bc60ea2bb76ea1cf892a7dcf93358f01504f874d2bd00773e0d754369bc6bad6b827ec90e4cbef34381d71f91619a646dad6d8a4ddef7e027124790383f85ee7a12dd59e007b8b1c656cbc1cb36e615608877724bc71fe1fef9ec1ef512c0c3612455150ad1db6e3b9a8f79441ceea95d33018f7639773c2367472c4d1d86a5d +Qx = f51097e1e4b4f3b32e92fded0b4c8b7240a62731292e615a4cae0dcf +Qy = 0549003f18e67076bc68110a75252072fc29b6d4a336d152dac2c3d1 +R = 6875a118dbf586a51af2212d5f32908c9f31110e9e9a7e4cdf7494c5 +S = 1542ab4260459e82070bbad405193a1894ce717af158daf1d096bc01 +Result = F (3 - S changed) + +Msg = 6cb6c545e73e783e9bb03f7febc23fc8b0d2fea207bd66795262dd9f994eb87ac2cdc0597c8a41b2340622c36723f50655686c5dbe651421f8be87d37bea1c50cb5fc76ae502ce7793f89e79d441cefbe378055026cf0642f9384c6438da3ae3bf1b418c998617860700d0eca41fc278b34c770bb6fcaafb484264b22daccf46 +Qx = 5255e4fdc816044389e9c6f5e09b85aedbe1c85b1cf9b7190ef7c2cc +Qy = 683c8cb6f31e4cc1e2a5361eb47e305d5d8bfeaf94e261a341aedde6 +R = f1b0f8a3fbf7d4de19cc1d3b4c525c31bd97c2e2a94eb8a27c7c197d +S = 936d3f49a9aa58935cfe227b22db83314ffadcc4751c8e26853d8cd0 +Result = F (4 - Q changed) + +Msg = e57f4a280c8aacd5d571b2c39e5c44f19ea4294496dc12eddc061bb283045e2dd46326f833330f3b178e3dce2e25919becf94b177bf3ed54a608f708d9a5b99b22ad7d4d8d4423637ba4fc62f2e770b8544982593c500f8c4e8745b224d66af01147b097e2a86dea996f320f7b6cee321c88cb447933ff746b8f3cb147546d5b +Qx = 7cdaf519f6b1254cb8da4668a2dd2015857ceec17f838c15d7d34b27 +Qy = e29f80fa4f830af7737126d4454b6498905e2c633fa61ad6acb30823 +R = e640f3e676a11007e73efd00b23087adefc9b9407ae8b79b47c397f3 +S = 66b7860a0ca35c2f1c65d50f99def9f2bfc0a6cad2008dcc38d6b3d7 +Result = F (3 - S changed) + +Msg = 43dfc1ec78731cb4f0e467141f46c684f5cc946a4f0a40451d5cc46c549597ed23c44ca468f59815885a50b747b6fd95ea3b76671acaa977f556d49305935a64737f3ce25b4bf970574323fd4f2e9c32c179ed1b38b7232a2ab0ce3ad90c2ca872965cb6c480a14851c0375eb0f35c19792cd581408e5eb1ea4ca0fc297c12af +Qx = ca1a04f08708ae714b7dfb3db509970d30b7e01be7fd6181613894a7 +Qy = 1d90a2fcda7dd6ce8b207eef48340e58cd439a3ce17658f6f82be778 +R = 9e810ec2a0bc205df6a75bd6410e0c8ea1c738e71af060e2eb271aa6 +S = 9d05eeb46258c468b0398cb6e421149bbea5ed936be3fde3380111cb +Result = F (2 - R changed) + +Msg = b5b0f24bc9515e37fe24e296484ad4209c513f98ea5c45f8e3f6f7572ef78b0d6191517236ab31d25f8b3911b953396ff1bdd34cd5a19b229ea37b6c881ce03fdbd58aeb7e40f180349d119abbce5a2ddd0f73a871b09482c5a2370f71d502ea426d719ca282bbe482b20570c18e58b833df46c1fd616d49bc766504c5559412 +Qx = 558c323d8259e055a025fbbe6ba8b525b02f32caddfd31e5b08219d4 +Qy = e1d6398b1c47132632cd3f3fae14fc3ee3092faa619074fd951a5870 +R = 05d8b0bcedf287a4740bfc548570b1c1fff71058e0a9d88476bbb6a1 +S = 769321d50e34939e622a727855501e25a7ad44ec979985e7389aa3f9 +Result = F (1 - Message changed) + +Msg = ba5eefa903c9aca4d3c7660207580c4903f8ed6e10e623d45eb8ed3db63407f6c0f88d3d0f8f2a5b418eb0bbc781e99ef251b829c8cb1a408dd3cc145c9be054238f9cb8696cdb8f640cc19d3c7c1200011fb9be673cd79c5818c39e4ff84d88c005e54497aba793afaf21ce39f3836a80824df05edfe4c3b1e70ed27b9e2648 +Qx = 9237e61ad9ffafc61cc1c72b6d2f96d69b588c8feee4074359f694f7 +Qy = db25a18f1eee72734c640313f5c6c0441358611406cc62619113b4ba +R = a58225b10080dab26644f10d8a817ffc4ed4535011729491b6ad5d00 +S = ddbc010e295882e0731ff240f15ed82fa3e81b7552c690cc5b40be03 +Result = P (0 ) + +[P-224,SHA-512] + +Msg = 11c46138692c1373b296d209dcc0abb71920570d064d077437256d4458e9348901db046a62533b24c84e3ae7572596f1c1315c99ae82233c4445ebf504b48b847b3209ef617b6961bf302a328c95fce7c268a5c3350e51bc270a4eaf83267299ab852f8ae607e9424d161670bae5dfdf98235b36a8e2bcd9abafe14d710f5b9c +Qx = ea7efb9a7e7bf693dc0249504ead70dd422ec86806cd649ed57a7ffe +Qy = 33dfb17b1cb244279990019286ab477a2aff2b55c08959deed0b1a28 +R = deab574de1f971419b7ba9e169866c3a6233fc627c13dc6a8cb88bdc +S = 8d4c542bb0046da1b3912652a2c84542668cd89920808785d04e4352 +Result = F (3 - S changed) + +Msg = 0bfabd6b152c3b095a4f19f15acb386ebd987b4dce986a10872a509bf24b2fc68b4412fd14cb74e04fd9b9dc2453cfcdce64340b860c14bdfdd65ad0908e942c2685f0f7a5b95b38183657456ed550d42a5604ca3450f209783b3968c4facc2931dd09ec0541df300a3f73f93bd5b1962b42f565277f043a22d04cc2bc0f17b2 +Qx = 6fce4d789b1240f2ab1c23051aa03e219da99943a18864e7876d4d11 +Qy = 3e84a6bddea4a28cf8151ae73aa7b1964c37e654241353a9fa723f67 +R = 2d1b4f1ccaebc0a929598b650ee364abfd6091a542ba426886d75f38 +S = 44f3d7afe84ae33ab5f9426dfc85248ebc7e0df434d35980ddec75e0 +Result = F (3 - S changed) + +Msg = 0a667edb6b991e48b2db87a982fe0e853d4611a0332b4861b133f0a091e2b9e6f0de895d69a9793dc6e54d37d4af2d696c28886f905449e0b7b178648c8ee82bd8695cb96ec6df240d2586bb5049eef307d0ea9dbd23c98c0df35cf816ec19bb273ae529a5aa7e006ea7a207d7b25d375cfbf765ec86f7d5e1b82f5d023c714d +Qx = 72013dd6f5b1eb709b3b7da234987f9a36c6f0b095620b8c31f02381 +Qy = 319d54c719b59d91900b3c20d963ddf1a10d80d6601ac155094b075a +R = eb38db9b757b3cf04020f09188c789bf0258cd0467cf7d67368e8703 +S = 7664e85f01e67881712b24083f89e838c8b818de4d665494e7016833 +Result = F (4 - Q changed) + +Msg = cc4f7225790159324dc40a729ffb161f26bb624c4c8ef8495bdf79c1181ecafdb6d4cde37d08ab12667526ed89d582b60e9769be68569ed58dc3e801fe607c85126ea7d7922b31c99e4f3c61da6705ffb6ceeac796dcf1faedf02b7afdda3c1bb7dff99401524eda662b82c67ca77b20778c965f9e25e78cfcc9bbd28af36987 +Qx = c6a65011926eb64e02bf472d5ba37841d49cfb7f17a20fb9f59355de +Qy = 386ccb33d944fd7be6b8531863d2b6200cd602d300d7e7681537e53f +R = 9e7c637a699dd52512faea847079f0ad41b20cd7a5461c36d01e857e +S = dec6e9ef361de3f6ec7d87de3129eaac5fd0b43b5f7f58ce46c29173 +Result = P (0 ) + +Msg = 00e66766c3f3b32ea084f951d0242b17808246b045c8d20806c69c5a36b14707633525b1478819f9464d79d769b189aa1e88af2e08396072deb36b7b7aad481843da0a0f7fe70348c7af50fde2b3a56b64a5fbdc17e9aa5bfcae1dbb7e9fc81fb3996cb38546383e8c0c8ed367922d4ca39343aa7dde01504f62afefe69d4b21 +Qx = 5bcdbaeb2f6c57e8a9dffe94804e74daaf9db8452d13c6a8bc2a4966 +Qy = a564072356c5d86200e979291a19d5e73d8bcb701cf84d9012824bf6 +R = c58436fb77aaa4468dee284e1220141ce9ff4426f75daadf5a898a6f +S = 87aeee1229a50921d8e77e7e3478061f5c051097defb104a0455ed81 +Result = F (4 - Q changed) + +Msg = 04639e5e0f9ecc1f67c112e9b928e365ca4b7167b7b189406670d3d856f034c252b8d006349a0142b0da4eaa15b061b02b9702a6a9e198b4f013eb094ba9619b8985154f2ea422f627ffb2ac9df1c4f942d559bbae8b5342ba717d5aeca6c245869afed38f550c4f0ab6d59929691b960799784461c813d3bb48024d78ef0c59 +Qx = 6c6a7deef8b3dee2eaa98d8ec877dddb460365968e63ffe5c249a421 +Qy = 1ad1715797b5e47c4be24d7ecb8141f1772344a2f643cc66fbcf3f9d +R = f778faa2dc2cee7de2af0bbc4339239dc240907e59ac034464ce986b +S = 2ac929588a8dc8785808c9d4366bd7b1a81e0fc5be0c63e62344c251 +Result = F (2 - R changed) + +Msg = fd43b5f491d0e9e9cf6008f9fcb144c4c05da64fb363a43e03a99f0d3ea816ac6a2450ace86b33b445cf07ba15e5a3b897cd5f5374a880683fa49d3869128f0cd8de681d0281c50f68dc1b84c48a8fdbb21649a8b0c328797c6dbab5d0aded032433353c06a40fd3a27a1f2efa3338abff208914c2a78f70b02a383bdcd4180c +Qx = 0ee33a134feae6ee1488bf10edf7cf7c318a2d709080a24818619b91 +Qy = d7d39536e42652baf55159847f475ded075385a3c1af5c3dcb17ee6a +R = 34bd0407f80cb6fc759036e6d4522eb6da94874c92ce0f02d8f5f2ad +S = 3a2dd970050ff990162e5702b06905d03e3c7bb2771050de6d84eece +Result = F (2 - R changed) + +Msg = 8a5cefe2295015c4986894882f2c2a9b13cf0d97c00e2ac892c311d9bc75ea4099000ce8702e310ddbdee08df0a7c5a18a2932a912c09e4d00744923f99de473aaf20acfd3a6a8d01369665b1721f6bebbee709d36cb16d3f85a07e9f551169acdad42e54fa68420f49ddfd366aad886442360bf41c93b96fb859e5c21dad587 +Qx = 31d3c62a4305c37a15e9102072e287a8e0ac027f9189cb9d87ecbea2 +Qy = 26449ca391af6a2a9f8daaa036f2c9044b336773ee48bcbd9cad59f0 +R = dc33e8f7b52f584aa3f091aba10c2a9a23be6835e1551092652e1bbc +S = ae84a6d19f6bad3f9886930c0a1406016fae813673db1516b31b638c +Result = F (3 - S changed) + +Msg = cbcceabbba6f423d1135a4981923e9dbf35db41926310e863015799597c628ce82a97beb29a6222aa300b7d79e04aa55971f8f5f5a95047eff79748babf2214c5aca26208f8cf3521dcc9a15904b532ea18e8f678d13ba3ffdfcbfd68f7f8871e23bcdd41bc90ab51d4178e5a9e0eef2b40beb2984390185b582cd11ca435feb +Qx = a6e4470712df583d0c795237ff46c9df5718ba2aa24139a2d99721b4 +Qy = 9edb403a8c10807e8736af665dbcf6052bd4b43bcdc8b9eb8d4394fd +R = 4e9ba5bc4f4fc4e507c1e5cbd0d688da4237385b16ff06601436d8ab +S = 4e0450a57d802d0ea7b0fb57eb162267195bc4248a831a0ee8b0380d +Result = F (2 - R changed) + +Msg = 51e739cf6242de802172e21425a804d0512da361ca34ac9a9dcbd65995e50da9fcfaf04cc6794af4816ca2da337220d0e471df7145d0abdd3e609805b71a8b380a360eed3f3cbeb93b6916917ed4b12033110bcc4f7e01bb877d0561bfd8f772eb675290cb885b20985cd89f1adad18285eeacfdc55bcb1a329ae9292ec8fcd5 +Qx = 350fa782e1cf7254b18cde30683e54edf2c1b4782525fd081bed5920 +Qy = a77de5b4139ff63e108b6fbd3a7e6c09c3d2ea8720860a7db1c1b5c8 +R = fb7073865646bd92f882f8224503ac1f340cb7a5d6319102c31fb544 +S = aed3ca77d23c78ec76f748e84483c536d447b0f8e186dbd0774b1214 +Result = F (4 - Q changed) + +Msg = d9a8a63dab8ccd95e7cbb989d3ba034a0d4710b2c247acc7800ac00f49c60ced88d17e7165ba5a56658a57e4d957dd6c1da4faf0d76de9e2ac27688ac40bfca099aa304c068d0a9fd105a38210cc39549807e7a419a83878d48dba4985f62236439fa2ffa82e05fba5814a58b41d5922e0cca7b4f621559532dbf2a6122a97bb +Qx = f10652c3c2c30a765564f5e393c6c202d436c81fc7d71b88857bd458 +Qy = 42979ba5e6c8cd044e262c73e6aa918d8c3e0e08e4bf98ec2d5c6f57 +R = 072e0b130267d8e124dda2d0604f4c575ef4007628fa61f66bcd8f07 +S = 6276475fccda3bee2af7816c7b3ec222e408cec36d0409e672af23b5 +Result = P (0 ) + +Msg = b0465efd2a6dd512f3dd6e9fb1b929470387de4c75d7215d7d3604bfe3accc6b7547586128add45eeacef182be2700329ac0061299ac2170db4c1714be6387d9f31af12fb9e0ebf12ffce8c2b4440bb1c1f708c2aa9104ff1a27addd5feb779373a4a80c80a248e315b05144b1b82ad62a56747318146f8c25e743e4396ffb98 +Qx = 89cef29515f1d30fdd283625eb59e682023bdf2eb0497288ff700b27 +Qy = ca0a3f7ee4853ae8454fff6e926c7a85dc7852fb4d01cc3de861c53d +R = 0ff5dba589454d0ee5bb391a4dc8446b1ffd1cf8d66c9fc0f05a8a89 +S = 987c32258cd12b6b9cdcc5915eea5eb79a30ead442179a126b97fa9e +Result = F (1 - Message changed) + +Msg = 29f8a8112f8e4eec4339e4067ef06055c87d81445fb659fbc7e76a1cb800f513e1c98a533821c86a8ccc14aba76124183cd1613cd115d0286f510339f7f1936ff37df717788eba0e81fff66173e49df84d7d39960bdd282d2e5b368bf724d5810e1783261513f59fdd9064a9da997a92c20d3767761d50ab607354b410ee60a7 +Qx = 086d892340057368ca47a3762735519a4316f005ed8a18a9edce3b4c +Qy = e15f4c9a0d240fb94e05192ce4296c532b549af577c26de861dd3452 +R = 8d1e13fdf36eeea06a837cb22d17601081df6ed2815ea9da79894a75 +S = c19713a132a562bf2abf8c2d8cae95ef3272824db63edb0776ffc1ce +Result = F (1 - Message changed) + +Msg = e5b02a9ef5806a52c300354dabb0d0fb2373d90eb7a47df396a25b0a377e1e4d4baffe8dff5e3527ad35819c867e9507c6d2b3dc58c9b314e279d273ff1450e3143768b902d32912e0babbe79c559c4ac8d1b376d5249b9246b4fd2b079ed44142f925461d791d4404d6d4188e5c85b22403808ac4f0fc5f542d11f4417b3c34 +Qx = 6c8aea044d4f0b9699eaf398dbb030db4d6c68e0786068fbc2094974 +Qy = 426e743008febd8597594e7247ed1cbd40561bbabe1031963591ec6b +R = 3041c36b8456d65f4564597c65aa880fa8bc455f2c35de0fa2298cc1 +S = b87a516d1e2dcd862c6e5fcfc363e9f36bb06ff2c0333e95221e7f36 +Result = F (1 - Message changed) + +Msg = 4f00725aa241ba6f1d1f8211248d9dfad1a5790de68dea2857626a74ba03181f65fdcea0bacd8a74319102b075e4864bc8eb4cc0c452dbad8b976b0fa5d2c2da7b58c00972260c6d22b2036aee079a382df841b0d9d8172860f312e76bd3abd4aaff6d61a85bf596a08e063cc4b18cc2da3ba8aba2cac8f80e4e7ab617035e6c +Qx = dc85f6701bc95a60ea52f1c476dcb211e5e3eeba5b35dc3a3786113f +Qy = a52b364fb7c4b4c9155e4ee2d8841386b8a96cbeed1e5c9957214a50 +R = bdc7b4d3266e54a19f030f3055f83460ccf30fe8f5368be013076081 +S = 82a0e3a21a8d5e9cfcc5a673385cc2d4159498b6c1ef5791b2b02f9f +Result = P (0 ) + +[P-256,SHA-1] + +Msg = 2d9c344f6877877290ad536c9eca2cfb92f3973b208367b90eaa73320326025663959b0d165ab88902c891dc1bf61a96a76e4488d6c299698e94f36b198e1f2b0d243d184ab145eb5c2253ff7ad10fd2df710e15015493f1b2fcbb28d5cd734b638d8d123bde9ff03027ac7345b5928c1963645b80f0e8dfa53fb3f694cc8bda +Qx = 1198b3c409a8b47edb1347e0982d533cb1813e5cb2a92c824b2881b3cd2f3f4a +Qy = 0bdbac5fa02e41e775f8d602446d58ecb2209b5a3d79ae69eef399016e992e87 +R = 9206d435f148f88c15b2effbf3c506e41b2c620102022b801e371d0767b54bea +S = cbc4e1674ae1af69873946ccf6275946e59e0107278749b2d0010795833d80fa +Result = F (3 - S changed) + +Msg = b6f46b2a2e9e8ab9ab1927ff7c86ea3df6e8dc391248644bded191af47e53ff6eb251e3b724feaa704c59ee9c99973ef83a4d38f7c2f0297d6f8f43bb33b672ccb4aa1b48bb8977f31e494a3236fed1ed5f2ff7e895e3edb55fb0e1410eb8e858ec037e09076256dbed71aa914e4c8af63fdd4b69832bb69019ad841e15b35d0 +Qx = f7c6280aecd6b936513b0ca84e63346333dc41437a15442e605d46bba93ae101 +Qy = 3c834cecc16167b07866a9478f9f2d882de7ef937da447cd837e60cb5ed65d81 +R = f615af212ab030c4bbf9362d9815a1462312df4beb4358a7ce80d820355420bf +S = d12ed715ef65cfe6fe6bf348364088a0e7f70927bbafe4c12fc4cb65c0cc51bc +Result = F (3 - S changed) + +Msg = ef1e60767413eb9c0e24e578c78b3b14613047f9217901996dfa6f61e2f6f953fd7ae253e6a3a1e12754aa4e2b2251654b861073f5db8615f783813c686547ffe9457a30fe86ab4a6cd5c5c05e23f7407f21f6413efdfe84bcc0d0b2852675c07aa579296d8d7a08d0b9bf863c8e2fb106741d977272ab8d307f31824a693dbf +Qx = 0e7632dbc4db879e10d1d80f2789d9fa414c1fe77a6c1e56d6667af43e36e610 +Qy = 6f0dd2a5840e5a6f6ff7e23f656f5c945b7a493fbb0cfd5b9b531bf04435b1ef +R = 2b0b9ab4a575732a168f28494b66a855fc1a757fb1177864bf3e4f0a000c4a86 +S = 54901ce2f92f55ac112afa0f8b62bc00b44c8c10fe0c863675bfd305d6dc0cd8 +Result = F (2 - R changed) + +Msg = 3b9e4ed5930c37f2dd52ae3dd938aa2d4f265839b31b986e04eb6cf6b1f35743a3ef8260aadee414c75e13900b2e35ffa4fc7cbee8a8b4f14354eb2a5510e483c62ba74723803e802df4f3d6dc24017ed86772fe964c49ad7ac3b6f218a5752c972be718824f85a42e71269c187494d5a52258c3e9059d962132b9ae8aa70bd8 +Qx = 1613f12bae8e98d09b4bba53f5229596a0d417d2c625f41bb15f923b3c1e4b57 +Qy = 411319fa85227997a4cf3b1756161485124d2cedc38c9c30d82f42dc2647d545 +R = ed058d476a77be99c1b0fc8502abe545541b4c0ff3eed3f558133ae2f02042b0 +S = c571b4895712a4f64f7220b0694cab767379b09f1824fe7874acd127deb2371e +Result = F (1 - Message changed) + +Msg = 06a04290ea6f64ff0ee5f59b325c9108a9acc4f70af32092a321cd9dd14115e48ad5e4f1ec5cc1cbd05a29d06cf8f5c4a7101301c117fcd62b18e081156a1049d0a11545647d41b16e4edc2aa51460853283c8411cfd8a45172ebe540c06881c85f3a84718440cc7835d5128b63e3e158f30ac4e284757996958b2905b06c8d7 +Qx = 88bb041dcb1733a676a7f4ae8d3e407d72d5396547f07db77078485c1d5db077 +Qy = 72cf2b55e596cd140c58228f1b0a19c34fca26ffac043528a417c5abb6fca9c9 +R = 87208734deb125dca68f0d33f9d369cf1b79cf5a021391b9c6c1727d2efe663a +S = b984f722de18f1ce407104342948f03f2b55413a096c4b5fca1e032a2c814a4a +Result = F (1 - Message changed) + +Msg = 6e7047fefb707b9f8c1b645ea78958f7136519a3cb111485979c318637fd7247fe093ea93c02c78dbb590cdfcb3e9702ed7bef95ed3000d6a5b7ea9014f6588b10985f105b4e53494adb23b7ebadbb844fa239c02e3781776b9a6ce476d1078664f226d280615af80c4ecff2c718e57bfc4ca5da4aeb7bfbda021cf48603d723 +Qx = 811eb5180def7fb60d632f8cb2cba831b88cee778aa2a82ec3a5fc3d80ff7fb6 +Qy = db88d65b0fc35d9ba1f1ced0400434979ae895d371d1441d7c7a441a9fb1709b +R = c329fa28dac0018276c5af0cd770e60be50bc14e2562d5556991971edc7d4916 +S = 2d111d13837a02fa279fe835a7dc59a521864d92b26649ca4e24b36ae93878e8 +Result = F (4 - Q changed) + +Msg = 3779c87fe0fd8d54e7a677a3610851611d1953ecb50b2919d76233ced63fc8b5a92ae278ebabfaac3eb59684217445ec240c192e1956b24bbabd80a6a7871675634f1149465ba90f8fc4d68182798a4ea86596747a29f8d10555f35752d891678a62b86036b68bc118138cf684e9abb843bcfd3e1c899bc490354525dbecb824 +Qx = 4a6f1e7f7268174d23993b8b58aa60c2a87b18de79b36a750ec86dd6f9e12227 +Qy = 572df22bd6487a863a51ca544b8c5de2b47f801372a881cb996a97d9a98aa825 +R = 4a800e24de65e5c57d4cab4dd1ef7b6c38a2f0aa5cfd3a571a4b552fb1993e69 +S = d9c89fb983640a7e65edf632cacd1de0823b7efbc798fc1f7bbfacdda7398955 +Result = F (4 - Q changed) + +Msg = 485f372d91b762635d3fdbc6d80c5263fafd5f5908cab548a78a74ea6bf07657a12a61c8714dd41d6c670bdb700e315b483f83efc1821ab19e56810ff36aa8c462a1a0f56e269e121ef56efef1bb83c64941e5cf33894fabb821557f8cfe71cdb8e6015df4df41e85d8ae936d9cd54551045ed404e79a69abbd909071475c6cb +Qx = f3033d1e548d245b5e45ff1147db8cd44db8a1f2823c3c164125be88f9a982c2 +Qy = 3c078f6cee2f50e95e8916aa9c4e93de3fdf9b045abac6f707cfcb22d065638e +R = d4255db86a416a5a688de4e238071ef16e5f2a20e31b9490c03dee9ae6164c34 +S = 4e0ac1e1a6725bf7c6bd207439b2d370c5f2dea1ff4decf1650ab84c7769efc0 +Result = P (0 ) + +Msg = e1214be446927e95011ec806444ce37ddb21a1a1d14e939b5a4c834991f85ba84bde22d9afb093c20752cca101cf6d0aefc8fb4593c18ac9dd9d838a1d7f28bbce1e9a20b08226152eb03590e37078c444f91ed24c7934c3c19b7316cf0f3183821df6cc0743c0f3b233eb70359981db0e19be05e135834d4f76bcad4b862961 +Qx = 0ea0a6bb6c70966fad1a2307479c12de2322795bdecb70e4b286bd6200ba9c1a +Qy = c40eda3947021348db691ac4086fb6c06b587ce37c155bb0a7d912b93226de81 +R = f5509deff7bfda3f3759800fa4033af6a84466b114ecb48eac37eff48d2ae1b3 +S = 8c4b62dce2082f80caf220cdbb1d02567bbdfab40564b90ef31d86e3e10ce80a +Result = F (1 - Message changed) + +Msg = 7d0853cca7bf29d22b02c49bc19091c3c4a067999fefefebdcfd5998563b5aebef3b6e779fc665ba0954077f63d0608ce4d16ee9edea3646e34dc38f198ce0b25760360a422a3a1946a8e9903fcfc951733676d3b27d6b9c5f73af0ff098da920121bfb06a8741dc52bc1b01c73a1b0d8c517c2904e16fb7cf63306fe2e2da6e +Qx = e7a57e0f6ec0fa9c7c34978034cf82f039f8fd62804070ad943573fc8efa5775 +Qy = 87b2cc85dfff2dae5620fbe3e6256bd728de28fc9dc1b5eb6b5d7bd5d29186ad +R = 97642038932fdddbe2021ec1af53ae6b9af00ef9c8b9f26aea582892e80e6285 +S = 9cb14918359338041cf795cf6781e4905837fa5ce3b3e50ffafb5f13c73b5bc8 +Result = F (4 - Q changed) + +Msg = d2491a19cc2c114f3b42d9da78e27364360b4e59fdb5b4f0aa330fa22798a34d2356de0123b6b459a386a3ef8eae30738149ea3742c53b5fa195f390fad647ea1b7a09d8ae312f5d3bebcbd3e756ff831e9010a078ed663588f555a39122a6e9786b7a5b709c634e86b88f41a0028e5151cdc6d11874d184c2093c48682f4289 +Qx = be7a651be0c87278569987cf62d7fa1dd1b3d6e1b868d8f4dfb56135a9960eec +Qy = b7a62c588a987760b915edbd7f95506870c60f042471de1d8b2d4cd9d6563391 +R = aa889fb608b6939f6eeacf2f64c3b2e3a6061f2834058c7e724321720b737a63 +S = 6cd6d0ef2b93a760daa914e11b9b414bd4d72457405f00a62ab63f36d76efb73 +Result = F (3 - S changed) + +Msg = 546138ac0fc0c031eee621e5b8779abb728c15c6a71369f644bbc56e36e61f91e91ccd80b15d9bd75fe46493c928c7a3c0eadc2bb9acce0a173e41eeb5957cf232f744116ef875fb708b42fe8e3b184bea118ce06741bd6bc8e0842024ad67eadf811d37a37f7d572cd4ea76184f61e08f81c3b664c46db4fa797d08f9de61a6 +Qx = 76ddc46d8db8d7ce2ce837f60cdabcee92b7c7817ee41c8f066f1ae65f85c318 +Qy = bea47191f1c584c87250370ce337a1de1583bcfc20ccc23b7a82e83f19adaa88 +R = 84a42efbf7ec04166ad144d19cd98c120aa2e79d483b5eea6fbdfa7f1222e07b +S = e41531205e691e65668f69f518abc7b60f32c373434872a043b7358462babf83 +Result = F (2 - R changed) + +Msg = 41e6ef0cae4eb07fbb5cc0d381029072974fb68f92a7dd5fe9279fcd86949ef5777e8e555ae5d90966de5decd00ec8894b2d8ae2b227789ef6a0697444b40bfd3e5880b97dd993131e2de92853a6f402cff1bbf1e0071d2c66c581ff1727d38ca486e0456dcda16d82a67b46a2f48786e902754016cf3c1df2152aea907de65c +Qx = 2f71b932f770ba9daf7c1dd47444ab6cb8881f71a1c597e719845b15cb84ca35 +Qy = ab928625b40ec0738d0fc8dbc4df4a1f65d20bc0447b69cfa13bb20b95bb41d4 +R = 63fca172bbca6197cd2802a9cb61d74c2b47cf35f6d35203e67ffbaa838be775 +S = e70ec283cd212df6ba3723e26b697501f112d7cf64e4f45185dae76055e09f1e +Result = P (0 ) + +Msg = e2bb35226f7ac77b652c98993b4a0d45f7f25513d66b7a0a25b6a2ccdb2772d7423d034aca445cc4e5332e53c580d1fd48dabbf09f6010fe251efc4ff9f6c09a121d5718d4ce5b26ec35fb5360f4ed9b70ff0cd8fb015cb96f8246acd697be78046ea3906cb0614b50691336d7990f23994a96e0975492524438384e71166048 +Qx = ce775648b928db82ac5edb3b009d32959a73b86c45e96d4b8d5b6e640b7c2790 +Qy = 52455caf08ee94d86f0984e9ec9268d74823f2102dd97fced59638055f6af18e +R = 2a64b29146588f3153fee1029a0131ac0a8a25ba2ecc494f697c166c7c91fc08 +S = 7b429bc12a72ca3d76c119eea9f4098633cc31c87831e54d5d93afd6e8d20f4f +Result = F (2 - R changed) + +Msg = 27500d3ee8bc458633114e09e4fe23fc5a6e2a10f2d32865b55b0dce15f9738366fd0098d7f482923f7fa22d360261a272b5dca94218bae2f88700045a645cf21b23e815170343a4c192a336ba79934d022be0b7104e68bc5c79e411bd3b2c6fca529b19a78df6d901f54cfd39138bf83a6e6c1a4b665e596ccd71a3fe42917c +Qx = cd2f29a53f0ce57e0e4a542c3256e65ebbdc30415f4de771d5d706d3aeacc852 +Qy = dbbf2c129f30d11fe77d7816a24187764eae3fb2ff70c1ec745e876e26f5232f +R = 2454c5ee84e4f77b554acd368dd412389db8c78429590a092f24db2da43cb761 +S = 63e870ce2fa4085d4ff1e360f7a5c101a1f8b288abe71cca56887e613ad034b7 +Result = P (0 ) + +[P-256,SHA-224] + +Msg = 3a9fd6b13337d9fd995d6e011e41c0bd24a7b068e8caa2f8ba10cb5b852e4f82c2d5176542a87668df5c6dda62ad47067e3bf7bf7f0defa57d996a1b40b22416bbb009532b5e29d995c74defdd3824847e7ce473353f9825331fbd0aed174f6ec2c8c4c7f05d7c66304f09745acee5708e31770d9edd997753c74dff1b0507df +Qx = 843f6d83d777aac75b758d58c670f417c8deea8d339a440bb626114318c34f29 +Qy = 83e0c70008521c8509044b724420463e3478e3c91874d424be44413d1ce555f3 +R = d08e9a5db411019d826b20ac889227ed245503a6d839494db1e8d7995a6b245b +S = 8d46a204054125d0dc776ab1055302ec4eb0f20b90bca6d205f21d3cefd29097 +Result = P (0 ) + +Msg = a122dd3120879b6d288f1a4fce115899fa5a4a273621b022429284df2905a5f00eeceb4c3d57d17f1092b8bd11aac2768f69e82d4698170a028fe8b01625656eab963d07409280ebeaa12222adeab1e068015347fcf208d50d409c40913a85e6d0b8b8b65a70c10077e79be52286ee767018d9b1528e92014f5c8e11b4be9042 +Qx = f08b56f73f7a0e098444f6f0a02ad81ce0b914a11cafa15893d1c84704e1c564 +Qy = bbee9aeb91cdc2d1d1437b4168df73acfd64e8b02962b14c85e67187e1ef80a4 +R = 71b3ec982725a007ac18a5cf60587e1fd1beb57685a1f9df3cddd9df25dcbc18 +S = 407e41217325f92f8a031cfcc4eb64c1a4b17b0a7459c254af754a7ea9eac997 +Result = F (3 - S changed) + +Msg = f8c9f5e424bc4fd18b6d103ad110f1c33976c337b0f8bb98ac936ce172bf218256c5f71a08d3365ee3498193d916065033c323827a0acb1cfc1f09ce40005b9cecc316f3cedd3da420c90a41a27c49f060588000ff2d26c77d830b46bcb6d4a5ffdb4702f575691b6b75fb1fbb73b5a03cd773c97ff7aff33d90a6ab9a4890de +Qx = 0b688e761e1ddda2305e002809da65bf5916dfe1356a5b99b61f5576a9b90efa +Qy = 90ec958e2e3a676e7bbf8e9394f72742875836125a317b0ae38374953f746a91 +R = ef89df3bbf079fb250f7e882c4f85c0023fc3804e862d9ef4d9530a15f1013f0 +S = 4ba985e900e6737b8e07eac638f7b38277ead4faee6d2076a2eee90fd2a6bf0f +Result = F (1 - Message changed) + +Msg = 45a7186fb5a3b99dbb2f68bbd7f0afd1f49dd904a0f2a7899bc570f52b1f6434db43242cffe43b9053fdaac409c6be10d7c0ef64d7530b34948209c76aefca42c5c4ece230640dd98da353261a34268a47aebf39f7f2b5ecb96bbcba3d6416a80124c6008f2c4dfc4f071d033228b9054a58c501a827bac237e8f92e064df60b +Qx = 0b64480783e260e1e9caef37b4cc9c650d2d57e2c594b1106314843d8d7ab74e +Qy = 29d373d8522deffe40055aef539f53f38937eb799b44f05a8d8c0b381f12907f +R = c5c26b0b21eef0f7a0f1cff38d0079d890376759369b01d8d8e959c1c785e203 +S = fecc400bf0deab99d87da168b9d0dd31d2dfa3435b0fe9d38b5fb8efd45195a4 +Result = F (2 - R changed) + +Msg = 5201328490b8f88a1bd31e16359e9a0770691313da5140575ca460d398f3d26ae4fa32fcc4aa522c9597333a20bbc0986235410f861522584a382b7c197a9f90a6742e18cd091f68106024b5beba0a67fa4699f7d0310c9c6d49ce37ce1e9653b3b77eb7a17a58676c2d9c765ec5077a7562d3c697cbc9a6f5e50e0819405afb +Qx = 7f78a8fd880c509940e2b83de67c9ab553ab91489bae75cdc1d5b523b06ab7f5 +Qy = 7786aee7032c373cdfad7d9ddb6fa09a026f6da30fd477ab014d30a289d542a1 +R = c93ada69db326f76b1362d610cb8bcc6e7ef1dc03d3d11367e153c0e39d5dc86 +S = d0c02c71b14ef7a4af4e23bd207ce98449f5d6e7e5b3ec8cbbca9549e97d379d +Result = P (0 ) + +Msg = 2c3af4a121b896c59437abf6e58c21ca6cc45af7a405515a7a253554264735dbd6139cf27316c6d0454c5729ee770116c267844e4a4e72bf6d3a4a050cf274bdd9730235a6bf26e6731b2e72afe81046849706f55f8d3baccb6b321123f176d6e586daf01d903843b396fe7f3e4015c464363f54aeaff6e719267392110b37d3 +Qx = e58cdc207c56f62e0bb7c0b55b7f7236a6b308f8fc4de3e61cdb3bf20ad2f62c +Qy = 6056c0ee827e85ba284838954d0c6cc096df03b4611b1e0f7f9002bac86856d4 +R = 2df3906527ad322000285bccdd11dd09130d633cf43534f5802604639eb847e0 +S = adaaad19b7c66836ef0f4afeff8ac5e898cd2523246a74a1a291a3a1ff583322 +Result = P (0 ) + +Msg = f7afb86bb6943f7c0108c31185102a323311011529b95ffc0a9a22b63e310f50a94813089c2541d4f864ba1e9dd275cf5abfa79d5126e8164f1c1f78fecc0d24808cf519a6e93648b0fa4da4cbd2888c5e02867653287de8a7cb4ae6a7a5c8dcbef01bf79d31f22d7d933e5bf25bec1d773f7a5ae67fc5bd58069d3debce16c1 +Qx = 70b4bba10b7bbc6d4175ada8d485f3685b13916d0c992301f47e45b629c63d0e +Qy = 257a93be31b09ff4cd22e3375e30b5a79f3bf3c74c80dde93e5d65e88c07c1c4 +R = 6e714a737b07a4784d26bde0399d8eee81998a13363785e2e4fb527e6a5c9e4e +S = 94c0220f0f3fa66ff24f96717f464b66ae3a7b0f228ab6a0b5775038da13768a +Result = F (4 - Q changed) + +Msg = dfd611caa868f764527c54f144dcabcab1fa7722882bfe293a15b35b0250d3936466df4eb1f87e053295290ba34390e6efcd64677a8771d48cf8aefb59951d47149c95f90e7cfab53b996f53b4a97e6696e6dcb4b0c8282e5405e98fa5da1ad7536a018ccb5b921873d89f957386e9aabeb8cbdb908d49d4cce97a63268d8863 +Qx = 8b11b48d2397355000a5289d816b9892ae64dffc842abec02a2fb2db2bb34310 +Qy = fc1a42528a0473cfc2c2e184b8bc5055096350fe1549d24b526d6536681026e8 +R = 61a91dd1c80049e70dc4aea84bda0efc6ec9c7b9dd16ecbccf687244c51184ce +S = e381e7b32bab49578c7e7ce7784ce19263e4a7dab4b614df411d20eaebfc391c +Result = F (1 - Message changed) + +Msg = 6707e3bb71ce50247337cba8b70a684fdd1d2c7bb677b999e0766e31f380ae658bba06094d89a0c344cbc7425a093c1382f1d2d3670ee4292928a472126a9c7e48acbe3f5fe3176e76e62668b4f8c01fc8194509e4aef12722d626d932e6c8e1972c9d9aeea5b862ea13121664d900dcaf6d4c8ce5b06c6585af8424b3df5cc1 +Qx = 7bad1b3d8bad4355a44511d2eb50daeae793af99418ada118327359936aa0e1d +Qy = e7eff40334b7a5455f6b0d0ecdcdc513702857bb5bbb73c910c86746092bcd7d +R = fd961b60b21be32b47abafa77e22197dc99af6825dcca46e0e3b1991a90aa202 +S = a0477f97b94a1c26a3b2d186791d7fc9dfa8130bbae79c28fa11ec93a3aeac0b +Result = F (1 - Message changed) + +Msg = e166218ec72b1c41c436305949417c607c02607318fba65659b0c6e484f2ef3a814b056b1f4ac3d8bfacce79c1d21fe0f9e76714a540dab55c9a22b5d4d2877cdd8f9ef5a259fe2724b9e4ecf9c20e34f0da8dbec1496f4442010b138e915ea4a71c7eed4b8ff15679b82d4c45e01b53aeb7b2f07c8baa08e1cb0d95c4f29755 +Qx = 407d92c9b28723602bf09f20f0de002afdf90e22cb709a8d38e3c51e82cba96c +Qy = 4530659432e1dd74237768133e1f9808e62d0fbe5d1d979d1571baf645dcb84c +R = a7dc65293ee3deb0008ae3e2d7ef9e9a4ebb8bf7b10d165f80ab8bed58d6fdef +S = 3e8300a3ee603a8d8234fe265c628e705015bf1903eb74c943323050626f701f +Result = F (2 - R changed) + +Msg = bd808ee61aa7f2cd405366f7bed152e137c427123ddebc73264b2df06a780a47ebd28f4c5cdab2640be9e7a0d2f75a8782998d73e44ca6b579892590abc70b34e33c8495e9c4ec7416f3530193f04f7bf9d7b3477af693619141a6a24dfc9ea9f0ee795cca8c9b418db2716456e3fd5dbee55f22aa8c9986673b1a4b631fdfb7 +Qx = 26aea3dd5c53f984dbdaf415c7f26e1e73048658a548eb3b59dd5f721899919a +Qy = dff15f57bd9b08644d49cbb214403647195725cd4d4511bc8a48b0770466ae9f +R = 726af92afe53e8125b0b9f3659745be401a37ae658b7b1aa88c3cb97e9de22c3 +S = 794484c5837a419efe11a4e4293341a6fa36d21230925a0e5e135887302acca9 +Result = F (3 - S changed) + +Msg = 71755d628e025a37c0659b208907d64cf984f6f18b60ba74fa172595ca4a92552bf93f37d800b2777fb7f97cd94e256a203b8046c40ae2236fa7ade88e339ce42a6e976d17575ce4617b017b890ac24cff2a1ea4283c923133ae5eb393400a431ae6ed650e67c5cf9fb1f7d7e47719d8a3462588bd5980a4325097fdbf12494d +Qx = e73418677ce044b331a6d60773cbae199221699d31e1bec4b68b9bc0b87e4cd0 +Qy = 37215db4e3d9161f3351b385a61ddb2fcf1cec469d1659e7574610ed27fe879f +R = ac469290a8f61a2a8c6adc7533dd5cfe804e2e7bf101cc74e5f624f301bccd23 +S = 4c328c3bc259316641fff44753743afebe89b8627f904df7245e42adcff2dc76 +Result = F (2 - R changed) + +Msg = d2d44d06dae06355f7d9e09077a742a16755254812b671fd7535653ed5acade929b138e72a678b6f9deb5ed407d60b67cf1db10b3bb15b97a1c2946abce915d281c5a1bf498388bc13c61e735b1800e26919ede5236cfcf3628284120dc03438ffed8cd192d651207638e482ca7bb6ff2f6f935462035f7c48328329ea68a8fc +Qx = b0892b19c508b3543a5ae864ba9194084c8f7ae544760759550cc160972e87ff +Qy = 9208e9b0c86ad6bc833e53026f233db9a42298cdb35d906326008377520b7d98 +R = a62dd0d1518c6b9c60de766b952312a8d8c6eaa36a68196d2a30a46fb17dc067 +S = b9ded660e978129277f74c1d436003d1e6d556dc8eed9d505bbaf4c67cb13d21 +Result = F (4 - Q changed) + +Msg = 0a04ccd0555acac9e47faff6b6dea1f422e4aec83029795d8b9063bbd2e5306e0977cde1b9d78e005f0e3f3d004e95c87ba5b526f1eb9843e1de8cbf3f2d31b41eabc2ffdc317840804216a2b6127040336cca086734f8d757362fe8736bf0e7e4fdf4aded8e9ceb76d20b9829588b4145afdb208c551407e65d7de955619250 +Qx = 8c5c41cb07d828a6a86be4533aef791d3a70a95cb285aa2956b21feeac2f8c49 +Qy = 84101581cad7a48b7d0596df7ffed47085d22e8a4af685cddbeeb32ea69ae190 +R = 9812449df0a51f7a2a8f78aa9a589ca9644dce285f1e69658daaea759fa5bd7e +S = beb4c27c748a7944e37afe861576f76b5a749a8ccbbd7dec00838ba250ddfe1a +Result = F (4 - Q changed) + +Msg = 7b11d09b5e7971ac07919f902c59e4490c70d1ecc3f56b625fa836b056187b2a95f752e60546c871b509201e9109085c1fd607d677cfc96780f12c3c2640b36d03b72dffab156592a462abac041ca7996906baf4d51d55753b3ea3ab985f30fdb698338bb336644a02203ed839e7a4a7f23c2e04e33a787a92aaba834fb507f1 +Qx = 788d7e54ab03020e4954f41259052ee5af68361492b180da31fbbe68d868aa95 +Qy = 982a3ababa6d351649e56da3faeb7160b9de74e22fe93a06ead1bd9a8dffdf7e +R = 3ddea06bf8aa4a1b0c68674a2c4796def0bfb52236f4efb3332204a41fd8ea89 +S = 871237039431a41aeefcdd08f67848b2b09067e3a1344c8ed9b372d1b1c754a6 +Result = F (3 - S changed) + +[P-256,SHA-256] + +Msg = e4796db5f785f207aa30d311693b3702821dff1168fd2e04c0836825aefd850d9aa60326d88cde1a23c7745351392ca2288d632c264f197d05cd424a30336c19fd09bb229654f0222fcb881a4b35c290a093ac159ce13409111ff0358411133c24f5b8e2090d6db6558afc36f06ca1f6ef779785adba68db27a409859fc4c4a0 +Qx = 87f8f2b218f49845f6f10eec3877136269f5c1a54736dbdf69f89940cad41555 +Qy = e15f369036f49842fac7a86c8a2b0557609776814448b8f5e84aa9f4395205e9 +R = d19ff48b324915576416097d2544f7cbdf8768b1454ad20e0baac50e211f23b0 +S = a3e81e59311cdfff2d4784949f7a2cb50ba6c3a91fa54710568e61aca3e847c6 +Result = F (3 - S changed) + +Msg = 069a6e6b93dfee6df6ef6997cd80dd2182c36653cef10c655d524585655462d683877f95ecc6d6c81623d8fac4e900ed0019964094e7de91f1481989ae1873004565789cbf5dc56c62aedc63f62f3b894c9c6f7788c8ecaadc9bd0e81ad91b2b3569ea12260e93924fdddd3972af5273198f5efda0746219475017557616170e +Qx = 5cf02a00d205bdfee2016f7421807fc38ae69e6b7ccd064ee689fc1a94a9f7d2 +Qy = ec530ce3cc5c9d1af463f264d685afe2b4db4b5828d7e61b748930f3ce622a85 +R = dc23d130c6117fb5751201455e99f36f59aba1a6a21cf2d0e7481a97451d6693 +S = d6ce7708c18dbf35d4f8aa7240922dc6823f2e7058cbc1484fcad1599db5018c +Result = F (2 - R changed) + +Msg = df04a346cf4d0e331a6db78cca2d456d31b0a000aa51441defdb97bbeb20b94d8d746429a393ba88840d661615e07def615a342abedfa4ce912e562af714959896858af817317a840dcff85a057bb91a3c2bf90105500362754a6dd321cdd86128cfc5f04667b57aa78c112411e42da304f1012d48cd6a7052d7de44ebcc01de +Qx = 2ddfd145767883ffbb0ac003ab4a44346d08fa2570b3120dcce94562422244cb +Qy = 5f70c7d11ac2b7a435ccfbbae02c3df1ea6b532cc0e9db74f93fffca7c6f9a64 +R = 9913111cff6f20c5bf453a99cd2c2019a4e749a49724a08774d14e4c113edda8 +S = 9467cd4cd21ecb56b0cab0a9a453b43386845459127a952421f5c6382866c5cc +Result = F (4 - Q changed) + +Msg = e1130af6a38ccb412a9c8d13e15dbfc9e69a16385af3c3f1e5da954fd5e7c45fd75e2b8c36699228e92840c0562fbf3772f07e17f1add56588dd45f7450e1217ad239922dd9c32695dc71ff2424ca0dec1321aa47064a044b7fe3c2b97d03ce470a592304c5ef21eed9f93da56bb232d1eeb0035f9bf0dfafdcc4606272b20a3 +Qx = e424dc61d4bb3cb7ef4344a7f8957a0c5134e16f7a67c074f82e6e12f49abf3c +Qy = 970eed7aa2bc48651545949de1dddaf0127e5965ac85d1243d6f60e7dfaee927 +R = bf96b99aa49c705c910be33142017c642ff540c76349b9dab72f981fd9347f4f +S = 17c55095819089c2e03b9cd415abdf12444e323075d98f31920b9e0f57ec871c +Result = P (0 ) + +Msg = 73c5f6a67456ae48209b5f85d1e7de7758bf235300c6ae2bdceb1dcb27a7730fb68c950b7fcada0ecc4661d3578230f225a875e69aaa17f1e71c6be5c831f22663bac63d0c7a9635edb0043ff8c6f26470f02a7bc56556f1437f06dfa27b487a6c4290d8bad38d4879b334e341ba092dde4e4ae694a9c09302e2dbf443581c08 +Qx = e0fc6a6f50e1c57475673ee54e3a57f9a49f3328e743bf52f335e3eeaa3d2864 +Qy = 7f59d689c91e463607d9194d99faf316e25432870816dde63f5d4b373f12f22a +R = 1d75830cd36f4c9aa181b2c4221e87f176b7f05b7c87824e82e396c88315c407 +S = cb2acb01dac96efc53a32d4a0d85d0c2e48955214783ecf50a4f0414a319c05a +Result = P (0 ) + +Msg = 666036d9b4a2426ed6585a4e0fd931a8761451d29ab04bd7dc6d0c5b9e38e6c2b263ff6cb837bd04399de3d757c6c7005f6d7a987063cf6d7e8cb38a4bf0d74a282572bd01d0f41e3fd066e3021575f0fa04f27b700d5b7ddddf50965993c3f9c7118ed78888da7cb221849b3260592b8e632d7c51e935a0ceae15207bedd548 +Qx = a849bef575cac3c6920fbce675c3b787136209f855de19ffe2e8d29b31a5ad86 +Qy = bf5fe4f7858f9b805bd8dcc05ad5e7fb889de2f822f3d8b41694e6c55c16b471 +R = 25acc3aa9d9e84c7abf08f73fa4195acc506491d6fc37cb9074528a7db87b9d6 +S = 9b21d5b5259ed3f2ef07dfec6cc90d3a37855d1ce122a85ba6a333f307d31537 +Result = F (2 - R changed) + +Msg = 7e80436bce57339ce8da1b5660149a20240b146d108deef3ec5da4ae256f8f894edcbbc57b34ce37089c0daa17f0c46cd82b5a1599314fd79d2fd2f446bd5a25b8e32fcf05b76d644573a6df4ad1dfea707b479d97237a346f1ec632ea5660efb57e8717a8628d7f82af50a4e84b11f21bdff6839196a880ae20b2a0918d58cd +Qx = 3dfb6f40f2471b29b77fdccba72d37c21bba019efa40c1c8f91ec405d7dcc5df +Qy = f22f953f1e395a52ead7f3ae3fc47451b438117b1e04d613bc8555b7d6e6d1bb +R = 548886278e5ec26bed811dbb72db1e154b6f17be70deb1b210107decb1ec2a5a +S = e93bfebd2f14f3d827ca32b464be6e69187f5edbd52def4f96599c37d58eee75 +Result = F (4 - Q changed) + +Msg = 1669bfb657fdc62c3ddd63269787fc1c969f1850fb04c933dda063ef74a56ce13e3a649700820f0061efabf849a85d474326c8a541d99830eea8131eaea584f22d88c353965dabcdc4bf6b55949fd529507dfb803ab6b480cd73ca0ba00ca19c438849e2cea262a1c57d8f81cd257fb58e19dec7904da97d8386e87b84948169 +Qx = 69b7667056e1e11d6caf6e45643f8b21e7a4bebda463c7fdbc13bc98efbd0214 +Qy = d3f9b12eb46c7c6fda0da3fc85bc1fd831557f9abc902a3be3cb3e8be7d1aa2f +R = 288f7a1cd391842cce21f00e6f15471c04dc182fe4b14d92dc18910879799790 +S = 247b3c4e89a3bcadfea73c7bfd361def43715fa382b8c3edf4ae15d6e55e9979 +Result = F (1 - Message changed) + +Msg = 3fe60dd9ad6caccf5a6f583b3ae65953563446c4510b70da115ffaa0ba04c076115c7043ab8733403cd69c7d14c212c655c07b43a7c71b9a4cffe22c2684788ec6870dc2013f269172c822256f9e7cc674791bf2d8486c0f5684283e1649576efc982ede17c7b74b214754d70402fb4bb45ad086cf2cf76b3d63f7fce39ac970 +Qx = bf02cbcf6d8cc26e91766d8af0b164fc5968535e84c158eb3bc4e2d79c3cc682 +Qy = 069ba6cb06b49d60812066afa16ecf7b51352f2c03bd93ec220822b1f3dfba03 +R = f5acb06c59c2b4927fb852faa07faf4b1852bbb5d06840935e849c4d293d1bad +S = 049dab79c89cc02f1484c437f523e080a75f134917fda752f2d5ca397addfe5d +Result = F (3 - S changed) + +Msg = 983a71b9994d95e876d84d28946a041f8f0a3f544cfcc055496580f1dfd4e312a2ad418fe69dbc61db230cc0c0ed97e360abab7d6ff4b81ee970a7e97466acfd9644f828ffec538abc383d0e92326d1c88c55e1f46a668a039beaa1be631a89129938c00a81a3ae46d4aecbf9707f764dbaccea3ef7665e4c4307fa0b0a3075c +Qx = 224a4d65b958f6d6afb2904863efd2a734b31798884801fcab5a590f4d6da9de +Qy = 178d51fddada62806f097aa615d33b8f2404e6b1479f5fd4859d595734d6d2b9 +R = 87b93ee2fecfda54deb8dff8e426f3c72c8864991f8ec2b3205bb3b416de93d2 +S = 4044a24df85be0cc76f21a4430b75b8e77b932a87f51e4eccbc45c263ebf8f66 +Result = F (2 - R changed) + +Msg = 4a8c071ac4fd0d52faa407b0fe5dab759f7394a5832127f2a3498f34aac287339e043b4ffa79528faf199dc917f7b066ad65505dab0e11e6948515052ce20cfdb892ffb8aa9bf3f1aa5be30a5bbe85823bddf70b39fd7ebd4a93a2f75472c1d4f606247a9821f1a8c45a6cb80545de2e0c6c0174e2392088c754e9c8443eb5af +Qx = 43691c7795a57ead8c5c68536fe934538d46f12889680a9cb6d055a066228369 +Qy = f8790110b3c3b281aa1eae037d4f1234aff587d903d93ba3af225c27ddc9ccac +R = 8acd62e8c262fa50dd9840480969f4ef70f218ebf8ef9584f199031132c6b1ce +S = cfca7ed3d4347fb2a29e526b43c348ae1ce6c60d44f3191b6d8ea3a2d9c92154 +Result = F (3 - S changed) + +Msg = 0a3a12c3084c865daf1d302c78215d39bfe0b8bf28272b3c0b74beb4b7409db0718239de700785581514321c6440a4bbaea4c76fa47401e151e68cb6c29017f0bce4631290af5ea5e2bf3ed742ae110b04ade83a5dbd7358f29a85938e23d87ac8233072b79c94670ff0959f9c7f4517862ff829452096c78f5f2e9a7e4e9216 +Qx = 9157dbfcf8cf385f5bb1568ad5c6e2a8652ba6dfc63bc1753edf5268cb7eb596 +Qy = 972570f4313d47fc96f7c02d5594d77d46f91e949808825b3d31f029e8296405 +R = dfaea6f297fa320b707866125c2a7d5d515b51a503bee817de9faa343cc48eeb +S = 8f780ad713f9c3e5a4f7fa4c519833dfefc6a7432389b1e4af463961f09764f2 +Result = F (1 - Message changed) + +Msg = 785d07a3c54f63dca11f5d1a5f496ee2c2f9288e55007e666c78b007d95cc28581dce51f490b30fa73dc9e2d45d075d7e3a95fb8a9e1465ad191904124160b7c60fa720ef4ef1c5d2998f40570ae2a870ef3e894c2bc617d8a1dc85c3c55774928c38789b4e661349d3f84d2441a3b856a76949b9f1f80bc161648a1cad5588e +Qx = 072b10c081a4c1713a294f248aef850e297991aca47fa96a7470abe3b8acfdda +Qy = 9581145cca04a0fb94cedce752c8f0370861916d2a94e7c647c5373ce6a4c8f5 +R = 09f5483eccec80f9d104815a1be9cc1a8e5b12b6eb482a65c6907b7480cf4f19 +S = a4f90e560c5e4eb8696cb276e5165b6a9d486345dedfb094a76e8442d026378d +Result = F (4 - Q changed) + +Msg = 76f987ec5448dd72219bd30bf6b66b0775c80b394851a43ff1f537f140a6e7229ef8cd72ad58b1d2d20298539d6347dd5598812bc65323aceaf05228f738b5ad3e8d9fe4100fd767c2f098c77cb99c2992843ba3eed91d32444f3b6db6cd212dd4e5609548f4bb62812a920f6e2bf1581be1ebeebdd06ec4e971862cc42055ca +Qx = 09308ea5bfad6e5adf408634b3d5ce9240d35442f7fe116452aaec0d25be8c24 +Qy = f40c93e023ef494b1c3079b2d10ef67f3170740495ce2cc57f8ee4b0618b8ee5 +R = 5cc8aa7c35743ec0c23dde88dabd5e4fcd0192d2116f6926fef788cddb754e73 +S = 9c9c045ebaa1b828c32f82ace0d18daebf5e156eb7cbfdc1eff4399a8a900ae7 +Result = F (1 - Message changed) + +Msg = 60cd64b2cd2be6c33859b94875120361a24085f3765cb8b2bf11e026fa9d8855dbe435acf7882e84f3c7857f96e2baab4d9afe4588e4a82e17a78827bfdb5ddbd1c211fbc2e6d884cddd7cb9d90d5bf4a7311b83f352508033812c776a0e00c003c7e0d628e50736c7512df0acfa9f2320bd102229f46495ae6d0857cc452a84 +Qx = 2d98ea01f754d34bbc3003df5050200abf445ec728556d7ed7d5c54c55552b6d +Qy = 9b52672742d637a32add056dfd6d8792f2a33c2e69dafabea09b960bc61e230a +R = 06108e525f845d0155bf60193222b3219c98e3d49424c2fb2a0987f825c17959 +S = 62b5cdd591e5b507e560167ba8f6f7cda74673eb315680cb89ccbc4eec477dce +Result = P (0 ) + +[P-256,SHA-384] + +Msg = fe9838f007bdc6afcd626974fcc6833f06b6fd970427b962d75c2aeadbef386bec8d018106197fe2547d2af02e7a7949965d5fbc4c5db909a95b9858426a33c080b0b25dae8b56c5cbc6c4eec3dbd81635c79457eaef4fab39e662a1d05b2481eda8c1074ae2d1704c8a3f769686a1f965ef3c87602efc288c7f9ff8cd5e22a4 +Qx = 40ded13dbbe72c629c38f07f7f95cf75a50e2a524897604c84fafde5e4cafb9f +Qy = a17202e92d7d6a37c438779349fd79567d75a40ef22b7d09ca21ccf4aec9a66c +R = be34730c31730b4e412e6c52c23edbd36583ace2102b39afa11d24b6848cb77f +S = 03655202d5fd8c9e3ae971b6f080640c406112fd95e7015874e9b6ee77752b10 +Result = F (3 - S changed) + +Msg = b69043b9b331da392b5dd689142dfc72324265da08f14abcedf03ad8263e6bdccbc75098a2700bbba1979de84c8f12891aa0d000f8a1abad7dde4981533f21da59cc80d9cf94517f3b61d1a7d9eecb2fcf052e1fc9e7188c031b86305e4a436a37948071f046e306befb8511dc03a53dc8769a90a86e9b4fdbf05dcdfa35ab73 +Qx = 1f80e19ffeb51dd74f1c397ac3dfd3415ab16ebd0847ed119e6c3b15a1a884b8 +Qy = 9b395787371dbfb55d1347d7bed1c261d2908121fb78de1d1bf2d00666a62aed +R = 249ca2c3eb6e04ac57334c2f75dc5e658bbb485bf187100774f5099dd13ef707 +S = 97363a05202b602d13166346694e38135bbce025be94950e9233f4c8013bf5bf +Result = F (4 - Q changed) + +Msg = d2fcaaede8b879c064b0aa46e68efc278a469b80a7f7e1939ec2ebc96c76206f23395967279c181fea157ebb79dfadc68e31345f07f13305c80de0d85e4330d3a45f957c5c2526b945838ce5a9c2844b6b2a665c0f70b748b1213a8cf20ba5dbdf8cab231f433da522104a5cd027d3e36bb373c4ed404d9af0cbec6f85ec2193 +Qx = ce4dcfa7384c83443ace0fb82c4ac1adfa100a9b2c7bf09f093f8b6d084e50c2 +Qy = d98ae7b91abee648d0bfde192703741ac21daad7262af418b50e406d825eb0d6 +R = 597e1e04d93a6b444ccc447a48651f17657ff43fb65fe94461d2bf816b01af40 +S = 359fe3817963548e676d6da34c2d0866aa42499237b682002889eaf8893814d2 +Result = P (0 ) + +Msg = 06cd86481865181cef7acdc3202824970ec2d97662b519c4b588dc9e51617c068282b1a11a15bf7efc4858a2f37a3d74b05fb5790eb68338c8009b4da9b4270514d387a2e016a99ee109841e884a7909504ef31a5454e214663f830f23a5a76f91402fca5f5d61699fa874597bdbfb1ecff8f07ddbd07ef61e97d0d5262ef314 +Qx = 1b677f535ac69d1acd4592c0d12fac13c9131e5a6f8ab4f9d0afdcb3a3f327e0 +Qy = 5dca2c73ec89e58ef8267cba2bb5eb0f551f412f9dc087c1a6944f0ce475277a +R = df0b0cd76d2555d4c38b3d70bfdf964884d0beeb9f74385f0893e87d20c9642d +S = 128299aabf1f5496112be1fe04365f5f8215b08a040abdfeca4626f4d15c005b +Result = F (2 - R changed) + +Msg = 59ad297397f3503604a4a2d098a4f00a368ad95c6101b3d38f9d49d908776c5a6c8654b006adb7939ffb6c30afa325b54185d82c3cc0d836850dce54d3408b257c3a961d11fafe2b74ba8bddfc1102fa656d1028baf94c38340c26a11e992aab71ce3732271b767358671b25225926f3a4b9ec5f82c059f0c7d1446d5d9e4251 +Qx = 7ffc2853f3e17887dda13b0eb43f183ce50a5ac0f8bba75fb1921172484f9b94 +Qy = 4cc523d14192f80bd5b27d30b3b41e064da87bfbae15572dd382b9a176c123a2 +R = 3156176d52eb26f9391229de4251993a41b8172f78970bb70e32a245be4bb653 +S = 62827a29e12d2f29b00fb2d02dd5f2d5412e17a4455f4431a5c996881fdfc0ee +Result = F (1 - Message changed) + +Msg = 8215daca87e689a20392646a6511bb7b5a82d2d995ca9de89bd9d9c0b11464b7cb1e4e9a31e3e01ad8c2cd613d5a2cb44a2a8df6899fce4c282dea1e41af0df6c36be1f320036567f8d0d32aaa79c95fe53b16668f7e1a9e5d7d039ea260fd03711b7d1c177355fc52244d49ca5b238556a5541349014683cb7da326f443b752 +Qx = 5569f76dc94243cde819fb6fc85144ec67e2b5d49539f62e24d406d1b68f0058 +Qy = 1208c38dbe25870deab53c486f793a1e250c9d1b8e7c147ea68b71196c440730 +R = 706f2ba4025e7c06b66d6369a3f93b2fec46c51eceff42a158f7431919506cfb +S = b4e75ac34a96393237fc4337789e37168d79382705b248051c9c72bcbac5f516 +Result = F (2 - R changed) + +Msg = a996b1fb800f692517a2eb80e837233193dd3e82484d3f49bd19ee0db8f7b440876b07e384c90aa8b9f7b6603ca0b5a4e06c1da0edb974a2fb9b6e7c720ddf3e5c0e314c2d189402903c08c0836776c361a284db887ebcc33e615de9720b01dadade585eef687b3346468bdafb490e56d657a9e7d44d92014069005a36c1cf63 +Qx = e4b470c65b2c04db060d7105ec6911589863d3c7f7ce48726ba3f369ea3467e8 +Qy = 44c38d3ae098de05f5915a5868c17fee296a6e150beb1f000df5f3bec8fc4532 +R = c9c347ee5717e4c759ddaf09e86f4e1db2c8658593177cfda4e6514b5e3ecb87 +S = baae01e9e44a7b04d69c8eaaed77c9e3a36ce8962f95cc50a0db146b4e49eb40 +Result = F (4 - Q changed) + +Msg = 1a6e49a377a08e992353d6acc557b687b1b69a41d83d43a75fadb97b8c928cfebadebaaf99ea7fb13148807f56ea17384a7912e578e62b1b009fefb2aafca5ac85539433619b286f10643a56f8dfa47ba4d01c02510deaec18029ea6b9682022b139dcb70814164c4c90ec717ad9d925485398531cdd5992a2524498b337f97d +Qx = 96050c5fa2ddd1b2e5451d89ee74a0b7b54347364ddc0231715a6ef1146fe8dc +Qy = e0888a9e78aeea87f6e1e9002b2651169f36c4ee53013cfc8c9912b7fd504858 +R = 2353d6cd3c21b8ea7dbc1cd940519812dbe365a3b15cd6aebba9d11cf269867a +S = 85f560273cd9e82e6801e4cb1c8cd29cdac34a020da211d77453756b604b8fa7 +Result = P (0 ) + +Msg = 3e14f737c913931bc82764ebc440b12e3ce1ffe0f858c7b8f1cbd30fbbb1644fa59be1d2cca5f64a6d7dc5ed5c4420f39227516ae8eb3019ef86274d0e4d06cde7bf5e5c413243dfc421d9f141762109810e6b6a451eeb4bd8d4be1ff111426d7e44d0a916b4fe3db3594d8dd01ae90feecf8f1e230b574180cd0b8d43a3d33b +Qx = 0c07bb79f44012299fbfd5a0f31397aaf7d757f8a38437407c1b09271c6551a0 +Qy = 84fe7846d5d403dc92c0091fbd39f3c5cbca3f94c10b5cae44e2e96562131b13 +R = 49e9425f82d0a8c503009cead24e12adc9d48a08594094ca4f6d13ad1e3c571d +S = 1f1b70aaa30a8ff639aa0935944e9b88326a213ab8fce5194c1a9dec070eb433 +Result = F (1 - Message changed) + +Msg = 4000106127a72746db77957cbc6bfd84ae3d1d63b8190087637e93689841331e2adc1930d6df4302935f4520bbee513505cdcfca99ebc6f83af7b23b0f2e7f7defba614022ceeae9c6886e8b13f7ea253a307ac301f3536720cbe3de82ba3e98310361b61801a8304ffc91ff774948e33176ddcddf1b76437b3f02c910578d46 +Qx = 71db1de1a1f38f356c91feaff5cfe395d1a5b9d23cf6aa19f38ae0bcc90a486d +Qy = ecdd6ffb174a50f1cc792985c2f9608c399c98b8a64a69d2b5b7cdd9241f67e2 +R = b0443b33a6f249470d2f943675009d21b9ccbead1525ae57815df86bb20470bf +S = 316dbee27d998e09128539c269e297ac8f34b9ef8249a0619168c3495c5c1198 +Result = F (3 - S changed) + +Msg = b42e547d0e7ddd5e1069bb2d158a5b4d5d9c4310942a1bfd09490311a6e684bd3c29b0dcef86a9788b4b26fed7863f3d5e5439796b5b5ffe7aa2545d0f518ad020689ca21230f3a59e7f8cca465fe21df511e78d215fa805f5f0f88938e9d198515e6b9c819930755c6c6aea5114cd2904607243051c09dd7a147756cbc204a5 +Qx = 8219b225aa15472262c648cac8de9aad4173d17a231ba24352a5a1c4eea70fad +Qy = 0fee2b08ad39fbf0db0016ef2896ca99adc07efc8c415f640f3720498be26037 +R = 134fb689101aaad3954de2819d9fbd12072fe2bc36f496bbf0d13fa72114ab96 +S = e65c232bd915b59e087e7fd5ec90bf636cfa80526345c79a0adfd75003045d6f +Result = F (1 - Message changed) + +Msg = aa563223a7d5201febdf13cab80a03dce6077c26e751bc98a941196a28848abc495e0324013c9a2094fb15dc65d100c3e8a136a52c1780b395f42588900b641b6d4361432e2173195a2f60189f3fcc85f4e9659cae52576f20d1852d43c2b400deea3144c8e870e1906d677425d8c85037c7a42a9d249b2da4b516e04476bd45 +Qx = c934195de33b60cf00461fc3c45dad068e9f5f7af5c7fa78591e95aeb04e2617 +Qy = b588dd5f9965fdaa523b475c2812c251bc6973e2df21d9beaace976abf5728cb +R = 71f302440eb4ed2a939b69e33e905e6fdc545c743458d38f7e1a1d456e35f389 +S = 54eaa0eb9cd7503b19a9658f0a04955d9f0ab20ebc8a0877e33c89ee88ad068f +Result = F (4 - Q changed) + +Msg = 98e4babf890f52e5a04bd2a7d79bf0ae9a71967847347d87f29fb3997454c73c7979d15b5c4f4205ec3de7835d1885fb7abcf8dcde94baf08b1d691a0c74845317286540e8c9d378fefaa4762c302492f51023c0d7adbb1cc90b7b0335f11203664e71fea621bc2f59d2dbd0ee76d6597ec75510de59b6d25fa6750a71c59435 +Qx = 9e1adcd48e2e3f0e4c213501808228e587c40558f52bb54ddbb6102d4048ea92 +Qy = 34eff98704790938e7e0bdf87ae39807a6b77dfdc9ecdfe6dd0f241abae1aeb2 +R = ce4f0d7480522c8dd1b02dd0eb382f22406642f038c1ede9411883d72b3e7ed0 +S = 8546e1ee3b77f9927cdaccbc2f1cf19d6b5576b0f738bb1b86a0c66b39ca56fb +Result = F (3 - S changed) + +Msg = bb6b03ad60d6ddbf0c4d17246206e61c886f916d252bb4608149da49cef9033484080e861f91bb2400baa0cd6c5d90c2f275e2fabc12d83847f7a1c3ff0eb40c8a3dd83d07d194ba3797d27238415a2f358d7292a1991af687bcb977486980f9138b3140321485638ac7bd22ecda00ffe5009b83b90397eff24ecf22c5495d67 +Qx = 93edbecb0b019c2cc03060f54cb4904b920fdb34eb83badd752be9443036ae13 +Qy = b494e9295e080a9080fe7e73249b3a5904aa84e1c028121eecd3e2cf1a55f598 +R = eec2986d47b71995892b0915d3d5becc4dcb2ab55206d772e0189541b2184ddf +S = 8a6c1edeb6452627ad27c8319599c54ac44cdd831ea66f13f49d90affe6ad45b +Result = P (0 ) + +Msg = 33a5d489f671f396c776bc1acf193bc9a74306f4692dd8e05bcdfe28fdefbd5c09b831c204a1dec81d8e3541f324f7b474d692789013bb1eca066f82fbf3f1cf3ba64e9d8963e9ecc180b9251919e2e8a1ab05847a0d76ff67a47c00e170e38e5b319a56f59cc51038f90961ea27a9a7eb292a0a1aa2f4972568669246907a35 +Qx = 3205bae876f9bd50b0713959e72457165e826cbbe3895d67320909daa48b0ebc +Qy = d1592562273e5e0f57bbfb92cedd9af7f133255684ee050af9b6f02019bbcafa +R = 0124f3f1c61ec458561a4eaa6c155bd29e59703d14556324924683db3a4cf43b +S = 688a5c5fc0c7ba92210c50cce5b512a468a880e05acc21ca56571d89f45f603a +Result = F (2 - R changed) + +[P-256,SHA-512] + +Msg = 273b063224ab48a1bf6c7efc93429d1f89de48fc4a4fa3ffe7a49ebba1a58ff5d208a9e4bff27b418252526243ba042d1605b6df3c2ec916ceef027853a41137f7bfb6fc63844de95f58e82b9ad2565f1367d2c69bd29100f6db21a8ab7ab58affd1661add0322bd915721378df9fa233ef0b7e0a0a85be31689e21891ec8977 +Qx = 484e31e69ef70bb8527853c22c6b6b4cd2a51311dde66c7b63f097dbb6ab27bf +Qy = e1ff8177f4061d4fbbacbbc70519f0fc8c8b6053d72af0fe4f048d615004f74e +R = 91a303d8fe3ab4176070f6406267f6b79bfe5eb5f62ae6aeb374d90667858518 +S = e152119cefa26826ea07ec40a428869132d70812c5578c5a260e48d6800e046a +Result = F (1 - Message changed) + +Msg = d64ea1a768b0de29ab018ae93baa645d078c70a2f7aa4acd4ae7526538ebd5f697a11927cfd0ddc9187c095f14ad30544cb63ede9353af8b23c18ce22843881fe2d7bde748fc69085921677858d87d2dc3e244f6c7e2c2b2bd791f450dfdd4ff0ddd35ab2ada4f1b90ab16ef2bf63b3fbe88ce8a5d5bb85430740d3744849c13 +Qx = 8b75fc0129c9a78f8395c63ae9694b05cd6950665cf5da7d66118de451422624 +Qy = b394171981d4896d6e1b4ef2336d9befe7d27e1eb87f1c14b8ddda622af379dc +R = 17e298e67ad2af76f6892fdcead00a88256573868f79dc74431b55103058f0b0 +S = 881328cd91e43d30133f6e471e0b9b04353b17893fb7614fd7333d812a3df6b4 +Result = F (4 - Q changed) + +Msg = 1db85445c9d8d1478a97dd9d6ffbf11ebcd2114d2ed4e8b6811171d947e7d4daedea35af6177debe2ef6d93f94ff9d770b45d458e91deb4eef59856425d7b00291aff9b6c9fa02375ec1a06f71f7548721790023301cf6ac7fee1d451228106ef4472681e652c8cd59b15d6d16f1e13440d888e265817cb4a654f7246e0980df +Qx = 76e51086e078b2b116fd1e9c6fa3d53f675ae40252fb9f0cc62817bd9ce8831d +Qy = ca7e609a0b1d14b7c9249b53da0b2050450e2a25cb6c8f81c5311974a7efb576 +R = 23b653faaa7d4552388771931803ce939dd5ee62d3fa72b019be1b2272c85592 +S = a03c6f5c54a10861d6b8922821708e9306fd6d5d10d566845a106539cbf4fadd +Result = F (4 - Q changed) + +Msg = 918d9f420e927b3e0a55d276b8b40d8a2c5df748727ff72a438c7e6593f542274050dce727980d3ef90c8aa5c13d53f1e8d631ebb650dee11b94902bbd7c92b8186af9039c56c43f3110697792c8cd1614166f06d09cdb58dab168cc3680a8473b1a623bf85dba855eace579d9410d2c4ca5ede6dc1e3db81e233c34ae922f49 +Qx = bc7c8e09bd093468f706740a4130c544374fdc924a535ef02e9d3be6c6d3bbfa +Qy = af3f813ae6646f5b6dbfb0f261fd42537705c800bb1647386343428a9f2e10fc +R = 6bd7ce95af25abfbf14aef4b17392f1da877ab562eca38d785fe39682e9c9324 +S = 6688bea20c87bab34d420642da9bdd4c69456bdec50835887367bb4fb7cd8650 +Result = F (2 - R changed) + +Msg = 6e2932153301a4eef680e6428929adae988c108d668a31ff55d0489947d75ff81a46bf89e84d6401f023be6e87688fbcd784d785ca846735524acb52d00452c84040a479e7cc330936441d93bbe722a9432a6e1db112b5c9403b10272cb1347fd619d463f7a9d223ad76fde06d8a6883500fb843235abff98e241bdfb5538c3e +Qx = 9cb0cf69303dafc761d4e4687b4ecf039e6d34ab964af80810d8d558a4a8d6f7 +Qy = 2d51233a1788920a86ee08a1962c79efa317fb7879e297dad2146db995fa1c78 +R = 4b9f91e4285287261a1d1c923cf619cd52c175cfe7f1be60a5258c610348ba3d +S = 28c45f901d71c41b298638ec0d6a85d7fcb0c33bbfec5a9c810846b639289a84 +Result = P (0 ) + +Msg = 2f48ec387f181035b350772e27f478ae6ec7487923692fae217e0f8636acd062a6ac39f7435f27a0ebcfd8187a91ef00fb68d106b8da4a1dedc5a40a4fae709e92b00fcc218de76417d75185e59dff76ec1543fb429d87c2ca8134ff5ae9b45456cad93fc67223c68293231395287dc0b756355660721a1f5df83bf5bcb8456e +Qx = e31096c2d512fbf84f81e9bdb16f33121702897605b43a3db546f8fb695b5f6f +Qy = 6fbec6a04a8c59d61c900a851d8bf8522187d3ec2637b10fa8f377689e086bba +R = 1b244c21c08c0c0a10477fb7a21382d405b95c755088292859ca0e71bab68361 +S = 852f4cbfd346e90f404e1dd5c4b2c1debca3ea1abefe8400685d703aea6c5c7f +Result = F (4 - Q changed) + +Msg = fd2e5de421ee46c9fe6290a33f95b394bd5b7762f23178f7f6834f1f056fa9a8831446403c098ff4dd764173f974be4c89d376119613a4a1890f6fc2ddff862bda292dd49f5410d9b1cfe1d97ef4582b6152494372fc083885f540c01f86d780e6f3e75a954af2190fdae9604e3f8ab32ab0292dc0d790bd2627e37b4b4885df +Qx = 633c2ee5630b62c9ce839efd4d485a6d35e8b9430d264ffe501d28dbace79123 +Qy = 4b668a1a6d1a25b089f75c2bd8d8c6a9a14fe7b729f45a82565da2e866e2c490 +R = bf2111c93ec055a7eda90c106fce494fd866045634fd2aa28d6e018f9106994e +S = 86b0341208a0aa55edecfd272f49cb34408ce54b7febc1d0a1c2ce77ab6988f8 +Result = F (3 - S changed) + +Msg = 4bc2d9a898395b12701635f1048fbfd263ec115e4150532b034d59e625238f4ed32619744c612e35ac5a23bee8d5f5651641a492217d305e5051321c273647f14bc7c4afab518554e01c82d6fc1694c8bdbeb326bb607bcaf5436303bc09f64c02c6ec50de409a484f5237f7d34e2651ada7ec429ca3b99dd87c6015d2f4b342 +Qx = f78dce40d1cb8c4af2749bf22c6f8a9a470b1e41112796215dd017e57df1b38a +Qy = 61b29b0bc03dff7fa00613b4de1e2317cfbf2badd50dee3376c032a887c5b865 +R = 4a96169a5dea36a2594011537ee0dc19e8f9f74e82c07434079447155a830152 +S = a204eaa4e97d7553a1521d9f6baadc0b6d6183ba0f385d8593d6ca83607c4d82 +Result = F (2 - R changed) + +Msg = d3356a683417508a9b913643e6ceac1281ef583f428968f9d2b6540a189d7041c477da8d207d0529720f70dab6b0da8c2168837476c1c6b63b517ed3cad48ae331cf716ecf47a0f7d00b57073ac6a4749716d49d80c4d46261d38e2e34b4f43e0f20b280842f6e3ea34fefdddfb9fa2a040ffe915e8784cfdb29b3364a34ca62 +Qx = 3fcc3b3e1b103fe435ac214c756bdaad309389e1c803e6d84bbbc27039fcf900 +Qy = 7f09edd1ec87a6d36dc81c1528d52a62776e666c274415a9f441d6a8df6b9237 +R = 1cac13f277354456ae67ab09b09e07eb1af2a2bf45108da70f5c8c6a4cbcd538 +S = 5d83752e540525602ba7e6fee4d4263f3eda59e67df20aac79ca67e8899fed0d +Result = F (3 - S changed) + +Msg = d7f5da9f4cf9299b7f86c52b88364ce28fe9ada55dd551a1018790f9e1205e2405ac62429d65093f74ec35a16d9f195c993cd4eb8dc0aa0dabb70a503321d8a9649160d6b3d0a0854bb68c4c39693f592ef5dd478aa2432d0865d87d48b3aea9c7d7d114165c9200e4e8d7bd02a7895ec4418e6f2fed6b244bf66209039e98a9 +Qx = 5ec702d43a67ada86efbfc136cf16d96078906954a3f1f9e440674cd907e4676 +Qy = 05a62044fed8470dd4fca38d89d583ce36d50d28b66ab0b51922b21da92c56d9 +R = 75f3037298f1457dba55743999976a1c2636b2b8ab2ed3df4736a6d2934acc83 +S = 19d43ad168dda1bb8ac423f8f08876515234b3d841e57faef1b5ab27359b27ef +Result = F (1 - Message changed) + +Msg = 68f4b444e1cc2025e8ff55e8046ead735e6e317082edf7ce65e83573501cb92c408c1c1c6c4fcca6b96ad34224f17b20be471cc9f4f97f0a5b7bfae9558bdb2ecb6e452bb743603724273d9e8d2ca22afdda35c8a371b28153d772303e4a25dc4f28e9a6dc9635331450f5af290dfa3431c3c08b91d5c97284361c03ec78f1bc +Qx = f63afe99e1b5fc652782f86b59926af22e6072be93390fe41f541204f9c935d1 +Qy = f6e19ce5935e336183c21becf66596b8f559d2d02ee282aa87a7d6f936f7260c +R = cef4831e4515c77ca062282614b54a11b7dc4057e6997685c2fbfa95b392bf72 +S = f20dc01bf38e1344ba675a22239d9893b3a3e33d9a403329a3d21650e9125b75 +Result = P (0 ) + +Msg = e75be05be0aaf70719b488b89aaae9008707ca528994461db7130c4368575a024bf0981c305d61265e8b97599ec35c03badd1256b80d6bf70547ad6089b983e3bcc3481828f3259e43e655e177fc423fd7e066bd3ed68d81df84f773c0f9e5f8bf4469960b8b4d7b2a372fd0edd3521f6be670908f2d90a343f416358ea70e7e +Qx = 6d11b09d2767cf8d275faee746c203486259f66dd2bfa3a65c39371a66b23385 +Qy = 4eb05c73e05261e979182833f20311e5366f72f4b949665ff294f959375534c6 +R = 15a697cdb614e11c0810e1e764cd501fcabc70874c957587bc4883d9438e177f +S = 7bf6244f92bc768063cecb5336c8eaacd23db930b28703560f241c7d93950dfd +Result = F (2 - R changed) + +Msg = 0dc4a3eab66bd2e703a8fff566c34d466f9823ae42bd2104f61a6b051c0b017833fcef4d609d137ad97c209c80eebe252857aa7fafc35f16000a2bd4b4be0fa83b6e229eddfd180101f1f40d0453148053d8306833df64d59599b90194b55541d7f22dd589da9f7be519cbbb9db416c71bfe40ec090b5b7a600eec29bfd47306 +Qx = f3899caba038efb534c4cea0bd276814ffd80194473c903b81af11c8c05cb6e6 +Qy = 6ea6b17402fcf2e8e737d11ffc7c2ed3b2d0bc3b8f271a381f4294cff62682c3 +R = 57b99380452e1d37b133c49b9ba493dee8630940477ca3351a43d90b99871e6a +S = df599c3a37105af3ecc159b3b685ccb3e151b7d5cf2d97147974ae71f466b615 +Result = F (3 - S changed) + +Msg = d55e5e124a7217879ca986f285e22ac51940b35959bbf5543104b5547356fd1a0ec37c0a23209004a2ec5bcaf3335bc45e4dc990eacd29b2d9b5cf349c7ba67711356299bceab6f048df761c65f2988803133d6723a2820fefb2654cc7c5f032f833ba78a34d2878c6b0ba654ebe26b110c935abb56024bd5d0f09b367724c07 +Qx = 1fd6f4b98d0755291e7a230e9f81ecf909e6350aadb08e42a3262ff19200fbd2 +Qy = 5578fef79bc477acfb8ed0dc10c4f5809c14dc5492405b3792a7940650b305d7 +R = 97a99e96e407b3ada2c2dcf9ceeeb984d9a4d0aa66ddf0a74ca23cabfb1566cc +S = 0ecac315dc199cfea3c15348c130924a1f787019fe4cd3ae47ca8b111268754a +Result = F (1 - Message changed) + +Msg = 7753c03b4202cb38bc0190a9f931eb31858d705d92d650320ff449fc99167fb3770b764c8988f6b34ac5a3d507a10e0aff7f88293f6a22c7ed8a24248a52dc125e416e158833fc38af29199f8ca4931068d4ccaa87e299e95642068f68c208cb782df13908f950564743ed1692502bafafaff169dc8fe674fb5e4f3ffd578c35 +Qx = 2dcbd8790cee552e9f18f2b3149a2252dcd58b99ca7dc9680b92c8c43aa33874 +Qy = 5dbc8bb8813c8e019d80e19acdb0792f537980fecde93db621aaf1f6d0e6ee34 +R = 2bdbd8b0d759595662cc10b10236136ef6ce429641f68cf6480f472fcc77bc9f +S = 7e7df0c8b86f7db06caf1610166f7b9c4c75447f991d5aaf4dea720c25985c8c +Result = P (0 ) + +[P-384,SHA-1] + +Msg = 222638def3abc9e846fa506fa6e05ca6bf35a13947147fbfaa20bd0c3c7fa836bac8a0c257573d32f05b6387eb3913af4d14d421f8b3ab6eb182542a48be0fef76466c7fe4acf7de2af7ccb82caa1a37f8be08db46f455f9b3ed7d006b0cda1f0a99e9a09e4caa00d11b143fd645cdcd402af41536eb89c9a77b0ff47d46baab +Qx = 6881154cfe3f09affbee04cd387b27b7854326faf8906c4b9c9e6ac2c632e0d59717b3f33f6d747d7b7cbb4e4dc01fb8 +Qy = ba295ae0966f06ad9d84b3bb4da7f99b56044c99f88d71082cfea6964ea3c63bb79806a6a41fcc314b55b3f64f82b68a +R = 2112385a75d4edda89ae2bc3c74524dc792544a3a52fdb588da3f0feaee6a11623db275e2ab8abdd998cc42a29c60856 +S = 8d308a3987b81c595f8cec19898b1a42da8eda97496af280033b0f915283f171fed7e2a221fa9c78927962189333f437 +Result = F (4 - Q changed) + +Msg = 7fda17a3d3bdaa614f5a180211867fc08cf4a6de1fa407498b990e6730589e6eee8bcce705b15a67be22df10d58e62199e6480efca7878516a92020b0544bd04bdfa05f74ec61c43ba392f933a9dca5490927532b775d300ae4171ca9a842f15973ba98a4edd2211340d6c9409649329599f38123c02441340959fc1b5d73173 +Qx = 2f2f43f244ae027c3d2ec5c900393f80a8ad0e9b9a12a047195d29a39f2b7026b071688dd9a6764379d02a5ed8035ec1 +Qy = e43d45851bc76c37d34dbed996a65ffcfbbaf0e2cbfbc9f62d2116bdf3b330bbef5acdbcd0aa6d949f771daa17cda1e3 +R = c011c52e9cb02048957a233704ff9a2c1d4c56e08ebb083aa8ba351f041a23a7d0da19088ac6c60ea2ca117531c7cf35 +S = a66ca9bf06c35d129a8253a0f793acf681e482d9994868b275a230b215286e03a66a0de77c7a53174375137fd4688556 +Result = F (4 - Q changed) + +Msg = 053329a0b61466a6198e05d23c287a9f8b4cef88bcb5916da9a50b89b67a659430f46183d28463d397b1f10056a911debf00acc99df49451e146458332517ed7b862fe41f008dd381d7ee2c8e78942c56a147dacccb966ab803725e6d423505e027786baa13fc0c7cd5efb268e3dd8b0464629eebf88e487b8901d22c0b28863 +Qx = 9a5e1932d318bfa7986f0dac4489c6f55775427bb60fb24bac7646b9994bbc3a9b5cd15e818cc4e832afc1c3fca9abae +Qy = 64c89e7c3399c136b2718ab675944207157f0bf23d9e2a807ae7ac3bef81da7ec3c56c2d2c08afc53301af2a3cc71861 +R = 4cf6c63fea6c80efc105cd99afe2b53da05ae16566ddb20b9d40a076575ffac419b6807fa336fc6e7c7416c59775ef09 +S = aec2d96054b4b23c49faaf9903ccf63bc96281fb7c1b9d14daa54bba51bb2b2f4d3a901f3b0b9cb2b62976459219350c +Result = F (4 - Q changed) + +Msg = 33602a6ec9d3807a3bc3bac1a4429865d64d1c1d3715d62cb5f22cdc46770dc991b70075691fe4243cb6a8633b517635b08ec442b1c6ecac08efbe54e7c1e7911852a5189833b0bc7be99c2ea94337f86cc295f2c9c83d0b50e494908e6e4519052f7aa1d905a1867a1b6dffa62760b6bbe26e3cb88878b50a17ed5fa8e1ad1e +Qx = b3aeff27b65540c6da10a88008404b1d49239c87fbf47932518fb87a9bb132403d1f310f531d086340bb4a68c3e64b9b +Qy = 567e75f442fcd81017b8adc4cce634f5ffa3cd497d38221d34dc1f43aef99133131ff1b197f7b9f37beecae5c438849a +R = 3b94a2514eb915b71e18c867ad7f508a35375c5bcd4b797b86054798569870b2477e2ac14406628017d829400efc63b2 +S = 179a10441a0beea3b375248e697e0d19e24bb68184c373fe4302839b97dd7353a5a25929c2733796b0c0d8211bd67c51 +Result = F (3 - S changed) + +Msg = 3f0783a58e66f3d2c0ccfb5fac3f09db6f8609d0592bc77fdffed9cf0e137d26a867057665f3ad81beebbbdb723d5a47c580828f10f7347ab8a9c24d195f736dfae6eae37d88fe3b4735e7c669a80ac1913e5c24c8c1d5cdb15f994f3ec2f1c774752e14f596b38c2fbf037616d608244d3da7d4badf351330f947e04cc350e7 +Qx = 0874a2e0b8ff448f0e54321e27f4f1e64d064cdeb7d26f458c32e930120f4e57dc85c2693f977eed4a8ecc8db981b4d9 +Qy = 1f69446df4f4c6f5de19003f45f891d0ebcd2fffdb5c81c040e8d6994c43c7feedb98a4a31edfb35e89a30013c3b9267 +R = 8d9d3e3d0b2b2871ea2f03f27ba8699f214be8d875c0d770b0fff1c4ce341f0c834ac11f9ec12bfdb8320b1724c8c220 +S = 62150dfba8e65c0c7be7ef81c87241d2c37a83c27eb31ccc2b3c3957670a744c81be6d741340b5189cc0c547df81b0d2 +Result = P (0 ) + +Msg = 66ae60b818e65b19c0efab7223a38dd7b8ed1888494bb01dee42d0f0c913ff9f2e16e146a5533956e28af9e8c46faaa0041cc74469e639257b971ddfb17100ab78363439ff2b3883bd17d54adb48a58b75202b4cd5aa82493417bf230436b65cfc3ac64a8e1e874b7b64ca68bcac1cf30e6f363fb2f736502d3e41940ae248af +Qx = b4b92211edbd41c5468d2ba70810bc37b5e7c954c7bd0db80c4fa89ccba10bf07cdab953828a068bc0104d28e4040c14 +Qy = 93ed318efce3dff98fc782b788d78658ea5ecde4f716e2d5d0ec2d87a2e761daa1f1658cfb857762caa567baaccf9924 +R = aa3978eabd196ddf9cab2815cc9cbab0b61cd639deaf70e093a10a58ddf9f410ee1ab965ff8fbb98efbe812421a613d3 +S = 02761a2947e1855806b8a25b9ebb0762be9f5517461a371e5783f34b184f32c4ea684b362119b1a2d8a3ff439f10291f +Result = P (0 ) + +Msg = 11bfe43227da93f9ef79a85c243da7e5893a720724f12f9a64da942ae1ad232e158847c6817983e70325dc4ad7a9ec5e3780d4f376a7cec331f33a8b4171e1ee4b613f8de1608cf9b72fd5621ca36fb7aecb27bb432d21845d8b05e3a4099ad2e458409e8de176d5187af0d06f9f2fe2b9ac9d609ba1206f49a88b2d11e3adee +Qx = 63b4cc14f9efd3b8f29e65806591d1e9c54f34a3f5231339bcdbfa4109c42d946a59cdd7bbd2591fd1b2383a0819772f +Qy = 55ab3d208109da6ef039c23cddd52a5af619266d8fe066dcabb1af885ad5501401a78c44ed3b5fff2892fdcb2a3ac8b2 +R = a3f9b840fd7201356f35b5dde39027410aad26ac61919c14fe7b0535bb74e7218cb3312bfa60aac63f14166f32ceff26 +S = 1b1bcbcb0237fad4e406c8d4e3e39b55642d8535afa9ccbc9c601cb4e01891df79f1bc792687cb3a5ee7703565c4a13b +Result = F (2 - R changed) + +Msg = 766c86593bd80ece725a75108a2fa8bb9ee5d13d4d89d0e95ca3105816280d2a82c4f8bc6d2977a34699b37bd7ec4fd5237ddd09ee894ef5311128487ec1cd8387ac24dffd62515bd1fe46087c6f0fc1c37f84aa822fcff167af5c93a2c6e2811c9375a940735d639f856061fdbd28bc400302112b9ce7ed45f2045d9a03ff9e +Qx = f82f82f8f7454ce7a94a040ec0bbb52d49e3b9f8ddd095704973c760ee6067a5c28369656f22d70d8bb1cd70ef9bfea0 +Qy = 0e36e256d02870ee5646a17aac4b280c9d1d2e1d4803eb3cb32e7f754cc889522120efd7c4d8a82e509a4d8f266d3ce4 +R = 27a2332f3c59464f5dfe7bb1201a3936248d375bde603724c048eb8f7c0c2be3ed4b56c14b51d7d68bd2554526b36d9e +S = e1f90367b0cc530c545f95163d9ffb1208c943685d5ae221052b83ee40953397be581e5979c9855b20246e9d26d57acc +Result = F (2 - R changed) + +Msg = 1eae9b93f81846153ba466ce52b83c1ee8f2589f88c50b01552cacf14a6bf825b081a3f558005c35f65171b730f33efd38d33dbd898dab5315e9c8005e8d8ad6c026b37b480d04245b3030fbe3fd44141f8a015d45e9772b327cf9f3f3836a9bdede73a1ba0f8236dc17727bc7f26c32d6328531df081fceeea80aa573524f35 +Qx = 7d40b51127cb1642dd8538d4124138a2f49c41b4d12f702c1b0cec8deba50c3712e01c2e1e693e00438af0e86025da33 +Qy = e734b5939b673c45dd32baf20d234f01b7124b391d14beea231e9c604e813fc83b3a77b0cb1f2ce4873a69b0165e369d +R = abf16821b6657e0005071f78c679cbbb130bee6e7ca63526eef0f747fb721feefe6258dae1aa02064a700e963bd9dedf +S = 3f7e61c34a30cc5ff7a8be375fcc9c38a76dbc0c30a4356843421ca37a7bcf24edcd41d8235903bb522fb6e5a8033885 +Result = F (3 - S changed) + +Msg = 8e25d2238f24f2b9c3600eb6ac8de5f8c42accbd27939c0039430a2b656d5af7d287f83f139b367cc0d1fff2269ab3912199a70a6af4236e0079d2f22c3a22594a030b40445663c787a5ad0e2107b8280538e02267ea4e36d1f3a93df06302572b93eb0d5928d842cb2cc30a4f5bb319ba274d3abe905a0596a655d76e839feb +Qx = a5b59d59599c105e39f61354da99c7c9135c749cf996cc2252eb83b008299cdafbcb44227d2d2c4a5ffa44823922893b +Qy = 0399fb0edcbfd0b76b524f22b7b87ddbb4fa02f510661615312a4492eb3f2001e0fc0e479f77c33a88f9a7e20757373c +R = a4c9cac2409a9bfea1ebe28fec4e19545f08cd18fdd31048f52a3f2d32b2ed859dcae4dc12fb2fecabe542c4f03191ba +S = b4d83f927ad1980d96cbb0ccc36aa640f786293b8b19e4dd97a797d192b420f630a5e42ac42d8736e7d42008f445dbc1 +Result = F (2 - R changed) + +Msg = 9b128ae06a780515c734a7f98e4c17adac89bdcd60fcb0a1d079d856c69440d6cad4952d73f0b3fc399638af1e9eb3944fce8dea9d3de7f91730e11b0662287616dec1137c191a06e628dbec01a99eacc494db055edc54ebff99f7161d8d04aa5afa9244a1adbc87d8d7de67681310a42c9c232aa51632562b0bcd52b6dcd0e1 +Qx = 29178ce9127e1048ea70c7d435439e9ff9915387e51b7e5ca10bfdafe53565978eb3784d9a4226f443d4834f4d451685 +Qy = 5cc2970589a453488649711bdf3cdac9a200519aae65b1c6bd54fed0d965755b36b74d978d674275bd71a03e8f054b0e +R = 5d6f5e9a94d9c92a0890c558bc0408b3405cd04e33f663df16701e80520e4394f1c54d3c8225d36f4753a799aaf6ff90 +S = d895b1cc522ceec6a7867867b8f603245c6e4d48945dfc43af721ebae4683d40a3c21b905ca3bd4b974d36806825b2cd +Result = F (1 - Message changed) + +Msg = 8d94d7b6b6e16b863be09b9217ae9488d8cf1f76aa344dfe12cd32a702c2ee7f2f5802f97c041aa377a365193aacf05c8aecb505414fae1c88a2954545134d78a7fdec43893ec98ba7584a018815c869c22219a816c4dd70a48e24e78d08a3681fe63548810b5f0c31415f6d2b16a141de875c262b81ba95872dde37bb21c75b +Qx = 9f03569f8c6ca2c16d707f0ca36a8a8cf214a9d5c14034829d709e283cd675eb4e3090c6b973429efdf476c0782e0a7c +Qy = e1b842536731e91596782787d57af17db85dc92fd2fb95ac65339174aee66775ce0a4721d1faeb29da968ea5eb705e59 +R = 31ccbe22a360b1786dac89394c6ef4ed6604943e50837395f96052821f6182914840096e90f2ad650917bd91d7bd4cfd +S = d97199a6b952dcaefb1defe23def92bf2ee236ad18046a2ccf8924d42ee10a62e70ffe7f3c909b11112278f160d98b7a +Result = P (0 ) + +Msg = c3221ec7fa1ad3f33665614e9e2512b853c7b9f515ffa78a2405f1b29f91e87acc2a69564d25977411dd3441120c6c14fa5d479b1526de21667c696e692112563d9a8ab7146dcfb042a33bd5184deb581ed80ad22e059b7b5ed8c5fb51789b82b2e87915b947b8ed452c2d8b0c62f80e15791a7f7cc3d7f47d2437412a6d4c1e +Qx = b85e78a935d169dd5ba8f558f964b21c07804464816f9231233184675f557463a8b00470ac0ca8278cd008f4642e7962 +Qy = 8edf7be8584c5f207939d479e65173e2e69673090a8538fa93efb4432127895d92b4e4cf13b7632a830e9a33b37f75e1 +R = fd2876b250a94ced71734aa7a0d32423b2c6f039c926c557e748f38e23bbdb46e17d1204832c6f76c3ea854e1da23979 +S = 76409e381799502c81194ba87540aec0b89fc4680dd683780d49f82a46a7191b40f5f06ccb02e45e704c31fcd59382b9 +Result = F (1 - Message changed) + +Msg = 6485b69626904d88f55350dfcc3dbb46bf71e1c59a40be5b8c9e52c491097839d5849dba67920d866d8494231d67b36b0cec035ced20a47e679ffdad4918e566bfbae52ff34f2c74a0c79aa82a62e0bbee8c8a10fcaf915d864c8febb905ea2e0bd1e671e0d365667143f8a564828b975f3d797c65f1811a487833006876701c +Qx = 0c74aaa0527524cb6171ab741896b405a6ac4615e474cdc09c9457b18bed33c6383e1b92f2fa1306e8e5dcd1667e45fe +Qy = 7b00d934dfd876f6e07dc0582b20ed650be104fa603a5a1255c62b6059d2685aa9773f1ba31254d213c815d0efc8ed93 +R = 832c62b0f34986eda9d1ace5068a0c5318051b0d0166d3dacf137ac072cc359f109ad6e17059e700bb1958bcf4101246 +S = 6bb56f4eb550688ea66e5dd09aebe7e0b39e2716b4697ebb68f113e080f0ff26fd0fc947a34f3c5a8a2f10e07dc1405e +Result = F (1 - Message changed) + +Msg = 83170d2ea8cab8ca6da17af60d596c59af3dd9d8ed319930c0c328fad7a7a12a8127fcbd6a19f64e5bb2e26f1ce3ca1848df3a5b20d220b21410c010dff89f271b816942bc7fcd63c3de218775c46b9090a67fd4c64e2e8447aa755e68db28084f99a1393092ade8f72ed00e61c28e9a262093fce6f75b8e28341687b1aa4162 +Qx = 4104de08b4108ee26ee239e0a5d340c1b1aa48b1b3b40717debd6ed3ff0d777923c106f857a3830ce7f3d08d0d6d7908 +Qy = 00498c38393e6393edcf254804558f86e461df1f5a6557bc5144f8d2f3806413d372b6ce417d531c08a52d1e38e8b949 +R = 9924a3273248db20db007309560a0e616572ac799d773529a5215786cf4a6e03cc73bea81d4810c1eee4b5e975652eee +S = 6cc8ea4c4c56da87c25946a198e86917227bcb90da7be1dcde7b6547bc45a98e8175dd54af15bb6ef955b4cb48b7bb0a +Result = F (3 - S changed) + +[P-384,SHA-224] + +Msg = 97d4b3bf67908217a78e5b7817a40b56acaf6febc774dc563f34788fc7c01288378d28ed6dd7cb6174a72e64a663fc155f5f9d41f7dbb647996a84d07873fb789052187f7b8ce446489ea94439297b78f6095a96733aa305bbed66bc8cc98f87a32d14d87231350e167b65a9f7f25f75eab41a5dc24a66c1c3fd9dedfdc570e2 +Qx = b6bc9418f3da0cce38a65f1b52bb3a9d22a0368e02f5f12fa1f1303ac67df1cffa55d049a782bf5bddb5e841b125aed6 +Qy = 3b578a0560280a2958a14286e10faa7f5dec77fd8d90123aff5780efa8a636cee833fc9f10d7a164f1254a483b613746 +R = 6602090aec001c16e5f6e7e3e488bed5d1702d36b258b6a8a2d8392a5ff30a6af12fbf4308d67eed6aaa8b7be8b831c5 +S = 65d0c3bb1910ba0b7cc108ae1ccaae63405ff01a8df91021e17cd46aa6f8ca8f4eaeac6d6fc26fc816a3ea537fd9576b +Result = F (2 - R changed) + +Msg = 5ad75a561dfbf320a9c0ea8d51caa9268aa855020f16c2f99dd46e42142a5a3b930f5f7a7f76ac9aca5bf659bddf096c94ab3b2a43dad7f97e12803bba79a396a1782e3b72891ecb18d3e37caed5481d3f8ee32af62a3d3ac8a50ccf855b398fcc7930d1ec201494f5357254aa4de5f27de6261ed0c45e255c420ebc3c7cd4f5 +Qx = b4ab83a4ded7d76aa15eaecb1bafe59427d3cfc38564af9123cb707da2405184acd40a6c093ba29e321ba0f67c1e0c6a +Qy = 26e2902499495f8550e798617a44ac9990c4c1cc3527dc0dd003a15aee3cbd3955151f7863de1692a94aafd3730e7665 +R = 61e48d5a100049578e820768ea57f30f27ffd1a1f839fabc55e8f4816c9b95d042619cd3bcc7180fd99834e344f53e7f +S = 977b81d43216f31d8bedc3ffe873047817de3441df8b80a321aa0a80931f25a15c6628f43cf8e48d5c6aeca7626b0a18 +Result = P (0 ) + +Msg = a183efd409ee179ff142421d133b2f811e49c8fcd3091c187d032d1ee5a7ca18b4db7e4a7ce582c42cdbd7caaf57f5aab2686edefa7028b31198e7ea349a507e71b3bba38f3fbd96ea2f8e2c1d11ba3b2f9f2bad23a255831ef0ea5a4b1caab8580fb0ec6e072fcb49d8dc466c5d47030c98f26d512f2f81ab2f60754c165771 +Qx = f886f36fcf34e8df2a7e09220051b9981a3a6f693ec5999f28864e012c13896d633c9564f0118a95631cea8355b25b20 +Qy = 746f9a77835325f18338dee5dc88a9b086b858ce15b4e4462a98844bb01811195f4fae0bee8f457c32823e142210dbb8 +R = 665390653ed280b8f6bd3718d8423f26cb38d2d7faa10fc0f094295677d9dafad45fc64cfc22ded56afdd86a77cf3c33 +S = 864f0eb3a8d93c388d987cfcb60bba76098039d46bf4ff4be083961f70a29e724c25cf56685802b7b5be048107ad52e3 +Result = F (4 - Q changed) + +Msg = 036a7c7faf2cf08f55a1a841ba49f8222dd3a04a95736deb02c2cc7317bde1dac98eb2934ef608886889c5c7bcb5ebc97f76141ec1c3adfdb7bba7e3cd49634c3f4c478bf4d4b5e89df33a9817c5fbb6862493c1185bfca9556bd340d80db521f39ccf911bf6be6351313e22c2f7dab3de90dd83a0ba00241ef1cefaf8f9f261 +Qx = 5fc835a2f5429adb719ed22f11dfcb02731da6759a8ea75c21d1af9631187626c31e191f4dcdc183df01c48e13dbbce6 +Qy = 9ed2d03df1cbeaefd4478b8106e90f92e0b6e958145cb81b9648aef0b96b71d1d55918564694b1987d68cc8e7cbd7dd1 +R = 94d9dedd27f2d014ba84ea58d2e88d68f3e86ba88b93750e50255211effe88b0a0e2f62017f22965726cdc77c55bca4f +S = 14814bd09d9b7ba81b2485777cc588b5c0a4064df95c63f18a8bfd57494cd0f40c5bda9dc6c01ea72540f57a354360ef +Result = F (3 - S changed) + +Msg = 4df76be123a2fea6ff22da2099e1d6a6d69083f5e536155d96008eaa25523e5e500b770da5d1d73189b64eba6cfb7eb942e6da31f9349c5cda966038192f25e5c7762458ad9e5302b4663b34c53e1b30ee10109dd05f2bdde6204f0a7d0c454b791772ab5f36af13ce70fcf914333e0840d71749da7c7049c448b37d679873c2 +Qx = 0b86851d7c19f0f04a16e5e2903a36d09bf1863e152d87936fb2d74cf916bcf6dedf3c066d242f7dd327df0fcb42270a +Qy = b0c93480740bb635e6c25fb61630fdfcc462a1418366a51b1265656f721e18ba89ebf754c7dfdad865a252c884a6c4fc +R = 33fa5fe3e495076e90f4b62753d3cdc7603aa7f5b407dbf89a854b9521d15e6c381d3cf28f103035dc4291ae318c5f82 +S = 30919a2a3fae71e1afe8378aedcaa08fadfab6c6bf954031452d4fe514969ede2acf0347a2f1e81abf1bfb9d8bd55a36 +Result = F (3 - S changed) + +Msg = 8291e5acf7a86f9003c1c8e962efc862a69445ce76f65ba6f861900c7b69b2d711715cfb6cac0f757d3bd5d7af2cbfd7f0283f21f43f12c54af4234a1f28e3a326d14465e991f5e5a4e9fe80aea34324024ce34becf4e9ca56cf5fb66601ca53e20fdfdf353d5356be4c9919f0f7eeb0783d8c7c5d86e85ff39e42f016fa9313 +Qx = 6f8f2fc40d1db28309c8850bf94d77c01c5449b4fc556e6bf50e5ee805209c4489d8ff9bd781699eb0e42f6a962d56fe +Qy = a4c7c77271dbbe7e00d1c6e4287dddc5463c6803a577a18f89a5eea01c6addc12404353abbc128cb9cf2496732312d65 +R = 327c4642019a635d80dab82f7dc22e3102a3c1ba684c2b6de67d3d3009a17d39ae3d58ca2caec9f6f03f5ba3b406178c +S = 6b1af807cc7265cc6d3049959cd7779ae0de819036647f9510b0e9f7e4c0e3fece5fc3741b68881145a2c944dc5c54d1 +Result = P (0 ) + +Msg = 1266b69134087b06d6bd8b34aaf56093bd0fbec845a34e25b3d9e9f81897403eba3e59ce5a17317aecec8678b8f1322448b1fc98c99edd20ce085e42833f848035c80ca4427d672d4aef75cd9d0b87030b04472ebe816b6fd3ea86910099e8b89ffff8796712aebbef874b7ef546c32a7c5bcd5a70c2751c7751b346139f67e4 +Qx = e98ba8016a976dcc3c50127d2af792969835b1096b1644b37c004d1786f4fb1026233f33ad56cd9444ba0a332c92efb8 +Qy = 54bbcb78ffa3c855dd24bf182376ff5d28dd7b7551e4b05a19549c9f59c83dcc12a43092d63c5967fc0256612475b7d4 +R = 3b76a0c0ece2348085f3554fc92b9e5b0fe84801ab2adf1d239d7c81c9697b62285e8e5667774559d1bbc6e86f2ade64 +S = 91d929e42f8223ccc74d4cb09ee7eb619d3a348886c21091ec55d36164ad3cc04e1da6edd88ad89710a908ca4bc00333 +Result = F (1 - Message changed) + +Msg = c8dfc2e32c6c77a6260ba03b204601245dc999e8915ab0d8878e71580ba47e5f57ce74f42a8ee3ae0fcaab8adf7a10a5c46213b7a63c98e614ab211be1498524cf032c5bf3738b73cb6cbfdcfd08984dbf6aea2ab0b8cad764f6a0668a6a9536f24b341dee19cb74ccac9d7a131e3eeb20fc1b51d4620c33285fa81af13d1820 +Qx = b8d7a836715635a8b095d3712817aa9e6ffdd98d24be2db751bb0c1fad42b082542500ea255cde17525ec159afca7002 +Qy = 1a526c876d4771157b4f66e3056485c95066d4bd1e73e991ce6d5d3642807efe80015c52ef3cf8c86e57ab9a510ec86a +R = 9e36f47ec1b7ffdc6e3472f3cbec913494c0bbaa0c073f597e01845b5a3107c0e23a4575de4f2b582e1c2fe3067ec048 +S = b013cf51008a89b379a2a6b519b8d229ff0374401eae21a8da350fe35756b94168e7fafbd81f0f681f21c056941a82eb +Result = F (1 - Message changed) + +Msg = 374d67f9a9ad3861d283b333192d92ba9b261defbb42e86c348c94ad19cc292f81131be674c3d82d5f5bbeb1c2203249244f6f6b9aff3713e00726419657bd0523e823811a8298b36a0e0c1ca89a580a99d1d7e0e53ab7c572099592bfd78526fad344723fbbfd31dda66bccc8201ce3845371e4d3c5bb761b9f84a7d003ad3b +Qx = 4ffdecf5d5f7c1164297a93742c8a685bb425b97fdfe85f630dab2064ab29e52a0df34629c2531048c288216723fc9bf +Qy = 84fcff3e7e478a6932ace6f6b0ab70e61d8a5137b76886c59e721d938e0e252e2f7e57c2ab7dab90493446ad85c3fe4c +R = 7d909d9aacf064c32d070c3149ace8b8f5d83b2006e8460b84c4bce664fc20e91c61ac8b415965b6155eddbe9238fe3d +S = 19d909e358e71985179dab9113941ecad21e4f3608cb3a32dd065868af1657df8e06aa86855ac7ad757a7f8fb568a953 +Result = F (2 - R changed) + +Msg = b8b8c4c83472ed63cdc2b4eb4bd2fe1d6d9989ca15369391a3cb6151a997d69f219fb60c335cbc602b1d87ad2fa084bb98571de7189be6e28b025e1e76eddd218e2c370ea9e232ef466f9807660d0d86a35d8aacd707a581f962baeed6f5df2e657dc3b93db5a265f81f17a4fa9ff20911dd9c7236cde5a1446562f0821f48a0 +Qx = e805e0733fc156bd582faaf794e58d4630ce73fc383cdc964dd337728f774e4989a697d79665a3282ee6e0ee343d6c7b +Qy = 43821b7b9a6ce1ddf0c59ada552668a0cfc85a87a610b5c36b7a691947116b49a4099340306e53494fc6b496cb8d12b0 +R = 3d4fa4ec95b55feac607fddc618d6f4eed71da65dc49d732e64460e5c80c57dc4421c64bacf3ef1e22995fd19c2a3cf5 +S = b11898ba475f2b28402d038afc15f171b99aab93437b35a2f8a3b89f42fdb7f93a0469d9da7652882000dd5bb1e8b9a8 +Result = F (2 - R changed) + +Msg = 5fff95e8e8217950e0a1d33a48d22802ced612a4297b4208422312254632c8141bab2f6217d2c881430e4c778d413f8fa44ea3d386414eac99865fa68ebef645bb65b436296647f61ef8956a92c7ca6a25e85230b08d16423aaec9917736b2e0a4449c0e38618c08ddd36d6d5f0c63cc7ed0527564e023a4afe8ca00219306a7 +Qx = e15c7ef9791b9392c3e97389f2597ee161545c267e584b94262870ef25fda348f72349f396c27ac884fa8d776387fdd8 +Qy = 107b4a7da8be564a14f9c45e4df5cc9b62f0671b3f2c0573c33fa37f985fefd1ae3ff2640947ebb12dffda72757db6af +R = 9d715fd1a3668283fa83c407242e8d2a4f3fa1bf41919ca4101114bd0e0ac1b16c4379edb11de5210eee8618d42e9ed1 +S = 2dc37f453c8cfe01ea80c56d1865daf0f28847b12970132a1853c3ed80da6693e0da47a2476207947f29da34d68d604a +Result = F (4 - Q changed) + +Msg = 019e8ffecf34a14b9a3157911badc6732d7035c4e789ebec4d731b3758a42f23e90645ba6410c3f84e7385418a30ad16d5c7d9971b4c05d17a5a4a2aac93bfb79ffcbe80245b0772adc0be7fa6bf92f27f2a4cb1e37f379a305fd4f2b495bb052ac9a0a64a0f29e18302dd6091cd009dbf30d9bb5e2bf43a20e08bd0e39a0382 +Qx = efcb97dd73106b0a2be4f665c496352f6938da9d0fa97690dc0e8d018b06dce2ba8d19b93ddfe889d549a33e64497c31 +Qy = 66a0cb7e64f40470b6d09b9e12f217b59e9e6615af52fbdc4ddcb379e77809361eca2093a3e24c7103e971567018400f +R = 4ea5d4faf8ee52540db2f4c6283cea5302a3540a56e14c8a7533441c248465be99e10f23bba85be9634efaba7a8b172e +S = 4c98a2142ecaba7db44c78658efffc1175f810a147306ba2e6498553526adb1507d7a99a372e0f84c8dbd160ef7fd5bf +Result = P (0 ) + +Msg = cad0ae6215c97b946a7082d5c17c5304237d75e06256e355b0cb481022633825414a7315e50ff33ed0d8fbc52797eeeb418f47e1bf2b748681f114c1cdce606c6d425974ecb10ee4261afa9a47bc0ff9d0aa191a9f4365a56ee182515cd6bb12bd21750908a5585f4e90d857a5ee342c42434d285b2340a09810049d0665b001 +Qx = 4e916a3cf2561580b49ecc52321db7103292fd2fcce8dd4d6f86be6035808e0df51c3c4ac1894f0b08ef6ebf953e0d18 +Qy = 4e6f28895d024b4c71220b27052ddd4bf6115a260825acade48c043b3e06d2b6b8e4ebdf465980f3b013cb575d475bbb +R = efce00544ebe0d98ba6015c07e3e9d09af808d49a0820c22ef572a3ef9c8a684b377bef1f8b3bbddb734b9b0bd0b1cd4 +S = e80d0e183b3f00098308e20e5b4ae393a07f1d1a8defda9a9d10f19b3e5236e42f593b1dc57f6718dd8d4583f0175ff7 +Result = F (1 - Message changed) + +Msg = 7e666122d2a943cd6c0f3af2418256e746bf0099a59a0185cf7b63e2dc2bd16331d8cef0b2dc6eb23febb87b3f012f4e0f3d9f5eb7abb3f23852e7c650facd5453a1311ce13cf7cd4f31744a91090342ab16996e9702f4df3a75d30f91463ebd1e64fe5eea4d28867ee4ccbc07e72ad77c32e5258103fa7118a2132bed32aa7c +Qx = 3c6528c82d9d5e8dddf41a211c70f78604d81f49853bdc746270f1340a2a645dca3bc7844c3680268fa5973cd1758313 +Qy = 4b9e697f1caf83d3224486bb0a8cd6a7c56e47c91043d8cba3aba51b6e504441d37abcc9b7b2d49b9126463703e514a0 +R = 848814c01c3d18534f39bcd53a8736db16f0f77a015a0e578cbb2f831739723e83b29cb6d4eee7822c76ff056d0f467d +S = 05beb19f766bd1d4ec5e65786042258298a2dc617e3f13d8e2f0f4b50d934565f3162c737fa791a81897397f29305943 +Result = F (3 - S changed) + +Msg = cc84215ee2fb8b76fed16c27b12d7226483dc1eb343682baf341e643896ccb86372de512ad00b91d47e76d9a3ee78235121af0ad791d624a07bfd977f513dfe08aa3248104f43f719259240d8348b849280d7df855e9f4778b9f9529028a9e9af382b6e3f2d619d6887deb335c54ec1ae36b438eae121a4cb300fc817f7a1b99 +Qx = 80c3f6488dcd76f33cdb75e30f8452ab9a3bd6110f14e25179b0aefe4c19c60a07b4af10844b130b0b75a7024e341298 +Qy = 6c85a17ad4bbefb33910250e05ac02a17c892c3380712d06dd070843dff0d040e219dae78679b774cd5eff0adb67189a +R = bc444deb0c7dd9f96f20a7ffd3ddb35a1189316655531860c39b5f87f09992106985e5562e083ee9f538c8e2d5363c52 +S = 91adde5d47eae80a98661f4347fd6e4778478c3d4aff3cff8aa92e2345a8e03cd4ab64adfd38e461bb98b496516439e7 +Result = F (4 - Q changed) + +[P-384,SHA-256] + +Msg = a444216c9072caf87fa57c1f04aff9cb83dc2ede9968bda41c9d918825e526c2397cb7d771a7e120582424bbea8ecd56a69bb468cd61437f5a65f04953f9d4018c599afd9edbd4d26e861f86829b9496f829f2b601df73e931fff96559e091417c0d8b8c8129443f7efb985d286c7167b66d2b4d5903583a928db3ed6a883117 +Qx = 97c3f446803a61a7014f61cb7f8b3f36486c7ea96d90ee1767f5c7e1d896dd5114255abb36c74be218c1f0a4e7ebba3d +Qy = 553ed1fed72c62851e042f0171454f120029adba4ee26855ab881d9470355f1947aa1d2e806a7ff2583660fedbd037a0 +R = 7b06d6c2b63f1cc3bfdaa897d07dc15a83bdf35d979f70c34578332b3f4920422bb24867c51bde10831324df424e04ec +S = 4bef715161f400dc98d4b63bd13ff4ad4a6c981ead44bfc662fe9bca4b56cd790698e4deddf9a4bd69327f26bfe801e6 +Result = F (4 - Q changed) + +Msg = 43c5ffcdf6f9e21aba1b065596745e8738f7b39e1db486a6ae52218d66ce8125fdb155ee281e01b27fa20d0e37d6468a2daedc5fd30573e44b256c5af13df27dea56fd81aef689aad7c022cea77ac3c40a1d64b8c0cf7fb5a128d6a1799da7b8d95308613ceb2260e10b37530edd42925fa5abcdad5d0646ba5bc78c330346eb +Qx = 08bd5c6cdc1f8c611df96485090e20e9188df6abb766bff3c1ba341ed209ad5dfd78b628ec60998ddfdd0dd029352fbd +Qy = d9831d75dec760e9f405d1aa5e23aac506dc019fb64d44bd57f6c570d017e6609f8fdbb2dc7b28ca9e00e37cd32a3b73 +R = 8b372c86ed1eec2163d6f7152e53696b4a10958948d863eb622873b471702ac5b2e75ff852149a499e61510905f98e4c +S = b2ed728e8b30787a28f2a6d3740872e47348686c7cb426411379411310241d25f08a026b853789b1157f1fc1a7f6ff49 +Result = F (1 - Message changed) + +Msg = 5edd325885296a829b50b16b17e3c4fc3491f1d53384103f1c09a21a169329e07b3758d55c52e9d578fb9e35e8754bfab9fa5e319d0c7fdb45444eda6a2a0a9aaeaa9b7702cce742047146228f9f687e7684d9b4aaa3be03813c004f0418c1a2fe3aa8ddb3658137d7e954e3683a08e0eaad26c0cc3ae0031b191909a3ebade5 +Qx = 10a784abb3c549444a62c28df1c926b8aabb20c8d9aa4b1f7ca830258857cbe9718dbc9845fa9cbb78587a373baee80d +Qy = a1ad0c10b5ab6780cad49c8cd3eebd27de8f1b382ddd7a604458cef8e76ca632a7e44e1c63141a742426cec598029e2e +R = d9e52be2a3f7f566899cf6daaa38116d092473066f3a1bf91f3df44d81bca1deb438d9d25ce1632599c1d3576a30f128 +S = 0cad30bce4b3d7f40b3eef762a21bb1a3bad77439838b13024b7b2c70316875a99e80723a74a9e7a404715ca06a5d673 +Result = F (3 - S changed) + +Msg = 4fb73e9e8cbc3e829f99472671ee8719f796dbed096b3cbdf1080ad7f5c410a4541e3526de816fe35ab9e664bb1c1d1e9add2522b9a91eb461b45ae4426e1dfbab7dad03a1392706b9314c03104ea7b40f3632577b0b7c991d2b92460638707572b3387add6ab0f05f6f553fa1fcc50fefe74783cd8b781a35de5ae0e7fc5a58 +Qx = 8760182393132d69011edfa127e36f92eeac8272641c27f52f3337ef8af7451e6d14f4e4590c7eb9fafb76e8c92865cf +Qy = ebc2b123ed871ca570ead40ae8f6f32335393c569b21b38f626d09c064a3c8668e9fb10a4667e0f0c68bf25ca98fd6dc +R = 1db957e5c2d294035d7f476a0cbc28a4aac2614d8212de5017076cd836bf04ffe237dce8fec91f2fb5ef82449ff1c65d +S = 3e3b9058d0a9c5b417f9c6f86557b9d50e7a902694a7012a1be6bb70708497e4d39fc1f6d6bc60dfa52d23cab173385f +Result = F (4 - Q changed) + +Msg = b66ca1d77adf6b2b20c6ef68e50d353a9f5cd0be422f5f6fff8f74506280a55d7923cf047dfdb9147b916f6df6cad8c52257360f746b77edb9949ed4ae9a63d08a7da07c4cf32836574a34f316292b8cc5a6b057129a6baa1182be8a5be1c43739e7d9b0abe07801c2d4343a235037b9aaff14694c051fde4b545931ff9e9a3b +Qx = 2b1f98d2acdda8347b9a68c75174408eae7de3d6b9c08c26e73ce9ed2ac147b8d90cd82e30ab43909d63f6b457de2071 +Qy = 33f5e6f5f5793201991e014cce0045d04adc352298e32f45f4e374450111c8456b5c2efaec43d157949b5c191b2bc934 +R = 23d046402cbce807d232bcf0dc96d53c72992e0ba1ffce0d79050c0f4c5ad9bfbbdc1c96c730d67ff3aa3edaa3845da9 +S = 2cd46a4fe5d120b3af3a6d9ea63cc78f4079e8b5520a8fa96828334a4f182ff4d5e3d79470019e4eb8afc4f598b6becb +Result = F (4 - Q changed) + +Msg = 862cf14c65ff85f4fdd8a39302056355c89c6ea1789c056262b077dab33abbfda0070fce188c6330de84dfc512744e9fa0f7b03ce0c14858db1952750d7bbe6bd9c8726c0eae61e6cf2877c655b1f0e0ce825430a9796e7420e5c174eab7a50459e291510bc515141738900d390217c5a522e4bde547e57287d8139dc916504e +Qx = 86ac12dd0a7fe5b81fdae86b12435d316ef9392a3f50b307ab65d9c6079dd0d2d819dc09e22861459c2ed99fbab66fae +Qy = ac8444077aaed6d6ccacbe67a4caacee0b5a094a3575ca12ea4b4774c030fe1c870c9249023f5dc4d9ad6e333668cc38 +R = 798065f1d1cbd3a1897794f4a025ed47565df773843f4fa74c85fe4d30e3a394783ec5723b530fc5f57906f946ce15e8 +S = b57166044c57c7d9582066805b5885abc06e0bfc02433850c2b74973205ca357a2da94a65172086f5a1580baa697400b +Result = P (0 ) + +Msg = cc0aac1010fad8555f81423ac25203720853dbe6a465c244388df90839113d59ea3d3521a8a9cbef649f8abe8d6ff8b0cf17ffc199dddb2997511c4b50e944d41cbcdf5d2102dc98d6f9355b211f130d4e89983f63e5dfe6e1b4ffb3caabd1ad96563fb5c0e5905dcb738a59ec2e5d47684707191ff32746a0cbc65b02be7841 +Qx = 9e7553eab8cc7e2e7396128f42ab260c6dbb5457cbff2070ea7c0db21def1537939e3f02699e5dd460eca3798d08bd6d +Qy = 892c0c8e47dddf858e89099a8fc1026e8b8333532b22f561f7647f63f9c79dbf5e8dd18fbfe6ff34902233119c5d5aa3 +R = 2452da6a48c3749b66e576e0f1f768d51728be17aea149164c4e1654c5ce27f625a4610c4a2eeddb3a0626d3abc6c37c +S = 499504fb58c9db24a7ff5f7921e1312f8aa583c08a308e080f5ef1acf5cdae7927c4101573db069ab0b6de7f4f1cab38 +Result = F (1 - Message changed) + +Msg = b9d8d5d47edaa2dca7d7d687f98264b6e21a8e1eeb20083efedb71c116d13150d95f62a369a79f0f45233d2751a4b36432c7c12e19c8bef37568fa1a347929398b7ee69046e11911e3db472c3bccbd68653d99e461b4e5cfa617f94d59798f333ccf13abf426ca8be0f6587a453632a50c159d96695ad03dbaac716e811a3586 +Qx = 0cf4dc51e71185a29c0c6fa3c075d9da5bd7ede085053344dce5dbbe8329e8ac9045f7246c9d0efed393b8e113c71429 +Qy = fdb7917b73974b355cf9f3bef6a0a460c2d39fdf1fe32a7744be0a54ddd1cfa8d03914cff4b5ca536b40707ff2629aa4 +R = 3812c2dc2881d7ef7f621993b161672329b261ff100bbd19fb5826c9face09aec2017b6843d69336b813b673c5402527 +S = 5dc102fab9d6325131c556ec00309c2959d1031a63fbc1e2d5d04996d3234ed33875c0ab98e5878e9bc72742519ed398 +Result = F (2 - R changed) + +Msg = 6d9cf30d59cc9d6e560e9c52f8be325d19eb3cea592e43bd9584411d76064729c03ad54feb4dce435fb662ff069ca3e19bd16c312567f05018feb8f913caf7553ac728ac787ea3ca073a328633441d7c5cc4d30ec194f248c0701119f7dd80c99e44f469f37cc6726601c97e7d94dc8e549261b46d219a7ea36bee650ccd15cf +Qx = 6c590434988155236b43147389c6dbfdd27dcd3387e9b4c2587ece670753a542a13a736579887791cf53d31e5ce99994 +Qy = 35a20194ff3f1b55f7ffb2758ddd4b98dd0d9e0cc213e10ed25e8e0430fe861066c1d4423c67f0c93f7ebd87fd3c561e +R = 89ff866889245e797926509e563b1746920b78c9370a6cdae52663730d131e558e327d1f5fef8faf9e6c802fa29504ed +S = 8dd68e2de2f788e598b3e5a60c18d81849a0cc14b3b0e3c931910639f3125e5d6045f00330b1fa989252a80f95419b04 +Result = F (2 - R changed) + +Msg = 2de0c0671213bd4326ffa5a1070ca605733961b11e9f939f805d2d6974d5286e1b1c00adac360f32bd58432629f8c932e241ffaae742c9336f4c95782d4b73255cac0644c8c2d7099c2ba1fd0cf4243344dd8dc0f77004730f5078479955c385959e06303ef2fda8df81e7237251e3e84a03515505e448aa1330a9a1cd4822a5 +Qx = 499cbdf18ec4e69b88051543c7da80845fa2de8be2b9d9045fee7f104a8b5b7d04e69142de9955c5ab18c5a34ebff075 +Qy = a29cb8d28836b201a389922b6f8f93870f09c80a00242d00d32656a43ac1440fc55bcb123551a73290f603c3469be9ed +R = 25d4d243da6fd9b439a9242c3656fade7acb7a306e8cf23ea89e3ff4f9330be19c61aaa42d7b426d12c8e0f96b80dae5 +S = e7a99cf4b269bb4a6210d185e9654602523b5cfa1cddc94b1db92018aa557ecb6adda44c816975f5ec1756b6df3c44fd +Result = F (3 - S changed) + +Msg = 69de70edec5001b0f69ee0b0f1dab6fb22a930dee9a12373fe671f9a5c6804ee1cd027872867c9a4e0bdfed523eb14600cfed64fca415188d56eb651d31731cd3e0efec7251c7defde922cf435ba41454a58d2abf5f29ce5b418a836cab1671d8cdc60aa239a17a42072137cfdc0628715c06b19a2ea2e55005701c220c0924f +Qx = 9a74ea00203c571bd91ae873ce0ed517f8f0a929c1854d68abd3b83a5051c0b686bb37d12958a54940cfa2de23902da7 +Qy = 6f20ccf8fa360a9ec03d7bb79ff17ad885f714757ef62995f824908561dc0c3dffc49d873627936a2fff018b82879ced +R = acc1fcac98c593fb0a0765fce35a601c2e9570d63ea1e612fff8bc99ac2d4d877750bb44cfb1014e52e00b9235e350af +S = 7f53de3afa4146b1447e829ebac8f5645e948cc99e871c07280cc631613cfdaf52ccaeccbe93588a3fd12170a7ec79fa +Result = P (0 ) + +Msg = 383ab0251157e645e678100ad3431b9ad96c6279e237ada71d85db0ce3a96fcd4805b2e7676e9a395f1d2f14f24535b77160b22d3d1c7d2e02ec4bbd82058f397db468f4d9ff0ab8306f9becd234f7a7b9c5a4ed44b7474913fe984b5b9e995fae9a951e6e8f2975df67a0180cea81fd4c97eea60a25c15e2ba21092ab0eebd5 +Qx = e22f221809fb7a054ac799a70b3d24744eb7c5096c8671770399527c88ccf9ddaea0257a0ae9430d927ff5d9f109c533 +Qy = af4101d60df9b306ae92da7592f4faf3df422a3e33f1c2ed2973b2b900eefc346b4cf024de650abf537cecd12ac77618 +R = c39a8e79f0560b9f26504469a470c7b2230c0d25de07c206e87dfbde9aff0a5d85322f56dfb50d4c1fc67c67d615dad7 +S = 2ad94dd13a39cf4f4cb24c2c81d4c1181652363addd856dc9ba7455458e40ed047cd113129bc87f43949d5a98a0d5205 +Result = F (3 - S changed) + +Msg = b23e83d372422cad7bf633ff84468b5ca0f1902eea801bb2e6e89b45d2f75ef9e08c47e010decdd2cfbd9280b01511164e00bd8323fd06a019e83d3dd23c8aa0313ad5196925b5b7d5c25ff8fd198ac2a234dbe0a13fbd04c4002ea89856e91e789e07e25d56690e0481cdb776a3035a64f4bd571097ef07bd49994f95d8323f +Qx = fa8ebc3682d90ac7356f0b75b9e3376e76518676e0bedd176cfa7fa57fea4b3a399dbb2bf735ec90b9c1705cf9fa6f57 +Qy = 18c3fbca0150ec10696b3851f31fb3ba62c0b6be509d249e0d4b374c7a08e49338e0922e2a8a9319999e6569ab8d292e +R = fb58ab09b8a7ef7a6ec05b854eae11af9b713f7c7540e25115f609846e636ad4f88dcf4dd61e311273df23ccda474f03 +S = 485be4c21b7c3a9c6b39ffc9f0c39f4050f76d2a6b3fae203d016318c541c1b4ad6cfc0d0950636ff6883895dd49e4e9 +Result = P (0 ) + +Msg = eeef70ae23d95330a71bdde1feb196d599481e057bdbd5ef519ce445a9b5acb46ede325a9caad720e4fc49c198ff5f0910c56a06d0cf76f450da1ad35fecccdb4442f64daa6149ee6b67ab1307ffb5c4b6ca3e72a644d36d9e71c4dd3283d12041e73e6d20ec19b3b20654593a4cca4b2fd9aa12f17d5b00b7ed43df74548010 +Qx = e5f331536a2940cd67234bedf813c12e15aefa9a1a68429f8754bf2769a47c9c2efb5c42135e7b01a110d7302e097eac +Qy = 63b2398612c863febd482184e834d3acb51408c49aacbbd35d8719746f37cb13e013c9505ce034cd815aacd10d2f7a0d +R = 96c35f22d036785a392dc6abf9b3cfb0ad37b5c59caefcc0b5212e94e86739a2674020ff79258094d90d7d59f09d47a1 +S = 373cbc865384734c56952f7a35a1fdecd88e8b343ee3aa073d30f5f25b73506f1e5f5857f668b0080dec6edeb5e1be96 +Result = F (1 - Message changed) + +Msg = 7875194a0c3261cf414652cd9970219e3bf8185ad978affebd92ffd40c209a0d17dda0d5b79fefaeba3400088720598cc757aea1fb31ce976fb936726fd4b48d396a35cf4b78d16ddda56067ddc64728dc80b874c5286128b7b5da88808c7df5c3323791720e7ead8b50144dedc15590530b89cd022fd7291c97a4b9889d0568 +Qx = c53ad865beb1e2b92764065f1a6bb465ee94aacabe43426a93c277d02e00fe36be1c859ba08a031fc518a0d007668979 +Qy = 6728d42bae9bc097151748ffa0982964bdd16076fa0e7cc15837c1f773b08d02c3dbc57339091ccc34105b84781150b4 +R = d4f0dd94fc3b657dbd234767949207624082ff946de9ce0aeb0d9993b8c7d7935760e1bf9d8b233bc7d6cd34928f5218 +S = 0941df05062aa8849610f4b37d184db77ed1bc19ad2bb42f9a12c123017592bf4086bf424b3caad9a404b260a0f69efb +Result = F (2 - R changed) + +[P-384,SHA-384] + +Msg = 4132833a525aecc8a1a6dea9f4075f44feefce810c4668423b38580417f7bdca5b21061a45eaa3cbe2a7035ed189523af8002d65c2899e65735e4d93a16503c145059f365c32b3acc6270e29a09131299181c98b3c76769a18faf21f6b4a8f271e6bf908e238afe8002e27c63417bda758f846e1e3b8e62d7f05ebd98f1f9154 +Qx = 1f94eb6f439a3806f8054dd79124847d138d14d4f52bac93b042f2ee3cdb7dc9e09925c2a5fee70d4ce08c61e3b19160 +Qy = 1c4fd111f6e33303069421deb31e873126be35eeb436fe2034856a3ed1e897f26c846ee3233cd16240989a7990c19d8c +R = 3c15c3cedf2a6fbff2f906e661f5932f2542f0ce68e2a8182e5ed3858f33bd3c5666f17ac39e52cb004b80a0d4ba73cd +S = 9de879083cbb0a97973c94f1963d84f581e4c6541b7d000f9850deb25154b23a37dd72267bdd72665cc7027f88164fab +Result = F (2 - R changed) + +Msg = 9dd789ea25c04745d57a381f22de01fb0abd3c72dbdefd44e43213c189583eef85ba662044da3de2dd8670e6325154480155bbeebb702c75781ac32e13941860cb576fe37a05b757da5b5b418f6dd7c30b042e40f4395a342ae4dce05634c33625e2bc524345481f7e253d9551266823771b251705b4a85166022a37ac28f1bd +Qx = cb908b1fd516a57b8ee1e14383579b33cb154fece20c5035e2b3765195d1951d75bd78fb23e00fef37d7d064fd9af144 +Qy = cd99c46b5857401ddcff2cf7cf822121faf1cbad9a011bed8c551f6f59b2c360f79bfbe32adbcaa09583bdfdf7c374bb +R = 33f64fb65cd6a8918523f23aea0bbcf56bba1daca7aff817c8791dc92428d605ac629de2e847d43cee55ba9e4a0e83ba +S = 4428bb478a43ac73ecd6de51ddf7c28ff3c2441625a081714337dd44fea8011bae71959a10947b6ea33f77e128d3c6ae +Result = P (0 ) + +Msg = 9c4479977ed377e75f5cc047edfa689ef232799513a2e70280e9b124b6c8d166e107f5494b406853aec4cff0f2ca00c6f89f0f4a2d4ab0267f44512dfff110d1b1b2e5e78832022c14ac06a493ab789e696f7f0f060877029c27157ce40f81258729caa4d9778bae489d3ab0259f673308ae1ec1b1948ad2845f863b36aedffb +Qx = 9b3c48d924194146eca4172b6d7d618423682686f43e1dbc54ed909053d075ca53b68ae12f0f16a1633d5d9cb17011ec +Qy = 695039f837b68e59330ee95d11d5315a8fb5602a7b60c15142dbba6e93b5e4aba8ae4469eac39fa6436323eccc60dcb6 +R = 202da4e4e9632bcb6bf0f6dafb7e348528d0b469d77e46b9f939e2fa946a608dd1f166bcbcde96cfad551701da69f6c2 +S = db595b49983882c48df8a396884cd98893a469c4d590e56c6a59b6150d9a0acdf142cf92151052644702ed857a5b7981 +Result = F (3 - S changed) + +Msg = 21eb31f2b34e4dde8d6c701e976d3fbbf4de6a3384329118d4ddb49adb2bb44465598abf6df25858b450c7767e282ccaca494088274e37353674eef58f583937d3d184ef727317d3672397a74c8fe327919a3df8fd65af0bc8cebbc40095adf89f1bf2c5e6dc6ba44633fd8433b25f065f5e3eb4840af23cc534415406745a31 +Qx = 5140108b93b52d9ad572d6129ed6564766f8df3755e49fa53eba41a5a0d6c1d24a483c90070583a66e3cfa52b6fb1f31 +Qy = ff52498446a40c61e60c97554256472625633eda0c1a8b4061481fecfbe9c4503e99dfc69e86c9e85c8cc53dca6b8dc4 +R = b2726b2ba9da02de35e9953fc283d1e78700860d4c33dce8db04dd41499d904866c1b8debb377f6c0dfcb0704252174f +S = 0775b027068d7ad55121a278a819f52099ace750d5e996eaec9dee7be72758736cf769650148fbd5c411beb9b88f979e +Result = F (4 - Q changed) + +Msg = 58ea3b1e82f97708053d0b41441d0aa9619050e86ac6c4f7781164e5da3019c47a839366509fa95812e4f64afdc62b627c7a98f633dd05db45c1d8954fc83bdb5042679378bb7e4c7863aacf2026360ca58314983e6c726cf02bb347706b844ddc66aee4177c309cb700769553480cdd6b1cd77341c9a81c05fbb80819bc623f +Qx = 31f4fc2fac3a163a5796f5e414af6f8107ab5e4a98c755d81efa9d5a83c10128c16c863190112fc29d3d5f3057a2edf1 +Qy = fe208743f3e96c3a34b5fff78c9716c074a1ce3dc01c3f0e471ddfae91cd88e7dda38dd0e5e1f91b00b8539da3cc10bc +R = 706911812ec9e7370234efd57b2855975eab81e9c2fe783aa8e442dc6e7d681dab2dc0dfc6765f87ab67001108e3facf +S = 42c89efa22d853d32f619c9fe13e9852889ac98a9fed5d4fa47fed238e1cbe70d7970af9f7bdf84e51176af4885f2490 +Result = F (4 - Q changed) + +Msg = 188cd53097ef3e64b78b9260bf461708c836f25f2bcc98b534af98b96ee4b324e2203a7e62dbc396966f56419fb5135cb124369aaa025f396eac72f05ab45950d9e02cd5a2357eafab9f816117b7f1de192468895327802ec79f5d6b5a3d44d7afbed7b4a308e365655b8db2bde75e143062ee48b7c51688ac5db0bc7c83ec9c +Qx = 1f7911dcfe63a6f270cf75b8584d9b1b4a00afc1fa43543c945945b8a821ebeb37fbc705a000f9cc7c35f7d27027b7bb +Qy = f11835ec80c4ac06d99247e73bf72522109ac255e6109262de4dfbf9619244f74fb6c9ee57694537d7e79c248db34dc4 +R = 3587c9c6885adf3be1086825f9a41ccd2edfa0bd95e7fc4dba5a9710f41d539132de7772f14c18e318f8992b66d2a86c +S = 73a844d729599d4e3e3c1b63e9c4bf5a73d1f69e0160857fe63a56c381c051f5c37ea6b4cc4caacb6ff26ef9699efe30 +Result = F (4 - Q changed) + +Msg = 6462bc8c0181db7d596a35aa25d5d323dd3b2798054c2af6c22e841b1ccf3dc3ee514f86d4a0cef7a6f7f566ae448b24dcc8d11eb7a585d44923ea1a06c774a2b3eb7409ab17a0065d5834ab00309ad44312a7317259219543e80ddb0cc2a4381bf6e53cd1bb357eba82e11c59f82e446c4b79314119182c0de96a1b5bae0b08 +Qx = 2039661db813d494a9ecb2c4e0cdd7b54068aae8a5d0597009f67f4f36f32c8ee939abe03716e94970bba69f595fead6 +Qy = e2d5236e7e357744514e66a3fb111073336de929598eb79fb4368c5bf80814e7584a3b94118faac9321df37452a846fc +R = 164b8ac2b34c4c499b9d6727e130b5ef37c296bd22c306d1396c6aa54ca661f729aa6353b55d7cf1793b80b5a485115f +S = 4e7187f8f735b7272f2c0985315b5602bb9b1a09f32233aa10570c82d1ccedef6e725800336511e47f88ddbbbdc08f54 +Result = F (1 - Message changed) + +Msg = 13c63a3cb61f15c659720658a77869145ae8a176c6d93d3a8aa9946236d9fb0463db9e48c667cba731afaa814ba0d58357524f8de28d4c4bbe2691dac9b32632a7dd0f99fd4cb240290878305011f7d3e37ecc410cc1fed601e7901e8be6414ea44317584843a2d2ca2e15103e1ea49365bc384355b3c6fa6ccdd452543e9769 +Qx = 46dcf8ee848c6459fa66d1cae91ccd471401a5782cb2d3b9b9264189f0e9ddf7197b05c694931bde3306240cf9d24b7e +Qy = 79d9508f82c5ead05c3f9392f3b1458f6d6c02f44420b9021d656e59402e2645bf3ba1a6b244ddb12edbb69516d5873b +R = 5ffba3b5bd7c3a89ec40b47884b0b3464e8abb78608c6d61e1e62c2ca98d44fcdf61825d69dffee8408d0849d0623bac +S = 0d2597b5fc3842ffce1957172253a8c9c0e4dbe770ce54f70f139e0545dc34ec639d609e14175bdb2b812ccfda00c9d4 +Result = F (1 - Message changed) + +Msg = 6939a9118adc307107aa6b0057c280d10fa44a64700c7bd23e1f33a478ad2cfe596c05f72b540cbdb696aac6ab98d9ca8c62f33e182657130b8317a76275a5996333a5d3547e2293b401d0adf60f91e91d2137e34f3336e017c3c6dba6bf5b13dd0de288f9b20a896a92c48e984fbc09f920fab82f3f915d6524b0c11236aca4 +Qx = 097cea75f685cf4d54324ad2124ce3f77b1e490bbaa1ffacde40dd988f7591e1c5d158e6f232500d958762831914af7f +Qy = 716d8bc056daf69ca2edd21b89a6ae9923cfcae87bfda5f9a6e514dd4b9d28d164fcc613ca2afb9660adfece59f09b66 +R = 1c5d4561d2a3af8835839b543098c101c715c545eb7d00300c5cb05bb08dac29e732ffdc31c50915e691999ad505104c +S = c3442f2fb1498fd47c2f959edff37a19783e3ccee80dc6955ca64db087fd188e67358e7b9223535bbb858d21ba6a978c +Result = F (2 - R changed) + +Msg = c82071e42c45ac3597f255ba27766afe366e31a553a4d2191360b88a2a349ee077291454bf7b323cb3c9d7fec5533e4e4bf4fb5bc2eb16c6319e9378a3d8a444b2d758123438dbb457b26b14b654b3c88d66838adfa673067c0552d1b8a3ade3a9cb777986c00f65cace53f852c1121acf19516a7cf0ba3820b5f51f31c539a2 +Qx = d2e2b3d262bb1105d914c32c007ea23d15a98197f0ed90b46a17f3d403e406a76c8f752be1a8cd01a94fd45157f6511a +Qy = e585fba180017b9983b4c853ad3a5dd52e079c5f0ef792d1a0213b6085e390b073de1a4b01749ceab27806e5604980fe +R = 49c001c47bbcee10c81c0cdfdb84c86e5b388510801e9c9dc7f81bf667e43f74b6a6769c4ac0a38863dc4f21c558f286 +S = 1fb4ff67340cc44f212404ba60f39a2cb8dcd3f354c81b7219289d32e849d4915e9d2f91969ba71e3dd4414f1e8f18f7 +Result = F (3 - S changed) + +Msg = 137b215c0150ee95e8494b79173d7ae3c3e71efcc7c75ad92f75659ce1b2d7eb555aad8026277ae3709f46e896963964486946b9fe269df444a6ea289ec2285e7946db57ff18f722a583194a9644e863ae452d1457dc5db72ee20c486475f358dc575c621b5ab865c662e483258c7191b4cc218e1f9afeeb3e1cb978ce9657dc +Qx = cd887c65c01a1f0880bf58611bf360a8435573bc6704bfb249f1192793f6d3283637cd50f3911e5134b0d6130a1db60e +Qy = f2b3cbf4fe475fd15a7897561e5c898f10caa6d9d73fef10d4345917b527ce30caeaef138e21ac6d0a49ef2fef14bee6 +R = addfa475b998f391144156c418561d323bdfd0c4f416a2f71a946712c349bb79ba1334c3de5b86c2567b8657fe4ca1f1 +S = 1c314b1339f73545ff457323470695e0474c4b6860b35d703784fbf66e9c665de6ca3acb60283df61413e0740906f19e +Result = F (2 - R changed) + +Msg = 93e7e75cfaf3fa4e71df80f7f8c0ef6672a630d2dbeba1d61349acbaaa476f5f0e34dccbd85b9a815d908203313a22fe3e919504cb222d623ad95662ea4a90099742c048341fe3a7a51110d30ad3a48a777c6347ea8b71749316e0dd1902facb304a76324b71f3882e6e70319e13fc2bb9f3f5dbb9bd2cc7265f52dfc0a3bb91 +Qx = a370cdbef95d1df5bf68ec487122514a107db87df3f8852068fd4694abcadb9b14302c72491a76a64442fc07bd99f02c +Qy = d397c25dc1a5781573d039f2520cf329bf65120fdbe964b6b80101160e533d5570e62125b9f3276c49244b8d0f3e44ec +R = c6c7bb516cc3f37a304328d136b2f44bb89d3dac78f1f5bcd36b412a8b4d879f6cdb75175292c696b58bfa9c91fe6391 +S = 6b711425e1b14f7224cd4b96717a84d65a60ec9951a30152ea1dd3b6ea66a0088d1fd3e9a1ef069804b7d969148c37a0 +Result = P (0 ) + +Msg = 15493aa10cfb804b3d80703ca02af7e2cfdc671447d9a171b418ecf6ca48b450414a28e7a058a78ab0946186ad2fe297e1b7e20e40547c74f94887a00f27dde7f78a3c15eb1115d704972b35a27caf8f7cdcce02b96f8a72d77f36a20d3f829e915cd3bb81f9c2997787a73616ed5cb0e864231959e0b623f12a18f779599d65 +Qx = d1cf635ca04f09b58879d29012f2025479a002bda590020e6a238bccc764478131cac7e6980c67027d92ece947fea5a6 +Qy = 21f7675c2be60c0a5b7d6df2bcc89b56212a2849ec0210c59316200c59864fd86b9a19e1641d206fd8b29af7768b61d3 +R = 6101d26e76690634b7294b6b162dcc1a5e6233813ba09edf8567fb57a8f707e024abe0eb3ce948675cd518bb3bfd4383 +S = 4e2a30f71c8f18b74184837f981a90485cd5943c7a184aba9ac787d179f170114a96ddbb8720860a213cc289ae340f1f +Result = F (1 - Message changed) + +Msg = bc5582967888a425fb757bd4965900f01e6695d1547ed967c1d4f67b1b1de365d203f407698761699fec5f5a614c21e36a9f57a8aaf852e95538f5615785534568811a9a9ccc349843f6c16dc90a4ac96a8f72c33d9589a860f4981d7b4ee7173d1db5d49c4361368504c9a6cbbaedc2c9bff2b12884379ba90433698ceb881d +Qx = d15ca4b2d944d5539658a19be8ef85874f0c363b870f1cd1f2dc9cb68b2a43a10d37064697c84543e60982ab62bb32c8 +Qy = 062fb7dfc379fc6465302ac5d8d11d3b957b594c9ef445cfe856765dd59e6f10f11809e115ac64969baa23543f2e5661 +R = e2cf123ce15ca4edad5f087778d483d9536e4a37d2d55599541c06f878e60354aa31df250b2fc4ed252b80219552c958 +S = 696707a7e3f9a4b918e7c994e7332103d8e816bbe6d0d1cf72877318e087ed0e230b0d1269902f369acb432b9e97a389 +Result = P (0 ) + +Msg = 4f31331e20a3273da8fce6b03f2a86712ed5df41120a81e994d2b2f370e98ef35b847f3047d3cf57e88350e27b9ac3f02073ac1838db25b5ad477aee68930882304fc052f273821056df7500dc9eab037ed3ac3c75396e313bf0f4b89b26675af55f3378cf099d9d9a25a4887c1cfd2448f5b2188c41d6fa26045c5e974bf3e4 +Qx = c83d30de9c4e18167cb41c990781b34b9fceb52793b4627e696796c5803515dbc4d142977d914bc04c153261cc5b537f +Qy = 42318e5c15d65c3f545189781619267d899250d80acc611fe7ed0943a0f5bfc9d4328ff7ccf675ae0aac069ccb4b4d6e +R = b567c37f7c84107ef72639e52065486c2e5bf4125b861d37ea3b44fc0b75bcd96dcea3e4dbb9e8f4f45923240b2b9e44 +S = d06266e0f27cfe4be1c6210734a8fa689a6cd1d63240cb19127961365e35890a5f1b464dcb4305f3e8295c6f842ef344 +Result = F (3 - S changed) + +[P-384,SHA-512] + +Msg = a594969c379cb9e26a7f8db462d2382699b2a6212bc7aab15e768093b2c3158ad5c725c3680ae1f8099e3045a77e744a5a3fc9c15f118ec5a04e186b4b6ca46027737305fcef397257c46cf219d7a1612a93bca36b1e97148caffe0b21fd5d69e572f823f995c0fb8784c8920b6d0353eefb31abbe578f5b5c0b503dde205049 +Qx = d4e93c4bafb54c06814011309e9f3d8e68b76a5452e364ef05ccc3b44b271e576c9028106b1584f09271c886d467f41d +Qy = db730ccfdeb6644362f4fb510d5254bfe6f23e891e936132f90f1913e93baa8b1f8c0613a0f0c61a760ce659f22babc6 +R = 8d0fd14a59c24b0c2a34b438e162f1f536fe09a698cacfe0760d026d1593265d02f2668d2a5e49ac0b21e93807aa9c18 +S = 3162ffd2adc9dd5ec1bb1d97d2b0c27b8ae234235ffb374878d0b76382002ea505e885c178d56a2d7809bd1d83117ef1 +Result = F (4 - Q changed) + +Msg = d497dfe02aa5e4fa13178dc1ebda8807f9ef1656c1abc448619f2e22a809d05551526a0e9706febd9e0f7ec9b791bdabc5989cb1957377110cc53006bece1a025c5bc7e9e64eb1517a6fbfff058e0ae85d67adee20fe536caaaa9928bf7afc52fe8cc662037dcafcdae4e57630b0c15aa1552372b5bf22f500cacfdaf52e7b89 +Qx = c665feccf51e6bca31593087df60f65b9fe14a12022814615deb892eedb99d86069a82aa91319310b66588185282dad6 +Qy = 1e6e25bb8ae7714415b94f89def0f75dcb81d4af6b78d61f277b74b990c11aff51bd12fc88d691c99f2afde7fbd13e51 +R = 0e18c4063137468fe864fdc405ad4e120176eb91b4538b28ce43a22ae1a310cc22a2f7a2b3a0f3d15e0f82038b4a4301 +S = 5a1620e42041ce4357daf824befbb2ed65596bcd8214e88726149b26b1f416b9472a8877413f1c3705fc2edf4731943b +Result = P (0 ) + +Msg = 047bb55e59e957f9a8d038a8160fc9e078d73d1cbea39297b8028245b23734b05a6a5f231b729f3697fa3e4d19f6d1c5274ab56c4319dbd4bce742b65d31dbe25425c1c382f48681a243b85a725ec5d9fb1f6cb3d74284de0e8fecd7fe3abbaf2e1cdbefe07893f54e7685eceef8f827ab705ce47d728befbbda5809008adfb9 +Qx = a6bbf85e8068151482ce855ccf0ed22988fcf4b162c4b811cb7243b849299e3390a083147fbd68683203ba33588b13ae +Qy = 5c837ec9f2eda225c83ab2d5f10b1aa5bfb56387deebf27ecda779f6254a17968260247c75dd813ea0e1926887d46f86 +R = 9c11879e59659848274fc1ef5a6a181af813d23708b09a24dc06c089b93b918828dd938a75a34d5a681b0af362dc19a0 +S = 9c362231962ba7579c4a874e87bdc60dc15cb2e0677149c8ea31162963e05a6614616f67a5269616071cf095be7ff44b +Result = F (1 - Message changed) + +Msg = 67caf5a42a7150b0e4905067aaf2828ded4aa245f195dd793984b9feb76c9e2fcffc2326b0af42450b9e0ea13481aa4dc979bed8633dccbf40e1a3b821a674408dd80d14d8aa411080619b7536c72a4685fb93273428aafe490915f0734387c2a956d7d20a1d93c28c64fe3913cf367705366bca6693d2d22f6c6fbaeba86be3 +Qx = 9c1eb5cdb1a873e4c275b7ded8712b9058ee0d9ded06c96a2a8d7c652b82e894e2f918dd8e18138e5c34821744b97952 +Qy = dd474c93619f02b5d4fe30ea7805c1a13fb80008a81bb5f3eeb95cd11f38841b8e34d64f2c6cc2d6cc2587365eed6b6e +R = f17b2f2fa3b5c8e9c62a633e5d417139ddf3dafba75b464fa156c99b3948a0aca532c7fd3e14a266eb17e7fa80881da2 +S = 01c246866983fa74d6dff38b1ea091f8afd218b5a42467761b147c19a3bb20cd24be8ed1f95f1e61863a709d2d0148e2 +Result = F (2 - R changed) + +Msg = ef353a0ff016e6618ee11a09203ef5a8c1eb6089478ba3042c5002acae01a2f4d99abe37b10f35c1bb03de8b8a6a443cb0d8140f86e64a905f72ad7371f6c3e20a4962531b8dea2a34764909e743885659a9998aaa0db5830913d22697a54c5313af9115c3a66bebe2909b110fdae6fcd4181b6b414e53816504c35d99a367ea +Qx = 20622a293edc96d83fee77cf1ee8077c61d6f8ed0073d53cfb5ee9c68e764c553fa4fc35fe42dade3a7307179d6fc9c2 +Qy = 710fa24383f78cc4568fe0f4ecbbe6b11f0dce5434f4483712a6d2befae975a2efb554907aa46356f29bf7c6c2707c65 +R = 45a6cf5cef06256139caa709292d1e0f963d176add188572e9c7be29af21a95853a98e23aef0a0850e58d44d60b6d780 +S = df8d71cd5ab22fc718070078103483e5258734872ab935435f21ea199018e49a69c064a63801beb0759fde6e2c4a85b8 +Result = F (1 - Message changed) + +Msg = 2fc5392afee78db70368ab391d7d765ea656f13b1f71e5f7550d77443d1091b0df7efc9f4e4fd568827040e3fa7a4b07b6f8eaacaa640711c7d65b04122f7dfc4deba77736382e47a36dda3f379cdde3773a2c7f101825988f13a6b6b64259615c5b6897ba2866d0a0924b4626a0e8db1a97696dd506273a2fb0914283b3d8af +Qx = 83a4fecc0bf0a353b0acf6f54094b822f2b12564e172b296f3461cafa7315d7d31d0089b1b4c18ad3c86bd18f539774a +Qy = e4fd57c5b2937e6fba1e7d72fc3f02352bd79c13611931935f4dfd073b9379f862f2277585137e996e212b5b6533dcba +R = fb02804010a570d702ebfbcf3d6cc9d55ddac2bd4b4de56d325e9790571b1737f91d3fa1d4caeec6eea806195aed3187 +S = 1fd20fe383e907e77639c05594642798619b2742090919bedeefb672c5700881baf0df19b9529d64bc7bb02683226103 +Result = P (0 ) + +Msg = 9a6e7e81429fcdf0cff8343d31f4db2a3d9c44457e6935d30e72d7f5d4d9d1bb6a68311db4fe3eeace1274fea67d81e066f6a4e7bd78699d25c7a89d7ad65b02fb994b265c8f52a182c1df8fdc2822fbd265b362df886d72bec90b78bfd8f73fa74dc615e6e026b9fee64672af86aa3df458159b6d6bbfd6c74dd2849104a24b +Qx = 208a8c5a6b59458160c5b680116c8b23799c54a7ee8954a4869425a717739facfe4fe24540505cdc133fde8c74bfca78 +Qy = 22aa7aba797bde1e8389c3c3f8d8d9aa2a914f4d2d7aaf7187ebed9b2761975718ef97660ba0b8a71dee17f2b982e2cf +R = 0b4e835ed83151d2bde96e201c54544ba5f301aca853957d3c538c9858fcce796b60fc50f5600a48dcdf13e5bc029827 +S = 0270adf02d31d5428d523e13d7d315c1929a1d89bbd0f61eec0b1186abe1c307cbba6b1067a68bc3947e6196d49719a0 +Result = F (4 - Q changed) + +Msg = 0b1c2410d8b0cb48defe7f363d163c6de740dd81c9995ce689b22c4276aa2de84d17ed5604b41aca0a9b65a1c00ca2db5cbd49898dde92a52bd8c370c9fce268aca4a1d0ec130cbd7d20f9d2aff8e9e9f24c4a7c48211609427a5177e001e75fab90de23ede74f974dbdef1b04233b9eb0a71baaab7c864a6b46db00eae4cecb +Qx = 80ae47e99107d6148b1088c6694df5c1273ff336b66e45b68a7c65fed735129dadcaf2b900e9f8ec50eff70a5ba89ea3 +Qy = 47450efb5669bfacd7cbff1f801aafa0812ff88a6ae7b5a1f85e88e19129ed995f509fbf8dec15ce42bbbbd33814c09e +R = bae6fba7b1485ecdca48219ead3c39295fa9c196b1f0941445b1ac768e33962f68d37f1f1749eaad7200064aa202fb41 +S = b411a38d02deb42d1015a7837b033c89d2f37d92c70fa8bb1f592223f7750520b950f30277abfb4155a3ab194b3beca0 +Result = F (2 - R changed) + +Msg = 869ca9414de82de07f22f7844d8677f62a92a5bd236173ddc3b2b91f927de15cc64f87694c02b0e212267d70cc65c21d02ebd202366d7e88b292785f0ab49436df50f8d631fa0f0969009ab28c98af2a6d4ce79b7ad42228958d772ae693a4304704b695e82c7b905fd97a484a18a2e32f61e961508389936d7b984e2d6b2e54 +Qx = 45cb6dcca8d2e80ac04536a22f9d68ea2313245550108ddcd32799d154c0a55492e49463e826275bd9bf0d5e380205c1 +Qy = 6fd124f5a6c745751ccfb3ba4dd9144ea8fd41a4d9a4b34820434da66aa7385e73ffe71e6c11ed1beb6c7af22ce00edf +R = 2c782c4263eeee63657fbf20fa287a1a81fcd14b1d3bae333928ba4fc31abb20edebc130714380608e38ea74309eca9d +S = 716113d95bc9dba532bfb470112b0d43d9cd6560ad15e0de2e514994801ff339bcf19ad4ee2b8af573f57c038fbd70f0 +Result = P (0 ) + +Msg = 6c702f33dc562b5771abe12fd776e766f2328402538b99ee2059fc0c561622c5b9171b753e5dec6a6b5de0f2b8e8edc573293ef21344fb03acedb7047737e2b2284738bba243aafae8af1c8b6827fce77013b80c71990fcd517f0c19c65e7a501d4495e1bdd2c7fbbcd38aabe8a2db205b6fcf70331930551bd925e7e00c26a8 +Qx = 36c1459d9e9f7b6c1598778c784cbf94661a2b11370c02ee092f6ea0ca20acf81f1ed5048a28a1466a91689df26bc291 +Qy = d1367418c7b216bd32c6dafc8b2be99d02cab68df990758b2ddd543b7eb6ff6e285b649ffe588b1811b549cfb5f0289b +R = 40c338adeb504193444bdb95336177362031aaadc5b7e151e42030df9dd8687f3cb8fe2292fd4f9206989c089d966dae +S = be4b2ba251094c24de006c89af2b5c77e6937f36d7bb703b4f8edcfe65d45f4b2fd2486222163ae0ed9e215c0a96f488 +Result = F (3 - S changed) + +Msg = 75fc1d1be05faddbb5bbdd05bb5efa45fc8967b62af04f77bae1e737f0ea5fd84407b299a774cdd38f3697be8d9fc241ff4878856765dda9891a47cebeaf5eff6df79ca9e61c5624775dbbd7643fca27c1ec9cd537063f2b778d1302c4428898e06dd647acaf6d091394db9c629847850ce2bada79eb741c89dc1e38c7829d9c +Qx = b5eb6670bb0b0d3aef10e533d3660756b7372a2a081d9d920130034f48202cd43b9e2d1e5893d0cfb322db65ab839716 +Qy = e28444770396041b489b302786a57fca9a98f19685cb4b455d219151e64645ad30dd3149ec96f3bc90879834b65e58aa +R = 0887a13df940907864b425ec0d8f91ac719abcc62b276fa08c5122b38831c8930abd3c8454e98182bb588fc72843717a +S = a380284eacaa36a34e35f04fbf6e28ffb59176f41ea52d9c9bc1362eccd8e0d699c2e08111d93e9dc2785637b1f4f09e +Result = F (1 - Message changed) + +Msg = 141723104f09367f4b02c187ce292861d445d462d3adc5eb67649633d3c24f132149d12db67e498b98da8d7d7b0cbed2f67459bf40ccd6f629d98d30bd7b414d3b8502b08237f867e013d7369fc9b7f505f67e6a14f1e57ee0170391007c30e4892acb0e8d1490f0e6c20b4721000f08060fb86580a339691e45d140e2d704c5 +Qx = 700e8f65e052e918a63a96fa57f4eda849f9f9faca3302d6ead66ebf85838f8145a6d6718a681b7bef73170d7254958f +Qy = 9e9e10357658913007803859165926cd1e5e92c3a644d834098cb1cbfab466349bf4238a5154cf50ed77c77a78263e81 +R = 59be870e0fd684b000cce95c616d9f34674354e9d20db15d204b8a6285ff55258e4eeb49da1573ef1030cd6b2626dcfb +S = c0bbbf71d87479d82575458be9f4d686921db7ea458d620271f51ec3f4d1afe3bf25ef9c0c400eb7b92cd7058fb17346 +Result = F (3 - S changed) + +Msg = e4622318a8a04eea5288cd81100e60b224f16a2f4344f77bfdb40a1c4c263d1b73da80c1fbf30d13aa0c05be31267c77c802162a7be7488b5d9fcafde3cfe073fdd5c7a05208e10cf9ede811effb8bb72cffb0c59335ebce348b805a7ddb431911d6991a5a914172d6b8088e8dfec2cee36a52b7e12a63c6732abb476b5a2bda +Qx = a9de6f029445fffcf16349b44095cc83b11e3d0d9f08654b158014803b1cc31b8dfe00b1a8167c6f704d69cdd62c6512 +Qy = 27336a503a669ba1d1f3619f51dc8aa2a44b2075c682a36f071be486e7dafba9adfac2ce74be0442b7251e99304ffc05 +R = f93a4d2eb94d087f28572847e0099ae2ee944efacdad392ec268c9c1e632e6ccd670c36584e58aba52a4c2b07127d55a +S = 941ee89cea6e7ed20213a95482fae134707ddf4d292ab1952ed5464f1f1138669dedbfc9998b696eaf469be5fb240c80 +Result = F (2 - R changed) + +Msg = c2c34889861d29db3742763a00e42bfbf4e160537ccafe3d2f1d64557835d35c155c19fa2924f735dcf848cf35eb2880dafc2e8b6980717112f11533bd072ec1e4665aa934b56012eb6cde0f6af3d6d012c4ddb10344f2e08254835fae6ea8555f6c9ab7c451b93d816255dc2911d0275719b4187a1e9cecd435ce85b5165d91 +Qx = e63500d6d13069c01fafc4518f1d429661c5bb6ad1ff0383037ca6a469a5c20c453dce03bf6e4164f7e26f849016b3d0 +Qy = 83b7b731c2531c3ac61b194cf3db6dc02ccdfa16d9eb49f97bc4ec3fe6c8bd865ea27f1538531ad07dc44fc5107af8e6 +R = eb78733e73fd64a6a1f23eba5311af23d26816fb8847671e01fdbd8dc7d5fce1a0823b080ee99e8d75edb3f100e16077 +S = bcaedfe599f98b51542c0f94ae1010611c6767ac3abb2bd887399d62fd0f1b3a0e97deb24c95a76de44521bf24c8645e +Result = F (3 - S changed) + +Msg = 17aa6d371c82c58cd209a96d374733e53d41eecba295f4d5e9c4ec0ea0d7a6d268947999ec64b39957153cea7549595e177ce530d60e7613075a378b2012a16485e7ce7fd0f8e9560ad3490c6be17c13edeb60f3f7391a54353f7ddd615e4db831763d645101a60d2bf208982c4af2d082a95e42a2ebe436c0ec5b9de80a61a5 +Qx = 3ebd869be687f82d844416e6816d698d82e1e22a1f451d50b6c146134deb07f05204c0b04e7dc07ebdcfd916531dc7c3 +Qy = 6e4d7bde063edb7254a82b9d9249d2a2b9ad8988c37a84ac9f7c09daed42b1fd28f7cca1ea8b4f91a66e878224800bdc +R = 575f87a8a7980555a198cfdec279cbb2f89551b5271d242397c29f6bc4bf413dc30312a7e626ef7fc77a9124a79bf9be +S = f0b7d759246ad36ba8240c537b1eeb5d148c38d324f48028c598eaef6e49d79ff3f6cfe3a32fbbf6f3ed3aaaec31d572 +Result = F (4 - Q changed) + +[P-521,SHA-1] + +Msg = a2b07a8c08cf0bf146cd11882553147831c118d9adae78dbc1700555842c5758c553751b88da75b8c6f45315db85b1d147519bffb49fa5024219054123f0925c7e715a040478aa3a5d24b4ecf1c49033edafa6622dc7e47fcd0311c54b1e3229d9caa9ba3c3dd8ea9501018a7d4a3b45b865696c94a366d818f1285426944f1d +Qx = 1939b25d13ee8e04203643ba3709526a92912b0e98f06962fb217ed18d1ba52bff192640f980d3f7f92c116b5d94dfd48c25a26b72acb9425e316b3d2ac130a6943 +Qy = 122d0809c5de123c6e5373c1680a4d566c565408b6750d942c024d56c0d6761807adf9dab454b84254671dc68f6917f09a442643e6db1bb35e6796816dd3e5c6a7a +R = 144c1a1e075aced5e10f50ab7ab0f795bac07439c953ca0c749dc12d50a7e4dce21850dac1fd773e46576335a555f20d266842a8bb47fb464fe3fe297e9ee356e48 +S = 125f3b6f1cf7eb704bd37391a43034df9260c4d5fdccd583bf65dd5ab4b007c8f837a31a0b7c5a0be3743a187b2569841fc4c69f816c8234d8ae845b92fb9263242 +Result = F (3 - S changed) + +Msg = 69638c3ce737f19ec3492f5cf0428f0ed411aa86254c0808810b03ffe041b3cfafcefa398de1e965da22739145622378bb439cddd76dbe4d8cc66005bd5acdb819412bd7bc8358eda95f628f431199e0cc400befcf3f518eed60f986c1b710442454a71918a240db6a9b48122bb4ee5fa1f96a916cb640413b26d0f43a32e1f4 +Qx = 0882e2cfed1286668e62699ab20c6c40068b460917b306e51ce7f72a4d760e19b3f6cb5897de599cfd84ae70c26d1a39144772b90f8ba1ec2d0f09395265f0308cf +Qy = 020b80b99778dcdd3dc47da42b279cc289eaae369b9e2c4b0322d2eee9b1a76eed6b5b70d03d83f1db81a67ad6bea98ce71b120e9f83f0178cd6fa3f109a87b1fa9 +R = 13ec7124331d896832b77440854c043cb605ae9cc7d20cb358513a5bab26371903c6abc6e4860a0b4940bc5429755341a10251195e5f8af42494c002340ccc57bc9 +S = 1460bda2fd76ef05dcbe1cd17b9c5663b03551cce586c56e103179069fbef6ecae47f6555db755860f0b06eb1bf247312ae0f9d64c5cf13fbc42b923d6bee151b5f +Result = F (2 - R changed) + +Msg = 3f1b870323330de661aac0ff50a0426ed28a99b97b2d5221587c15a2ed6203d8a83ecab3d65dca6df1baad2adab24e7a5f71f9180ff2a28a98ade4fc054c3ef4c88aa8a61174e2399c06d336141d17b27d002cfcd34600585b4efa37131fbb80a0d3ebb5878c8bc3ae8e5db9083210d8318302a2e584fbf147a9ef4a3c0315a2 +Qx = 11a5a6f7166fe435c5cc4238daf92a2d1af483543b7f505785ec4e2d93b2ca1d1eed3bccc31761aa60f7dadc97629475d2712998c2eccb82a78d6da7b0524662e9f +Qy = 0c66d54768f5daf947cd414a1296a54c90e2b65a14cb94aecf0ba51c280676c160c39539955f2a8194357a983a1311845f8cac51cdca1e209bbac32cc809f0e4e10 +R = 10f45ccf0b4de7d2af890d65395c715043dc5ca1489c79b820347d51848f599ebd4aa558c62ce8769c5d5a294679f9aa74414ca6a1b82f183f23558b0a8dc6cce68 +S = 1adaf876dc35310ac592d1e3ba89f148c3b76417799f43aa1b24c1d2e3f544c018f066ed7baef480f7488820593bcbb25ce08183fc14c6c12fce0c118743f04e281 +Result = F (1 - Message changed) + +Msg = 14ab6196185df9ed556cd0ea664fed60c4e11cd77293497cefeca1973d291727aef380918747e1b986badd1f7835c7cbac2a1260dfd4d3c27c03fa4089dda56806518b60305041c95c78096aff537a5af1e73c674b13b536bc1256810d136530ba49d1dacc0b4d8f2a56b46c1df148673d73635790fb2afd8050a8d8174c6b0a +Qx = 0f3bd2590cbf620991d990b84efee86073f6c789deb07b89a1f278e6cc9ea573d8586ac395958ce4e1b09bda73af1b1e6f2a8c09ecc697c021974c024564ed87165 +Qy = 0514871935c187e57d1aac376aeb018acf57c4d005d85cc939a6c83256f38b2c9ecb1a0ec8d132e0f5169843faca4ae664459124bf5f30309fa86f87a2604058150 +R = 083e6155dd97bf9ba7c60dbcdcba7824b125a73df1433fcb46f57c51f63ae161ce67393d327d174aec7f0b552decb8131a192ae940deb84acc3b45be61917fc580c +S = 01fbfe61d75dc3fd814eeabdececf361a0a066b8c06c40f0e057faf8e4e7b206dfbbd3a99ef55df67234a29fb1a618620d2e27636d35bb98eb7535d1749c4b7e7d2 +Result = F (4 - Q changed) + +Msg = 22edb41beb81e6f9479f11cf76cc67fd7177e2c452d4672aff8351737829656991e0649f1845c5a4484a81f16afcb96e9571717b2eac63e747b98421147f77a5b60b45437640a57d0fc5ef37d0d4b1fa3c7cb0091d5618f1d188c3d8aa9bcb37cfb9f7925d3b4a5135f43b104833ff1359854103cb391f6352ba9c362d2e8e4f +Qx = 13136c4e5dee983f761955bce7c196a000cb26863a1dea762884bb041e45363a1ab1665c0ca69d1167e555bd63bceba08f6ee14571acd06eea3e1e5d9c11a036984 +Qy = 11c830e1fd29ee4e10d7c6db7e90d6c1319c9858f87a944542c28679d83680747eaf71a29362ea2c22a89d78e2ce020dfbba74448d2f46b3f84b99f22604075b22e +R = 124b3bcdae17413de84721e6ebe64409d80ac07a3b6c9a603ef19c5162566076108d30ec79426d24c72ac12af6fa1caa4830d55b4e6fcee900b0e4b20cdae0eaf70 +S = 03e0724d156c3fe5cb799a17972fbb891f0e11cfb650a1c524f6f2aab134c70fb114084a7821e0e12054fe071c516cbfb393fe9d98c840e1cc9e8475d3add81e0c7 +Result = F (1 - Message changed) + +Msg = 63b738e1619d533997f0e558699c5dfaafe2f5f330c4a12e9d9401db1d8767d044f543214ce9e65b9363702017a114f81f57e3f607a13268282dc4a6ef0e99862008d7da6e8b19807dc0671bb4d36045afacbe1f337663e6c06edea24b16aaccba6119e55ebbaac28cf3fe0082faa9a9e8cb0e038b45b05d7e65bbb92e264caa +Qx = 19eb73393f070160d871cc396cd8d6973d828d6f3c17bcec7168843f0342c1b54f3c02a1b11348da1035833df6fa469d75692ecaa2feddce9210a813bdb0e1f9936 +Qy = 0e030c5a11e2317ba10a20ec373cf69c96660b434445235efff0a9d23904c5d3ef49efdf0897222e51624f047b567ed61814f3f9e8c62f16ac27160897d5a09f476 +R = 0ca41bcf9e80780687ba70d7f5ffec7da25542dc22144d9f6843889e941cad2fd8d8771755f38c0ef77909416371726b066464d1d41f888efa39456dee859f0ce98 +S = 1770961a369ca70f9d73b61aec34662735cf228299a7c668aa24afbc9d7f621cb3acff79cee19d107361614c1e71ff1f32ae4f02b7bf94486f0fcd61b6f76f304e4 +Result = F (1 - Message changed) + +Msg = cf18ce9521ce1c6e99000b03a92fe1b13df5b2b1d37f5f97e83fcc49473fb3188739810e51f85c2cac73294daa80c9f36dd6704cb0e7d14ab21328935f5a5631d5a8172349155a3d945b4b36110cf8bef096120e6dad4164176c6b8d168c83cc5619c764819eb966aeb67a5bdd3a525c3ccd7e6e322e42c7e17ffa27eae91e03 +Qx = 00c12d47011ed272aaabcb0fb6c12d8627f33bda02b2b3c3ec7b5ed60eaa577add4205d222b8ba0485b1d98ade9df18ee1e1ad9e0a9e78242322201e3c664bf8c9f +Qy = 0d1b86d4a1171bc80822e0e1094a96bdf7e031201ec212ab7d0e7b55394cad8335050701327a0a1a17181b586b89ff24a658e4b0ee16b8418dfcac122f2457f67b1 +R = 0e4678311d0c068eab2118fc0a59014ec32c89cfd1e0273b966634b87783011b58a99204d266014d0236bd6f276f49c693a4d62b0601c307c936252cf718e239dfc +S = 149f5cc02a6aaa126a99a59b83ae34f405f8076b597540625fa76e27dd29a85b6a4b0fc3e73a245a91d64a8f2b13ac345553b7a40835af76a9528cb48ac8d0be364 +Result = F (3 - S changed) + +Msg = 9bbbbe8a72130e1f023fb77be4648c80e1722d98bd478882383026c5c4e8748873997c5a38e0a173ed461546422d7691393dc2aceb0c0775068bc7145e33bf6a9e34f7fc6acc8f079a265168e54d3cca8d40aa04c1afd0909aa3df50908d7324aa7861b50f471fbfa5d615b0d718132c81957b178ad936deb89fde37147f8ae6 +Qx = 0f50a08703250c15f043c8c46e99783435245cf98f4f2694b0e2f8d029a514dd6f0b086d4ed892000cd5590107aae69c4c0a7a95f7cf74e5770a07d5db55bce4ab4 +Qy = 0f2c770bab8b9be4cdb6ecd3dc26c698da0d2599cebf3d904f7f9ca3a55e64731810d73cd317264e50baba4bc2860857e16d6cbb79501bc9e3a32bd172ea8a71dee +R = 01e7cbb20c9a66abf149c79d11859051d35cfddd04f420dd23bd3206c82b29e782453cabfefe792e4e3e68c9bf6bf50d5a00ba5dd73b41378fb46e91ca797dbb250 +S = 0f1e9252573c003cb77f22c8c6d56f2149f7e8d88d699983da9250c8edfd4b9f864a46c48819524651886e3fd56492f4b6c75fb50a1d59e8bfc25f9fd42dc4e1d37 +Result = P (0 ) + +Msg = 0e75709c7f795f9dbebd482fb5a71de2c7ef01fa74a64292324491cdcfec7ae6bf315a030b81096eab2fd0142fd3dae77b703554b0fcf0561d8bc2b5ce3a63c31600fa1c5ee469c9cbcd4f16523b1e5c26a24af1ac0fa2920d8c0ce2b9be11a6e818ea7ab1683eabd08e249281ca83f322594c1a47862a226f80bcb75e51e12a +Qx = 0fc6486a5cc9a366b2c25d57f3f1caadf93659223c7eb38c310916cd44bc49d3ecf1cfbd429b57e329e1eab5f552abaf828ad9cfbc2f7534dc8c87f54d252e7b69b +Qy = 1c0010af6c5cdfe26b068990cf44b1bcf324d0940bce1e953f7366c757aadaf25ff7dee4947879f305d3deb1e9a849db3cffb83bc1c7e5e82777be140931d58d177 +R = 0a58843085162864b2246c619d6cd38626657eb8f13ed5921b73071b6bddd56640ec9a55e7f2190481ef5e356425749e626a4b988b811cc12dd21c61cea89640095 +S = 19fbd1f9b108aad0208d1a27735ead4685f04d01882ed18c217d8e0e0fc71d8a98d3c45c471327e4dfa631cf4b826ead3bd5fd4bc0426fcc95b58bd354d012cfcd2 +Result = F (2 - R changed) + +Msg = e2f17dda2941ce1909c33f3e1076f42957d8d9db8cb7f8ef5e2a6a2d7a03d56c5247c08b58727d40009c91458c818687ca060bb724a061b72bdd2e55988094a99d89c618bc099429e9f2bd2b47771fd116d4227e7d368c5fda34597d74f2ccc3bbf618c53f706d761ccb658dcb8434d9c4c11b0e0ee6fed9a0cdbcf308e5a64f +Qx = 00933ee70d1470acaea66626394023020ed521d5b9a52e068b827d23af283bdbbbf3999b0c2ced0abf607b467fa86ef89bee3852d4e993df3c2c73a49488740cabf +Qy = 10231bba67cba896274e7af7f9c65403e48c56356fba772120aa8781611239d0f50b8958ec8709a301078379b59123b47c5edb87bc2327cf607f876154904b93e92 +R = 16f79df89a498ac65bb39d62e1ce82e5578eaf778084ec5926a638d50ee5943c87955c8255340a90f800fd43d4dca125b68dfe957d148533126d5761d711412bcb9 +S = 175198228ce2eb0222d64eeaa403c0571989046e638419ef96612a90094a26fb819ff1addd823f8912e07ff32ac72790c38c601505b45dbb9cafd1b46f352aaea0e +Result = F (2 - R changed) + +Msg = f3278fbf2cd7edb7c0667eb911210cf3599d7322b15c053d1a3a8bf3fc6445fd7c6e68cffa765b8911d93eda77c0a3ce8ccdfed6bb07c9aebaac8d1245f0e02c044ca04b12f45670c97d96db7c36b80c0763a4c2fe93bccc6ccffa91e228b095bd2ef25b111c89aaf05d811b4625d343aa787877e8bfde0a9f432719473cee96 +Qx = 007a5694d537eea406d753532b307c5b86e8823d31e81f6e7371e6def61f31c8f706c1b89f8655e54f68e6821096e6b96a7c3752e47d8d3ef5da135f881927ed92a +Qy = 05810620b7d83d3e7e48f7338b18e03c2e97dde5dacdd5d54e4c7e75d736f159dc45431d5d3c07153a334fa60567307271bfb85cb0fcae142cbd7baaddcbdfdc018 +R = 02cba23e78a1f9c6c18bd26321cec0c26db4f1100b986d37a0f24fc42c75ce4731a2876e8865ae21700289734ad5bae3611418ea37a13fae67db2d1a58a86f85422 +S = 0c438e76249b5016e0b83ddef5447420fd13aee6f099a0b9ffafcba4e7227f70cc5dd5abba03532ebc50424fefdd4f6d258ffe044573aa51b8a5d1d5c6e5dbf318a +Result = P (0 ) + +Msg = 047876e08961d6855a7f11010caa839e506ec89d6e8e007de36a1f3355d0c7bdf90f0ae8586fe73108869d1d0577a9ee0395706f69bfc0c8c3e17f53fc78fda86290cd3fd63a06bbf1255667a33da0ab50100c239de0c036d40835a317dd9f054543b6ce25f84b1df261a92d5415c2f5bd19eef1b1d6eac37117b53939b792b1 +Qx = 0a00f34f4572450d93607d3ffb1fffe7c86334426ad60fda27aa647e67c34b2cb1f0a12f4707336f1f708b3ba1f3cdd599ae92a2be92f9ae5526eba9d4adc052fa4 +Qy = 166808273466ec1ef2865e92b263b897131c5ea97fce1adb1ef88c8ac2e63eab97567d82db9c0825510812db1b2e4cba705ba64d33ffdce676b7f3aa2e343f7834e +R = 18ada7d95f4d05350ae95494b7c81e233168ec88c5ebffa2d2a3ac74cf90b6d9f80407276f92bd9b3ca949e5d5cd51166e29678aae58a284b9e6ceda3a550b08c15 +S = 1ff12f5e9b12efd941e8a445ac036d735e7bf64237972002568e8eeb0dbb887709b53cfa67186f4df215e2a9f7b9feb045270c72196e19335a9c554a19cee0a8397 +Result = F (3 - S changed) + +Msg = 774c1af085bd44543f933f6db8d8c0cd07a25cd1517e82ee5a0ca3d1c54ac09e0addeb8b32bba2b1d67f86fcddd747a818e693668cf4569d9c25bd69b5e2d350986b1479fa03c1605c4691938e6bd9f505b9995e77469436b8943e9ada77351614314abaa05343f6b5f2a67dfbc0d61606cb97cea5b2277649bc21e5b076b289 +Qx = 013a5c825a9ffe6179cd106b4a2343fd3318d83cf3be58d971704d0328486738f7536041cc69e6f9548851cf591ba080c4a1c4b4f5d95d216138d72bc56eb63779d +Qy = 0e79075f5acb9f52b67f8411f310c02aac5a98dcce0275438e59f8a2a3754ebe57815247a00d3506fd342d3d43607ba67d4cb608da3a9296d57619223c02e0c4f8e +R = 1ad988418099c6483e6a8d62fc16a9fe571ad35c8cf111c3f35e680541a2f5ed96896715efa4943f8b46d20a0abb228852bdd5cfce1787c150d01231abc065718e3 +S = 095c1e7dcd09375d1760700c5351ab23618b1fdf1b2b02e918c0ec341e5156300b602f7960e0eee2c027aa0076b194080e63155dc56a81699e8aea36ddfe703b94f +Result = F (4 - Q changed) + +Msg = bc59b04a384e79b631f0f401ba990b8d48606cd6a1d4aecca8673058b283ee97aea6362b49ad52ffa533fc089a926f7d0c99b56483ecf0618046ce173527c1ce8648d17a45da8c9376bfe081df57ae9fb09c1e7193d41f359b2164b056737cef4b88a256db2939fbb1f143473e45b0976c964b78447abcd85c66c5d8366fc011 +Qx = 092bf4245f0ece3a8c3a723de152c6413526c333a64f4f2455e7b45396c1614c473460246f49c65e957dcf779af0b675eaf5ed7800539d3619a6fb131f1bc610968 +Qy = 047689692e52baa835ee9c49793bca7b01ed3bc4d4c396a54eaefe0520840a31fa3c35cc0d2317ce367881a15a3c06e7c26b192e90fe16c10e84c92233910d7df7d +R = 141f936c6a5ca580e5a18caeb85fc13e9ff57d50d89b8447c8645ff66202e71eff4303d57c28ee6b68915de6767a124f3652c22940656f4227d61ff30b17c2b9aeb +S = 1c7bb4c22e68920bc6b9df0626b09ac79e5b76ba29d0b632c0b892c8661087461c4131771a2b3a9834ea4b3d3bddac9910331774643ae22b613bd0b2464a12cfabb +Result = F (4 - Q changed) + +Msg = 2df095b1f48341c352258afc19240c805a72a7662c38362a81fd3f788120bddd86fc10a99cfcb4855a0f64eeb9c6f75d74c145cd6b3d938e325a9f154a36305e1a213165e83e51b0122a48553d26c9352182fba98dfe8fbf1d64a7e0ae637d855084b2ef5117028d8226af607ed6f6e86065cc3715613289976deea128af123d +Qx = 194cc7f51d9caff692137190541f5aea160977bedb0d3b67c3deed6669bff160696a96550934b3dba4129e204f068901c84c821523bec91ec40336dce0d2673e794 +Qy = 0709279f85ef54164fd7347afcdbfe42d8d14e6808002b3e0b59bcbed80ce0c16e2db1b320c1d98ccdd75efc50fcd6ce91df6baaa99ecbee6df41da9c142a74386c +R = 0d2542223b0a5322249e8f1af6d559a87c39aa5c3c7e595b07fb7be4d3bd0184a419651f96811f3e8c9c578a4be68188a8a3a1ff0ccba4af5429ef95c64f34d645b +S = 1ee3123fd300cceabe2ad99bd1975c4594005ac9ec31d44ee4b9fe325d39049a5a83b4ac2a7f0b603c82dd88d136507bca2d383c7e8375c36eda82a169b3e4b4034 +Result = P (0 ) + +[P-521,SHA-224] + +Msg = 149f206f82c9cf916a5da5bdce214398b8165121488b590651a7203efc046b1ff107badcc7c38046f7d035a74325df26e70fc67e67b735433d2b8192d93fbfd3ef32117c1dabed11d7e64a2804e3ad20566975a5c689333283c982698c7164ff491588e4cc12d3e5f940a53a75f445f284899a2f01b96851171731de7008c660 +Qx = 145896c96ede10f5b049edc0475870c0c6a09ab9cc47667146deca1729d98c124bbe009e5e161b88c7ff61e79d6f85b9c4673c0664e039dab852e8f99fb0ae70a64 +Qy = 05afb810a0a9c7f008850e8ecc67d907a74ff9e58f6d60ed14b3ed31e4751077a60de444a43d4d9a9b944905b79ff0c0ab431b21e0fb160cce8f08784677fb58bbf +R = 12f63284068bb815ba935833f382ee2a8a5f64e2dbc9869be281ec7d3a28e2d7d2a84e214d79598213f82217d95ba9868da4dc3a3ec7fcfd7c8c457a053e8b0ce5e +S = 12b62183c893455324b94b7cea2fa2e1c912362f99e5159e229ce67a80f45c7c0d27340e57b4a8f40b80a4d572345df083061d311b578a73c8faaba4e6a194b4726 +Result = F (2 - R changed) + +Msg = 6a491cfce7f5012e870b4aa5791b7cb89db1e7b95014748a20d2952836843ad9d013d53618418ce89c651b6749fd034c8b75a2eb1bdde0ee75ff2857d6f23581fe9eb2b133ed5e614ba83acd211b959afcee2bb02eecdb813b44a33ba83e98a83f52739d212483a4c389b49a0bb6fa05045c76216ef7a28e597b752bd9c65a8e +Qx = 113a72cee148a7428065d8f8e89dce2dc7e1bffad46a130af8f6fc8d0fabf26ad76bb64ee078ee66fbf0212987e363e176f0106369eb1e43297851ff409e935e216 +Qy = 1a723ee3f44aa68e1b43185a50bfca99f349ad47d848dba8f9dfbd773f9f53bc0298bf43130e19ccb8021be39ed70c7b1f7295cfd034e713878f47d7508059a4f81 +R = 010b883cb3b76612b6cd8f9288459d373d58c2e0366f300623ff6b28224036ad1df47d1d9df8037a18e774e0bcb42910e96dc7d7fee0b53686d5d3af13485453c66 +S = 0a29c87d9be8e91da4333089043693425892f50333c7f93ab27dabfa5cf89697f366573621a86d523e850caf31a4c26051e76b91ad3e20a391ba724d4e58641cc00 +Result = F (4 - Q changed) + +Msg = fc3d9cad349b8922e69115db085bf851cb9f7c6be6a668e4f6403da6a30db996220b59ccd24ffbc52a1e61da79b97979ec5fa59a914483df6f3781abdca679bf1bda15ac86362170c9f93c30cb2ea028d6999a9c714803017041646dfa1cb5423c90d24a40298c60007f55dd0a7461ef441a2357bcb370cef2d6bde3862bfaaa +Qx = 05766da7e6d9ebbe7cbb5b9bcdd657edf36fc4a7d4a173b99bd1caa804e35e937289e05cec2cedf86f0f7a8de42958e6052500c8a63b496ebea88252cf1b44ee5da +Qy = 0ad35038ce07b53148cd7d0b4ee8c8ad6d89a2c68c0458d0d694036120893ba24a52792e0c8097f86591dce015151659908829f323a5dfaecfc51470779f8e5a5fb +R = 11c5357042c1d98133e76f0a696e27a22738c78ff17c903d8a5190b3c5fb186374fce58fe47d9933c2b361cb20546d730bb5602fab6c8d14e0114a64f9d2b1d892c +S = 115ece7d8ab1b578b0e870faa8139d009f6cc3cdacf3172c047bffc1a31e2c66b198ac1ab8c90e826af291de58990e32b18e71b26fe01b6bcbaf86db6b1a726f51b +Result = F (4 - Q changed) + +Msg = b202512796d18e8e6769dbc286c15048d0d6df493d1c383d4f86fb83c0d6b2b309c103184856b7cd777cea25952a8bb0f828ff6a74a88198dead963f45880d5e77fb423d8f649d1f5df3f4e5326555f38bf79271573c819d9b8f4a1c49288a4b5383578840fd94e7f46b2c488d7c48df03b0be0058708c3a8c2444d0b6af61ff +Qx = 0ea4254c3111118d3d859c704474251fa951b0cfbfd2f249bd32f70cecd80526e8fb72c1258c994d8067539e478890d5637ad925ef43e2caf297fd1eb49d9acac77 +Qy = 1ed78a277869d8bf7f2d5eb9c2753aedd89197fbfcaf36a633a4f3b2bdb5e706983641156f0aa6e13d38e907546a2603bb1cec785bc334fb03033600a77fed391f2 +R = 127570a0c0141bb4c2ababef5fa879e55c1637407686b49535fd17b3b911452650e302e9186d539782cde4d48ee43c258572ec299ee63d961def2333a4f1f8d2af9 +S = 12ed61b0b4c889bb36ff9ba648318a2b11604be6fcff858adbba8e59fa49fa30e2e20df5f2d26a8b9e6d989ab4e50586732adfdd4ca49ddee11cd889f0176a59ca9 +Result = P (0 ) + +Msg = 9ae2ddbbf7b9f9d7cbe9f02050edcfcc55ab1f41b874407a0fd18a9584059511f474f964deb82c81aa8a902c4b3867c0b189cb3e1d6c2b417ceab2e857cb2f58e7c08178d8f3b2649a279b853fa9e1916adbb48c0995e3fa124a97a077e34a2b65e05f60f2645547c71ed3a6a909aead345b986d32f57792afd53d13d669414e +Qx = 0549a23bf1b24fba2e921c5c2ba78809d6b0623fb1b92a506690b668c946daa393ec42ddb113f10a34f1b11475ac1250f119e83149d5211791dbf6cfe4f591b6f44 +Qy = 1ecdd45de1ee27f6abc1270fe11f770d4e26d5dd12d0a7baae6f3fc9c7f074541bb05ff0137c3923e1f858d643ec63f7c50f776f45009f2998a0b4f37c192210ce3 +R = 12bf2daa304f162454686f98330f526a21d066b430969547ccb0ace347cadb4af7bf62b473e33aa1f62b5959b7c431451913d5b1ad297b4c1f6bc5f3afc9e052794 +S = 08c7c58e4703f46fe0885f353f97bfefbecf5f10b95a02d4ac7764a0a713919004a153ff443ce417d24db60d325357408b59dbe7ad043e7fc7c1c23cda14a867d83 +Result = F (1 - Message changed) + +Msg = 71e7828fe247439e49ed9f048810967f6b3e012f14aa5bc5b66f1cc4d4c716735cea76b65fcd77f013a7ff57f3f64c80f46bab49a51dad2ef45b2573ecb77ea6bb75b95e9ff4362f505a7d997064537c132611eee43847eaec58aa2d13178bd5a3a58b672aaa899515e1ce0aed0f654a5e08304cd458e02f8c233e0ab9b72baa +Qx = 087784b171cb62451eec46449a2a1ab769225288a092d833aeb823c99de8542ebef8c290f96636a45e2a9cab678a2c55e10283ceea6780c8d61d341952643903f51 +Qy = 14a9315a888dc2f774633ed1c5ba95e09b6898764dc5a9d568d727b56fb50d3b288eb77c9db3b1cd31aa204ebf0f2402fa513b782527ce5c5652a97df6bb05e35c8 +R = 137a47e2f3e1c2916a4a590adea04e93b4d18f2d548a3cf832401bcc42b1b35ad820e88a7efbc15d1462f518342cf81d41a40abd68651bef73816f58d1ace55e338 +S = 101e3233d8da91e092a6ed4db279c594494f73bd8d6d7bf5f6a8437146a29b1ba78fe3694502ca987cf108af9f461b6341735b8c2a21653d1b52010bf2ee02e02b6 +Result = F (1 - Message changed) + +Msg = a40e61cf7b4672c040a29575e4e1d5d1dc8c1d41f9361aff5837437e3839a400eec06f8170c47b5db76032ce1309ad44293383ae8232e060bf0345806d9ee5514c27d479c498399f84291ee849b48aa008b8b841465021dcaba9139b7de26e8ba14b82e0bfb5b9a17e50b0e050a0694ab785601fbab08dc2deb4cb9fb68a5e87 +Qx = 0b97948459489a548f94459fdbcff544e87f5b93c3ffd8baaa997f616eba75187f7a8fb13d848ddf427aaefc3cd001553c213bd1b1c5d892847eaff2d2663d90637 +Qy = 00eb07b08b69af1f15260ab6a8eb84f9337d9d3f99148e61f5ee06c5a031f1eb467e897b65c0d14773018929d9da129d3cd66b8f9c11ddede32bf9f339e3de57b13 +R = 1a31ea52171394839ce630bb1c2912b42b045c5143c3bb1c04a5b97a738887f8367c9607971b00964d5d9fc5d921877cd6b099a84e19024cd77249d263e729e7f7e +S = 07600944031efbf27face352b6267349f3cb72eca5679d74d4a0d47fa6e84b391f4743cf2f4704afcbb9dcf7b522d812d268a1ff393d0ff1b44b11b6d75fb84d750 +Result = F (3 - S changed) + +Msg = ed9b577e7fcd10391222ab021780a97747367d830684c6062b4444544f65586a1bd9b07319a1c06324c59e954fac25ddc0e23d858c33493f27650de85a31807fe51db9aa4537d53f739592722280258fe6065412eee62db2c4d9bd6290a0b287dd402400e4ef81f72554d13c48bfeec95018600837afce1c4fd40643e9623607 +Qx = 0edc8ee8d40918ab15122d92522bd862e9d46bbb6550ef22a52de0e4fbb6e4a4635be48406bf54bfb24dc385f506086c0a6e1297cea60ec847007e798a632867cab +Qy = 03e92534bf025440635fcd4d40e4b97c5396f33eb16fb1e3390830f24737b6b1645262b0336fe74284afdb99ed6b8551f82a449d80911b0c0f02592c7d210958b94 +R = 0a1f835da9b892687201294cf15769d7390e62e46efe1f61ce7ddc80fc47dc83c86db35a5096cee41289d66d7803f7e8e11fb9c9ca867123027af343fddf2b1b89d +S = 00b5b9653b2533da8e52292f37b86aaef201743c6d12352470656ca165092d74a8f97ab1772299c62b93d61ec097c957ae231d3c80ef1b9dad1f40b06e0c92ece2d +Result = F (1 - Message changed) + +Msg = c20d47b3e80bcec0e8e462bc8947f45abd17b57d4ffe4cdb634cd1ac0acca967f07753fceaa316301b113ad5ec97976d8d928795fa754adbc2db2a5ac4488757bd5e044a7b48e02bc9a49c74c45b45500924e218704e13c9b5279955279425ab35f5b20690bfb51cbee9e05d2185edd98a56d5aa4905e6d5de78f58c73c688f1 +Qx = 1f1464035dcc9c6dbc5e32c318b6b3e9def33cd2feb02b7d4b7249155078915034ef823a4d55fcefecfe6a10603891a4a9c3e6ccc1a05809bc510032d5fd30030e5 +Qy = 0ec160b9da57cd8e55630ab9524301ae7f0f53be5d55f7e7b99270272f6e6a33d6fa5fba73195d242e7ababa5cb69f6bfe9165ae3fcc1645df5ca4b6254460029b7 +R = 13489e2917236dce23e929f8c1ed0057b0d70c68762073c7b1787bd3cbdd084174f24aef0af10d09c77530c3f76099ce53b63598c0d8f8ce53df83a9af11b7e173d +S = 111e1868e71f5e83eb5e38f97fbc466a9e729e19165169ad81cfd214a1ad1e56fa47bc97ef47a93511397c849e9da3f7cee68bccfca4c5c60762d99b8c41393b879 +Result = F (3 - S changed) + +Msg = 722443efc091e76b4469166c943f6c7f2f0338d08646f0f7e77212023ae13052871ba8a1aef96c71cb6bb4c376addee14e7d4941ca7a5caf903716266c4f98c777227546b13ca5d5a2b9eba8e6c7c2b07ad917cf39df89e0958e9b72a6ecde8e67438d3b69456be061b44c02c243d51b29a03f49cff39907bdf3093bd424abe5 +Qx = 01248e0953894616aa4b5573644bf4c0b1f45a5c0a47a193c3ebd2215b29dcd387d76ac98183894bed359f06c6de7bb94e975c3e6f9c1be3fbe3b763e2501b524cb +Qy = 1971e69438e24b67baa6203ac5904159763202c16d6afa91298fb43eafc867bead0e61be1601a3fd70219af962f7140cd0a29cc26ebf765c22b895ad0f91aca7500 +R = 0215d8b547b0fcb9d18eeb5acf277f90d97ab6371aaa6e8a3c1dfe66d2c6ba5fef45260028d25cf600bb24560e599238b285a823a0dec5e014db4cddfb89ce64aaa +S = 0bc5c4dba8bea55b73866c0b4bf739c764ba67121b9b1fb261b282fc1882f22eeaecb5c89edbedf90318ae8537554dd8604930bb893d21ba36ea445d0cfeaa28664 +Result = P (0 ) + +Msg = 34497d9a8db31ba1edde4b48659895c8db6f22ebeba4765874b9dfec3a2ff4ea0e9aee89bd6d41eb6ef5cdbfa066319e48aaf8877629680c3deb9c23beb19f81e08b97ae4a61eadbde300bb7ee504294ef6401123a97425da8b3a981a5a0bfc2fb2327b773f27f2180646ab333740d4289bbb769a40f181e86ca0885ad5433ec +Qx = 0bb34185d844a096f7f673f86b317c27e84fbd6938c1e22e4afb1120489c38508dc643a92ecc963b694dd6f2c7d0958966d49b20883daad4b00a8d0107f2b8ea2ed +Qy = 1e5d3adceda7ed7c7177040b1845fa8064e187a16b9336294c1402ea2eb89e6c14bdd392bbdd2ab516aa7ff3987bc44f6dda8109452db403b39cba9536a39f1ddeb +R = 0d1f2dd7534f9f093a281fb538660324fef9cec2dbabd3527b1482f980dc08cc84de25f83b062ee5cfe1d3372555b7bcf618c71fc464caeef5a8bb141f39531f15c +S = 1a1be81c9379abd578ae9663cad8fdc892ff46144f77da469b832fec4e5eee8a6465be3f211f26e3b72de5a9e45aafa064e24d501fc1963733388af20c7b9c9959f +Result = F (2 - R changed) + +Msg = 293f0b9a48e992e0c7e292c7de27e5af655f8bdad9c68bf68cd667be86691c2d5b54551a415aa41643e5f8c384db9328bcf726537fe8a4d3cb916a95e1a81740f5de6f0849645f36825e2b16b9d31dccaaaef6547a53d7d56b9fb8737b2e229f70f13583f5b1f6be85b63b54c43d8e812f4d1c29d263d139ec1f5c28b452def7 +Qx = 12918b48baedcb53edc782cef70d772232d1d9e1f5e995f70c76b510f3effcd5c239625e3ec5e37d202b37e4e6047a28d70b489b44bf5bfc2b2cf03c8abaabcc4fa +Qy = 15ada9031e346257778a7b6a7d8285b9d66cbb27b1686ce3de3490c08a3d0a64495906f0ed6e1e4b7edf1ff657091f97bcc383e16f2ddb3c723c53d559fa0c5ffac +R = 074cc58e3fdbee1b3b09fd82621bd593118fd4fb372adfedf8895f1775add9bb38fceefb42298c16cacff33af75e38443388b448ae251ff8c049a09fc7af3cf6ad6 +S = 0c51622876dadca150cb6be19dd5de70446cffd2bcaacfb8dfae4e1c7d58c41defa4589668b45958cb5f164bec71353ee57817e0a882c8643fa7bc6339dd88480ac +Result = F (2 - R changed) + +Msg = e5f04509a8c69f4a37260c14193e32201a10ab3e2f77ae34e4b645fc98ed53a6b5ded8dfa53280d868972606471152ea371f98fd2fe0749bf4d16bb356c1d401a69f448069adf565b6938b513512c45e6516f58ee1635d7afe34fa1daa1e7a417a66899ac9bfeb9144f93cda44e9ffc9247f7d841319db0c43b17f1c91ec7c64 +Qx = 15f8a3371c14a76d932a83f242c56097843ca370385db632fd91e05939ce0f87a94028f9f197c435e89525da4624db332ab1b36a1a59cca8c1ebba281ef5ea48bd0 +Qy = 1bdd578714cab38b3d07f28f286a55659cb4de6bdbf13ffc149f0cdf71be6be2d11ef800614a1ab97731886179f50360bb98a8c74ec5a222dbc9b6762a4f56734e7 +R = 0c15e0d1c06abac899b90c86ba6e37c8b8cc982780262e303c94a0c9a1ac52554423257dfaedb70760e6ecd66f9b74913a283a2e44d05dc8eb85e5aaee5a4323015 +S = 014783e744895c7b6084d536a58e9d05a1a53a4ab96321d09cc4c89a908f75f01515c45df3c471ea02cca0bf9f07d1873bb3404d3ba5b51dcccf30e9a5ea0bb151f +Result = F (3 - S changed) + +Msg = e4f2712161d03f16b6d67753130df063b8570d86c445c9100bca9e315891a9d531344d0ac0ca330bcade268d7515ed48ceeade40a8c334fa971a6f08f5181bd01fcbfc57c5ea58ced8aa2ee72a434ebb93ad0efc1e4a78795853edbf43bd668ae7094444e4736802b5e01120bf17ea6cd0a200523f2714927e5756a4f44584a3 +Qx = 0af896543430ecf3b22534a1a3c1c84fa0ae28f1cc659432417426fcfa814faef9397801f16da3bd610206c2ad62f775ca01ebaf380fe64e928cfcb48213a268cdd +Qy = 1bf669b84b415f99e8e997b4e67d0b9f359823e0df92688c760ca99c08350f0375b301c404eee80d86af5de31e95d64ca95d9494e2d8622edda97282732e7e2757d +R = 191e914f1520532b8b3ccc536b103e4eaf2aceda838117b7090de8b3c2ea03fbfc1f54d15d6fe8e6d2cbb794d0206ae3387e808661518bf5c6dd608b5a40756e24b +S = 152e95ec2ba49b5e4d65a3f50a29d140b144f10d2eeba729e439f34ecd7b97dbe672dcc25647446a49e43f5710280d79fe01c0a7b7956fd80bf35cb6d7e560cc983 +Result = F (4 - Q changed) + +Msg = ac3afa28b5932d68d84d2359cb3042c42b3530fa10e7f2c9101f93c2713f64ac22615e406dd7642b39f7621722600b4e1d260faf6c30d33ffd53930c8eb9c4ae22735b41f661a2fdefe809b67740809e01cea82c0b0a8913f6cf9754749266e1e9058ac644464b1df77447e35f7f9300e1771429e32ab326145b757026352bf1 +Qx = 1ccee36646013645ac83b532106a9d78828cb387819bdec3f7d982ad2744292281a00d59cd4c1290365d5b821cfeccdbaa8ebd5f10aa1b4b1342bbca27e7619023e +Qy = 171cfb6c2a95aae42458b6bb582d8efbeaf7219594dca5904b2b3c22a203eac193068e603acf1afd10125306595d0056e2bdee05aeef2d4b774498619cd5f1a3664 +R = 04347e5389a6b4a3de2e543d7474c28e5fa284f5268e474f8998395a7dd154fd0c09253b8160f9bae840189161bc3c85db268d500d6aa82a3c383aa025553fc25c9 +S = 10623dda9d2c39d5e6d463d96dc1ae91f0c3f34df698dec0de2e1840467aa54a5bdbe7815426b175f6c19d1a5f09cec6f5270658a80ccbfcf58a30e10cb342e9e01 +Result = P (0 ) + +[P-521,SHA-256] + +Msg = 93e6fa311b9cf278babcd49a6739d312e5f12e05bc9dfee9bb37ccfb2f9ce57d2a3c0336674e094834a9fb80143c3c8ca82b34949596ad17ae6fc7592d1d93f143e7e7c842e17a7d230ace2d2be15c757c37ba0b1f34810c6e51786af718136db22c1f8336540cae5e2fc762ca43cd94c4babb1b11f8fd93a2ac9525324bab88 +Qx = 15bd9bf7a35cc60147b32b64e0e4e54bf9ac2173cc6784b3d4ebd076aa5d45c1e3d0846b20b61d6342341a8801a2f63028c991831318245c2fe31f8acde6bf2003e +Qy = 1afb67c9c700ed332b47a2d148e6ddd3571e138f02a81c3cfe6d4dee0f512d92e76574fe5797c5566c05b3239fabb212c735615e719e718fb40fa6783c964357f72 +R = 1a341d0e8906239faace79554b90d1445bd28f703d7c7cc8eb163337ad3d4bfb3725cb06e618991491534d399866df5c5bdef897c889947b21148d89c657e64124d +S = 05c5b728837d44b7b6935efb2b721b4f45c1675d803d87f70158e451434176d9682034c9b356b5f9181e07599bdcb55e5bc808fdd36fef9c19ddb6342c975262024 +Result = F (1 - Message changed) + +Msg = 8a3206879e6e463c6d19c4037c12c66ae26e23e09fa96e3b26d32bb41810cb9b02d55333733fad583ca5d24614c23071ee19e4dff9e4d958fc1de573e198eb6964cfc464ce97e69642c19c0ec75aeb01f93361b9df37cd2b1bc2602d967f3f508d1a9f3155a07675e8b1b53e79b608dffd6c4e0f0711fd0b8c6012eacd8e26de +Qx = 09f21a6e7295b183656709089b3c647140c81f71b0b3812e6de22c52245335599ade6a3116cb70277dc2485f91c7b1f46d62afb60fc17a110358c9a02e02e010960 +Qy = 1e914284cea47dd6836e7ce899d0c9a88d67fc9d039ffa9fa5bee58d247e0d0dc9251be8b82afd3add327f98c5570bdcd8ad8827820032774d19db09232aeba190a +R = 0ce4b2ac68afd071531027b90d4b92d9b0e1044b824ccebb2c9ab241d5b909ead1ffa2dc3d330f57187efbea7374bc77c4f7ce7ee689aa5a1e27aa78abc3cc1e751 +S = 0aa85d84f9c7fecd25064dbae69c16d6fcff38040027bf476c7f913746272b5d4b9bd34d2482e27730522df724895b99253aed86011139928fa9a272892f8c99d8f +Result = F (2 - R changed) + +Msg = a2555db3870730ffbafd007a8b565e3c79103751b9c634a40e9ce79098fe74bb43b4cd990c50a80a50f8426893f03998e617a74c8997bd7acee599c24770da781502011747fa55b9215c245f5d36edac311640029663b44b01a50c9b8c5e53f09c11fd73609ce665c066dbee92a749847805c26039089b94f80521e1ac94317c +Qx = 1098be00de7b2ee7390f26eff82ba5b6de8f04d7f11909193923866d2feefad9b01c5d78b699ce0a6900dc2a3073a03505ae946aa6f384ab0573ec9d17fa775dacd +Qy = 106e122e7148b547a0314da646b6f834e66c2ff7f64f39da9dc7983e80e84063e23c8ce12994e8495b7786c2b3180d7f22bd2d2becf1e1ba2029cbbe8d4801b65b1 +R = 1092e5ccfc4f966c3281a3924cd527606ce8e64cfd78f57373cfd702f528368beb71eb1a2cd64005bb172cb35b4ea61af88cb06bc8f1a38e2d75b235d23947dc209 +S = 1aff29a28d935d0e10bf8015f38ec128e0ec047f04020d1474366807b140e4d4a6d069aefc8dce723fcb4fc803df30b3880cc6d0dfc75c291d848d89e06ab7e24d1 +Result = F (2 - R changed) + +Msg = 58a98d6740bcae94d49817a49edcec1bfe9799f22fe7bc7c46933ec74db0679a34dd8057b71c439d00da2dab80711b943a9f4560d4b5e7f58b79a77f84eb7ac3b9e88c8f13b7ea5568b8612c22e4e5ff6f83c36649917e7165be0f3c759b06ba44cfd6b6d54ad996ac2cc9054e8d3d077386f4835cd024116462257907c1b496 +Qx = 01ec67de63455605b31a460d4faa664697cc505885577c0844472842dee78fa6d522e4b942d3c7e2de684e6399f6a44a328ccaab5e678cd99d49f015e35a934cdd9 +Qy = 19b41da41e7506cbcb7c31d39751669cda166fd045c86e1fac68d39d2ebb0f1ed50b8a923511e1306952888e068092b19130181c2de5f25c5e1fc4fd9ea202258d6 +R = 1e1882a3d98c236189a35ffddc9fecdb7cb5fc5e3d0784eabb69d9c37862dbb38eed6c5567a0abc4f74099329681b9a0921515f1df83ba8948b51d3871866a8f7ce +S = 025ff707889678f7cd05665c941a2bbe13622a1e75ab986cc86778658c62e527f55804ab27d0643f6bb8adaab0614eac47f33f0e1fba109c63b28fa6732a5afbe49 +Result = F (2 - R changed) + +Msg = 77bd3d86c52fe8c327649ce44ccb313cf34d6eee9f6074fd60a9ee3dbf3a84dc680c91703632d6f4ff39b8ea3d13090054d186b4a928b1052caee17dc9bee7a5905ca9bcbcd065be4160c4dd25639f2b23d1ce4837598917d7c86425679de1b33e922e331c1f3f748d3cbd8fc6aec68b73978f5d25d730c8a7fde247edd32822 +Qx = 0defff5ef7cc5de0e1ac32261e7a74e8c434c0b51f76df7566b612cc5b8201e7b38c51aa6118b6307f436394bf452a72224c977e37e410eae9525df2ee00a8123bf +Qy = 0263b7db73558ddc783824f0b19776802aaf5e46ccb1b1d1dda07d2d6c5843f5036ae8d381b235ccd2ed04eb90c5d51e32cbd7acdc7031cae63c06797556fb66fe3 +R = 089bd129a537840a52ef434d5a8ba4add952f72f22a84ac4523ea0bc02cbfa8b681ab0ed3fa2bca24ae575f23fce7efbb9bfd28e465174158a5ad2b08fd9e0b7132 +S = 004ed533337791e05f8d097eabdf4be96b3fcc9f876d47fb8c5c7a05cbddba398cded2edf5ec9b7dbb4e32c1374b46953d66a193c211ef12de4b9d73adc369d5e95 +Result = F (4 - Q changed) + +Msg = 12e796e7b92085ce16fcb9f420ee18bb0b5b985cfc47618d7b28a9e2ceae5d526c9dab015c33ccadb05185f8b205875b20323edc7d0a53a6a35f7061ce823244c6c73de20a38650fe6ffad79bfae8a54dbb611eb55a76fa7400ffddc6421e58efad93f43db1b7aedbd63ba94ea12c39c686dc335c7205f05f6b3e1d12fb508ef +Qx = 180f1e933054473e81ac82aa458094b7cb95d4b8d399600420cfb082e37980414909a133d5e42ebb7d2defddb34a9fb51fe4ab72e88526fc28608e152aaaba3ee5b +Qy = 1c5cee9fd322d1c3af1726366e8a1e3f22099d9246d4bb02708eed89ecef1fc73926dc97a5c263afa235edb39a9e63d9690608846abc482397a2d8673c5d472c970 +R = 17f1fd4df519ef432f68b5f426ff23a8f36b5729fdf7c8363d73f4e707d9800c7b50174fc3d66d89813a5265f8734602e5c998c2d7b51bdef6e90ee5a527e1357e0 +S = 10560ed68f152d649493c02c1e32bf4138aacb5f2d7f449e7685336edde24e5ce1cfaa2c54530f1419593614971896f1a877dda7bc5d56ccdbab18e770647287979 +Result = F (1 - Message changed) + +Msg = 3c06bb2421c7ebf060b9da78403a3ef87406cbcc73eb350a2e0a33d20f6a59572d282091654f98b5ed4b41411edfd216704c44a3e295bd7174cd51818b021cb37bfc3f644023ba69fdc081dac3e5f6bdd7c7bc1f71549882566fc4cb30114a1f02f9c0e7610feb0fecde666eb94f5e43245473ea56bd6256610b08162dc2eb36 +Qx = 06d8c16536b17cab6ff41f5df4038fe416c05ccb601710909708dc561b02ceed9cf020441d9daa075e8fd604531ff58084035b1c19a498b82582f5b20f9cedf61f9 +Qy = 0e89d71c66e55c4f5bf245413388bfe9de83944b11d1abdb4692db7da8a086442965ee512f7089f89464dda5d7786e52cc26a8a30bc8824cc56a289fefcd42bdfd2 +R = 087f86cf4bd36e8253097ac1bc8500dedafdbccbe5767ec25e53c73c4f053f3b37acd1d5ea4c16e4058919b61d2a67393220ffefe07535d53923ace6815463c4c31 +S = 1def2582fd0df89fa28c9ce882f5c3846135f51bdf7f4b2497b190136ef04618eaa22a8c5a117b0adfc6425eac3111b6558df145a8b14ad39524b98659e01d51c21 +Result = F (3 - S changed) + +Msg = 08f3847e8b10f18a2f33abbec099f764215aeec9ce64c33fc1c6ae6e7dcee8eae995885dd91a354ccd2ac9bf8f9924a375b6387696fe415a08f7ee429318f045b9394f4d6e75ad099ebde5ca94e69414155f4dc271cdfe4bdc318122ae469f9a4b5f44550fef6d4e09925eeb579d61299578d6d84d99c4260ccae583e042b0b5 +Qx = 1c7fb4747a409a3723177c38c9943b81b2d0aee867b8f424e227f3a664f1877c560d37953e7cc09390e05599292bde1ea345073ec365834d99ac59332f6e5bd29d7 +Qy = 1b7485b454d5ed5d581c7897a7e68f425d8c23cd89b934747d90765a5fda1cfc3d997af61728f328cc8bdfca8a3ae1b3b90be13cf164c343d199b8e16b0400f3e33 +R = 1552ac2dfbe67c6abad8d3325713c1e28537eae620d805a73dbaa4e5e04acff6ae0498346d6e41df1cbdb20b70d8e548564da8fa239fe6c6f28b6c2a6ef57973097 +S = 0cc9e60b694d792f36cbe9adff8dc79f0f75b3ec11ff2d54419227c7566e0bd441655eb30b558c78a55ac613c1bf3c3058ea7a4bb70adbf5b49fcae15e54defd6db +Result = F (3 - S changed) + +Msg = a1c88c643303f293bd918e30ac00964e52f78585be9ed920c579c48fa0276f749c04ad73e3a86697e393e7172d2459cdc30e0f1e2830e5e6952fb23c6a6e3eb61cfcb15a59cd6e11c3c2e080e78da3e0dc206ee9e1e5aed87d7b61d14702c59a116473f386faa21dcc97328f966771fc3e5ff72af66535f41e3daa4ebadd5624 +Qx = 16c0e1d1fc81e5069e9c02794fdfe1f5a8ac5008305d9ac2234eb0117e565203acc6777c570f41661c5db1adb26097d7f5f2a1762c4f8039f1b68caad75915baab8 +Qy = 00b3690995d6d881dc1564f792ab174cdc1a0fc6f12d69a21088d5e82de4a7d56947a2dad0ce64d9ad0675e72b6da755e3ef82c9cc6d532378c23112210236889d6 +R = 1316e9a934cad1aa0f7dbade1c9ad942d61bbe1bf41b7b95e3b25b761b9899f6125790369277aa09fa57340a2b8c3c609a08ae7be5a3c09dd4d081e6cb54d9f3061 +S = 0d6b285f91c3c8d6192af624336caf793ad5300d96262f5e25228dfb60896c4e28e61be22e92ca7d6e11a02f36655441032bf291f895aaa117f6bfdfb422286f255 +Result = F (4 - Q changed) + +Msg = bd980fd69fb9e1344540e5bb12fd0aab8199a16ffec416edfede8084b7cabff5891f8f04fa72a3260403adf5ee286efe9dc128b06466b21915c394b21ded8d468ec1f2ff82d6e4306c61b3315c8b131131c1ee8d093f5aa47b56dbf388cb935900c4d3413dde92cdb7d6b8c35440ed962d5ef036b241f2bc51842fa64496aaff +Qx = 06194b1780a2416dde8c9402e3ddbf310c51ed87fc40530ad5c97931b99336c00098337fcca7b01c634e56a7874309177364e6d4c24c2ab33d6a1a09a84689ad0b5 +Qy = 0c5bfcdf640c0a7573ecf4a9dc1aa75db298ddf1a679609e0669182a594b9b9a8186ee961b902d84fe998e3b380c304a0be98974514966965bfef9971f05a57c162 +R = 18051118c2d8b841c6d78e2e5068c7305039cbae1f8b5a479b9bba559ebc45d8c8ac18d1f6033713871e656fa4eba9c1c0892e7263bb22c46ec3c72aae92afe2c79 +S = 0de0db6a6ba5e6a953a126be3b87d6c895f4bc2db27be223109dc67cf115bbc8c566e1c9a1bdf1a87e632f8a0e4b31331a086caeb60793e87f03b404140aba206ae +Result = F (4 - Q changed) + +Msg = 961c9451bbb298e17f503680099244d969a0ff3d0ce6cf15b5bcc73d6edc3e8c8535a18531d885664612cad97da174f1daee6aad95220f6e2fd8c734c57747e46db21e169a03dd673df07aff30848e8370c0960d732e74f9b1d8b53847b69d2cad80f346b50e89d7993cb758fc218668c771422f804d3c9162da98cb30821912 +Qx = 0397714abcc503eaa0c18abd1fd26586d28ec1b1035d37ac710f2823911ec9afa429b41ea89cec13d5bcae9d6d7147794407e409f3b267cf4dd27e8c77e7ccf4d36 +Qy = 0a3a4b749d19b84708e42b59e9faa5a99ac0f0a01121655fab87785fca38c8cd4277c8c2c9a0024ff608c3cce954596315dfe0e3b133aeab08bb5389eb2a4f1fb42 +R = 19da96a866db12948e0aec7231f797061f345739d439bdaaba63e4d03e0bb52c3fea2fb593347d983f24a3afa6a77f476e6bb49a5de843b4c4755cddce97b8b909e +S = 01bb442f428b2ca445a75ad88ed49d965d6659d748d02cebf78faa1ecc187b606f284d11d47791d585dc371c2d91848a55ca7b092f06d561efcf64e0de0814e1db4 +Result = P (0 ) + +Msg = b9afbe0d18f798d2992740c35217eec0552f0812c607ef823f74dc2eb2ce58a9abe1c683ed193245a81b9f1eeb68d57c721f052f926b1ce3d79751bccf007375715e70b52c9bce92a6ccad24c205d43a4355d084dce3db2f50ab7d4dc3c6c400db8db47a48dabf295801e960232383480f029c7111bf8d5d7a0c9d64c9465644 +Qx = 1af06b10d357fc3c807854b4be235f81d5036da4df1af6a054a03ff800c1aa2d59c2ad5c0e25ed25c002057cae4b4adb92b95c36cf422a46c8833fd8968e0f32441 +Qy = 18432172be0e535a3f3a5f6d6927dfbf6a00051cc1983ba25410ee3598a60dd1f7c38526de7ee23f8e9ee973ffddff49eb3edb28adc7d094cd95b63d52ba45ecb58 +R = 1396b4f044919d0ba5ad43004cd37b8bb0626ea5549d57c532339358ee1794988a7c9eab91a9340dc2aa0f18e89b236a6c20d03a6e98f35c011430fc4213cd65dbd +S = 101e5a788a867d9b5a4444554c9651173f9f8e15c0f39f9adb66c18ef8075243f23b95d5229ccf5f56b87f5c50920b01b22ab7476ecf4c865a3d6d8f2242d422d8d +Result = F (3 - S changed) + +Msg = a6c421bfcf95f7dc2f3721c56eddd2bf58bd8a2717396441d95e265c8a3c85b031b80e5f90786126f578affecfb4fc2dcfb3adb96a33cd0953b109970d218a6e59a688b6bc7d51e64eebab69929fac48f45fdccd2a27c1e1a48f19bbd36e5f8f8f0d8ab3f4e2cca2301893f8c373794582eda7b700f57d092d1662b929a2d43a +Qx = 176f1276918fed24a098d6d03077f3c33ae543316df1b6b06ce877e74b69b2cd4131fdf797e77e5f6391b0b32411120d03c0c59ba1721a7187d18708121d6f3a86f +Qy = 10f9d38b30a2da1a745840de7c9994578e32bb10f9334b46f533b6eab550aa55048e4ac601889564ac8314e01b61613fc7b8e2bd3f1a188c5c5e869af16a8d61d9b +R = 19cb5639a321e95214c90a612d29c9ffd5ae5aaa2a814ee2d66ac1ce1d2ab3229009129ec9d472061444cbfbf50c7e4cba09aab65299a42740bce7af3fddf2a1f46 +S = 0082ce6bf1d809d3bb4f9f09a95590bb64b0c41bcee5fcdd332947a9b59618da5da897fff44968d92635e7833dec1e91d8d99bd8b527609393b446c83d109a32243 +Result = P (0 ) + +Msg = 1e8824c203e8915e62f5304b021a3a1cd027f5dfed3366e123ba28273b1a63956006aceb45a03b5995f14ef08e430131fe93123a4f91683cb0074280b525f7342963e98280d63ae179cdc908a191fed000239f1e56b012b7fecffc1d1a5883a29a78149d507205308170460da5a7d5ade323bef2c9ec4b9a336cfb8b1b7ae473 +Qx = 089565cf5838658fd36b70cf5246cbe999a394562c46e9d8057928e0aa9e04ade6002cfb83f315e06790e58ea833b3bd64fba8e93c5fdba8319c5d38be7cf25a21a +Qy = 08faeff531e683d28d817045a03b2dd22e50e6168f1e5fda5b5abc71859effc5e5c45b88705b62ca090e3362a8313dc472ec2ed970bbb5029200318e7582643d613 +R = 06b5237ad17da6037aef116532b3aaa70172d0ca0eebdc478c35e6f8bd0f9a6472d052c5a18a23dcced7be6e5e7b6d0bcb5b3cea707000e7d114b6f41084d6f5620 +S = 05e2556425b35e6495b137f7dab522c7e7b812004c87a002f6ce4f4b6cc5f967b8f5b7d3786a17d5f717d3ac467b73e176e90cdd8c5151a6e62fc4604cbeab7e717 +Result = F (1 - Message changed) + +Msg = aedf4e8089c90d95f870457561df7fe825138073e867fe13c39a0d0bcd77dfa2abcd635ca40bbb71eeae2b674075bfc5d5fc7d489dfd8f34ed30050631238af2122f7d45cc0634ae8a2efca5cbcc4f967ae55c290f77d53f2c03163f532f31097bc34f531823d23de7e5a9e09a1d17cbd9383a4381f3f6986368a6014fba8b96 +Qx = 0aa42473f80d9d81f6d41ed05c8ba35c005f90e2690f71dfdb12555b7590c7a8e95b618368c39f4e84d6cba25f522c9bdd256c60d3f8c8425ad313701225a9cc9c4 +Qy = 1992b7966b925f42c91f810eb05d602b804301849ea278466a68e5b616e3a0bce110fc9250db14f9c8f5929347e1bb8727bcf8072c6aebc26958954fe96df04e139 +R = 0cbb35513420f206bd26b568712503b66e159a54e154c8d4e9c661aa954e0bf425871275fff5e8f368c8ccc77ffe6adf84ba88a84483d8ba5cc862bd408f6a192c1 +S = 02ffb4e461e3161c801ad217a0483045181013deed29eec29cca94776139ddf5fe9d7771e5ac7b637a4bf7e5276940489bd8ae36f41ef6be93cff4b96bd0e1f3e59 +Result = P (0 ) + +[P-521,SHA-384] + +Msg = 4db7b4e0b8c91130fef9bd8fc4ca9c1b2970103cd20366371b1f0d4a00885cec613f5aa54d723289f4ce252d446b8c213f9ee207196f88029e66641673b0ed5cc5a2700219ad5dd6c35486c04f637ba15c77dd2a5b53b1bdcc7c5efb194de1e00adc53bf78ee5b7bf69e9efb337d9f24d697838ca5ad56b08903c5891b84c096 +Qx = 0984cf3de2bbaf1b37ad4e9121a1294a0128d8a031ddfac7a8c5d7c9db83699de26c50012d42223d902cbd4be7e6fb611f4502ce8444d43d3eb0685aee07349d0c5 +Qy = 17165e8feaada26cc599ee394dfb5de7e2201004f755ebecb92ffda0a24be55aba88ab9b3c7a575884ffa7b78b631806f54e01ef875c5819fd2d52dd6369d649615 +R = 036c8554602661d9d8f4bfecbb099f01e9e314136e50c6d026de2297bbaf66213ea72fce13b73bb07e6e333523f19d3910983ea5842a1b634b3e3ec8157d270b496 +S = 129b439d3ba2d66c89c34be2a674013128dccfcef33f5d3844c4465381453c361ce80e1b52b6a611749bc70933655caa56da2c5dd6b04defcd8baeb2d9be06f3caf +Result = F (4 - Q changed) + +Msg = 66fadb3dc27fe2a0057eb1e0aa3d49cdb93da4a07bb5c4c01719f8deac82fb0066d9c1466ae5ef67d1fee3e2cccf3185a24c8cb58c18df2bf0ca0caadcdc0ed63107b14e3627a9db7efc88544a91774fed34e335dde43a67ca44581bc9757932414a0fc3970b091e94dc52d39a9815a4aed5d27683d8c537c37e140e8f512750 +Qx = 0f976d58a015d3015a14997fa3f59ca8d762a6541861be923d6110c9e742a0a2a77d59a6a9335c67f13a626d9545b27c072349c3d20b80c35b0a9490f3e6c5c1b3c +Qy = 0425c22ac0755c58fe3497c1f1a9f537d5e26127d9b031359c2378fd4b13f83691a854444eac3fa346bb5a63bb9567c122945ce99d2aeb0bb1b956ad348f7c9c461 +R = 1ca7346a2efe39e03e627ee9480a9b7c925a6677dc80932ffd67ca52b7e46acd2063402545d678d218ac579a64cf1fa4eff4f32f92d3fa4510eea22472dbd3daa72 +S = 0893d86a6502d5973f6c766413e7c7ecbc4583577c58672ef36a76c83755a0ab65af0e0af0ad0f3e6cb8f9ef67669132ce7e996d6122cbbe1dec710a7ba9c9d1ff9 +Result = F (2 - R changed) + +Msg = f209ba5871f0a05677c7ddfaf93d39dcc69467fb6dd99b09c7685958aa155838779f9df0f2ff04b6b80275d2e9abce8285333c18cac19a42a6227ea1ebac521110d393e4e43bdeefdda0b3f9ceb2f3da6c5364d44d2a18795327668624fb8dd8c9e33dbc810f4c24edbecdfaba6ac632f5b2831f42121f1330930902452fbbc5 +Qx = 066ad5c073425bbbe3a1d97ce6e1a9f2c298392c5afb95c60eee1393f7cd5c9a12c283258b1a53f2ed4abd13ba1287f3a1b051a09cb0f337cb6cf616dffd16aacc2 +Qy = 09d2b2afc181bd82043b13b8222cd206b9264d73b229c71d9abcf74a478a7f7088bc8c7bb1e54882fee693340a3cf1aa56ccc2fb81d2675b19bba754dae0c2f00c3 +R = 04e6f08380c43f225169acb0e9f3ff61cdd2e9b713d149f63b5b6a4510d381409648fc1d442fa1bbbce2a8fe1ff7d1de0597f72d7681c79d3a876db6d3ef89ed192 +S = 11745ab4dec3542cbf37d10090d6038bd1ef9cce8216a4069b21e4a08075e7e8502ec97b99d3b18fd314d6ab6826bbbfaa2343ada1abc7c3b551c0b854dc45ffa75 +Result = F (1 - Message changed) + +Msg = 978116ee2d7fcbf1f5013fc84153c5fae7c1785a2fee2c7bcacd962aef6dc201ac62b04eab505b6a5288ea21d41b64114ce01a0a01c617ffd20d1e70babf1af1523a285494a3fe5bd8619bcf87370cafe1188d9843ce805db9adad563d0d2832833a8898bca03965a2dde6f94d2be5a653eb389b6539ec78844cff4d4df532a8 +Qx = 068801cdbb1e07f4b72218c52aa24bda872f1b2ab4e0c13b686cb8b10096ff88018e82196769359227192752a1c4c884f08cfa7f947ac428651f528bd41d1034073 +Qy = 1aeb335cb89ecae3cbc05681e2170870dcf40d486db4011c4d7bd84c58c6b3204161d9ca3516760b0c42466605077c96c0540939c635bf5d7d11e1407b6da30c094 +R = 1ce67a3509d59f8a0f171b86559f1d84589ff2693ff7d3ad3ae64b0e5af85db2fd99bfd7eda6e8f984a87f16767231cbd9026bed0a9a49d74ea5047201227c98f41 +S = 032b0e4c043df8e81ff22c9bead36f704c992ec160d6be7764640200e1307002421b5d73154eccde012b463aeefd11138c5b9b705623c2c849736da23c122df06f9 +Result = P (0 ) + +Msg = 0784227d3d40bf646f7402cef305863d59d904b16535bcfae67e4e2ffd79d26103c4d3f096493ad46c09a0cbeaf61269d49df46494a860b25c8e5cb40227eb8aa76e6307ddc47e5297393bb5afc946fbae5f8de0069ccb62889df88560a0dce85f888f83dcf80ccc6617a51466eb9d9cd450cdfa75acba6f3ea43cba0760dd0b +Qx = 01dd34056fd2ff3009bca2d0bbfa70ea0fb678597d41dc545358263ce2cef9a2efc016622c12099c2a50257609d6a14f3c5ffac8a52661e4a34689a3aebdbe86163 +Qy = 17926740659acf72f7c7a147a3a320d501efadef8519bb289ebc33e348d6b9efd65fa516048101678548898619d311b8ef2a0d4a6f59f86810e9e6534176a24faf9 +R = 19043db42f44b957784a0e1f09d2e0a0dd548b865947f93b516f249ef1757402544ce5dc402cf8c1f180e9a3be01657258a1dfc14b25ef564805651763d6f609d43 +S = 1e0b45e00bde9c4e8dfe094f9bcd7af5a19b631db850a69bf0b6291fd3df6e26f4c712e3b5d4b7b8572f637874057d5652fa2bcd1977065a695d26a80669a23f0e9 +Result = F (2 - R changed) + +Msg = c1c9b8b123b5680b07669c285d3cf9e82e96fbf5c9cb7409265b2c57036137ef73460263b7a279f363bd7a0c7f72318b8fdad4a2d5f8f2d74b4964e54a1409554bec5e3e36d7e594b3af9b4f5cf28e59382f56c1c01a9a6c5c12b4abd127726a7fca24f2aa8281d7e86d6e61b460f2436e23493e83bf99acee860ef609ff919b +Qx = 16e5b4f4ff81c1b1e7956103c5cde951c56b37259fb8bf735b386e4d8b3d44063ef062d6e179f618a506ec8ad9773cfe99044748e2c8ae229a51bca6262aaefe2f5 +Qy = 00069bfdb9123885d8ce4ce67c63311055aa9a1a5150197717a853d0549bd17d2683e427fc90a0b78af5dc96465ea3f2862cf98e8f3ee2a07089e8837aa8d09d97f +R = 11550cb365daec01901b5a5cabe7930c10d79128c5e510d58b7593c88647eee811e6fa736b26351558cbe7f17d7c882bfd1ffa72ca3bf4bc1cf1c05f31f5e8bc057 +S = 0d6fc97ad14639a5157c92b39cfd1315d7e940a454f1289c8e95c8cbbce8731ad37180554e7a91565d86cffb3f5caf4ef883184d717e03eb776af714a32234e3f5f +Result = F (3 - S changed) + +Msg = 8d2f5ad1abb9f5cc9a981e24ecdbc6f2fd50d52b848e872c579465121151341c1ec8e01165a0365a2e36a26f119b283485e3e385141b4c4d03bab2894211595d46839699c36db0551bf32aafa658d819ad8ae0cc013570487f2d4c6de5c4e4df311f4cafdfa47cd6495d99453bc6fbd0ae538917f6f49a961551fb0c6497b15f +Qx = 0202896ccf6710cf780bef8908a2783b3c8d5b8356f1546a1b6b909b0d65ffd7999a16112d8d68c837597656e520a56c2f6578e322df6dd794d2c08bc5d8f9f4c37 +Qy = 0576152d30218c941e83080a502cdfbf9de7ca2c394969e779b76c359ffcb84902ff89e37125dea7dcdea0ba928ce2305c619b1906955e6be5ce40d087c5245eb45 +R = 0bc6a7f5d77cb6ebb36a261e80d739f42b67ddc7a6496acc0ba7804d14b4850cf3fe4d8b56cdd8c019ef9f0d33aa26746018fbb4c69f4587b6da1adcf2feee2b438 +S = 0f09c6a94a8550a2781e70b4542096407fc07617f537cd27f1a1ddd15c599d5a9e3fa41da57094456277b44b89d40b26f2cc054fbe657788fa9d71659008d0d698c +Result = P (0 ) + +Msg = abe8ff2cc3397f3a914d6b026ed01dad7dc33fc11a736060a217ed20dd89a4458f8ee0a670a2f489d0e00599f5aab560fed8405496ba51548a07a722a3ff3546b94572b4c0abbd6503a46cbc7a38dfc9322b702c6b17a38a06e3736749801adc08f6200f06d3bc5fefb9ce72f82af2d68f55e1607602ce6670346b93ac1280d0 +Qx = 06ee95783b768c895e2af569bb84b0b1b00c8b72eec022df255892527987ffecdd81bd8afe267408a8912cce80982bad79c30610571a37d2a0e027e73ad23923b8d +Qy = 1ca3f60a37b18bd8b08529da1e39f93d518ae3feead5d00e07150d80d641b20e887c62e8e910ca1c2f64cdcfa678c89b2e3012e3d9b96088ae31dd660dfe6369cb6 +R = 06823e8f6514e42e79d50a112f0f320ecd53963729038ef0d66d5fb59e1c664fda493027678a02b139fcf290657fffd7a529f4f38ac73542f316e1b0b25b3b88cfd +S = 1b3bf9e54b0f48bfcc7289d187e831d94d165949db3c660cb63106be1b933e10614e3673bb8078bd8b80ba052c63d566899e618ea31e2a37e0c9c10da111ad11560 +Result = F (2 - R changed) + +Msg = 84508e6d7c687b7425b212230a1754393156c5643b80ac3c4023783938ed972f6644658e0f4538248adbf08533a10f75f21081dce9636611461cf8bafff496b984cb933d337b1b8405cd2e4626cee1cd9fe9acac22efd1c434eeebbeeef02f2a1c4a5083dd8651adee80aeb41d1e45029eac3dfa2967e76589fc5edfad49849a +Qx = 1ba73e2af308df78d4f2a9e552c3b9fd35d35bf20126fdf751d8ad9917cc58d734fb9de27553cd07c02eabc077f16ad4532871a8aeb59bbec82e46ef1581e4abac0 +Qy = 0cf888c75582fb50bd0de724a9f4834ea127a1eea437b9a05935d1ec06815bace3464c230314b7f796423ba9fa983b2e6d1eb0260a32cf2f163a5ff46a9623ff149 +R = 1df7e724658f1666aee8d5d75609e3f5215228ac32b978ea53434b7d154dd4edf661c688083d0937e43836c3611526c75f6f26b08f7844a95113ea4a6f1ab824a0b +S = 19d40a7e03bd69ca568f70a066a4a57c0e6ab82dc8c2c8aa52b00c3ee4c327a87eeb7d837b0c4de68e25f7ac7cf6c0d8bbe0393b98dd61ac4961c7f8c70b40082e0 +Result = F (4 - Q changed) + +Msg = b4b1372e94253cdcc6af6139b12dd61fa559299e80e24c900416fa79f9eab738512c7c381acdc2fa4d0393c370ff38d371ac96a6bfa47c4b8fde12402cd27c704059cfe1cb7c3b5fd009f415b4827c7ec0ff32501ebf4dfb179b278f013a16746f52cb5005d902c3cdb5a241a462fb9b1c86576c3a18d21793b0f2403c32f793 +Qx = 1419bc65174998ac21026f81e6807d8b42f0477396e7ff8a330e17c1d84bdc9b39b2a310767b46c41711f3f2fe503504350c86bf3d2b39473b64822ee32dec526e4 +Qy = 184c968f6ad79bf0da00520e5339751cd9c50e41e7cd21ef37756bd0e36e23a8071e5f0240988b73acb3bb2b6002002e09bc7ef70ffcfc7cf42d6b7c65110f54ae0 +R = 0d785b38c5283466f796988242aba08398ed2493aaabf959ed0e8b7b915cbb711d7694f94206db74641a518642d43c843ea7f43b8354a956a3695764021cc5d2774 +S = 12c20c6ab988ae911c7cdea0549de2e40e3e68c47cfe58fb777ebc204641bbb44f2c8b6a0196d330ea2ffa1d8cdc1dd9be353f1c657e43f7fe3c094898a569c45b6 +Result = F (3 - S changed) + +Msg = b96387edb83eab72ea30c323a7871fb0704ea23b21e20cdda697823b33fdfe31ff8b1e7b991b1cad074d4dee15ead4b298b56aa62477167d40350f864f3db57a414e75ba06223ca29b42676cd57cedcd8031e76de66949ffa933f3b8cf717baf0d7fe21b84bcfe7dbeadd99d665d1ae90c8f74cd6050038e32920aa04c0820c9 +Qx = 10f3bb1c96a753d278ddf6435e7a79a53bc2855d26d9f8d5c1337b0fd7d70bccf204377a02a1cbe95cb63e21a9e8a3ce8ee7c8d4ade16ff4083dcacbc6c4b2a350e +Qy = 1f98a0273c48fa78a91c0f8c1a43f59c7bccb74780fa38b08989d334f2ba0353a3619e6d4a1072e4e052720ed10e4f2c07e12d0c81a062fe912708dc51d4cdba97c +R = 14c4b9e23f51df21b4e02ed7611a8530466d1ed799b50b34b5fcac3bd1d63fa345925122414119cca76d22c167c18ad0fa8e1b47b53ab0f201bd4ca7ea25e011965 +S = 0ce91a050938119f80b5f584a9d9515c998212f6e122780f1607cebdb9b538dceb2d4039ab5e1b13736f4166e73d86c720516f20ad8f24e4b9fadd459c2988534ed +Result = F (3 - S changed) + +Msg = a56d82d65841bee94ad279a0c9bb3354caf8471ac11bac1e6b445ee0415b9933ebda8d54d8500e132a3f5b3e9aab72c4fdd0048b9e84ab2b1d4acc3df4003481a33cb7243e72005a6fd1e15995d7b3251fa47605d220ddb1e24571187bcbb67392c94f0b308406f5ee4115d5f18227c98124a087bf06c4c31a93a558bfc6d937 +Qx = 0819178ace7bf1e6e942fd6ed69193386f6c90cf65b42e9204d34ec96a0ce8fb92552ca57a7ba658422dc8b53bee150170362e6e74bdda24fb458271602aaa9b832 +Qy = 14af772624921f61b3d1275591ec2d68702fbf348382e9e552a9b6c110eebf6e93f20c8bff287d504fa08ae3628e611fc1262736916fa9edd87db1c78ed2426cab2 +R = 12c45d6ac0b5dbd9647211f770c3cca4411666aa39b6988a968bab345129237597b6c9b3bd788c5f9f39a38463a8afb159ad72f19e7e33e7f9ce8d67d611c3d9b46 +S = 1684000b3d7381aded85b18576832c4a89b4faeea0515454677e29e3f072097e786fef11f72f229b63defa1c2fd3c07090b34f9147647035854cf2950c12a8b16d8 +Result = F (1 - Message changed) + +Msg = 9e49b40d074d5e899060654ff081fc11ea9cbfa5904e00b49d5c0a0166b61e302ea0dac2ab5567b7fb1f5e116abc48305ba3013ce957aec0f239f7538fcf4f26dcb03540837c4bf8a3338700306e3c6aae6b27c73ce8948856f6c2120e96faf0b52a5954d9134a9b4b9d5395bbbfab3505acae48b30fc58e7676b522908b44b7 +Qx = 11f8e50ed6905b029ce4b16c8acb8ed9136b1c5adf6f11bfb5f3dd8bb1e208ca8329a0aff9bf286e3be90e4d61d5147bcaf2293f934862cca6aead51d6e0a083093 +Qy = 1963e84a2f06a9cb273a424ee5fa1ae5900fef348371cc91c99323f58bbcd8742a4495a4f7ef52677501a4d5d663658c1f6c8f6edef8b7880e6894ff9e52bb617da +R = 12fc3e0c18c4edbcda4f82b5136c893a6307c3f60affa15d0d99fc0e4a3576b7daefa363b3a362014d14f631c35619f6861bdff9a7b503825bf9f027fcb9a31fd8a +S = 1a138d6b02fd2a7ba45f7f952b2f329ba6a8e25697379330dddd91d1d6e865d3df1541bc4717d3e09b10a57cf38dcef587ac31b4a8abedef43e4f6cdf6ec3f49eea +Result = F (1 - Message changed) + +Msg = 036fdf92f353c2a55a33f54d4f731db18e56a5339e731bd09d0b8554806cfbfe36d3c43395c70505866a5659c246fb14a845635d73e222bfbdfad011669d2291fdf88461cd888fb32e5d7f63935dc536d390dc9a9d3f4a67ac1435b89002b4348d80a601b61bfb8f95dbfcee4fec34acf0af907819e2be2d3b68d8eaab4789ec +Qx = 1efc81c1efc7a9bc36ed49a5ef6fa1ba641360fa5c0f96cc1e4a3f4d973c95e86935d979fc2101370777637ab210a56fc4173a50a758725d60e9f925f2066d2bc00 +Qy = 108225fc94ab33c74aff785dcc68c45cfc3cbbdfa3481fd2a3f97308be671fb32fc8d268c129d97f140210def188dceecc9d712ac397793dbc39c5cac332671ec54 +R = 0480c48a24e7a7ef832547d107769254fcdb4e7982d0e6abd16822837fd4f3b66d81e1d4a018606881abebd220ed8ca865d7e00499ac9651a98c65502baebf34a98 +S = 0ccd22d1b44a1701c99f662535aea9abff7e27f73628101f42708737db8b07effdc2b0b05d4ef233c5910b6261ae9d9c540115f27d2af766c0494c33d31bd56b3db +Result = F (4 - Q changed) + +Msg = 9ce982c91af08a21d405f96abd6204588bb0ef1c8b78305b06f36a12d1914cae9dce6a1f1a0b4c42b067667c457c3e90e56f34cff0116bbd350d27882dd6e47997c944dcead9cb945f7c691078c1b533960a55f93d241970a1fdf4441107d8bc8af5aa8e088ea3aa82c7f3286e815dbb85d5cfae0aeeeb093468cb55201eeffb +Qx = 0a15c8040f94235b8b444f7a74ca293ed1b718449911eefbdb74332687850a644395394c690aa98e8064f6eca600fc3f659208c0f8a21a1e7113bed0c6e00e3176e +Qy = 04bebea7037b731d175043dec3630b2ee85c680a81256921a89407c14507c10ac043deb5d474602211ad58cb569a8b805686bdac3ef7ff62a4d25b27200706b603d +R = 0c1a70919025aceb29dbabdfc2a43715192cc60fc3d1ceababb40f91e3110b2cdd8f6e9c1bafe7415a26fa4179f8fc261b143ddb094fe61117afb13adae9db8943d +S = 0197d7f87aea8d6ccd2178614b147b290ec780c8075f8439137803c0e9a589e415d84fa23f5f31d61c1674f87142d4ba4f8473fc92d7715c281dcf3f1ee5c2f1390 +Result = P (0 ) + +[P-521,SHA-512] + +Msg = a0732a605c785a2cc9a3ff84cbaf29175040f7a0cc35f4ea8eeff267c1f92f06f46d3b35437195185d322cbd775fd24741e86ee9236ba5b374a2ac29803554d715fa4656ac31778f103f88d68434dd2013d4c4e9848a11198b390c3d600d712893513e179cd3d31fb06c6e2a1016fb96ffd970b1489e36a556ab3b537eb29dff +Qx = 12a593f568ca2571e543e00066ecd3a3272a57e1c94fe311e5df96afc1b792e5862720fc730e62052bbf3e118d3a078f0144fc00c9d8baaaa8298ff63981d09d911 +Qy = 17cea5ae75a74100ee03cdf2468393eef55ddabfe8fd5718e88903eb9fd241e8cbf9c68ae16f4a1db26c6352afcb1894a9812da6d32cb862021c86cd8aa483afc26 +R = 1aac7692baf3aa94a97907307010895efc1337cdd686f9ef2fd8404796a74701e55b03ceef41f3e6f50a0eeea11869c4789a3e8ab5b77324961d081e1a3377ccc91 +S = 009c1e7d93d056b5a97759458d58c49134a45071854b8a6b8272f9fe7e78e1f3d8097e8a6e731f7ab4851eb26d5aa4fdadba6296dc7af835fe3d1b6dba4b031d5f3 +Result = F (2 - R changed) + +Msg = 2fc1140a7414e33ab469799f9432b30d29d1e4451b28a756a0f24a7f7f90cb284fb443c074267a7600b370eefffea23078b4016b59cbeb95fab3c6f37a72e92271b29ee2382e1106f8dfd3871ef9bf045f78d378acc8d16c983d54c7bc0b0cb46bba0de78630f6d0796c2c275e46ebc88e6e6c0e675ebd849f02e47f51abd215 +Qx = 1d6aef44370325a8a5882f4667c21172cdc8fa41d712562883ececff53883ac8ee276124e825088c79d6c9d96323cb7b8c0b7ea44d3f0026e2538f4b62d785bb1af +Qy = 027203959a6e944b91fe6306debe74dc5dde9831fd0ec27e8be2d0b56807d63151b15f6495b8632e919e1e6b015f5ae5f2b6fb8cf75b5f848f00cf4ee457cebed3a +R = 04417ff74889dde6bb1820b5d13da5c81dcf9b0723ee89bb1ff0d3faa90d497685709f315b2cbe55481dee43ebb6d25b1501ae69494dd69e7bffb72f987d1573b93 +S = 0fd7aa027c665458c7ac11d54d4f32cb4a1e727b499ce27b08d3d647c636cc3222a4f0a6057732249ddc22574d7cb80c3769c3ea9de3d33db3edd8ea90cb3f8dc8a +Result = F (3 - S changed) + +Msg = f69417bead3b1e208c4c99236bf84474a00de7f0b9dd23f991b6b60ef0fb3c62073a5a7abb1ef69dbbd8cf61e64200ca086dfd645b641e8d02397782da92d3542fbddf6349ac0b48b1b1d69fe462d1bb492f34dd40d137163843ac11bd099df719212c160cbebcb2ab6f3525e64846c887e1b52b52eced9447a3d31938593a87 +Qx = 153eb2be05438e5c1effb41b413efc2843b927cbf19f0bc9cc14b693eee26394a0d8880dc946a06656bcd09871544a5f15c7a1fa68e00cdc728c7cfb9c448034867 +Qy = 143ae8eecbce8fcf6b16e6159b2970a9ceb32c17c1d878c09317311b7519ed5ece3374e7929f338ddd0ec0522d81f2fa4fa47033ef0c0872dc049bb89233eef9bc1 +R = 0dd633947446d0d51a96a0173c01125858abb2bece670af922a92dedcec067136c1fa92e5fa73d7116ac9c1a42b9cb642e4ac19310b049e48c53011ffc6e7461c36 +S = 0efbdc6a414bb8d663bb5cdb7c586bccfe7589049076f98cee82cdb5d203fddb2e0ffb77954959dfa5ed0de850e42a86f5a63c5a6592e9b9b8bd1b40557b9cd0cc0 +Result = P (0 ) + +Msg = 3607eaa1db2f696b93d573f67f0359422101cc6ceb526a5ec87b249e5b791ac4df488f4832eb00c6ec94bb52b7dd9d953a9c3ced3fb7171d28c42f81fd9998cd7d35c7030975381e54e071a37eb41d3e419fe93576d141e36a980089db54ebbf3a3ebf8a076daf8e57ce4484d7f7d234e1f6d658da5103a6e1d6ae9641ecac79 +Qx = 1184b27a48e223891cbd1f4a0255747d078f82768157e5adcc8e78355a2ff17d8363dfa39bcdb48e2fae759ea3bd6a8909ce1b2e7c20653915b7cd7b94d8f110349 +Qy = 03bd6e273ee4278743f1bb71ff7aefe1f2c52954d674c96f268f3985e69727f22adbe31e0dbe01da91e3e6d19baf8efa4dcb4d1cacd06a8efe1b617bd681839e6b9 +R = 04c1d88d03878f967133eb56714945d3c89c3200fad08bd2d3b930190246bf8d43e453643c94fdab9c646c5a11271c800d5df25c11927c000263e785251d62acd59 +S = 12e31766af5c605a1a67834702052e7e56bbd9e2381163a9bf16b579912a98bebabb70587da58bec621c1e779a8a21c193dda0785018fd58034f9a6ac3e297e3790 +Result = F (1 - Message changed) + +Msg = 307bfa6a2764591bc31537fcbc7275e258f158f4b7ac5cb03761aafee8ff0c58a933cd28a38fcd1a29a7c907050c273bffb249303ea0007d16c8c4aaaf145afe9cc97285d33a8bd42f566b1bea7a5ef77844e3d7c3b55132ac7407da04f1a7e85ec7f2d03b667d9c3c52ebeb1d25b392fb4aa210aff2dac00ffd1b14b0e2112f +Qx = 1d9020b8e6717254eebe619d46dd5a9dda7ba5491a7d1b6820fba888e236fafd71179200437f4d61284fb5a3dfbada66bac3e6909ccbeee03c2b93a8bebe41a73f4 +Qy = 048a5f09174fda12704acdd8ed560695dec42864b6300a030768a0be7f09d25f82d7b126125e41417a145641937807ed8d1af7a53f5bc3fc3c57427d755dcce3e25 +R = 092df2dcb457fc7578eaacc98ffd73ade07d764e9553506f3dc958cdb3f65d37665528cb2f5f8bded0db0a57e6fa73bfad1aaf94718379d1655db4f32d4c505a785 +S = 10e0c31479c2b29dc2726fe9f75b397d9e37a17619e96bc631c62e9ece71f05b199804cc803940d43ddee41171dd7787668c7db05049dd5b63e4f63562aa700ca81 +Result = F (3 - S changed) + +Msg = 3629ce6137cffaf0a485594cd47049e7866fa81bb56dd66168567542c6b8fdf7dbafe693c919a7288a03f2483b09c9cd2b3f91670264672967e4542d5bb6c87e861115ff3ec2ec2e96535148623e80525abae8d71f296a4e8947b48bb64074ebb7e0c7a586f57b35da910704f44b41151ac6db350c47e81805fc6932f435a98a +Qx = 007067d2cf7b7619b9fcff2c898246ae0950439b8bab92d809624970eda18456cb99953ce1ae45ee5d36ef02fcd5caa4d951de8581f0c21e572caad56d6dce60da3 +Qy = 1913c59007a309005f226b6a30122828d60b4d0390359e1977f88b5347dacf2056dd362648e8b1d6fc038a3bd3fde6f1140c740efa9075ab8b4a64b334c5cd43f09 +R = 12aa4a532c108aa3cfb1753f95ca626bb72bd96a423d727656d4ebdc3f406d6cc6c44d3718f9abae8a0b46be9b57f8fd3a540326b63d0d4a8a93165715920437787 +S = 01badaf38e16efd75915f4806f054d40abd2d11e402039bd48c832f66cbfd145e4dac93357d476b7e608d7b75a017374ae76eee86c505f2cc16eaa19075827ccd60 +Result = F (4 - Q changed) + +Msg = 27383a923d22292dacff105f00d0433eb719cc5fdf0d555f05a75fef392eb9a2b10aa7984ff8cfcc1425366578d138d193d735706e9689e1f2590374075c3b0143cf2a6f0d2108dcc3d6682c060e036c399774a3bc7800c7f34cba204693a42803df6592165fa19e34b6c1872ea11aa13e7a6648a4f0d56a5bf41dffd8f03aa4 +Qx = 0365388d9589c18ae608124b4cf746ff488183a912e07d26b6e867c5defb552a5a0df5a16b6342014dd1b0b6760072bcd60045d6a9a514fc74d16047c2e8765636d +Qy = 1a5319b26fd555f2a12e557418f6aa65a3461aeaea5c0c6d8698ceaa5495eed7a7d2fed0b76e77b5be11834f36e413d5288e47231c0eb0e9007d4b042bb7a1b6014 +R = 1d9ef377063a592cf81e27815a2c20789ff9b60f7f125e618b52d90b35abdd41cd7f437cfad337953ab0314fe8e79a2f2d27fa08597d4b28313358f714a737321fb +S = 0f01d4f150e0a174674a6a61a58a4ba781406024f6dd1b5252e04807b8a807a4ff8d52883eaa258286e506ef4b04ca890e6f81a79ed9a0cd5ed585094fea0bc5c43 +Result = P (0 ) + +Msg = 2235705a18ad2fc1940d6f1641ef3b7019e56e1cad01aa4c6da18150d622551206dd00163e71b9c2b133f29507fdef144c6fa4a1110a30eb309b04b3f3f9d7f5d6649ec3cf9416c8145e12a0934db1e48ff14800b238a4abe1e2b95ae6984a47aba11408b5f4dbc2cba858d52d58022b66ba2721573b83d5b62f07f38c4c58da +Qx = 0fd0cac24aeb75ca50c50a72340256b43649050e0fa155f72342877bf49c3d57ac2b51b828385ee6aea94bae38587e63390f5ef4ac5540a9e6fc6f1c1e79b524693 +Qy = 107b227bdd307efd7a8d4034f733d150c41601215e76eea2bac62ad2427dff52f75f46da3d5fe31bfaedf071d2a8bb5e3c82bf6c84ecdf89ca233c92d599d376309 +R = 1c00196aa5dcbc4c4404fa76504a5eacbc96aa66c3ba531a3a679f3fb675ce58f863e08b0d2bdeae74d96ad93a39a78ed4bb3749e26567d0ca5c48a71079925b617 +S = 0f1188eba4f0943f4003ddad6a54606c13af26014db2eb8e60534fad3dae8f07c021cea0990987f1e02dce03fe53360472c3dee3c305bb3ef4b0b53ea6625bf152a +Result = F (2 - R changed) + +Msg = f1f3b286307569704538c97c680abd5bb892b421463895c74aa8e1c4a46213f21a95941b8629af8117c2a00cbb71f44d79917357d529e486d8d5b8640f809960973fe9e28b34c6e4082f3b3b0689fd44d3afe5b71bf4349d32b7d80ef5e22d58f19a138e1b676addf384b3e54795c6cee53264f883d080630bf48f498761e6aa +Qx = 104a96beea09d88ea6789a9925880c8a9ece8d764be931675640c1bf847ac8e7a8b14f408ba6722c2bf6295db9132d6ad2fe287fa6e6855f7c58ed238148a896944 +Qy = 1b5e8e643fae552261427ea7d521f380adf605579462315c75e9203203ebdc9ee33dd7ba885b6cccccbd2327462988223c4b31485311c935a341ee87ba1ee820ce0 +R = 0ba2c57827baae684d2c637590275c782a6db263a5358c8e1a08b5460ca3cf0f5ff8d4119a6b0d55fc68a75c793098e0a5622a0b4e2fcb0f17943440138d751797b +S = 1594beb73b2ebb7c573ff07b5c43e722dc05979df0eef53587e9fe06a920f61d2efcc7671e6cb875df4e4d92cd4d37cc3eadcb9b6aee8f2097790ce24d6dcda8706 +Result = F (4 - Q changed) + +Msg = b6fd672065774d5c252a6a596d0373b898465af6778c7219011db482fd94a4e260df7fb7bd3703da7293e96e5324c12f5b8e1cd2c27dc3062007b6ea08e1fcc819ca099033eeb0a88ae28fe49be330a1b727d49fbff8f497edb45b8e0fa1553c33e26ff9b4c35b729b85a6e98654ec3f46a2089b6f863033498e1e4aac3690f9 +Qx = 10d587aa82a4d8e690672c00e3fd71826d892862d14dc4fbad4935aaab86924dc7ee6f7fd3e2bbe86a8652589448494dab83d363d1d623cbae59f6c2670706a0576 +Qy = 1a9734c99b6ff21267050738937c30971d0f6fe07e29794748a5017ea1036c975c9a52e6d3739ca0e8d70e784529cc1a7437aac5d75c69121b69020a95356137f1d +R = 188dcb840dfc573a97117009226d58dbb930ba8ec848931786abc770611f3519c8ba73cceb5b489170805bcf04974672fe66c908ba379aca99fa67fec81a994c2d1 +S = 00b1a185512dc6a65e454ea2bdb8049ef8f012a53ae87b759fb5d9edba51ea32e254e80545a99eb4b7c58af96b7c433535fa3f009cc644b1c97666d88355af9fc19 +Result = P (0 ) + +Msg = 297660ae8a7038969a7f0838cd95ed1885bd20c5a69a24f5fc8a63918c2167868ade4e372390b0c5ff198315ca1ef947d9c85036e38ba1277f1e6146723bd8f9ad1db6de80dce053c4c9e4597630a02dc514683310d3792a4831df7e8fcc77298f2a2fc4c071412219482a6e218c916719c613cd249a336f823632aeccff486f +Qx = 182c957a62e2e27aa28acee2e2f7b1ed6aef81c68001d2648da47d2b621e8b8bd18d991cd1e3fb9afb84f639fbed1050584428cd2a1d50f877532ffdefdd4e6f7ba +Qy = 05fadeef58cc0d79362b599e94636f9c70e3e5580c085b7ea52a5fd24fe4a892120b8f28ba53ec249c42d6d3b36268b8ca8464e54b72d37327d7504d9b7ce534d95 +R = 1e3a78e973fef6b6de8a0356401e89f435ae5f49c0173f073c4dbb9c91463e420f5265eade8305f11d30fa8d97e5b4c5ab33975f73385aea81fbdde2f7ddf7fdf16 +S = 0efeca10b5362e05a8f2e3df6661d0d536b32ca1e0a62515df2d94eb314aadb5eb40468483e24b16efe85c503d6c231ef860aabe674b72ed1ddd93853338e5e4e50 +Result = F (3 - S changed) + +Msg = 5d058ae533538ad5f6122e8cc4f5c6dbba56c9b9e49d7eac506874683b7b20093552db5ccd2d819ad554eadedb9b2cf613b73429723caa9f21b9fdff20d575f17b02bbedaa9e2c6b788ed90e239d9def9d108df3cc596fc5e975c59f1d78b9be3fa41c4fe86d1dcaa2d4876c494e14bc167736fef07563d2db0506b24da891d1 +Qx = 09911b41f9af525c874e05bfdf050331bf830296911bcb18eec16275027d63fa106c8989b07921c7e58b02711b5b5880cc4e6d9174e0d31060548cf643bf7ed4f0c +Qy = 184fc0fac3c2c80c69c1c0293f4e5e22fa08c267b1f36ac5ad6dfdf4da1754f7942f48cb56f56cba05e22b91508fe4db3703066e8f697aca56f974f3fe530c9640c +R = 17b8a22fd8f73112310867909f234fad6aa82999c28ea5a2e74b4b4bc79b2f89008b4d361ef7e797c7656f7d9317eff3e5a4982799b8cc0db82618bd2aa3959f617 +S = 1edacc6d1c0004b2090d2025d615de1fd53a96e826a3930c7cafaf3c87f34b2583997534cfa127485600a7ae04e6af4a2e98c77fd04507195e520e80014aa982a3c +Result = F (1 - Message changed) + +Msg = c805a07a01e3806dc81454ee64b3afb33f302dbf65062c1c31169bb501fff4c4a1905729a4d0ff463f2349fd74596b7d51414419e3c92767ebc9db52dae4df2a83cee45486dc1296c6422000699c72137178ffd666d2f1d1a105972bef6eef74e704d8c815bea269512a32fb1b8dd82174e04b2d0d5beaa0401284a7e2bfaca5 +Qx = 06da3b694e3123ef96b3fd2ab964f85a36110590720dc1724a5d50d3050498957211c6a1535032cf1f31240bfab967cc0cf3b442c35a1bfa3e72470df1863d2593a +Qy = 17d0a5dc460c85d0365c7bdc2e9300e276b8aa97368af9972744f4422442afc601ecfe7903a33b0354c901c7b61f29d2d3c5610192cd188291c5651754b385b87a8 +R = 1f9cb1f4e2e65282a929acd8b685ab34da176f5c73bcb374fd1b09bc995385ce3902d6c5496b02916fd5a28f6f8bb662828a76aa0ad14b01bc24a63b328c7bb949b +S = 01d6b3a2f34e3b7bf63d06b11ace172ca61ac5a911a4b408d766eb586c9ab820d42f555e546d892643e12a6752465427c213e3839e4f8cb3a7e4fd83642843e8544 +Result = F (1 - Message changed) + +Msg = 05f1b975f4f446a1b8aef50dfca608b03574a83a7c78d5c2efe1660a034994917455b9c8a774ae381cbfdfff162d36b9a17bbc6ddef34517cf8fa54bb6901f42def4b787a83d3285eaf04621c58267ae6d2bdf20b3bb4cb6c4bd8ee5105eb3f049c44df4cca39f6015a3d316f08af97eda47f92a53600cb2304a2724e40a9361 +Qx = 0b7e03f0d623a0998add5360dfb0bfe836fcb0a46b0d6f697ba6b3766bd8698ac8c7af62f50511c6aa5e613f4a99fa28f70b220ba1cddb22482be74c969953ae6e5 +Qy = 0d4ee40ee4441dc85356760f87ba32e2e7c269a2e53a2e8425d5ff02f5e4fe8d65cefe20e162c3915d2eb9ad1354bd28595a86dbdc94a5d40c5b44b1e3aa3965455 +R = 1fcba4781de6506f7c3f26521f0e036b5225f651e69e115d6784b2176a666edf69d759627468400a73a136f599fb8db4643fcc16bdeeef6384a1875e1c81c36b962 +S = 0a21cfaa7e1ee0eff7efc3d7e936378500283b00687363070974483ad474c58c6b55b77f678d78e7cb44d9745f79394659bdd26b72663608384b5ae9cac1c888d13 +Result = F (2 - R changed) + +Msg = 3a8d8066c0bfc287e1434c2430261110e33d0ebf69d35b65b0a2d70763c7fec993decf883174f216a6c0ff622ef777c078cae5c6724f9a020f8ec07041dfcca3689a8abcce10efae0a2da949b87459586fd012805c54f0807d927d0b64595c6b18705b49d497cc2ee8b867f9e58b1382e25065500d1d7442944283346657a835 +Qx = 01bb7c623fde41beec7ddfb96f65848c2f52b50b39576bf06de6ccf157b8ec49889528728480928236300447da7171f58c8f0e0ba8fd3e2cf378b88619aa6c1e0bc +Qy = 1f8b20a1a7df319bf78c2cee03581a1ffe8ca5107fbfd40760fbd5ef5247e2df1092d5caf504a9ee653ded2995f0cdd841d6af29c9f720770056ebbc128705f68e6 +R = 000db4c31f316912295c5b9506aabc24b0b2dc2b2358e6b023148889d9200bcf44762e88575e359b4868b2d93ba7bdb24800b09fc22eade0744b9832b71ee784e9c +S = 18c84437fac7cd82099a2a4230084ac27ec7ea9c92e1c9d9a71290df9b37dc881f9ba59ed331c22dca4b2cbb837cd916e0a78398d2b7aaf8e88f113a942beac48c0 +Result = F (4 - Q changed) + +[K-163,SHA-1] + +Msg = afd1324e877bd73ddc2ea040fa6fe0e70f10837c4d41ffe67b2f4f3a7bc41d24dc90c159ecd28b401cca36e9b9c31ec0f2ce09471d8dab50273cd7a4cea721455ea4318131e4c55396a089f4280a2bef234005d775046929c6ff784caaedb5559dca9e6f1800ce61fc2399dfd0fe71f49c9668d71cfd942b85dd59ec94ab543e +Qx = 33ecd8f31b2a4528692e8d6a64da3b1c4a5bd03a0 +Qy = 2b0357df509db56d5b58d9de7968e5b44a822e311 +R = 2fb6f4f62727870a1b2cfe3d7405aa2f4a1882718 +S = 3d70d8106ca04c2c2a3ecb4f36df1756b7b685f39 +Result = P (0 ) + +Msg = 942ce31971ff206f3457bc318819eb8c0855b3114fa08da1f8957919db02d477ee7f85f2c95377ac085ece0e8cdd1d0ea6a2c53e72c2ce1b7aa17d22687e08fbad96119450d837c324a3ab9408831b5bfcd73da2cb95687bca3438d364d5db7bca248f7ef99377925a300e02c6838412a398757b29f0da0531cfc549222b131f +Qx = 069b337f2903942473650163a3469dc40171f9f26 +Qy = 3ab5150bf75fe1f74fa7da7185d402c59f1dcdf86 +R = 052491b94083f675d9f809045cd15a8ee03c51591 +S = 22ebf942ac6d825bc35de8528c7f7280e120670e2 +Result = F (2 - R changed) + +Msg = 21d738272430edb754051e653a636c9594418f993b5dd9d2eca795c5b542b59e485f8791d1ed4a0d0c78209e7e4301a532141295a7ac4d496153fd7dd0ac89482392b44cd6e945f8ff8483e633c4ad08aa3b9b5d7b2c4b1214176e65c78483656bf6c86099d569e41cc05ce1951e5d6ebf5e1ab4873f2f6139a41183d3faecbf +Qx = 1fd28958ccdbe15f3e8b06382cdfeb84b6da216ba +Qy = 785dc6495e81807d4ed785d5d75fc665a786200b5 +R = 35c1803549f650a4e6f70b8842cb4bef2cb738869 +S = 3f5de8ff3886e3fd55fa4b252f4f8635ae50f5f5d +Result = F (2 - R changed) + +Msg = ae3130f431692a4085cccd79ed6d29d5d78cc82f14b63ec6b3b4320795bd5c83b60837e3c8c30e5afb3b1cd0f41530654d3f3a23fd80af9bf0b159b256e28e39f7599209ea0a6591b066bc72c5e65ea1639ba72ad7f4b111cfab892edc1ced5b33cfb829fb5e8e13bb4dbf6ef5558c0c28712d1f4807e49b496287d438e1ac61 +Qx = 22bac9a38527a690277d91a2ba53725bed24d950e +Qy = 5286c5817107e55030776f8284bc0dface6285b8d +R = 2a8f5a6f33f2540a82313ce64a0b981e3cecf7fa9 +S = 377efdd4acb1bdbec7b5415c3d43b6b1c244e53da +Result = F (3 - S changed) + +Msg = 51bcd47c27cc88f8b246858c9214808dfe37544d6cadf5928fb0c7f4c47240e6a2868ba42dbafb4a0d55ee5bab5d607c87c735507a3a0ff2f8a8f528eb31466130ba1b5841ff7f16309db52734a672c2adf2e9fcdc3c30cdf3f5d32d3b5edfc39b77b8dc5ee7215e93ce602fba0f66e38004b6b5520a2372a24d886a50547078 +Qx = 744a92bfeebb7f0f9b530f53c15bb3a8a4b3242c3 +Qy = 0e8cdffeafc748813d57cf69f5d6b42f81988b154 +R = 0ffd0a6e8fc7e7b30fbbad722f7fd142918ee8223 +S = 1400a45137e9b02f1a486879af01d8545112d4f83 +Result = F (1 - Message changed) + +Msg = e312a2a8fdaad5d479f089a52ad8bc02b3d32f3013926d74a37c5eb34545903a3add5820b3bf48b9113ddf0f3f4f87b49dd024d577d4e6e4b26a28453852bf11cd745cbbd0fe6e916e356db0e7dc8beff237c4bb96cf2ded9b589b78bc63e7a70b213081bc77badc7bcc4f59b005dd7da9088e64b8c3ffda4569cfb21ccd5204 +Qx = 435c2680e772064b7570968c3f1b1bd4888145db8 +Qy = 1e28987868629a95ac57c15da77244a69c8206c53 +R = 3ef0b18adda1096a48fdb0534f0fa8bdffb414857 +S = 2e4f1cf52e815ea1aa15be254122754b57de3691a +Result = P (0 ) + +Msg = 772cb7a6f0ffef1dee9443b12f32d33294a760c08191c5998b24db84ffb743bb59d25b2e28175b587711879896fa55ce04f6403519b5c95869523a41fe13170a010477195ae142581b20667ce5dffac8e18718dae26bbdfac947258473f7ea21998046e0b7bf15e93e9db2f957f9e6e3639eb01a4fd974c527e19f531fbe9f60 +Qx = 3b8a2cf0c4b7a687b883269b4e85e33dc1f3f882e +Qy = 07f13021145c0322fe9138822d508af71ce7795d9 +R = 1663e57ce8894055e34b7636b9b1db78c7d8ee2ad +S = 175b29bcea846f76158a08de0af1853944cde6cb1 +Result = P (0 ) + +Msg = 5fc741ed0e37cef6b62431fb093d0c666ac21b18475f66b8f5859e4dacd7b60956211fdb7f73ebdaaf76894d7c5108a62d8585a333f8e08ce50a7a7cb3a4a550382ea929437c4f17793ecb3b8c929c40f6161ebdb8a2e9a4d87acfa5588dd3b962c3935a58c345369ab9765e96cc0e8ade83408548ce61ecadab589928492414 +Qx = 4586228a5ed3055d55ad404dc0d791df3c37999f1 +Qy = 1240f103233bd427c451b800b19f63c0c7034701e +R = 36e351e409ff0327d25f908f6a03db2f697309398 +S = 03a85a06e0af615d71da81fef5617cdd264847950 +Result = F (2 - R changed) + +Msg = 242f0429356ef141d85b0f73cf873022d641d08475a33c5725bd5a44ad0cbbbee0e44f004c11b72bef82b24be321c820c01e866b34da3c6d56bce8edb77f273795b3f6abcb955f22893840809cf11f5b38e5c8b19a678c2b0c7d1e374201af16789b101426807e82c5b55ef1f40684fdccee5ddf2d00e1c63f3094d30710d3db +Qx = 060c3f73534694117c03966d6bf097ee5e722a3c6 +Qy = 3f5dcaa44046de8df154d2795746a62472aa42f42 +R = 22da77d2f4be01abeff507718733d5583a3a7e192 +S = 3d3def91382a4d46297491af9392f87c04edfe25f +Result = F (4 - Q changed) + +Msg = 05ab88f92bc9b072caccbab9ca80f68068d82d6887b5cbc6861b6c723e6a0297d360568fdf85be6880936a6f53b16d2b0dd0fd3c9e9a4984db5e61fb6ba58278b124c2c776a89e46d514c33d07a7d5a9dddcaaf0dd10caf93835a830988e14105c5528cdbfe7f7bbaffbedd9a7c06f954af4018cfa1d10fa92e3297cc23f68e1 +Qx = 57df1aaeb1dc9ca7cc707e84f46493bb2135a7d98 +Qy = 20733ea8b0d04d1ca4c1ba761754d41c93a8658d9 +R = 3cb4180d4daab23e9e3aa9dd2c6e99c9e458f287b +S = 335c68e4610b99eebaf07d345722610f9852b0937 +Result = F (4 - Q changed) + +Msg = c078a5206f05c77a4d50639ead4d1807940ddcfb368d7f1a777ec11f3d0b5e3fb9799dff84f2b410a04b2d2f61226ddf3af6b6afdedcc26bb1a328749fda490d0cc220bc55be469e9add1a89a2d868d4562c2463ecad9cf1d7fb3d5e2555d2a6139d55c72bf5fdb0f5d4b1fede8be926badb3ac4c856bd3b5c21b41beea3eaee +Qx = 36482240ddba3a04f37849aa4c38739c518e028ec +Qy = 5afb2c63e69ec1a19997d40f7d8175be66c861297 +R = 156d9f733038c102403c24c293e02f0009246886f +S = 1c5da656f92db88e55fbd3cef4fd7bd444d1295f5 +Result = F (3 - S changed) + +Msg = 8adae1bb09497a760ef3bafe7e391fb22334293279795ec5eafd183f1f706d352cb16d4bb33fae3863717aa2ee21b4eaf44a1f105480f68453552a70713c834765e82c08df24f52d95517b0a54886b2b7fd562f2e88b7ca94824f95e2c6c1c8aba04d21110514c8b09c9810f5a70f7e3e3a363fcfce0d53f4aef58c69c3875ed +Qx = 2145ec8e43939c61981373f3013366496e2106327 +Qy = 2eb7ebc4fe2f3b44566d898e382c24c2bcd562158 +R = 034d815677a1f1b1aa55578ee3a753f1ba858f9e8 +S = 3562df0654fe5ceae7d1b03ce2f0c090c0051c3d8 +Result = F (3 - S changed) + +Msg = ae6f29decf1d8225630b0e347e1db6c5ce25fbd3e1b107746f1bd8b781e12154fd257a1b26e70c19def8691b7cd47b293b7c9bc386f6aef9243c897ea16a07b9d753e380565fb1959f05284c1c61adcecc5c199a8be1655719f1a453c1b46251df71c36faec50ccf49cd3bab0121dba3c1c6572d7686a47653ec5d4fe92dd031 +Qx = 3265f508cb6d87f452d52556412c55d7bbca908aa +Qy = 56be50cfc347e781416416b3c137c454da4b964da +R = 3f38b03aabcacc98411567f95c4c667def55c5ec5 +S = 32697f804c727370a1e987f5f15ed4040c4b83422 +Result = F (1 - Message changed) + +Msg = ad955ef0396a43b669c68a16b4342e53a4dfba0d397a0d0c121d0721bf252d3298f0d67630569ba8a1c34369578871ed9619d41f76f5fc6ca835411033c4bbfeb86076fac388aa5dfcbad5969ae043df6110dbdd7a33cb3f3188097cf5e11865aafe290e17a8d917c67967d7341f844e7455a9f8274122a8a63a111ba5ded82a +Qx = 270041e1508accb9d60f65db7f29eab0eda63829a +Qy = 5a958fa9effb8e43cbf35362f8de75c51554a4720 +R = 3b130fe34005c325bd44f7b86e2e2c9726be1f891 +S = 3ebaf6b82f4a2a47f6b10f78bd4d9d41a3b88419c +Result = F (1 - Message changed) + +Msg = 8d7ad83308772c591c5b577973e99bca4499a853359a1d8d038df2b9a45e127eb9c244138dbe9819e3f95553ea96201ee2c5898ccd4d3f2453624ed86a2e5e628dd14e2b87035dbde2255223a396f2cff880dcc7d8482e96b9d50db8a5a35e408d0ee72c729ee7f94dcb9eee3c63dc4a237d9f51138fe149d5f9fb56e093f182 +Qx = 29c26b6986e2f1225bce07a38bb741d07b63830f3 +Qy = 771785d4e32db0c7f0863ea33ae3a00c929e7cc29 +R = 077a788d8dd97ba121d9e319f5a2359808fafa1af +S = 009d2516b35705c81f0c80228e2e02f6d936f3f92 +Result = F (4 - Q changed) + +[K-163,SHA-224] + +Msg = f7016b4da0406dfea655d178eff155caba0a1d93863fc8ea24462f8167b42809c638f892cab5c1b6a1626ca9c684f100d16d4d9b0d6fd90a43dafdf8b6be6c793e724c05174159be24f0426556df1f71591561222813013a175fd713dccda1ecf7f39d5efd45aca860351a38b6f07bb41b1fcacb2548539c2072a54f7747722d +Qx = 389d925968c5e0639e8dab9279ba863a70df5a5ef +Qy = 63eae5a665406ed191f6df15265fec0e455e2e9c1 +R = 0f755617aa6e4cb39ffaad147818e26d119ec2fac +S = 0f3d0d8acb53e9b2e66613c4c2c130a777190045a +Result = F (2 - R changed) + +Msg = d59e1347ef158a812fb3a9536d42fcd4724c04ef0e80882d57fc9f7b7de32fad8c1289e777ac7849170c02790463aeeea6e5fd6722313fbef75ae3369f792308bb59ba6d13cbdf73b383c12636d52fd9cccb9e5c6890f55ef54a9c865f590517d9db6bbd7173b738a4b940e8a10600a664aae475389a614bbd78ac68c9220bdd +Qx = 661068be45f1a1a75438166ba0f30fc5d76934dd6 +Qy = 59f5a42a66ecc94fd49879303ec1112ce84e33751 +R = 30929f68bf34a94708ef376369b8694573e70dfc7 +S = 0ad9cfb7ef1b1d934d7597416b115c2ee824e8a3b +Result = F (3 - S changed) + +Msg = 7ef2cb3a222802edf3b0f60ff935519637dc5cc62db543720258f1df899b0ae09259a3bdf25586c8d58d0155f48652905f40bd1a5247810aac31faf93cacb6dc2a3bd12dbe1569745dcb2d20a1fda543bd537ce89980b2e028a76e349a8f45206d76e50316859317c70f1980377297d1d158a64c22f782d46cd99ef3bc7f2a1b +Qx = 7f86b09c9cb2e80f041c9e1bd86b0875aaeb42ac0 +Qy = 56894d29d17aa768be48f18763cf368ea0b037d51 +R = 0df81ccb48127291a200e0c35d79556d0e6c4cea6 +S = 133008d83f5194a2b3471a9faf22a8b5a77c0dd49 +Result = F (1 - Message changed) + +Msg = 674e8d46d4a31422dd81d3abd5014b2b8bc22a28ba76359f451a8c39d7201b2a050a92ad03367d0bd3aa634e0518889c8992aa898e0972dad4a0330f452fa2de02fa8c42352b9b26c751ad581e9d3ab242aa2fbd5c2f69880b8ca6ff5ad1e5838f30921d2e5af95bb83cfc2c4389df9430ae74a63bc55e3b615679741dd26d17 +Qx = 64387465794698b5ad84b471e1cbeb3caf113f1b3 +Qy = 5c1b044af75cfcddc45b17995ef79b2817adc1110 +R = 3ea2871e2637896b6b9915eb672783f601f983034 +S = 26787ce8489b5801de588f7b85a5d30db6a8810f4 +Result = F (4 - Q changed) + +Msg = 3d588d6f8f77426f6f3130a35afe8b95a77273e46023ab6ac5608b2d80193e172b3451ae291d16f1b8283ab9465effd09ba1c7fcf00b2c996f1068e899ce2b2c14c1bf282a414bc97f7dd38324f2323ca0c28724bef5dcb17fee6579e0e4093205b5469c2af1839898128c652b1c94d66a9184aa2b2eb05ca53846c7655eb405 +Qx = 5f03c98efd07658828a75f29af95bb883225cd170 +Qy = 0dcba47bab292ad7eeaead11c0f735286a2c407e3 +R = 13fcc1956656db068fbf704715d4a1aa59eea69b3 +S = 38c722438a767507d10759dc4934f87e3ce25adc1 +Result = P (0 ) + +Msg = 52598c2e846c91079682d4d9641a88cbc78eb73569d42b5a6c20a731405b7d07c0121fc690b080d7b472181a05cc700cc3e39134b4364c777bc5aebc459ece4b8a3e5c1ab16c7df63a166353f7e4b21981d817b5db7b8b0986aa84a14c62da6fd1121e0660246f221b5c63577c30d1a2fb5c2a5a5f61fe67ec19214e7c89eca8 +Qx = 45dfa6274d726ff9e627d04114aea124e14f99a6d +Qy = 6cc4862f41c7bf92e4ec4af2d22ad1763063c949f +R = 19ba121e1357845d9c9c6e8c7c975d32aa69f7e28 +S = 0cfa06e312b55fd472ec964e093442d524ed7db6e +Result = F (1 - Message changed) + +Msg = 75a06692365571f5f49de3269fa6543de398c56a1bbddb510e575eab0c627e9a3cc62502581d1807ed034a2c614ba89a5461737b6975ddfcf6fe262ee8ab5162bb0d16db15e4bad302eadd409d1cd4e2a317f92197ea661581ecf7d8d99ec88221a8ec25db8304d98fc5da6f1f7b30043d27f05e6c00be372c84efa167883111 +Qx = 5e67dca24ba1aaf5303ea9701126a4acb42c06504 +Qy = 6d177af939825ea6607e96a7cba4e3ce6db0c9f6b +R = 233c79dd1f6a65381f9cadf4b55e080c1ddd4b705 +S = 0eda18a0564e7688bace40e0240cf5b2ec3a83cf7 +Result = F (3 - S changed) + +Msg = 1bf6f143eeba2b482068ba04ddebee3ef10209ae115f4da5c7d7b25a7a60153583b14c314936525d326918093710dca5e85776d00fa7f20097ec64324c5305b3c37bc4e48d9f6f772bf2294cb1a6fc5f902fc3379c901cb4da39553e0241ad4a5672d13838f2a1e23c2b1d533598f54b59fc7e0994e4b887f6a912c57dbe1290 +Qx = 1be8cc969defa342904ff0cab3c54700ebf694ca6 +Qy = 4b451c3ba78e6586cbfcb8883c00d28c22f6e0260 +R = 2926f26156775b2140e7aa052e2680b58e3b57a6b +S = 0802fd3ad812b310f6a93d633552264f881a97fc5 +Result = F (1 - Message changed) + +Msg = b785b24defd0deb0e930adb3b0895ee1223f07d192bbe17d218c2616768bb0ff31272726c34a61e1e0806e06cbc2b9d48d7cc448b5383412bff35684007b6a2200d508703fbb25cfe0867e28e87ff3b67ee52d822f29cd02f7e1a91883d89c4e030475cb8af24a77331935dd6fdd94337ec19f5cd0ef834dc162d2cf5c2c6071 +Qx = 344ac6fa6b95ba7fa60ca01b7d5042aebe06f01f7 +Qy = 13d126306a362273950013bcf3a60488bec0a1b65 +R = 2c3c99d6687f1ab76ca328ef1321e124ab334c964 +S = 15d225e1d5e0088be34157d2e80a98225beab93b8 +Result = F (2 - R changed) + +Msg = 33e794e2a7e2f35964f33785114cd8d42a1ba14e4679b24075fe19486cd7557d66f42bb3df7b796fbd06a707c314bca8e7ca9395ffc2e2365f49af37b91a210fa12ffaba439c141d377666846c2e3550a55e451115716e73f51f8f1a38eb41cd4732be4ede7347b9a6ef21540808b3518167ee1472d1d02f40918daa113a2263 +Qx = 0fd2e532f7f851015d247fae7f10a9dbd05f10acc +Qy = 200d90f1dc0b169b0b32c396edc3d88cfeed6ae65 +R = 3afd056542cb8c09b299f2907ed585c3bf1abbc70 +S = 17ff99a79ab2067e9d310f8654594d970575ee1f7 +Result = F (4 - Q changed) + +Msg = adb4b70986d9c06b4f877ac58767b2a3d7b01043edd5d079bfb81a683fe3fe8d64730f3fcfc66eaa35435af12d079e4e34643653c250d946708bd3a0284673b4d36146c7dddec1831baf99d6551a744dd92f6b2f0a1796479445c62ed5b8f8d0fe6c229245947219ba18370abb7b551b28bdd350cde6ec2a494a8fed4e768291 +Qx = 015f996e2abf0eb884bb1dc1590fd4b64f2b249f5 +Qy = 5a02183c0e81d8f3230877f2066b3f324387408cd +R = 0798a8dad7d304b438c6be33cfec68fce140452a9 +S = 3ef7e9c9a5479661e13475ef66cc888853cb6320d +Result = F (4 - Q changed) + +Msg = 98f582b03c3be722f4657ff7d980afb96166a5066a8815d847b16daf4f4782060ca2d8133b48f25aa156f58656dc6553632354eba5f820c624d9f7b79622902e7bd452936857d5e72651e0dfbb9c26235c291be8cfa776d496f34460652de6bd2c7e7cac910f6c2bf912811da9d6972602d68578803f7a35f1e073b4f469dfa6 +Qx = 3c88480805470eb5065cf518a538ad882042c4fef +Qy = 0209eb73b2e564c8c98754d7967095dd55e4d4d14 +R = 0879065c3b64627773f205fb9d729f079361ec3b5 +S = 1e0d4525675fb72764de61b7504a15da8905086aa +Result = F (3 - S changed) + +Msg = 08d665b9ca15fbaa2047768574bb92d063ed7ca0e762cb05986b491657b686183724799f5576f05d160e548a23b4c84117fc7e449a7765061f7389c2e0522da0d83b1f12468f915ba25e542adf146a41b6b78fba76029bf586930e2aa4ccbe39def58d3087ff1df1ab0b3868f34367ef0c36d38be2ad37266965724ca1ddcc09 +Qx = 61252855af1ab96ddaced6635943de206df770ba9 +Qy = 1b0064bf2577a5fe4655b6c1e8efa0bf8de2e4fc0 +R = 04e0bd3cbca1d6b28f22d4abb96c597e512e990e7 +S = 1cc9ec2532784feb9f13f5f93f7699a3f003b4d51 +Result = P (0 ) + +Msg = 28401498d7d6a75b8d0eca8fa35d7d6dd344162641c2fe13a0e611a182c772f7e440cdf63a2b268671bcebd41af1c985a5d67ee4aefd0fc26b10969f35c3b6b10657eed6b9d57325bb034ea261869452a9da95c511890455f7e3db3489990656270e613428283f24a4384ee3127f886c9f1bd047aac507f09439c089f3aab8b1 +Qx = 3484bacf926b4a5bd516a8374801695391596352d +Qy = 352a0c71c5becef3241009b1831f5ada798cb6e9d +R = 3375751da88e19aa3d26a862624f171d81e9bd75f +S = 065180010508bde92f5c159f12222f26ca702b344 +Result = F (2 - R changed) + +Msg = e883c9144b93e272ec14c223d155e46459a228a8f10f37c4c8476d4fdad2d453e092aaf4ba4b2e4ad405c7d7f86a7a89ea62003ce0c1ce13c6b0cc05d051e188d7249eac9f43838608e12073744759cbcb342b72b5bac10872de5ad9ef0b2fd9a42fa44e79779c953e1e512bc4269d9a922faf1e46edc4359079a87974a79380 +Qx = 60ec9dfb7e73c267e7b3054bf0cb4962f92982ea5 +Qy = 7de7decea83f84ab1fcf080bb241023fec0edd8be +R = 0e3a24abc77c7bacd339fe1669914c49e896f0d42 +S = 2dd55657948233e84c4aa6c6d351b3589455894d6 +Result = P (0 ) + +[K-163,SHA-256] + +Msg = 36c6b824012460b73d9a1cce453eae5505d952d34f28e2490a8f082e5d6f445f8aec031e15edda57c0b364b248cdf84b2043c4845e2e81ae09486ebebfade2850628d36e04f52077b2cd0746914aa8b7216df1e9a9342f59b4ed2157fe7a812187defa456a3d64c47e42d6bdb9844616a1b3a15bbdfb8828622e39ca0aab7610 +Qx = 76c3013015e54a355f44f119dc69ff79a6220ea24 +Qy = 43312e3dd36371e6e6028d29654c5050829532643 +R = 123cd916b9d0e681d2589b4f69dd158fc763b3cbd +S = 34eddf7c7b19a5fd1b90f421de1094f1afd5932fc +Result = F (3 - S changed) + +Msg = 480b24b8d46a7b023516b37b302df8c5f113a13844cc146f3f4a78e102a1a1d475554224efb2577ccc073e64ea2288ce31ab230a0faae0ad0819d2d007b7b4607018f5a486274162c30b0a0a581ae798cbbe46eb38b78a8096b70e20e844ef74de37466c2f9d7e30c9397e692ddcc78373b28b25b945e91a6cdbe218ce94b5f6 +Qx = 09e59b792cbf290b1a5558eb2bff0d050cdc94e55 +Qy = 23e83acee2ce8cadfba7d558b09bb60b8df01bf6d +R = 23f53c4eeb57843ff82f3d087081f7c858de51c34 +S = 3afaf8b91edd1900e57dae40afe1414a78e8c0a1a +Result = F (4 - Q changed) + +Msg = e1ffa02b8359a049765196823c140a82defec326ddaff88fd9e47189e8734c086de84b8335b6a655a26a4a6185f8aee426e458e22c4d3caf3127f64ae9a2ad2181c7dd3b9dd9adc29c2624ccc32e0ea441f6524b915f03d736f4be65b268d5bf3c409937c0ad6087d951701c7867d2585a2b9c3d4fb149041e1ef12f534d61f8 +Qx = 33fef189d89620780b3b7d093ae2ed9075c4339bc +Qy = 49b4a6acb23f0e8ef899982d6cc7438521761a07a +R = 22466c273a29100b1916d0f2968e8434df20839db +S = 1920f30c82972b8de69589bb231fd793cd52f154a +Result = F (2 - R changed) + +Msg = 2a4d77289ed9184fe22833aa6716073cec9278dc373b558d857241335ccbd617eb1d6db7a9682bd132f2ed8a27b44f5f2d0d5f41f7dfc86bcd5e02607d2c3e23056b8b4acc430fa91cdfe9ff5bd8bed0c64b6197752e759746086fbcf6f5997bbaae221ea66008721c66abe55f9f0e6109372911f2223483132cc938ddb66c36 +Qx = 2dfcc77d88454d56f6554964046c9ab3063b5d2b1 +Qy = 50662c61f46ab6697d5aa1b9811f88a1671715f3a +R = 143a9219f6f5f50f16c0bfe1573cdb3d5e903c491 +S = 222dc0a774dd4a81599ef8ef0d6fae11513031f85 +Result = P (0 ) + +Msg = e75a3be7a8a7104577d72891338f5580e57ee5214f29ae43891efb6ba87055c3a3145ec11f2c790f949bb2f9f61b63e02c8237d0389af19db11b8dd2a2da46e1d4bc390a1dbab226d3a9f7fefe209a1ef152428e9c2b99361090efbb9472df76a694720497dec63f82184ad39c282354846fe2acf6068e05894dc729f044ca2f +Qx = 373c4f4353f923c578ca2539c6552bd4aef2d92d6 +Qy = 649727c39aa3cce9cb693e4c6e416619846f511b0 +R = 222ce5b6a2a993c2f3d533e1276a11ac04baf098b +S = 0a6cbe7929c6555d86d48eeadc62197895ed107af +Result = F (1 - Message changed) + +Msg = 6113e9623c289b500bd42878aaa261905dffbddc4bbce957799561b53a42e19980187b2eac6053fe080e33ecd2171eb5f90239fb36f140c59615a97d18c13cad3e4b69885c038c0a0cbe0e3f2726fcef7204e11739b30d8b1b0d40ed44b931c6116aa1264bc631a6ebf54ff4354aa855edcad319d33500940b34943104560ee6 +Qx = 4e167afdaf35555bd5ea7df37d2368539de2f41ec +Qy = 08008d831d6cde1753fcd52b2c901a6365c4d0d98 +R = 2a6885861ab21ab6f8c3158404b2809ccf19d6c16 +S = 16688fa011b736f10f5bd94111bfb01a30b84f43a +Result = P (0 ) + +Msg = d58033f8fc7d76a9a9c05c0f9df7f825d2f38fdc7f61a62f7d05b30e65d38060c08d5605aaec3867484e5f047a456c8b143f3cb6624969d2d7d8d5ecca79d3bebb8f441c8f5bf3a9530b92526f3b030171725f3665dc36d936722fb4f35f5faad6ce53995ad6c38cf2a7216afa5e0fc1f62f5bfcc002370bfe6aeba1f8b1e49d +Qx = 5f2c87f0ed73dec394bc9cabd06bb1d559a7062f0 +Qy = 14419a9697afbf8a48be41bc39a54622d1fd7d95d +R = 0089046a096e18e5fcf647218be706a7fd53be4a4 +S = 39868eaeb01b73e26725da43e69e45dbd809e8d2c +Result = F (4 - Q changed) + +Msg = 5e29caec586d58dc9ea0e70a643f7e8fb6724e878aa892db0d7029c929ae3c3b62318448d52286b10cdad8b7295d3e1852b790093b0f370a37a402b2cbe04fbe7fd9682c3c1314ab9af82c40fae806afa83b754b523ac43429e64e8edf9bbb96b88db46608a18883d09bb18b307ea7da0edcdbb9ab6ac4dea4ebd5dce049f37d +Qx = 7d05cd872b3bb108546a26ca46606917a01eaf645 +Qy = 52941401fd2a2d3b6bce67bed2b4187b8ac7ffd26 +R = 3661f6196bcab4e020f44f64f82d5e0e1fe57f595 +S = 2dccb91ef4621e1f9459ba3afac68cd08714c4e42 +Result = P (0 ) + +Msg = ef3ca1be5c2a0449c09a344a7fcf9e9b335029bad56cceca72863374d9afedb3bc68f1a69d9a1a1f7b797530a47ad7a34cfa68a9601a74863224be6afb3207a9022d5a193dd9e8db7b09ca3339f32ac33490afd5807fa56aa2acfd56cf6373ac527f05b0b4641bca00776ca1f5b68e06680406d4e1e6abdf3d6d8cefb55639e1 +Qx = 1999d3daaeddad83d88af4fcf9c3daf2a846fac2b +Qy = 627a8f8b10caf0342f3905dd35f17f6d1cfa0a0ca +R = 1422948e7e46049ca42c0ab863db2a9ae7b17255c +S = 1ab478155f05eaff5094a619d5992d9a53f92f095 +Result = F (1 - Message changed) + +Msg = a52507451cc6345b14e662f9646e26baeaadd7a115fecacf30c79b555dd53e2a0d2c5a8e0acc73a13f86ea9cbec68e373c69ea43fc39708f89e3580443ea8fa950aacb8e1a413ace79319a3553833def9deb85463b640c385b55977c206dd48aae16a94da5f7d0c9092c38c60c4ba35d32c8b554899f615d962a5c0003156ad7 +Qx = 0b2abd329b93b59673fc2062beee93c4eb5506f90 +Qy = 6ba250ef99a76fd17412b74b7f1f2c880eb9cd31e +R = 21da9919ad92e5fd3dcb6264bf50368f5155b8e77 +S = 005d0ef885e02f1d1a56e7cf68a3e77601cda6d55 +Result = F (2 - R changed) + +Msg = f9ab9620bac1f529590f636609181cfa4440e2405452bf52d0537b7d7deb24ffe4084d38ecccdfc82a317e9acacaa8f3d877d96344ae2f30f26bf6eebda3ab84bd9eca7dc15726bcea74dacf225f9b08617a523feb74dbaa091cb5274d787630df01c88bd8c8f92b115c418071c6c837a1b48ef391b0cea0589aa2fbe1a88a50 +Qx = 50941fb5d8a06d7adb0247ae8f05e57d945dba82b +Qy = 37eb54ee6256a5bbba6fee5e787eda480a194896f +R = 0a5663b2f8f716a26eafe1355e1e2a1415ba9eade +S = 0955643a446a1515ad474d0c89d2199302ae4af2c +Result = F (4 - Q changed) + +Msg = 0eae123c5a24f1a13d5db1af1f74e8942b1666fcb324625be1135caac6dc928ab0f3bcaa336b8b82ad1ccd00871112508830cb08fe5c9dee3f1efa409ceac2fbca49d3f1c2367efcbbd5bde0d6269256c74ad0f1b2fca3a12ad78d1dcb3ab6438aeaab06147978db0297c8e2893f512aae32bf418a8764d6731b8d23c4daf034 +Qx = 30c2654fc28a5810568f7a12ab7538889a58c707f +Qy = 12ff689203f39018b483f0c3bf2cb3f1426295f59 +R = 2ad84dcee156b8baea144caf6aefabc94a8073540 +S = 0a16cb7237714876720a5077c248dd869b325fe82 +Result = F (3 - S changed) + +Msg = 80bd4ffa9cd2f46479279c71e4a8960573e243d02ae955c1e2b66ec9e94aabea0752d69e1dea663bbff2e0d8ced18863bc64390a0a8343936e318374bfe86e3bcbb732fcb53a44c87cd6bcc5b8db4a3f6518963515de8fb8a31449c666ced3a1d278d6ed04d541d1055c540065e3d2e5343b661cb13555ea3a4bb5b91121d21e +Qx = 55fec16ee93d12009cc43af62eca57ad9ff3800f1 +Qy = 0afd0adda200e0933cfeb393a6ad10b0b3b5a2244 +R = 0a0e16229fefa5589b56f4ed4f50fa99419036f02 +S = 170abf3a55ccd031f073340fcedfd4a34170357aa +Result = F (3 - S changed) + +Msg = 727e77409d98682b01ffe2ef12642f36b5b0b1e4c918ad2ca613c6de40564332db6147ba58b5e29aa68715a8f25376b336eda670edd87ba5151ab42ec66c6e41824e8d59ece3586533bb4c64ea783ea40dc39d40aefc526f8cc80f97f03cc8e070f3c243c52e31d7680bfe570245d010065d25701b046f9c1192c377f638ffd1 +Qx = 5661912251b9dc51713a7965ef7262094fecc9420 +Qy = 7bca37ad53e19e128f0b372ff9491b4df55ad99a7 +R = 1b1d172d272ffd6c2e6c7681c1bb9a194c02d2125 +S = 0d542020f115c1515673f90bc2b62f7c7b9fbbb24 +Result = F (1 - Message changed) + +Msg = 197b71ba9a5cbbf307c5e9e59c79d6863518bf48a655a5ab55f9edba46ef2fd05fd4bacdb52ab09302b772d6983095315cbdaca16b0108b7bf8a3b6f26e0c050316034fe8b53f7885787b92c17c790f20a4445517c974bddd68fbf3819d3c39acba8c4dd0a674b48931f76c7ef586a985f780870a7b5b5d9c30deaf0b2d60386 +Qx = 7c6dd5be903fe1e45d87ce2152b0d94d9b461948b +Qy = 1ac2b0e7ea6393256b65cb0ffe8064f091d91a454 +R = 386a0da595a1262fed828f558f462f1b757d300fd +S = 3b1a0fab7d24535de8bb5b9c1aeaafcbbfadada29 +Result = F (2 - R changed) + +[K-163,SHA-384] + +Msg = 257dbe64f65d630b8ec48f933421ae2bba997d00cf5ade93dda9b15b14dabfc9527b06d5180f36288d281a72abca5424ad2f1f68f3115167070289f0153bf39c19ebb395cfea2c9abe3b7773ef3e813089f2bb552ca3d571ef4a3695c50c252c4a05312cf4ecb598307016171e88435004a16f56127b381ac1573f9b8d92c58e +Qx = 47dc4ab6eb1142612bd0699f647a4992ec2b4d17c +Qy = 25d0e38173c3988c1d96d66fcbe11ce426bcefda9 +R = 3d63cc8283d690a030c2ab11b26cac3e79360fe51 +S = 0f26893150754618bfee44920194bfcb4a9abbd95 +Result = F (4 - Q changed) + +Msg = 755c9edef70b85b10ce3b760a3fc6de4db5823d6c4d202adcb95fbdb3c24b0d2bdf34a36a01152e0b63d9725cec9c61fdd990df161ff21bc55dc834238082d72df5cb2127518e46cd17c63c6574e84cbded7bf769b4ee1f17e7010d535d5eb70997086f1f554ebcf5410ba41eb2f049b4ccc6e0c8a76ce065c52bfd8e968ca76 +Qx = 6bfe070e7a062b62ffd7e10abe2d5f43c6c8e9b08 +Qy = 2cb58bfb1843d7b6dba67c11bab68f922e5b1c749 +R = 27ec7a456305ebb4f04a4a12893e39b0febc45319 +S = 1f5a42fab3dd3e792b7ae03007d216725cf010334 +Result = F (4 - Q changed) + +Msg = beaba3c9dfdfd090ba08657e545f6fcedda8986600eb52d8dc7444a3eea868cea122e1880c56ab0a921e7033601cb5487a9e03505b0f21d0d5e21b75acb526ee19d3f1ab776e5a47fb98f819a101f02354552cb29d45749d4b8292dfb7c7876254de4b196e89e0b2ffcd96846ba91f7a06474087832559e9ebc69d529fac086e +Qx = 023b2f02c821e2b546667cf07a2071709aa7d0362 +Qy = 04f044fe2d146362562eb9b11b540a240ac0a8d97 +R = 1d3bfe668ed2b4005490137a386313a4793e78a6f +S = 319cd3fb0bbc434f9bc40b18bb5ba248c0a7f1974 +Result = F (1 - Message changed) + +Msg = 8a9bf361a8765020adc9610bce62c6f131b15b393f7e378343b72860620c516f37ebfc4d2ca4d29f8f0337e1d490e90254cbffac7ac57127db2b1f1e2ddf47e0c403c61c3820c53ef4f33cecc99f03af1eb2afd0264b27d5317c011aca828eb88c44f033f8141636d5558f9a10d957daf058ba8bf1d1a84a7c6f32f5d7fb8ffe +Qx = 1c02f7056611078217bd9ca435acfdfa191180f75 +Qy = 1529fadf5fd94516ab1ea5c9beffa78fdf8054d6c +R = 300939301c5103d8e670877cefbc56b0c1a54ce07 +S = 1ebb67580825e42d349acc41cbd1ff7b6310bef99 +Result = F (4 - Q changed) + +Msg = c7891686c0b16ef736846655e9da2b17b58ec537fff80c678287756de6b148a2dc43269bf8fa65fc3b3026f6162929bd03bc22a5359139808b0cc41684b84abb0614b5552a9f901ccf72923262fed65530696172039fb76d72d7dee9c411b5f81472dd147b16ea722ab6352a53b748d848c6829eff63751762f40f01c53fe48c +Qx = 74373b5f8245e9c20348216556bf97620ec46f2b5 +Qy = 4ebe3ea3028f9f2493c9acba45da0214a72c6ae0b +R = 023d05d5136f5e9d39401511f4b6bcf8bbacea1f4 +S = 38980afe51489896b05b28821124c15b7cbc5d886 +Result = F (2 - R changed) + +Msg = 85e8e6a6acc785b0e12fd156a3c083df9caa1b8c5d8e179524d50728c16a25db0ecafacbf8e5e7cc890d51e1b581ef363341b9b24233a73dbe000ad0262a8a710a446623c34294fe6de9351eb4503080a9dbc061862a28e9e67dcdfa0178ee153207fe900abb8ab6d4b5f09e7d3a42935c892e6313c4e84751a1bf53d1011077 +Qx = 6cc97833bfc94ac8c51086fd87592feeb72bbefa9 +Qy = 459a7abe1d4fb0595a0575c7e648b39bc72a4fa0f +R = 3b2c8fa6f4f9ccf9ceaf24d40045e950a44cf3953 +S = 3616df75db902a7ef81614be0384edecd24c76d71 +Result = F (3 - S changed) + +Msg = 9594f51c8ccf9ae1247711cc6e0e3c48d949dc27ffb508450684480c1eb30462ee7a2aba309bb24571e05aa09ad0d7b8cc3b36caff77bd653e405c2c6f8485c7ffa8a94a4f63e429c83dfcad8e9b2bb2619afaf54393eae8707cf03362a8fc38bad41051ac051d09da708c848de61b4695566cd65d8934f77db8fd54d53eb60d +Qx = 3e92362f37493ddaed8310a4912386099e65f755e +Qy = 777925bae02fb9fc268ba3e8c8515886b428f1d70 +R = 2b6e3e8a72be128f98a80362b30d24c28ce126a26 +S = 2d1702f90a008da3e920c52a506ae01596765b9d8 +Result = P (0 ) + +Msg = 71fb659737da12e53ae75705047e2af9c8265363f02c30359e738ee058a74e845af8c71766466e5f3abb931cd9589f22494b5394a2985da36dcf1807fc8c2bcf38fb28951aa0b97c8845d0c5f5f619df80402bcab96d23036b2b013f4d4d7fd38a8cce38e16bdbf2fa3bf87e69b8c3226477de04689745e234d67df388588e42 +Qx = 76798f8460740bbc0ff4533d714d02d561711ab7c +Qy = 2fe9f24a5b0037bf3c57a24229a51ae5943cb858a +R = 01b7d8cc2a5be5404d9cfde720b7fa5038efeb490 +S = 344bfb611787c025c81e9afd7d4b9075ccc142aa5 +Result = F (2 - R changed) + +Msg = 8f80e7bf7f3885627782b5933d753c4a9ee5be66957ad874340b4d1447c3869fadb7574a84009d164e8a0167ed08e6751193273e273aff7a43794e8b3cb5492c0aadc12193ae232f9b96bd6a2e3bda708051a6a670545f451ae614a828bea42dfa9b5d2a88de4e23a25fbbbcd0709e04f75abdbe95d5a77d201b40807b591c43 +Qx = 22b4355c5efb83fe013fb899b1a81c7ec13ff901a +Qy = 4381e42526f0ea551d6934f9e97d57f82ff35d846 +R = 36450514a1eb31ebf43468f263ac8c52af49db738 +S = 38f37054e20a1523ccee5a9fc03bcfb5b1f286e43 +Result = F (1 - Message changed) + +Msg = 042f929400b07a48121da12d53fbadf7a93243bd0b4cbb3a650086e4b1ac5a361bcbe0532f5b2f5af55baf6e08840cdd07485b8da7c103e7280872150d62dae13fb7116e870bfe7de21acb8b87a82e510b3f3ece367a86236c099077601fed7b5db22dd4bab897bfd2112835cf5217709f157d4f36bf42c73ba48d1a98849ce9 +Qx = 68ec67a9c9367b4d77c44e2a7fc615ba4ee45a8d9 +Qy = 2019aa77a2cf437583f7fa8a8940fa527206498ca +R = 2e706118aa86952b19d358e0284e24a63d2224731 +S = 0754983731e37f031a9e6c85f68e4c536b73cdaa7 +Result = P (0 ) + +Msg = fcae4cb00544c56bf683570a257042c58f69be8176f7e76a69b12bdc8a94bf20af3c91f3f03c40b932b14007eababc539b5f29b3eeaf06f014bbaa8f7ea7c1d9b9b7e7440a6da574b26a15d8cb81a7295034bd70d4f7b598f1052c5f402f869df7f134740536433d3c9df7fe73fe9faa9cf3f8615800f4a0f6ac84fb11245fb4 +Qx = 2d9eb41717a9b6c12c5de7dacf4f5aa18a01eea55 +Qy = 6aad9a784cb7e3cc421c0943f9ae17ada6eff0108 +R = 24cf80f36ddbaf3b6c2a389f6f897f648fceea936 +S = 2b62047b422bb1ed503d890eed4e2c1fc2973f2df +Result = F (3 - S changed) + +Msg = a510bdf99a2fd0900eb7efb499cd3d11f843ae524fa1d51aee32eb8cdc004212416c342549438b4a116bca8b6a98699e03f46aab7c8cb0bf5bfd1f2f11782a3f54cf8a896e522770ade076c11d3ab3a55df096fb9621bd3cac506567bcb30c40ab651a541050e363c6f8f47156ec0c058af721d63c2eb6ae8dc4a2880a5bd24d +Qx = 3c7cf2bce87d135adafdfc7a1b62cc3d80a9be827 +Qy = 75cde5c0fb05dea17e6253175899b85a624a5ce62 +R = 0e7e0ce2fdb58fd22f68bb5a3e723874fbae40744 +S = 1a658a7bd9e4af051df49b7bb6c51f1a56292ebf2 +Result = P (0 ) + +Msg = 46b849b8b81eb091f2682b9f5bcd736782693766da42f421c29bbeeb7ccea56494b0e5a2e767f80a3ea1b373321f939a5007701646aded0e149b728494787554b81e386bd88d7f700bbe8828f76420318c4f1bd28d6f68dda8d7686a3416128dc788db55be0da433d84fb55434a054531380a3cebdc819e9fd12500afa8bedc7 +Qx = 1ebbcb5d28be4c63b63691e90c0f7c371fb856148 +Qy = 311040edb9c5f4533c9879ac83284793be4a2d105 +R = 14d5e53655c03c12e0087b1210ce0f048383f18db +S = 14e8c03a71daaba3acc4986617e165c9116792c0b +Result = F (3 - S changed) + +Msg = 1323930ccd800ba0601c6f0f992dda11f2becda670ab93870212a4cf50bb2d5c4292a617202e713fdb3110d976ea87cfeb3c029f91bf293903916ffc7e61b475a415d158b8345ddf6dcadc57bad72bc2703b687f8a9425547781430e94794888dc2dad1250f0e3481480dcb97ed1fe0a21346050baef1b472ea4ae4b76113304 +Qx = 4a6328ebbaf25a02f641c7b07f04f6b9e48012b38 +Qy = 412342a367ea453b07fd91241d36e97535579e755 +R = 033c579b37e7ef7d1cf211bb99a510b3cb4c293a8 +S = 03ebc3d335f8b0db42f18300aec2adc0a8173a271 +Result = F (2 - R changed) + +Msg = 4d34443f12dde0deb503d88de4bd84b73c8ce9183ccad11e8aa223fb60e8162d60f88e3c20124b75f85cb063b6e4df98d3a32718532d74b267c4dbe28e1fbe73f388a08da477da9bae80afe7828fd35db1cd9202b7256d311e49792d142d7f576ea8c509811780621a35c9dd56397699cc6d5349586fa36867321cc9a6370eed +Qx = 4a109cc5b8d003c8ec61582f7f9c22e9429641d18 +Qy = 04626eba91b1d5368a29a6bc9cb2815e12f080b29 +R = 029e2b1952d28cbaae039588201d0e9def5495064 +S = 2401fad0efb80cf37e452032370df42c1980fff38 +Result = F (1 - Message changed) + +[K-163,SHA-512] + +Msg = 410589d6dc79e3a1ca51c9fb84a3f1cc4c4a0d74e8d539b10e1d03aa8d0a9304ac388e7ec378cea99e93c411c79ceae8990dfcde8383fcb1dbf8612a49af0936507df3603f25fb866363e472c91a50df4b00a43803531777ecc0fed8c6be0e1b403d1647e4165f2dfe58d6deab4b9f01ad1ff429c458d9991fe3c94219d98076 +Qx = 13b710e91e2faec1d2e34a4a0a32d944531dfe2c6 +Qy = 6d2f8ddca633ca0c52c3438bdf99c18d35e66de06 +R = 254412da587080f5e911461e96256ee1477f9efe1 +S = 2f8e1cee60a2c4d6f75f8765bf20c882cdaed654b +Result = F (3 - S changed) + +Msg = b87af93bb05463cbb6d61c4c696290f8ab40771f4a9dcc7052dc7b031eb57c68e33e933426d89624c4eb8a604438a8ef7e094357a54b80c9bc70bbcac3609a930c456edaf366b7fa1e70d0d7f15a2462178548277d11b74e5e9188e220edb6ad46cc9ca3e6019323d8806f2bd6af6b2ccea5f491f4642c69e651c218a584b9ec +Qx = 0af0f24629c1fc5f0e968ff923757c4857430df4c +Qy = 7dbb6e661caae47a78e50ef97d65eea9cfc37ad7a +R = 315141e67772d3658b76777998f457e1fc8d53f69 +S = 35a129f92d1996f4ae04df5f092de41c41490b205 +Result = F (4 - Q changed) + +Msg = 014855603ca35d201fef46ed17161d7110d133457877e862e66f0e9e0e10773e217089dfd728924ec5849c1801b5a85c4623fd8e357fcf6c778e5614e6817ccf435640bf6d400b3694e7255c3c855872ca3bc79f3bf38c805cdaa20e1e0cfbc437c891a2687c4254462c02f20d2a5b8110daa86e5bfeeb0acf262773c2ef2c29 +Qx = 27b272f13549466a930e59cf28039b6275fbecbc4 +Qy = 3cb630a44f888a520dbeb35e29879ea445306fdcc +R = 36682aa4d99d8d90629456812eda01eb1afc5c30d +S = 02f83faa2e844a8005ae32e6ecc9202984133261b +Result = F (1 - Message changed) + +Msg = 00c724ef48283d768b1ec0d2de238c5787a1abfad0c75dda1d070ad361dd00827a2c55ce626c505a3fd984f8bd1590af9546048f9251440139a44fd14b2b5b7975b2f1cf1041ea9ad76685f39f02af4f6b7a1a88dcc47764f5bbf0a7813603d7496a913287773654226956f80be2bbfcce486e4f606f3b0f747c45a314eae681 +Qx = 0bc9eb8daa9d1bbc80ea479ef923d96fb5b29f50a +Qy = 1d60172e81f2b9e967c1f96c9688a7a8b32a8ac96 +R = 29817562328d26f02658dc85fec2bfc223fc32e6d +S = 0539afab0e94a8d7d6882060bf207957676ff45ed +Result = P (0 ) + +Msg = e7192ba1662aaf55cb253fefd76777405d755f8069a064ad6a4d461b39ddcdb1c6beec4e7d28716a1f2b302aa10036c07322e744190934718b8760405994ca146e8b61427acdb22f004245a97ad9801894081b4890ef5c3b810e651f64e90ad39227163d9fa9d0ca181e4d84c9a08c6138df5764acd2409ce7cb331b2ff9b2b8 +Qx = 19645356b58efd5a0c0316c27a5a6a772fb8b63b1 +Qy = 03080853fa9881b07f60f48368f42a6822b48de17 +R = 153347f2f04a34a35bba1f2de5632fe2c5de90537 +S = 1d68f6da4538d0f6290dc0113141098fed4a9ccdc +Result = P (0 ) + +Msg = 79ec5ca3472b96a1ed0a43c07e45357eb08ac7e99582d1310622bb9894f0ccc9dac0c4a6188bda796d7773ea6f33fbc203aefe89a43639f7484f677265684e74dc7e63e360b30aa21db354769dfe218a582e93a7232c4ea3098f17b55cc33137fcd9223e2d019748c18f1f4c6a50eba649019bac386e1449c4aa2f77640901b5 +Qx = 6a47b48b7ff7ab6fb8cb59ba4f03d15ec4eff7662 +Qy = 56fc1c22bb33b50468342d50ee23c520031d43606 +R = 0bba125de5e1115ae3f9c85023ebfa6ae9fec4f4f +S = 3a272566cc8fcbd8137e0e698120d1568b155c34e +Result = P (0 ) + +Msg = 7ea69aa563ef94e2beba6834c1a4c63b3a75d4cd5a4f86da9b8d263aaa0e5e48b97a022a9ba4657ac005c5f9b8f77b1bef1b2467ce319bd5194d490908a7e78dd078c6c4fb366591d917def82ce80583f91fa1e38a91d2957c03fa6ed92be5009ce3d8b80cecffdf9b87cfd5d454008748b296dda1356c2cdd158ce365276d02 +Qx = 3c6ab701863d6f1e4181db35295352b36b9b0298d +Qy = 203f37cb5f86b44e6cb1f88104f64e81297f2d148 +R = 23650659888c4f4149b7db4876306235e9d0365e4 +S = 1c566e9639e9b607a618c206a498c9f153e82c611 +Result = F (2 - R changed) + +Msg = 979fb7bc4a1c093585bc5e4ea8d199dc7ef4915c66f216453a5f68d8c044841a1efe0cfd11e268ac520d54f6e12019267594a425fdc18ddcd00430ed94831eaad991f296e55790d11b97e3e6b0c347def0dd1651d4f30c6d7ece51c4d6a36d29c5a15df8f1853de744405b20f3a9dd49be45a85c8cbd83c44b221c744973dd0f +Qx = 50065d1b441bfcb1bfa69d13ca53f9f1877b401dd +Qy = 18f6c71048cf2bdcac3159d0333cb5d66c1d71dc5 +R = 23d5906f7837ea38a4ee0f60c2ae14da4ed61cfdc +S = 1c82df612de124d20459ed2afd00d3bf5ad84cd48 +Result = F (1 - Message changed) + +Msg = 754abf7a77d73515a45b736757825a136041e4537dda15101843635d5680eb0c06b80a0185a951f56a1fcc0a1bba61364b0dcd605eb20e9d3cf4afc0a9cdb9064ff359f07ca580415b7d12038e78d4eb7039893d08bb65d0d536d74068ab653200d1b4ee4b40c7aef85d0cc4eccaf77a3b559565f8f3af410fc9a6237d637f10 +Qx = 7fc82a493e34311108ffdfbdb4d40a2dad95022fa +Qy = 4ffa0ade159562eca8c379e5bc4e4b9027968e527 +R = 2264201525ec2d1e27e9547868420e215732ca9bd +S = 26ccf9178b9969fd696f145435a4f3affab98ecd2 +Result = F (2 - R changed) + +Msg = 88899e0c17e196ad17485d79920d8d7db6ab1a4029d43b8821dedc3f19ddc96688d867a5c712ce6748ab5065211c1b26e3760b9d2ddc823643e1083204c3beadee42c261e9c5930f16edce393645cdb31c88cd3cd50804f405baf1d467c340040bd28644f97d9981f1be9be3ac33a6bf068f6fbf27cc6e31e6cb1015beea9f0c +Qx = 78a1029522bd1ab697025427e3dff96520cc4fa75 +Qy = 61fe7d75b4197d2d0c297206d5d496b485681ac00 +R = 18845c274a2918c4989e7524f34f66a9b0d293c86 +S = 129b2943a8e1f5307a0160fa625ced90b9828f577 +Result = F (3 - S changed) + +Msg = 7c0041a0f9ab0cf8f13e7935c69a655244c9cacacb007d757103867b29c0ac45d15da2955585d93bbc12f07cf9f61e127188719c8738c2d1eea9ce4413f5cd9c8722212b64385af88619773f007e3c8976424578de2b9d2df81fc390ac83aa4c0afdffc8eda41cd75d05acf780676556da9221824a0b5ba640718befe1ff1e78 +Qx = 1c0a2c22ecb15e3168fc960c0de6a099259bb925d +Qy = 1d9217146f946cf40fbf43207d190899beda154f8 +R = 0e5c367538369e45c0e6a7f6f8ab5985f8ae5de39 +S = 34a74b010caea8dcbd80c8d37f26b0928afd21fd7 +Result = F (4 - Q changed) + +Msg = bf83da620de7a74de4e31f34732b1179b15a2b9c460d7c76aa933af058cd731eac32774fe3c0e2523b8faebc9120c55efc459d930013dfe4f51894e9d792ba30ff27114546eba10b9e72b65a136e7750965cef1db72c0902d891a8e54868bd9bb31695a543c96ef568ff4977c24cf00d34d6a0f6e6303c4ffaf3a7adc92aa8f3 +Qx = 073acb866d82ca519f835574ee7a137cd133168a8 +Qy = 02cf51d1f6f4a51194716eb51d30d3a333d7f7e74 +R = 2b3a5ecc52434b0a6aa6e65e530c3696d7fb1a7cd +S = 04702b9753bcbc40e7ffb37800f24e554cd6ca981 +Result = F (4 - Q changed) + +Msg = bc565b3ea1e773f7118b14ab82420007f43ecba2043d5c6331fde7e683db3b0f6660d925b5ebd14503501fdd0dea3310b3ef913e13bf0d89da3824a8d6734a8b9abdc89784c093eb9dd9a541cf2ce1c7a3d338759ad5c88aa04b736984ea94504ebbcf08a7d06029c47d2d4dddf0c8318d683686589b838c08ccfaf6f6a7d9e0 +Qx = 1c716d19322956b08622f359d1d8cbf93ede0bbcb +Qy = 3f210ce01ad63cc1319f0e039860d3b22e205a425 +R = 1efa106928a67ae5ab764aa2f4d729e88ff0f80c8 +S = 23ff0896ab5963491a7e02cc174cd632357dc8023 +Result = F (3 - S changed) + +Msg = cf05733ab76e2ef6e52974541f42e89a6f64790c76e2b5ef824d04aab1251bc96ff218d52bb99b33ceee6fc31bcc415261014d05b3144c536be66a3d2c3fdb1a98cc03f4ce0c5fc2e5a28251d42656bc360aa036b042bfae6d39c9aa0cdb40b30e03ee9161b4f6cc5e24fe40c7721659aed8b8b44083cec0f09a807610e4d47f +Qx = 0729ea095ee8dfc4be2333f41a0d9d38b57b0a738 +Qy = 4b7c7248d5e62a4779b39add6297b1e58c2cff5e1 +R = 20aefd06e95edbe8ce663874513f78c8b09c432f2 +S = 342edfafe63bba46509a0ecf5a5163404625f00b0 +Result = F (1 - Message changed) + +Msg = d3cf40ec78292a1beba229ebeac58d889d03c4bb36914da3e94a4d92946b4ba9811817c949af1df53115626f8ff90000974c9dfe3872d3231c91a03a6526f4413acb2a61828ff3932ebf92cbeb681f1cc65cf4ac5238b789aecbd1d4afdf4e0ae623e230646efd7896619cb3b20f5eca4ac63a0c45d0bc13316e5155563a794d +Qx = 734180a5bbba49f47434db4420fc2652d5027fb10 +Qy = 5263fc6bbd3d1afa86a543b0a7dc044b766939d18 +R = 36369e8af4686422f1dfb351997d09a4a207a92b2 +S = 333861b1eb923d7dfd851b2a2bedb69fe99aa2eda +Result = F (2 - R changed) + +[K-233,SHA-1] + +Msg = 82a4da2741ec971c42cf873c69c0cb54059c7975f96536deeefd6c414f7b9b24009caf6a95a34a3757c75cae615b7b34bb5e2759341f59eecf08ee5771a837bab41ed6018a69d9ee7f3f1b619b7d9227ed9af58345df1d17e2b383cf7d158a69ddbf8b7051b0e3b367d42d1d5e9748095961a52c90c8a820e7eeaaf5ac341d33 +Qx = 090d347615e437a38718081754277bc467b0b209048882c9d6964579caf +Qy = 15af61c298066bfbc47b574d8b892a2caa055ad2f54eea50f90207f5e63 +R = 05406c84dbdfcbe3fb6d537fed38b612cbfdd9fad21bfff203f412eb706 +S = 0225e7e4649de30519b414a2291b5f084df84ab84601788c59acdf7de30 +Result = P (0 ) + +Msg = acf035eb1d27f9fb2b38281560d3f75113320b7f747630bb9d7d0bd740514a9611de8291ee88a316fcbf3bbf208301f6e6147c8d705014ecbcbf4438b614bc789dea90da1c4f5f85488c91cfbb131effaabaf2493f9d9e07deba9e5456cc3f6b394bf12be5d18bd614251f745a5614d1144ba544ff1bea19c8af367762c6a435 +Qx = 032660861a79b461b8e2cfff0c12e2026d141d85f042220d7af016fe39a +Qy = 16e4d31cc852bab40f42e3650ddfa86c800a988675cdd311af0540ba677 +R = 02d8a32a7e61837306c53e8e8b33c13b5c1cf238594dac94455e5cdc70c +S = 02327008de25b63685eb7201150fa570695c60214a946aad6046a8bf3f2 +Result = P (0 ) + +Msg = c6e7da47c9767ce4ede2c861c256cecfc88105a48b1c7650795abe2dc5b3cb8837366dda5bc235a2cdca0dd53c51421d375e5e446d95e5234c5261e7784733d8053892de2f308d47a57c951b6b07db1fa09dd4678512222484ca224092c15165cebeebd1d101f5ff59ffb2d4df538b9e42a0336458b60ddc7172ebfd5c048efe +Qx = 1b9e14d2eb9878077d2049b976bc065d09cbd854c440f0e13fe0826700e +Qy = 0694547f07e4f5b9bbfa080290add778ccfd251e1b6d0423021af449cf1 +R = 0266403b85240de4169caa4ac32486573b5ace853e68702ab703588afcb +S = 0205a6c76a6f0b12892e56053e42e35ac0b5118b03561b42e3304f59730 +Result = P (0 ) + +Msg = 24ede25405a014e1bdc088d380fba5383ebd9f336b28c5317b88db04d2281bce7332ab23471e258a594dc219078cf2faac93fb079903bb78b5ab14e39939ac64955afc74493cc56bfbc1b20593e59b4d2bed2b78100e2cfe1d886e232ccd23eb8671baa6e031891ec9feb00e1e9bc1dec43696140fd008d61c201f2269f934a7 +Qx = 0c0b06974383f1ce530d3f35a4a007ae87d0edfbbd9e40f7b1d5ac9efb5 +Qy = 19a37f2dda74e77fb5a2a44c26e879853edf702c8d5aab7235b96c4945e +R = 064219ddcbe9943411485a76424254661f387690c1b98a9d4eeba35d2ad +S = 033fae62cf58940ce68761786af4fcc4792654548ff319bad7a1775d9df +Result = F (1 - Message changed) + +Msg = 4a3d4b2d9c6bd7817440f6556edcc92c8ec4343c2fbb33af6be78105533f4f7c61003c241f85dd10eb58e7d4fba0e3fb25a77f4a8fe8b644816bd1974ec03cbdbf6f4bd6026b05bf7df3c4c1ddfa8ac495f84572331680db4fe5593921458ac9003964484bcf7b9c1d698fe0937e0ffe17dd79e86499c8211f22c1e3987ff4c1 +Qx = 09f99d832e07abf4640ce10bc14494ec1f308ed12988785bd62af2a4d49 +Qy = 0362798346e64c5046929dc21e2cd2a9854a20ec9ac5641de34f45488b4 +R = 0012b4b82177c277acdafc5f9b894a9c8c57d68e590edebb224f3333efc +S = 07944e04e9ca4e42376483e1e525b98384643670749def710e838dbeff0 +Result = F (3 - S changed) + +Msg = e5910568833ca5cd3d8825220af6f63b90f85c031342a0eae9f09b6a929e8660194723a7b0ded8ec795eb52b666b42edb866e26a7a38c1ac000ebb4be76ff05b94150f91056fe5cdc4b05f48e7de121c21a3362bf2dae9d8c5dfc674ef6febab86ded2fcc300cfc674d56c08b2afa5187d14fe21bcfef1fc74ca6258d56129c9 +Qx = 131499eece1668047eb5c72c1efa847b7f283ffcee179daa881443b6d20 +Qy = 004624a14d6f03b0269fcb49d8049195e3fc2e7b2b93529d5a129bd6eb3 +R = 011941a6e892ecf120eff86048427501f96c3ba5e4f711b04183fdf6642 +S = 06eff8f5d52f343ef17a84ce9df4156634cd8a1b30b8c87067f75b1f85b +Result = F (2 - R changed) + +Msg = c8949cf5697500e75e1c7d297ad01d6be602d9858979de18f2983944704aadf1997e52269e23d90cf626842f4016c13aad7b00a859cecc122d88349cc30fcc9af571e9f71ac107868be7ba6f922d22a86309b78cd158919bc7e432fdc31387654337f579bb6dabae1a12a027f061da78b68fdf282d4cc11ceeb997dfd03a5f20 +Qx = 1091d399c10b9b57ba7ecbc772b28757bcfe584407a79eb162a01e353c7 +Qy = 11969e49d0d4ce984b2c7040413018864eeb5bdaaaeb5ffa6bd0680c5bd +R = 02e664806e10d43e53f3d91adc18b2b97d46d7cd75709c345263b8881e6 +S = 04f103365926b9ea787bfc21aedeafb2503311a4bf053d1a87203788705 +Result = F (2 - R changed) + +Msg = 1ccbb195e98a2010a56b0856c9d55e39edeb83b091cdd49dd9f1d651358e02b18bdd887e9aefac4262cd7c8322b81bf26f6a9710942c7af7ea5b9df2914724841adb0906e707f1da51f4a8f29a6e572c645cf0f8700f0045336c3b77761d35beb882b7f28aeedaeea3b897082f8611d5835dea174c06640c55a38b5dfaf9b762 +Qx = 0372e90f686d415bf6a862e896396fd37bd79eb96917fe7bf1d6a5d51bb +Qy = 019444fefa0c3834f67557a43f7b96e3e0c886a6ab84af076b0d58ff5b9 +R = 01abd6cc5d25711c9abe0df22c9d82926c56a19cc21b83b636f63e2dd7c +S = 04f0d6a11265bcf37efd5be5c17f06291899539c6ade61527a9d25256dd +Result = F (2 - R changed) + +Msg = 04632c72b2e03d5d31d15ac34e6e46d6b8b0347841ba6bee3014cc4e203e4b022096699d46a4b1e70fd06ccec74fdf2deb7eecf51b58e32e055c75511b744bee4b84a6be10929446a0426b0753647378aa7897bb6d87325e2c7de0f9c048f8a63eb861f753f88f25db2a4fcfc609c4ddd1255e6953b72f66e32ec50b76926f81 +Qx = 1b80412ccfbb3a36ec113667eae777322f41c061e402ac33b45eae2d03e +Qy = 0189390af920c9ce2451fbd4f5f4862b07af8c9182fbcb048f996ec6fcd +R = 0306cc9e534e65287febd1099812efce6f8da61477c07316e79fae76be1 +S = 03ac5639206b7cb8d73695b9b5af5cfeea5008d5d55229c04344f0a73fc +Result = F (1 - Message changed) + +Msg = e6ea434b392bb4ad1d330512b40da2c07b5a19763987a3229abbf4929f614a5ce3161d805aadccbd7ecf160f0ac573ba1447da8dde616d792ecc46f7c3ab471fd87298c388ebf2be11c2a935d8733dc43ae0b38599f5158cac1170ab0238df70ee8867f0687b158650fcfe8bc61452c60b7a5b9df15f2709578582f8852c63a3 +Qx = 0ce0d5dcc990363c8ad844fa9c0acb0954eae58be1e7a245c5a26ef9181 +Qy = 1e9ce85e90ede8d8e437ab99753af46521cf34a8fe82ac938f6fc16514e +R = 01799ee34ff282d28c6c74e25941eef748aa3288c31dd4203812a3f1642 +S = 0303ebfc4b395d8378ba2ff035b06f036a69a476c01bca76ee7c768e8b5 +Result = F (1 - Message changed) + +Msg = c523d6864fe87159d3fa3d76e4984ff5685d7bb5816687cbc8e1cf81dc8f8434f6278b4662481751601d14af7289210d1d4cdf9664235698c39dacb0f165b4b8a6d340d4928bb6fb8fbb9d185f3ec9e831f044d45ce82d5caac28c4b1b436fffada9e98b9ed26d0c998982e61323f1f89fd942aaa600f1700bf74c351e0c1bbc +Qx = 1767cbc3b592732602fad42cd76808f241b0e832896d6fdea13e4152f6d +Qy = 079472851b0b0d609e4fc17b5eed14643fe47778341b66a1df28f5411cf +R = 02f72f8c494b5608e80aa56220518d685c3776da84b981d7dd215f34406 +S = 06daade0cd6952fd43f4ed8cd177ae58dcabbce20f17069159987dd14ba +Result = F (4 - Q changed) + +Msg = 8273ab3888edca37bc6b32c1ca200453f98a8de80ca425098b582fc70eaeb9cbf66f1825a839bdc7e4fc62ac91bb740e29b6daf6e9a171375ef1a4f2a3085bb1ce704e2e06d92556390de2cc269b186edd440219ddd65fee927af3d867f1533789167f28aecb5873030a99f4d96d2831b391a8c10b5ffdeca31734cdbfd84b69 +Qx = 074440ccc72aa5dbf5dcf768154ed6159cdc9c28cc1bfcf5f84ae1cfa1d +Qy = 1aeadf591d430f06ffc7ad17ed2160c243be99025d5bc4947e275d40e6b +R = 053db98c98752ed41d5da46b6e3d3882ba300b7d011337f39e3a21e4f77 +S = 05dce91fd5d1bea8fa5d789388d970b93b1f2e1bac92de2e028a5f47792 +Result = F (3 - S changed) + +Msg = 59ab671a99d3a34a2dc46c9d8a68de6389073008e3acd17521a5bf006d9fdf868caf33f251d3b766c72462f8a62ccca5fa83f91073b38ce8e9be46ca8a1f5ab24d1850ffe0215a9a550c9b5b34b4d720ad3b583177e8e5faf8bf03cbb944f01575f50e426c78242b0cb0104dbee5685e96a177360e9e7f2bec12eb9d575cef93 +Qx = 1e4e5b6c85f4a750e9ee7451e04985e1d90ee6c9f388daf3dc6a300037d +Qy = 01d5dd5950c5920e0d9e9376ea1ae918a5728393ba95a43d42ff74ec956 +R = 06e666a16262bd80bd51e42a8eb767ffce24bf4ca022153c90603b6fc0d +S = 0343f88ed312ec26b48f80d4ed49cc9b7139cd1af54ab6713c496be5211 +Result = F (3 - S changed) + +Msg = f281ec71488ba9005100554c295db177411090f4d44d7a11f2077cdbebb232f90dacd42fc9bb87809d3a48fecbeac8c026efa014807d71af381b900ea0f2edea258abc024a72b21c54ff92fb49e1b0ba6918ce398693e1176f5c4d3bc20e70259d216207b7b284d2600b3a161db34ebd34ea3926318fd25feaa8c2dec493b3d1 +Qx = 1eb68701a3782a3c7173867735f2c76d2197dc07fc9184e6d67523b0420 +Qy = 10374dc4d6e30997aa83bb412734f46b21d6e488c576d39293b2db2fdc1 +R = 03fa446bb5eb167b5ad4e352304767f2654599b8277b424d308def77e73 +S = 0566c410cc1dd8bac7e0ef206d2498b1270d4dec6f94579e05b7331b3bb +Result = F (4 - Q changed) + +Msg = 7814143655d66fc35206fdefeb9699e8bbf856bfcca56860774521ad084fa7dd0d2ad18578ad1a53a996f84039ee2cdd9c103b6d164ad7935df2bf126501085e33c80ae2a3831a751711a53ddf1b4d0b357f1da3917c4496d720d94256a613c189fb67c3af79af7c1b019a27daaa91003044877e4137d54a175c434fa0e05d41 +Qx = 170fa20fb7138402dd1a2974f38e34aa40887675f6e82f72de6c93dd707 +Qy = 143fc0024ad4664b5bc4554faf43b62b1000bf00f407fda2eb3d69cb5d0 +R = 04f6ac584ac6456379e83931225e7257a60f24f644758cacc3721883d3d +S = 035afb55c774416aead6c2d75c45a4d2422facfd39447357bfa24c78aa8 +Result = F (4 - Q changed) + +[K-233,SHA-224] + +Msg = fc4cb7b52cd8a0350bffa51eb28875b9bf4eeb12dc6a84c2c5f18f7e98b92b77a8043f89a7aacdaff26cd2a2ab1562fd197357bd098b74f1c08f347205c1dae9e30e4ba4864e6a309b180b3de0d57196725744b7d144cf265f56739359b51135f9c058b0a801fa44a4846772dd7112f3b822034be4150e6d769de70ceba6ad59 +Qx = 09519e08532fad399f3d69a57e248bbead22fd2e5dc784feb3bb61ae22d +Qy = 069bd883bdd1dc1c3b04e6ab7ebb765097712741dc88bafc7ded26affb8 +R = 067b025272a74077e9675ebde9348b53904a1baa8df5e98f3161cccf5d3 +S = 07737820d0037c7de9c577e4f9256384401071bb925a184913259232ed9 +Result = F (4 - Q changed) + +Msg = 219613d4194afaa7b2c5be656d44a0e8b7215b9444ec1eec4d226fadd9d353c4829792d96dd33a994839ec1b47bc74110f2f5bfec3eafb1ee6ab9ed95905b5c25b03a116fe8c9d652b3f501d4a94d6e6dba0969e341a39e9b92a1d5959beb14581c1b93ac4dc4b96236c699723c3a2ccc927711997d498c6d71fd74e127c37ab +Qx = 0186322fda5ae71ef8e159cd335702238e7296f27325724a6f3453b3c1c +Qy = 0d45e90c61ac44c7666ceca04b7070faffa8facaaa7c116f6d8cd7b2f28 +R = 01779c66f38af478092998989ade5d9a96e269a9e24d06fcbf73c5cb5c9 +S = 026866e2ee7f1e2aa8a327130a611b05b201efe9ef161d50a4aa71fbbde +Result = F (4 - Q changed) + +Msg = b4a4659a5c20f3af085cf047d9bc50870bfc44f001ce6d0e0d44238f1f61af245bbfc013f15860369d619973f59a39baff6f211a4cd0d44061705524241bf1a815705d270ea43dd8299ca4b57199e88fc492a5315f940a1eaa6205b69d67c55148237fd2940bf9e7e9e1002487b10175116735e37fd2ae5ca5da670eb1865d37 +Qx = 15e948fb47fe493ab59b1b03c8f06ffe635e9d95e532a6b9736fee039ab +Qy = 08186b0907c69e2856ef55f575644ad185afa400380f631cb1bdaabaa7a +R = 003b6d091b7504d7bbe3156bd30b68cf89c69e3417004c12bf8fab9419f +S = 0042b8bd930b72c983e781780ad553113160b1e88c1420ae555031e0cda +Result = P (0 ) + +Msg = bc85ff0ff9e412031c7e8b63fa04a84800ca692361cbf175bb1cffb8547c72c4bee1fcd4566ec5f61339cbaf9db36192eda6d667e4ac1fe785a0a8a3ef674748a1035f3115b82c65723e3da4f6bd480b6ad19f26ebaebaf128ccfa0e19912298cc6a321295e4f360625c4a0d61af8578119183f63ff9c3722e9effb438f4488e +Qx = 14678e29ae776d7b9e8f4160a1b63dcef28d3f9fc23f973b728e4953873 +Qy = 0863a1e9096c0a197bb837dd47da73dca585b292eae7a0a2992b0fa21be +R = 077d2546d931b48628feec96e5880044023cbc9dce4ee02ebc62fd92079 +S = 07da348ebaa314f85ae01efb6ae974db34198f1a71c069756674233271d +Result = F (2 - R changed) + +Msg = 02dba4b579ef0169c8bf8403689ec078e36a5280db9abb3711f9b04e4ccdc50a0a3876951924e14f5e534ecd8e8a90344dc8192402e3dd6c19e45a258776a6e1eb5aaa87f7d770fdf62e0f13c9d2807de2c75b109425a98de03ccfc98e90ccd4ea6b2cf68d9b17dfd04abe46ac8f730ed8b396bd2773d98f648041df9b6946e8 +Qx = 12c76c6da3baf752184c9412ac37b62d698bd64f652f1c7b905287296f7 +Qy = 1d1e204433fbf51386311daf06a4a627bfe8c2562e563ea9310dba05e3b +R = 006debf5f2f63da931d30036c51ea1b51ed56944372f4168ba4246c0db9 +S = 06fc4aa020b649e9cbaf383ba1691f0b7e7d5c247a99e31c901c7ec14bd +Result = F (3 - S changed) + +Msg = 72c0c6cf5b2a694575c5474bb65e3299a12d4776de2f10640cd90432099b6fdad29953f0ac178d518e6960b0a29ea74960021109779434c5e1e7c6d5c830b2d9c0e9d639e8cae0d69cd671b4924b5e98ee44f9bdb550a1b7bae3350ab5ae7898de7bc70708832b1ae9f80626272a9644d2b024b5c2bd6be69cc036b7704d8e73 +Qx = 1e9ad4d8b620c93cacd4c7015eeae2f205150d64e2e448751f62999f1d0 +Qy = 13bf50d5bc502bb374d0a3636aebdb68ae255d3c25e4e6a5c4a594b5a4f +R = 04ed80eae781ab5b734d378c45a3a4ae4e4b7e9b914c412854f9753ec49 +S = 057ad619c566ceb5b2f7da556934da53c4e0d08f1a882a2d37669889584 +Result = F (2 - R changed) + +Msg = c42ba8ac202ac92f98ddf3737667824bda7571132e4c5e3ec38b3dbb6cd817d4e66ecb12817b3d677229f41c1533e3073e72a5c4e24611d2551220e7c092d0a1d8fdc4cd8be021f9477f8267de0d83f7d27ee20cd7952ab5a8a960c64da5b90d620e20d294b251f743829b9ad8cc88b3b114ddf8694d5f178b91fa9ea2122bb4 +Qx = 1fd74f03f9eb9d36b569c9ff949e3950eb3d7d4fd36db597d605259bf2f +Qy = 1c1c90dd569e56dfa66c448762e233864f2a20f54ba6d1957de912a8962 +R = 0007c992bdf9f151c2bf78497b8f131ddf896a0374cc4af040b78aa4367 +S = 04722eb85b9405195f49404ad6849643a417e5183c7b7c6473a7e9268a2 +Result = P (0 ) + +Msg = cd5be74dee439bee65f92512a7f401708110d52b6894a193073e75ffa0c149d93c3dbf05a7c813b19a8bf6337769fa0a515723a3faf93996dc41f2585d223342fc474c0bdc487e62f6f60bd95f7c538ed879edac6db50d18597489046cb1e026f8783e6ca2dcc2006bb767cce232fc55a6cd99d2359bfd219f77ebcba1273627 +Qx = 19a348da33f7c6770adcc8a842a068b3503540a829a3c74aed1b87998d5 +Qy = 1707dbe4eaeb63637b07dcbf87aa4e9459f7359ff67b5b5aa1cb1ce2845 +R = 02e4ac218b97e72e54e366ede4d68984b07dbe3b4b69a04e73dbc480a8c +S = 058cc7d79144b21f42e2415e928dba2e0912bada96833972722089de5c6 +Result = F (3 - S changed) + +Msg = 64f09b749201d28e2bc38fbe0fda95766a0864b5a82c9fbd66f468ddbaf59c6b8852d5ceed19f979fa500d2fa116cc6533c21d5fc078da92d7991dacba9fb9209779c99beb32eb4f597b33ce9cfa9c51601f0a386e185ba6c570f1a1eb5554e60cfda17b0f5383e4b615a95ee4c1103bfae639326ffbd96b8eaf8e11fe700748 +Qx = 1fe409a5b5aad5eb0f9bbece61eb90dac280010cbca19ea77a452777e05 +Qy = 0bf1af9c1b8487f5ce321607a39abee27eff8e520137f20edfc920f5bf5 +R = 0342b6f86d70141ff4ef84bbe78ae6aa32e0356ef638cc6a31415ca9ba1 +S = 0606fd254cbd9114c437b4fc7ff95a9830299145a2f24969a44efeeead0 +Result = F (3 - S changed) + +Msg = 833eba7a24620e1b1f6242dbf2f3f0ebd5b73148377440f580f7baa94de8920d7d8f3ae1b3c4aaa6fc7d24c5bf8d651238798ad60c227c5e8d4f220151f35ddafbef85e87529f6ed035b57fb87ecda13ebedf320631a5eed5def2d5b2adc383fb22c0801058a8d3d81ffed2bbdb9406d1d530854b6751013bc7286d4332429a8 +Qx = 06631290e67b486103254cf20daccca10e8023186a8d5031d4a1a3f1b9a +Qy = 064b56a70a13abe171edb8cd9e69974cab156201035b72178b1aba4ad43 +R = 0333a0e205008a960c1b4a5a37670c7d81d96ad20bef7ba609c0f26821b +S = 07c8b8c5de2d3c9885c6dbe48721fb5d762739bf82be3e1c2079ae28e4e +Result = F (1 - Message changed) + +Msg = 7ff2abc05a9b3f81944f7a76a0753d398cd7a554723cc66c5416ff067e4a8491db53a18a9a41a0eeca8582301c6b32a3c31dce88bfe4f128714598d24caf909ebb412e7d33e6a1c50dc030fc35102a0a351a56572d066b5423fcfde79fe6a63af9e5fc79cffdc98309a6f128907f66e3acc189ec12d5cf858ea19cb946bda022 +Qx = 1d8c2283e9c15a775c16a466cff7f0f59fbecb25e57a75ef6cd975b4378 +Qy = 1881f8e1c93d3d8084ea1455e090e1d29bb520b3512001d6a3bdfba6367 +R = 01b84300b65707ae148d8a766f764de9a3b485d556b3003804de9321af9 +S = 0124848e90f5e30f05089c67ac23eea36fbed5af476f2875588af407beb +Result = F (4 - Q changed) + +Msg = 4934fad84315335562965c5ec0bf46e7d2d26fc63db226291e55103f12b72344ee0b5d3ec4a11f5a078ba16cb874127eb6df3694b390dbb49913b085e845be6d8318a65cd7fc3469aa603a02a364fd51ee705cec68310df4b0d28e31dc464355c0d76bc866660cd7fb52ab850c85d2e691fd130b010069457df533cba6dad607 +Qx = 145d379c89eb90efc1a30c2d1d82be3c5facca0575c07358e331bdee852 +Qy = 1f07a591b2e4cc17a42c814777b4b6d48e0a4e4807526efac528f73a2fa +R = 01303f8a4275e889c60aa02cd4cb92e07f12e255d7ffd63ed1af2ded678 +S = 07021b2a5240ccdb0bb553ed58f44fd73ab627739eb26c39d195c060858 +Result = P (0 ) + +Msg = 490d6d05b3210f572cb1109fdefddb10a9d71d5506d98f8ef22e83bdd21ad05a55bb3dd66b089f291c0687960e1f7e2798b0d9336a0d67402d17306bdb53a092e8982d8e693588f3c1dcd31757a0159369b912ae50dac9261d141e6af50e4a767689e643c0a9ec84be7f93b73223f368345b9110f7cc6fe5d6866262b27fe1a7 +Qx = 169e62a270bafddaff5b762d68b724677647d178ec34b2185e53e10110d +Qy = 19c662b5a5e27198d1e2c7a2e581eaaf4df640cee56f0663c98ac2e8802 +R = 000a4903da0224778b34ba7251553e2277c5cb2d387ad1008fd452845db +S = 03057b8bad69940f3d0ca55dd554123ca0621224c1b48346502ab3e0d97 +Result = F (1 - Message changed) + +Msg = f91681cd281c13c35d3dcce65ff355e075d8a90b2d6434417f6cd8d4261591001aec2f92e4fc5c794a15675d7ddd22d294edac99a29e044ba03058facc773e1943fe143a538fa8fe123f6cdaecd12c9878a11ba3a1ea023a08195babfa2d76d41b05a7f424e0147e7ee3e0ccef85ecff42dc3a7beb8444940c43b5e4a8307d35 +Qx = 0d03301a31b767a95d0fee0b9ccaa817f2ab36d847a7172461b934b852d +Qy = 1cadaa0c20250ce3553e92bb253aaa10663a903cacc243323b7b2e4d043 +R = 0721dc1a94d71fffdd89db1d078a2b4c3c81f487e4054380733314b06a9 +S = 0499945deec7c7670b859042bb4221af31a6798a7596798e8d7a080b4ed +Result = F (1 - Message changed) + +Msg = 8b54fe64bb8cc7ccb38b76a70e4efec83753bf94064e7c7e1e8f28d37d58c59f6689d74c69e34fc84579e41427d829e2f6e522e3ef38cc672985c6dcd21cb41f22ed74f466e8f3af6b8ef5f222331dd421946a099f77b0e3b5407e86dfca64d9b2a26cb7209c15ef7b3f28d16838b945972b4e036782dcd89c4d1c283108878c +Qx = 12d70bfd8f7de9773fec7f2bca5932d50cae168150589d5c65dad370ead +Qy = 09d36638edb034273b9b0acab1fc3243f651e91380b87f6578558f4c340 +R = 0247a5d0e37b9601df394035a1410f73c263dd0440fcbb0577da499bcf4 +S = 051b1fc23dddb05dcbd42012f4a12002fc55e518bae3d85a60d0a1d7992 +Result = F (2 - R changed) + +[K-233,SHA-256] + +Msg = 6719cac1ec6900ff80ba613a7db7b68442ecbe21603d1d25fc766b6ef1878f7cd86a3bf6e17d53ff987ab5ac07a6a68d64b60f9acd548e327ce73b8ab611cc7173c28f524ff5d654234b1fa23e05b417938e19e5efeb757a2e5daf7229414dbd1a100212ed7d2561eba567729ffb0fe70ea7df638b071bd7c3aa9f6c2dfc6c6b +Qx = 18fda2de3ee40f8e9562d773ca9bf9559dab84511c73d4131a71cb31cd6 +Qy = 14e314e03df5a8df9f88462dcc428e5e28312557b3dfac0913f46da3075 +R = 044b852007552c79edb55d396454dd96efc6d6bcb9f11a462235b4db14d +S = 02f06a4c5550c45811ae890e316b9ee791a42c7079fc7d787cfd4c2db9c +Result = F (2 - R changed) + +Msg = 34cb6198e4cb52ecd1d43a118f6c80858915de2520b8d794964611c2571367a3ce5166e4be07115840551a159a6f79b2776c571178c1ee2ff55f0de117fec86bc69d441e66a8f78ed0b1ef8118bc41a9faf132a037cf2276b3858ccf4fcd7466a37e6ee560034c4f09fb29115802eaa09ebbfbebc7e542e09448ac54d1ef33ac +Qx = 19b47eb656b98537519fbd2ab2cad8a3bfccbb113fd61fb1a516f956533 +Qy = 1c4882d84aaee097bbbf7624fa8e527810999469d4d9eacb805d6466c9a +R = 0064dc97a6f310c2b2778d4c6be45ed7f7d999d9008712afe0bc32c7e97 +S = 0225bf3fee7f182769303d046ec332d9f2c1f3688715686a3539b22775c +Result = F (1 - Message changed) + +Msg = a619e588d2fd8c8786db7e1c25a076a636df59b6f38c69873a13b471148e43d00a9e475d470ccf8dbd38825d07f0be0a44577e38d269631494b2dd2a0de31f67cb21ea3d05a018ccb3a94b5a1a4d554fce474add7821da75633d3729a5c1756e945d84538a3b7d4b69d3167b7bcbcd9394bcde15cdd3701e313cb0a3b86522e4 +Qx = 03d027adc776f02dc61b73bb6e024ac3a56d38783337a7b45582ce2f875 +Qy = 14d11fef06300982b9f154ab7f43005a827dcea84a7101a1a2ea952373f +R = 067c8d76b8855e32772937fafb6217e327e3e0e654c53c429d533692e23 +S = 0786b8df13f51d0730ebe26c8f9c6ac29bc83da55935bee28a8b3eb2188 +Result = F (4 - Q changed) + +Msg = e0f37dfd7ffc8a5466f1356785a9a6a61e0ef635d950ad5eedac89ed081513ece425fa03276abe29046af6a6b3cdda9c162fef94def80912f01bfc7e58ab71fa0f1472d634c9f39210fa91533c95e676985c12adb894d462f3cdceb9ef6df01c13807729da76564d22af1c78e174fb0ea0e1ef366690c0baa7c7c953220b620e +Qx = 056da4469a2f0854b92262db4dbab70d213670d89b54136ad433b59a3a0 +Qy = 039c1e06929da10ec9e5494c94a09e859bb368635e8ec5bdc8c3823e283 +R = 0449d9c77c32b6d5af2eaa2f73bc8f70de98e2492fa9f199419cdd7649b +S = 03284813f43479c614cab540c2d4914151ac0d0e134432c29d689371c5c +Result = P (0 ) + +Msg = 0a8bc1770a32d6f2c4c270ad0e5346565e22a791dd9e5294d7e6d6703a954b6b25d6ca2382d15e552a81b3aa492f52d5c6cd7f82a9acb617b6fa9bcbef3378d4d5cbf715efce670ffab34aadfc43a723b0f99ed6a31d91819f8d3aa31fe5b0a092d0f0b23ff18e6efb5df70e591fdb7ff194d5ea8a25002c2f6066bc1ad498c5 +Qx = 1c074a511d481f52dfe6b3e72b59961c51bf1318c226005f852520e3676 +Qy = 1feb16fc854c98006a7609b4c7a17300c3cc6d4b41d014a57af45522924 +R = 0361d76bb3e8422205dd90ca51208d9cb5922757102f320454b59ed13d6 +S = 076f3370d8e7661ad3119903373ab1370a5cc6c4bb53fc9af1f9bd7d473 +Result = F (1 - Message changed) + +Msg = 5f4d0eb047e4361d7c393a2cbfda7d72b17b08a909f1e0c8999426c1c04791d3ac005dcd25de7fd820a9a7b1f317a3298edf5f2406545a20a7e97c399216a26e061e8337102644c386ead4a823b25c3d62506c783e8678c2e9a42b1bc162bc197cbbf162f774721212991f40c2f90b471ecfaef9c5d7556b6d3528d2c012c35b +Qx = 164bc13e11ff04eb12b7c1a067f4acc950cf6dbe7e30ea2adc5f0b5c22c +Qy = 0b9e341ddb661df0ef77be5ebc16b268a6fbe0f21ff6a541420c1ac4592 +R = 0062d7b918fa0c99dd61c1eeaa8d3399e10fadffba8945d5804d46d6e4a +S = 0725017995752baa424124b019324e6502d126d8315a9aa6f47fe7477c8 +Result = F (2 - R changed) + +Msg = a0b81f1b5f04a9ca471f3301fcf708a716826597be3ba3b6c698798d166a1615c027ed1b73539241283e80390c91df60af10b427c34919317c33cbd49ccec88070c810240c2fef15625d7d5bcb9a7177e4d7dcbacef87386eb8fd8f5592c241a5d4e9407e0ee84d66648681a33ee8c391a936619984b6109b11d7533a0270873 +Qx = 102c55e3e684e1bdea4614d0b5d364212040f3330d08a274857dc91ef2a +Qy = 0caf9e7fde8452abb690da59f5e8f2e0e039287e107228e0256582ff019 +R = 0333a64d45141c7e994c0c4e1266a65331dcf9df357cadc022bfb0d2a2a +S = 071460f8d5062eb8ad7bb006859526e33d7e8ea32bd3b4906364bd45da1 +Result = F (4 - Q changed) + +Msg = 67031e1fccf41b7da12bdfbce8161b0462ddf093814337cdc1a9088ec1caf134767ebce3067d1ea40cbbfc702da895d03d6a698db1571a076e77524952b20413c19f469ff8b46b12778fd1cd22f411533b34b189c0473f357b4ea5b2cee1c251cb83406d55169ab1e1fde0d7ca8a687cf873aa752999b82e9333dcc5d4f418f1 +Qx = 1cb4a5c38749c9da80a90d2cddc2c78b622f6f91018480175756d783f61 +Qy = 1eedc516e4753d90eecb6a8094291bea895284d241ee4189042c54ad3d3 +R = 024236890007420facb1f1101d0e28678c4afbb865f5355b8f30f0b8ec6 +S = 04e0ffbc132d0ee38fa62b77355f579b1c6ae476b48309dc9c0f9b7abbe +Result = F (3 - S changed) + +Msg = 6235cf6dfcd4ba92ae97ac72a3f3518eed7fdab06f7254bbccaa41bdc86ce3ca1415669fc1c2078d5593307ba24ddd2e2008893c5858395486e1136fa1dce8540263351d6cc538156efbeb27053906eb4648b7ed078c8a1b1277b21747bacd5be192a1f20384e90c0d70011068d983838fd67e89c269f09c785c0f7ef715519b +Qx = 1206c8794bc425d499cf55bfdb9edcdc8cc97419f4ddf99cdb66a90b4b7 +Qy = 0664cac8332370ffd39d4c53b6582b0daf5fa38c74a2c7a9756f8e527b3 +R = 03ec868cfa67a7522a77dbb81162fe5ce656c1f65278020ac1860f3e108 +S = 02f94319ce4415061c3407a1c693f1a884d19c6f0e3be5971de014b42fa +Result = P (0 ) + +Msg = 62269bc8a227d64dff8fd99cf18db25826b4d4e7099851b4c8412142813150299e7291687832c2862cbfe14b156404c3b19921abddc24a77407dff4f1beaca721d3ecf06ed9b1e2443a44e219bd9a52886b14f4786d6198fe0057c21b8962715e124ef5d1c4ccf9ce595e0ef72b2371e61843776da8624a1d623f93ac532b003 +Qx = 073916409b59965337c8a06805a760a1278bd2f1b54e78c52dcc2fee1cb +Qy = 08d45a2114f211761f83097a249e97b2df92b5d0eac48ac9e86440f1153 +R = 0148b5ecf334a114ea92796da7925e19c220a5d496f0547878ae4a5ca31 +S = 0628aac56de338bd45d2950bdb1b2a1a55e58d3dba8cbc86c225721323c +Result = F (2 - R changed) + +Msg = e985eaeb65db74f123c53efd8b8e14aa293e22fd48b460db9382d1ea5f1306b6ddd1fd8130fcfc1977011920caf89d335bb5191b107355234fe796e66ba57daee5378638212999f7fb68bf547c36cd733369983a0a152bb92da1f77874e3340b003a78b4310848b513870f26acd9a5ac4e10395676a7aed66152977d9f81b5dd +Qx = 18798e1ce85a5d518d526da132b5e8d8aaec253fc4c0e78082a7fa1ea0c +Qy = 150d42227102dcd566d3f6ec89ad23544cdc64144f5d4964903fb26f2f0 +R = 05bc9f065b79d07c92a3eea0b093a3cf5f19069c11865f6fc2a3771311f +S = 01db6e64d17f8232f27bd87baa38adebb53777f218101dc2bd9cc22c4b4 +Result = F (4 - Q changed) + +Msg = e9cdd1aa971756a81c0b8cf88d0435503b31a64a03162b993c7739fcc20bfdd61ac733b75ef7c55a58be55aaff56e31998a24066facb1535e49bdf65dea473f113ec05a4e717374dd60753dc54d9acf774cb63cc69b42e5d45d56fd17c9db36437834ff5e5e6d7c3934f90f5f5490cb6d8dce1bdf6668bd629a678d9a0d7b106 +Qx = 10ba3efb17e3eeb01a7f359964ba9a90ce6f724ca6c3e1822349fe88c41 +Qy = 149222cd827d8325252daeb55e1dcbb071e9da32efbb9bc9eefbcaf17a5 +R = 019a16fb8600ef8b99eb043c8ee3e01c730f67880d6bd2e84f250f7d2db +S = 07eed1ecc674bcbc4c8ca8de326f9471514a00d01bfa1bbe197b1ceb0aa +Result = P (0 ) + +Msg = 4eb7e581704d04816e1feacef66a7262b927af684789d19e8f6cb497a3941f4795e099838753b9227f17746b3b3d1fddeac5255063b8b8fe067bf958c12fff1f1049c1749bfce8d76b05e4e493ce456b5356554e803ece1a870fd3ad262c19a61c206d8d4a5ee0a58a19f47d907883ef7145c5edb9e59670daef2a1e1232b7ee +Qx = 0b3800eb76da8fffd02cd624c6818fa9368896d9c44d565bb41d9c2ca27 +Qy = 1d91851b71043fa3826b8109fbb6d9f200fc4138690e1b29a7f5e3d8a19 +R = 077e7fbb4afd61c7d71edd2aa3c2856f8d130301e64e1c76976b9966002 +S = 0362fd609cc924f5889fa7d5d5afa7040633d5fcac0267fdf77364257c8 +Result = F (1 - Message changed) + +Msg = b7b87cda91314737b3b272a9453534a6db5c6085646870b0e6635021d924a5ababb03a42de9ffa5b2c532199ec5279b81299d3ad759e108e4228123b20711fb56a974ffdbd384b05e7417efbc65e8bef3555e4582542f845d9c64ec0ba88597e194af086c606a0c4916dfba08932ca5f81513ca63c64383e0d35a88855c1dd48 +Qx = 09cde2a71d84d92ff188d569327f8ef2c148fcf5eaa6899d37bc4eb7a6d +Qy = 1a8aec970adea24479ae476a8f957fe65813019f9ee3edb30be36bd6ef7 +R = 01ac5d299143080ad45a088db0f40a51e7ec61963ffb67a0933cccc076d +S = 036c371035deb662bc3f3e5a2ca72f53b17c851493fd8c6f35aa5760c6b +Result = F (3 - S changed) + +Msg = 8dbe6d44b6c67f0884dec2393e57d928160c7656e2b1b2a946684abc4cdc3e50897eb36ff662e15ff42634e27730007fdb5eefb1150894670eacb28c4599b3d2d2304281288980731d8c09e5ee54c469675f355b1c3f7866c590765d7c2191638c905f6635f50843f6f515a9af0f261a7f1c6315bae701ed230cc7bc4ec350de +Qx = 0aa0a114ed50c41ee7e07b9310aaef8c4b81b291083f7c68fbb8b642b7e +Qy = 079e00265639c77dd9975946a6e8fbd2d80e703d570fafe896789256ea2 +R = 0013039ef8dcf6eb27c5f27860ad4a906f99a432589f892d3bf4206d532 +S = 062fb5668c5e3e04ce9b1249b91dec25068e6034321ed5da93c6eef778a +Result = F (3 - S changed) + +[K-233,SHA-384] + +Msg = 221e5d22c5973ac250f61d65213fa8fa9f1aa2df07f3337b7b099da28a6de6b52abd00fc63acbc0b21badd8f49db380b2150c180e16282fd9febb78930c5775848d0024968610b3ee26dc0d5002041a92ff27bfa61af9842dbaea99735ccdb07628424793f56244cfc873c105cd9344cabca4475e8c9251b4b5c86a705e2fbdd +Qx = 1e482fc0f34564c09fc7465e9b28d8a269715a0acf432d9c0514c693394 +Qy = 1e7f42861175b27ceba98ca850c004b9355c9cb0fd2256809f7095892d6 +R = 064b4d31aa645458b4ea811783b395ccee744b493916346079217afdc0b +S = 03e1b71c660b363335fa738e70bf88459c8d7db546edcb1d888c3308502 +Result = P (0 ) + +Msg = b95b99ce4039315745a8f744e896671e978e3412a82b14ed6c5172e9010ee31a53771e6108d1aeb6484f75bccb3be3c2e947bb901a436a927e95abad2b46580a0094cb2ff36a548bae67e304ea43bb3bb7779aabf96aa9ed782c97503e5d33347a59c656394424c101b16372995e0cc63445f0c39a2672c638d689c31c377ae4 +Qx = 109e71393c6d17b40467917d1aa9feed716dbeaae71174a36304213929e +Qy = 1f368b4589e24c334f7dd1e1e9c337cd022fb023e93e263ba492f5c0b6c +R = 05d7db9502a2204dd7e223cd3e5c51a0650a4bb911586817e6979aa924c +S = 0652eba54363f84e7b4e33e2aed54cf15ae16f50a41ad3fd85288e13599 +Result = F (1 - Message changed) + +Msg = e99ca119d6e061ff793acd1524b8b75a9b4dbfaccd47d59ba271609ac0016659a1db3680453dc938bc16278b8fe15dcb4d8d1cbe1d347b8e9d7b9af12f2b033e4dea2dfe692b7d216a260f658bd43d9a56ce52a1702dffbdf3f09a54b4c0f8a06341cea692cfe8add28ed05c2308fedc428a21ce16ad902443b5f417df4af6bf +Qx = 1a1e93ca2f3db58e4234da0fb6bcd184b5f23a954629e80c417cd02557a +Qy = 15e3ce533f8e8e2eec385347989294cf997d5933cc515ec92d3b6ab515c +R = 035caf7e5257f16a57c0fda70b1373fb7a77ac0a027d847562e4ac15506 +S = 0557fab4d8d5403d3d14527b96dfe258f54f3c3999e8da0763f0ef3281f +Result = F (4 - Q changed) + +Msg = 916114a913f4a7c1a4130dfd0e463a131c327640fe276be0bb65157411358871f61cb3b1dca7935515fbaa9cf5e939ee71f8b43af93fbdcd6722c81fc9483baa776873b8e4099e01c6a69c3db887742ac1237cb0bf8f1552d2a010e5bdc4041c32453b5235effb730d0b07c36dd0b0aeaae04a320fb32a43879c4597aa5b1d30 +Qx = 01d25beec251cca84b0e0d56a1dfea6fc5d94187bc4f2ee53db4a313abf +Qy = 16aef62d690a8039b7d9235bb097215aa29d751ea31862446d923646d40 +R = 026ff3e2cfbd7e05524a1f1d4b67dadbc5e564871358dcf993caaa689d2 +S = 02536437178af0111366607e566fe463f77339fa0b973c331353f19d0ed +Result = F (2 - R changed) + +Msg = 4df912d1c135f66b275ee8a0a3c63db42e099c3518e8d2f83551ee3dbf719f900020a7166b8bfc2ddf3695f4db7e245886b3a5b0437bf70dbfce272317e86d4540035bdfe898483503518ea9e0ae9a27ec6a991038492677b2133e4c3455dec00a58f6750ec7818629b4e05b4e8452bcc9c32656c4227f769e58a1479c81f338 +Qx = 148ce2cdb6147d1ec50a130ebd852f1c0130ae3f1db12f2af4e1d2fb481 +Qy = 03a0a01c580ba0f7d6cbaa70b5cf68d36a6e75a5172b8be94e0e30f2f4d +R = 04b03501df0eb75d354a042fb92007f713563bc42bc068f7b0fff0d44c4 +S = 03d501ca9c4932b8d67e3e7d4d68b1df9630318a08c78d8e62816a6353c +Result = F (2 - R changed) + +Msg = 55806df1ea152ce5d418cb8af0bb6a687687347dd909ed855e6053d277d9ee796699d04e997e134dcf6bda95e85e640ca769ea2bae8ae3f512ea9374a45f1f8bafe600be4d9dbd0d65b3f256d4f01f37d8053faa50a620ca0eb7a8b403f74fddef27187fc28260ce20d9b6a2ff28c75fdd3f1d00ef3babb3fe58e2ab0c0f80c1 +Qx = 0e6a13cbcce0dffa2c3fa8713e9ee83c36b0da514ec386eae66d4f4cf45 +Qy = 08ca41aad1a91cb676fb76f66ec7f2126e64d0b79434e5fdce565880531 +R = 00a699bb8b7316a25dc3c0370a06a6f46c146afba607aac352619df0f3e +S = 002c3d39e7edd0ccd21244d72e05f36e483a36f5110ae483f6ede0ac3dd +Result = P (0 ) + +Msg = 4f8fa6cc8bfb0b6ad2893deb821d8385a40983e457a3f6231a64b06f999bbb2d9efedd851b044f3b5d86d3302d934f85aff7931d5cecb31755bea5d5a0a7d3cf21abed663c73beb387904f461bdb3c0cdbad95486d1cc0ebd124ffdec2e451d7fb0b764d3baca7c7d46cf3f6e35d012fc33f409830e083b58ce648f3e82ecb07 +Qx = 0a30e76817366e016cddfc06e03d888a04e609a0f856c6f9c42144a91c1 +Qy = 1bf23bb79f0673daaf443db08b743213be8a85e886dcbbf8acabe18e804 +R = 001555814b37ff61d8f041dce54e6bf19c934b26b0f5cca4f4a4af2c917 +S = 065a31d70975b27185388ee745a0e6fe82b813e0921ec5afdec4372bd75 +Result = F (1 - Message changed) + +Msg = 3004d740bc47bb728652491f13af25e8dbef4c2b817d4ad071762afdee5ae020db747cd7407e3f0ec67b47f101742617d9588ad838da53cbc99810a84e020d3eb4d158cd431e2198002b9d392dcb89491260b6da1287be60baab860abe78afaf5ea6e8cb08e23af78eef56209250a64388eefa6f68cb124ba711efb83f0bfa0d +Qx = 05e167ce05c2045a5806bebcc234cced2169036ffae085e10d08b7ea578 +Qy = 1d07656d00361d294e943fc35862b86d1f1f113f37f8478f152f166e991 +R = 02949cf45e580bf4571e426344cd8984aa5ca8995249f69a581c0ea2043 +S = 0160cc911ac20b5019457bc920cd494d53dc5393738674335b97091dde2 +Result = F (3 - S changed) + +Msg = 238e50fb15fb9733705c16fae8d7d88cd6dc1ba1ce370e56842c764229d1ea46c5d5a531e9e29f36f7c8fa92a074273de4c939d4b9f4f5c7463b24765ee19ae6b16d8157a7829cca51e2d0d9e487d3e7986fc3525f88b9135f98713a0039a09d058889cea5be3c0ba8dd241f35d875357981d3af7e63f158e7c2920c00ab30e6 +Qx = 13bd601a0ecf1c480c8c2b78fec29c81f1b578f01e2687d8affeca01665 +Qy = 0727685858720312d347cd3177c3c20af8f04eb370545c14d0c4dc833af +R = 0476c79489f579087d0f3b39eaaf313e126f906356517722b0844e9b800 +S = 0375a317a2121329adc430581bfb45a3425ed9dfd9b777d04c2a00d18c3 +Result = F (1 - Message changed) + +Msg = 8fb281ba15c85d23549adbf554216563b12fa967c496c8357411e647a84ee02b8cbcb9bd83c2d627201ccb3a3fb92e4c048df2bef34d91d1cfcd757c2dcacfa80558032fd5608292ed3024530ceb4f4679a4935e0c174a9381c7cfce18d4e9647f342f10b10c67823740da0f675d1016daeff2d2aff422784ceba0e397c4578e +Qx = 176dc867eca6a0379e40e7cd78036761918d28d0f662fde3c494fe3b33a +Qy = 01ce0f6fd75dd0f931313b146d159a12a351ed3456ee6a8dee9d77179d3 +R = 051c7bd7f5f75eb58b87f983fd79b517bd5e8906c4c2ba530cff906b92e +S = 019faac5b91daa19866de65560e4f2ed855e7ef78394446457c6d4a1362 +Result = F (4 - Q changed) + +Msg = aea09ccdf4a2fd1244b42b279c3f9efa3e59d98986373ce26afbe7565c1b157f9f7de4482c67a3ebeb9dab1a982d11c3db26a43e500e11d14bb4d5ff9a24c47a1bb3301b1e605369d279c293f079bccd7196e9c3d49a15d7f0aa9457396a70a8f1d387b9832d2027758f1c3181f9b052dfe05bf39eb74235a627c44569683acc +Qx = 1b347f32bc29188d60a1476b3c4c02d481387c0b87e8679bcd3930d6d26 +Qy = 03411791dad5b373cca363221995e055631602459a0383e354f878dbc00 +R = 05025488ccca1992d995bfa88621f997effbfe4cb527747c10d70b4121d +S = 040d94c650bf941f53c49697964d1196533eeb24d4ed8d019c2aa4ff21b +Result = F (2 - R changed) + +Msg = 0ba4f5b6dbccb0c573d878fab677145697647b76987ea85599e49e06afa3dccac537156b849948967847e2e8a4a7c96e3013c71b9dbb14e4fceabe673c07ed95b10ace976e6cc7911b593b9358eca3cf34936baa2e12e94959dc41533571658569e7f896431eadbfbf79394e3d74aa1b383d9713b4bf8539902a1bac1bb6d40e +Qx = 14a5cba616431755436b1c3d4f5029e8955948a4585868e993c4d867749 +Qy = 0ab95f266c5c0dae603ae8f638b70456a634b0f2ab6bf03a253b80bf40b +R = 049048789cd370a0596c0acd9c702d0ddaa0469b869e35cde6ac81f7d98 +S = 0167c4c563924123bd227d5fb9b88a35235d5fe5572562e4e7e7f45f42d +Result = P (0 ) + +Msg = b5d8094cd5c2ccb5ee5d353b9f2fe39fdf58c7dd258767b9f4d606abc81cfdc0bc30b008ce277aef8984eb0a014db3b5519e85296be1de9b18c5bc99ea1b9457978e80a301a95e39bdb9bf3450d9a824be531d1ee51bb1f29192392333e1c41be178f4c32eb9c47db64f07e3acef9769bdbace9b28b4959ff201167b88185a33 +Qx = 0a72951bae00184ead3733be3cdabec78079914138b834f5449878d503c +Qy = 11e483dbe4ea1bd7d62ea943454b32bef2ef4b0d0da89cb17add90c8860 +R = 06cdebbbf3eaf18a56298a4a741a637bdaf930dbb8a07486178273eacae +S = 0623445251667d0b1a61048d549fcec71fed0893f1c95a8b938d43346d9 +Result = F (3 - S changed) + +Msg = b28730f7d0b1f28b384b337189d4520a71b32bbc37f6398055b23bbb3e15b3a27b1c5ab40e40befaf70615711fae4f1801ff32368954878f6b2d06f2c108c91f06e7422815f0c01e2c4a973825ae8028bce19f414f401718c05b7a64d1e24792afe30fcd29fb9fe389b3931abb27a4fb60582de71cd3ffc7972024589ac068e2 +Qx = 1148c82d81491bfbdaf10553afb45549e18583f19e7ef92549fb198b382 +Qy = 0d0da8dd592651268968e486485f8f514d7a60f83ea46f6d7091882bf92 +R = 027eff204c5513a868e6d58041b08e162c0faff4d6f3c92f9113c47c658 +S = 06f4ec3e55b0f10021be9f89cfd7146dca2fb5432681ea94d68104ed5f3 +Result = F (3 - S changed) + +Msg = 17591a787d5d2f8e0787f4317e0bad2593abdd313bf027584feb4bbfd84a62aae157a0a7c6714957bd8efbbba94cd4f844a9ba05360a25848da6a5c8325fa662823e4d4319708a8d532f2e5ea9d50c9abbf1dbf0dfd144a13ff177778cc6483614df810d814b74d5adb7eeb00490278e489d14209398c6a9f88c89191e92e52c +Qx = 16af70666405abc3e3dc8d5055cae90d74f5db425293fb2c2a8326eae3f +Qy = 02f0a5e4dfaa41128a67761bf6b3faed34dc5a2e08a7ac9bbedf674b335 +R = 003b32884f4a90a601b1753380e97c5369a742c6083ee6e8a9cc1860774 +S = 067e429f058521cda0a1c4a1c42ed4598ffba58cb071bee9315d9efdabd +Result = F (4 - Q changed) + +[K-233,SHA-512] + +Msg = 50419e9d72795709c8b4ad022d9759bdd75f1d4b8073846f9963c58c7ef95c4c3a4e5cfcae58c7ae189e762606d491745d974888f1e88025afa854c5fa9172bad1890b601c305303a1cdeb1af9a8c8e6b44fcdaf9c0542448dbb4c43f2b88a2423e43cd54b42e015de1f2d74f922efd4f3a6eee9af710763b56087fcfd7ff30a +Qx = 01c9ec25ec3b5f15d7b4e4c648edec6a99edc2c778cb9fe967b90d639c2 +Qy = 1b6d548db3bbcb58a69b158d3f877f807ebe105f0c5afeabc31ede82ce0 +R = 062025fc1e934d995e085473aa72e189f76a28d2406f00f081c69d5be6d +S = 058aace75cdc7790e8105db271be8eb7f616c562a269cc7596f6b6a66ad +Result = P (0 ) + +Msg = 6f070dd72909fadaf8b877648439a3c459bcd7b36fd57b98e3ca5142d8ac2a7ed86ef744c69e1f7dc71075c457a5db32829d7c8b7c284cbddd7e81d895b900b6521aa8a9f7cb07d3c6e1d180d639408491623e01c8e55e5be64b607c1f1a843a6fb7297009ca57f7640c6da5f090fafe297c55dc8748c5893df4608663ffbe29 +Qx = 0acc739e1fd89ad5f065d0e8c9c533701c6b2de944fe14f8b6e2995fe6c +Qy = 00a03a032f58ae89e07476a874359cd0c1c04d5793e1b4460310c09b759 +R = 02c4658ea9b78d91832376b83738a6b4f8940dc3435ef7a382130e76d2e +S = 0249f5ad688c9d211674d9195dd4a3cf0606b8bb5360beae3901828a230 +Result = F (2 - R changed) + +Msg = e82008b1fb25ff14278e6674cc72bab5d654065a1fdd19ea64bceb698a5dd997a6da9cf3671881e519cf3c190a9656eda9eea042b5711d42a02b060ff6f28c7cf8e80ed37c1a7fbc428661071fe9e6eebdc4693658798dcf75c01c796991f6ee97394bdd94c609283f10670be4ce9c96c6c2a09e22e78d50a20d851d8ec17b6a +Qx = 1720bd7b3efa58d14705b46e21f6a1f3eb47bc6aea5482104ecf94d1124 +Qy = 0f5bb8a128d932002f8b10c2a260a110ef3a3f5d78e80d7d5591e6f3789 +R = 058ab365c45488c0bd4c776ffdf3cb8354b6fb2196f062e702ca0f6e775 +S = 07ec979e1d4ec6561666b11417bfa9f978abb7b341888f98dee6c5a677c +Result = F (1 - Message changed) + +Msg = b0a62c69bda964b7f130593b7ea3df7eeec30de6b7ac5f3c011ec061daf1f007edd0f5f397cbf51fc98b4742b82ca8ea07033dbb9b71358f7ed800ce456072204d765c76865cfcc072fb89513bcae46145b51f21951c4580f2c27f9f66d797c57d5f87ae0543e82e9212b6cc2b178199e9362283af27391b5efe5ac2b46cebb9 +Qx = 07200ef032d3e9b502bdf9843fb090d7d5c39d7723c136ada857bbcc2c5 +Qy = 139acd2f37a8fc3a051e7a3ab916ebbfca44ff9bdf98da552806d5aa8e8 +R = 011dbec7640cf52c1a706cc51a9e058b87e779d47491f1913ce54a6eb3c +S = 02ce5955c8acd858c7a62f845f555bd909033b421056d8f95675620461b +Result = P (0 ) + +Msg = 687dd66ed30c077d084fd7ab9dd9073b1a258d175e4d6a576fa15fb47dcf40e7fe6ad31807e536aa8587f0a62ba538d732d5f5bee8133dd2376833a31c349b14a5997782c06f156a54da3dd4a76dce6d0cb685047fbeae682e2b20f1db46e6fe55f4d167127c4f6947b626eff8ec9a150c057c49ea3befba8d92f38621c7ba95 +Qx = 151a77b631a4ab66793965404a61633c136732c3c13da8f6e669d4ad7d1 +Qy = 087ed4476550373713b2669caec70330bff7d158c4bc996ec18b7e48b09 +R = 060dc9fdfd15fa8184d88c7b2bd91a3390417f1ead264f91442b25ce244 +S = 00e6cab05dfeee0d0b823f2e496dd6df1a2cc774508952ff6394979af7b +Result = F (4 - Q changed) + +Msg = 9021b84d81c5b6b68a6fe639f911edf127e866b713b370f85a38445df570d6f466746d0e115e808099839a73ece23511f3868b27d12e3ddf5189a1e6f34e4d67fd2a6260cbd58547677ea2f038bc95cd78f2c7b434819a833e4873c462fb7923bfc5bd869429db03d62b6d40631a9a65a31d794c53646e067d12c7cd25d39e75 +Qx = 1a5699dd5bb437e240ec5f33be6677faf967ceb71364a3371d510568da1 +Qy = 16bd9bd8bd63e37d273b08d625bd9d8854c4ec4f9005266d64e170efb86 +R = 02ba682dfe04a62fc5ebd36e338dd7f09b123a2136cf71e77a961cbd3c7 +S = 045632329f456312c738470cabb93f38658c54f4ffa81bbb83699b1fb8a +Result = F (3 - S changed) + +Msg = 18e4a1bafce9eb4b7d9af67d83b2bd62beaf9648089cb0e5b5ae7e8e0159a194b5cf7e634c7e67d03bee8544aed16ef6fc0415ce77dd8deeb6396648310a4ef6ea5874c0fe925b09b997a37a4ecbfd241cf3a01310e5a3561877d2729651a5f068242ba9395a24b4a6b2f1017163d21d647df5a946bcf8e5ae37c4905b24f239 +Qx = 07a6fe61c50c7cdb16d94d8802776e3a5ce1bfac0d65dc95a3cf8eae577 +Qy = 14f305a067c592b709728a5b103df07ce6f107fd8a2f87fe18610e5decf +R = 058f942b4596b715790204f39a7db5badd8b136a0fffa23d9556874a9fa +S = 062154e880b26cc73926859ee7bf12d21c4f400707796a39e15c763e238 +Result = F (2 - R changed) + +Msg = 735dc1588c8bdd94f079cd9325533d8998ae3e4fb75d3d4aefc067ce10bcf1d71e281f45f966736c6b896a8ebb87aba66b8d4e19b7ecd7b7914fd9ec87e59d97050041cc83c6c1c5042e3b4019c5c3533e90972910ac0ba0d26171132c7081ec43358cc08472dee6323d52322b4f46bbffdabc6de9774f6b83764d8cf7004848 +Qx = 13957abe32e9f51fdc0825fe23fbddfdf2a8f09c49cc2b3213e7f438e6f +Qy = 10174a2ae315c673bf3891df35285469c273a7fb4d3f24498224bc47c81 +R = 0361c00996d9ce2e9d682036f21b5f809f8f24d2851894f7ede29623827 +S = 05d489c17a5a235bb4005ed6a48ba4c950d6fb76c76db107d89149fbd6d +Result = F (4 - Q changed) + +Msg = fa829f1417be99b5d66f81c6a703f4d77b0c5551f6c038be64f7e0b9cfba1263bdd56d1c9019f6e9da2f4ded8d8b9a9b097aafca0c96e251fe07c77839d3315302931610659c48d002ef871f8fce681958d474286618c5ae4c8c8e7ee00f18f4d1073f4cd220670b169de5f3c49e4c278625b6bc3d89a4223c52e3068d64cc1d +Qx = 10a5d34c5ab8614ee0e0aaf706e7f003d3bb27da39b798b415b2394c458 +Qy = 18e16ac02111c39f6b58f8a504d2ee2db5b7ed41592f1ed500ffc417231 +R = 0014f11ea85402e22cfc2765d58c8ab9ad143073512d56fb9d100204c88 +S = 040b3b0ad2e725d5fadf9ce6fd7aa9973f2d020dfb0f1fc3ed27a58f35d +Result = F (1 - Message changed) + +Msg = 2cd96c2757ff2b8e30ed5f933cc66bca306f3167a9e92f97dc15339a0754655277575737bce79d9dc75991927cf00b4b8ee9fb5e7ebdc81dbc03eb965beed1e1c28502d15ba519e58088ff52e9243de460c7ad05aa793a2181e90d7dca5e2d5cef49d8a7cfb8dcd679e7d51cc23626bff5c57333527a0dd9b82926f6a333be0a +Qx = 0ff665cad5d9c1d3e48e719c75a7c5bc89850150f96c0ad8a75abba9a2b +Qy = 13d69e43ec8f3e412af94aea2c27291fc3d58e4d35a2af89346c06ade4d +R = 007843fdb8c0ddce540930f7d68f94949ce8f6ba7637f0bb0dfc24b3053 +S = 0329da532a340669b680d5ba89531a319436b7f58e867b293ac02dfeec7 +Result = F (3 - S changed) + +Msg = 538ba4ab1be668fb4291d51d5a682dca33408a3bdd6dfbd0f95b49980600851b7e3b467d4a44214870901bfd7a2cb49c8f16b457ce9bda39a027a6ee286a487b0c377716e94e4c73041fccb1c0e77e06418bbab642610fbb1c601f3d076e38496cc627107487f877e9088cb48e5ad94651ee8c43433d55546b592db4159046cc +Qx = 1f6c0ca42dc7bca10d1b401b409a3bded8657f42dd2e2990f7f55a3ea7d +Qy = 00c92ccabdaea6c07f017ae07f370776e02b459b82bfd9a8e5527647266 +R = 0198f241276170a641b1aaeffe65cd1bac189d411d9edc9ca9dea39a4df +S = 066d7e7f2b296003f307ff388847c45c8b8f24fff8ab1f277e167796625 +Result = F (3 - S changed) + +Msg = 5e2953df888db3a03febb6668235faa85f2c2bef4d1292459fe017ab7cb9b604e09410eec394697c0def66edc7977088584d4cba7d52755e31a4af4ab803408ed40b5bf130869626726dd50f7b5aa07825bb456c3521a33d27c4f9aa825388a0d15b2b795f017764e1e90ae17fed3fe50031896b04a74b707914da7437f2aec9 +Qx = 12a26d521adaa33d3a965f5c3b8cf130233494f6193fae84dcba070fc5a +Qy = 06cc6d06245a504a38ee8ef3a689d33447fdf2b784df96cd145b68845fd +R = 03fa11c3069107077007b599db904f5e190a882f111fa83d30aef5f49b0 +S = 047b678a0b8fa957a8193aad2336221060cb718846e9aee5af0c9b0ff75 +Result = F (4 - Q changed) + +Msg = 21de28d256f05d23cb8831c6968b9f14b6fa307eb10602e8b751842b5094bfdbe26e5fc2cf859a023b55b1b8e546d9c30763319f18a08afa45cd8cf7e0a710449abed39ec1a7c811390cfbc8f970b470359d9dfd8aa10db40c16e73706eeb37387dbbec3b8f19da6ca9cdeb60abd65a0f941931e46b78a001491f8de59aa6304 +Qx = 14d90b1d90fb030d1c5b8c8ac240f7f6d04fc376817ed62e223aab8561b +Qy = 0b86647b6815fbfcd2494ff7a23e5ceb396deb0579b6a6f650cdaab15a6 +R = 0507da1bde36f568f433430dfe9f18c5d2c5d313ac6c684604504557c82 +S = 034d5fc874d443d9e3f245bb64459048c97fdafde0747d50fa99e7233d8 +Result = P (0 ) + +Msg = 306d4071cb554e21d1c512116348072b26cd82bb5ddab4fee80fffb77b2765680787bb927e585d2f4ce7e7d56732f6b41aaf518e0faf00ed105135f76342c10e96df717ec4bfb743522b0b75ab8af5d782cf04e20221ab16cafc6ea674fe247953380fa52b3195db8d7d896ae531f27935a868cb8edc2e5b812d9e88fe070fd5 +Qx = 1defa3382818b6aefae77a5af9dc7e3720bc4ddecb940628f418d0bec4e +Qy = 0d5ddab59cc0bcd2a8b57b4ecbf48b4c191a133d84d94f43f3a0a1e1e40 +R = 0167f6ae2d50f5171060de8d1b9213a32e6b0c770bd07b58984b3f3d2d0 +S = 071a72c972ff6819a0205b3c7c8bf1a743823c34e6595681da6a235987b +Result = F (2 - R changed) + +Msg = df8a05c049ea00015954ee9339f6a281141943980a2c6b88eafe9dcb16d97239a1c92ea8043a31d9abc3aa6c0817f369a11b512dcf72bd8ff98e60c25f773df7ddb9613f40ad91979ec08c6f37fcf2cc02fdd17548e3713ebf17307796e4cf4175046f7d58abe5be60fb5aa0ab3036075357417d2214ecbb801b0f83f07bfa6b +Qx = 0e6321c21df87e66701d66463df80a557a157e4a63ee9c3dcc93be86bb3 +Qy = 079b6597a59c4b106be91ea7b3ca8fad49dbeab776b90322088310565b4 +R = 0662960710594319f2b8f352de54e806bddc2b3f7527dcae90f2e5d89d4 +S = 0660f34748cf57f95d67ff4eda2527e7d9b9d1d084ae5c7bc17f3eb8714 +Result = F (1 - Message changed) + +[K-283,SHA-1] + +Msg = f9e8ec5d1d7ef8831533aa90ce70cf4bd128744767076f613e5f4e5e16d3301d10047db3f82327b6f984c38784df36812f863d979e4eee6c340037ce8cfd08af5af4f6691a48ed047ac1fdc5c51385b88bde3876e68e7bdfb10e6bca84106b75c0dcdd08c3f91f80a954cfb3744b9e9668503d781a8add92643e023de7d6eb5f +Qx = 38d49e96d6c2aad7644f74ca6e3618753f8bf650ab61e8e4864cc2d2728492505d7d846 +Qy = 7e49060d0f8c73d351e95c4e8a693adecd17ffcc64c14d0e01da080f15e16add0fd357e +R = 128b3ba6f7a39e1a21e5f8c553c911e62c316fd935b0ea12027c5484a3d037a9c652ae3 +S = 02c97d9bb87fc5285b096ec48e20e26acf793a86d9cd33d22d4d2588b9473135db85fa7 +Result = P (0 ) + +Msg = aff8e0cabe993d750e1113341ce98c5a79f7a278d20db2821a83d7b91922920dc808080a165ec5696f6f1d3ea18bc0c542efe93143b6aa1cbe328500d3cb0d8558707ee4dca2a716dafa79ebc335bde742dce8b817f245af435f948518e2f58b751edf2d75461abf823ae78ea08229d132e7840ca4a3c5510c77bc4d19adedf4 +Qx = 3466fea747fea41728b29faf87a53d14dbba135bada6fc9f46f0bbf7de907c4ca1f6630 +Qy = 557542bd7dbc7ca35277746e6157044d714940a53de0e0eb5cf074523deebb2dd6426aa +R = 1b09027e5bc0d288a77b6d7f4d3901b9f31634843345946f5a7a731c26a5284b20dccc3 +S = 1a6d64695c16d79dd2a4a23ee645374196d9b5d8b07ed9195d4e43aeca46b45c35280cf +Result = F (3 - S changed) + +Msg = e1d7a8b5f2960e7861923ae7f43b28ea7101d77b0da2fd4e5e709df635211b27ef3c967a6f74d6d73f88cdad47c1d151b6292d7e10ab91b8a07069f4e18a49e127504663ea05e5ded8c9991e31d5bfe8f9a45eef16201d2cdaf2022adb408b52862d902c2c8ad21c2e9c5a3f42773a09d3b5aa3843166ebb5e655b56eceb699e +Qx = 1197ba1a59872c4d239857a66171e5af94af08af2bf18100858ea3bf2b8a127d4f18aca +Qy = 32c6cec59a6de103494bae07266f1fbea7e43bb1c86e1ddf01f63207b16ec03cf4d67c5 +R = 129c7533f52c92d929b6bc57b4dd54282bb0b544cc3dbd7a5100c43ff450f77e3dd179c +S = 0681c3ab96fd49ca51e1570947795e31267432648c31de07331f118919e63f9ee12f9dc +Result = F (4 - Q changed) + +Msg = b333ba8ebac1eb5c0d016bc2049e2a73b546ae0ce46d3253d8322f9df7eec6a019545791073fa8daaa3fa444c83971abca95cf372524f14a10aaa4b0ed189fd3ac1c01ab99af71fd761659d097eb279362765e9cb128a76c71553d2478199903ffcd2571008043ee8b0dfd0a06553e76fea38ee3c7dfe498c9d413b2033e47b4 +Qx = 287ba1e09453dd0a1b1febe2d17bb2b36cb8600b213e488b1c5ac560159b16248f2bb69 +Qy = 30eb597ecbff205cc276d37e96050da7fcd20e4ef9e3202ae383712eb1a0b7c838ae1e0 +R = 1f51eaf9fa4fb2a3b5afa5405915057a5a4053b9aa81f62741e10eaef49a655f0ebaf38 +S = 1667ed9e38af86602274c63515a463ac7e93a68246824983d6885661cf26c2b228890f2 +Result = P (0 ) + +Msg = 4b1ae21781ac92595bd7d77dbdca50fd15b556bf451d5ff95d3c8b78b2e7221b7e94cdc975070778f8948df011528dfe42c2b39f638019d3ddea0c096466e55e70947fc0a500552e8fbf7b9b4a20cde29f3481a2211663cfc9063976d65401f81c39bec31480572fc2e1103480e9fad2336e87a6ccee6cdfb96a20168762ec8d +Qx = 3fccb55f406b8dd8ef262ea045c3b3d07bf75a02310577ad6cce68efaf41adfe5a57999 +Qy = 777dd5a1a1935d79b2a1f3b84ef3045ce8a4894e738a10fa72539c268922bb3c9490b89 +R = 061784a4ab614c2ac91c7819f8ce3bdca6ad51d20cab3c14c574164a8fd53e5a90da88c +S = 1997ff2b99e708524087782a9185376ea4665160437bc71fe030c0fb6c2a73343308729 +Result = F (4 - Q changed) + +Msg = a8f677a27e87c164b73e595f8001490cd22abed242f31c699258a893fb7415077e61cd2d0fec14732917037c5381c45074c1231096a1bcf799351f95c57aa6a2e5fac2265970c491e791cbc11e0a74159ec960def1a8b360657ba9ebae061a69d7f83e9373ade4cadfdda866a1c0d4f39d0c7f8fb1deb8dffbd4f0453d814a3f +Qx = 0bae5833558b1c257bbbee2b4350e833cb7e638db39debacba5cf2bae1856e1b936ed49 +Qy = 10e4b75fa1cde7bd71e09c60ec8473038d6a467921cf0642b25fe1f4a548440394d661d +R = 1e57976f27b0cef9f6ce04c51ef33675bce2e36e609a0379f61d01c666bafcc0e69c852 +S = 002b1d115db34e59ca6c9f5d3085210781a411d0ccb9748dd3c64e801d57d4d78cc0747 +Result = F (1 - Message changed) + +Msg = 7110b0dc2b3c8017406d60f5d37d8b7e68c78831e2dd80e1e3ff31881eaecdb990126e8101c107917669534efada982d9fccdb0aba72cfd9ccc01a439b889027598cf51850c2ddcb487821372d6e3b3fc55975fef244617c60c875d80cefbed812bd174412db5d4c7b8f3e0c1e0f6d89ba531524c17177b3d0f7c2df14efcaed +Qx = 348f1627eb182024fb8fe21baa62c7e97e00be97f5cf55c3a5f6c78b86683cf4df542d5 +Qy = 352bed45af0fbb902368df7007a2c12fb729fdb51d740dfa1017497fce9c782880212d7 +R = 15092ca929e97eda199af29ed55fd81889a26735ddaae990a8fa0db751731cf2b7f0194 +S = 0fdd2fd8e9bdca2571062780eb5591f30132f0d49f45ce0b8cb7d83682935106cb496dd +Result = F (2 - R changed) + +Msg = de7f8cb78f95fadb78277199e07c301d5b223bb0b3c2949741a1380e2c56183f879f193a00e9c851994be6f10e6587c6cb413067405ddcb5185d3213b7518307c991e36cc09859d618905abde194fd2c2e69d77d69934ba6d8070fa9e7b03fc7d7d61063cb768a120daa59a638b69477674d49902521407da5e6eb390097fc00 +Qx = 1fcd3a381e7e622d09142ebb2693f77cc9ccd6eba855dc22d84d880dc23bfdc367910d5 +Qy = 06256c6d6099a3ebf70a35f54601cea7c5625344c2d13bfc78488adcf0252db96d9cff0 +R = 043224ef2c07e706223bb8a41e58d12163762224a23caebe667e6f52955730cd2da9787 +S = 10d979b06638d5147d309d0f7dbad54ac06383518f607919b36d345f4418c2e35351fa5 +Result = F (2 - R changed) + +Msg = b6b066edf19e0838fc826c01801c28ca8d2f7150ff05c23cdee74ebb892a65eeb057184ab21731882dc8a89eed21055f19ee4894db91aae0922330cd401afd93991c9d5888df2cf0bdfa4bfe14e6cd1bd1b057a61adf7777e0a0cd2f25f4461d8ded62f6046a1f32d2fd7edf8a19ef040bd71eaae1a1ba4d61d209f8e5d00a8f +Qx = 619475438f90ae1954351ad8016c4da97410bc3a8eb06b4194dcbf0fce66df0223acbec +Qy = 1899f0bb6e2a41affeed5d3e6b19c99859e3ee86aa78caa38a9512052b468c3f1bb4590 +R = 06855ac7fb72e285442123e97e1344828b991f0dd9cbb369bf95132b4760dfee74a9eff +S = 10ba241adefff5ee8a1fabdcba192fd4cfdaf1f564bb62eea98c5b37c7fc9621162bb35 +Result = F (1 - Message changed) + +Msg = 841f26c10ac5e75e81fdac34431153bc0224a7aa2f5688df6672693d6d2d847e3175dd46d11414e73758ab8c26296785eb7154e3b4adca8b8573eb38d2dd2540a70c67e03f99ebfa459540b7d6f06676b04bcf2c8a9e34cf59d3db4d93660edc729fec31f966aed4f40cd747786e5bf7aa48a06bbb0f37ff929e8c264a5b310a +Qx = 050438f9d67ccdf28413ebcb829c4aa000fa5738bfed995b15e7b82c808d1fb535fe358 +Qy = 1a3d0f665dead14aeb1fcc63d7c28720e367f6fd00a529803806ba37b38d67cd7ef73aa +R = 11cd5ed271698955c80ffb8351afbc469cbf38e6236e101b81f7ff5d08409b174082a70 +S = 0113e44ff734fa6388e07e4f6ead43bf045af2c889b2886b02b23aa6b8558701740017d +Result = F (3 - S changed) + +Msg = d2d55f98240ae5918c1121f18de550a3aad7377676105d287a311d80d59c660ebb28ea2d1c58e11d891ca1f79504fc5b697ac5d52f1199938281f07f7889504e8a3ca843a5c3f81d716f182fec227d5b349482b051de4f613ecf76dbc9f7c1018c9e5f8b347eb128fa6349091138e4716657258c7b961df264bbe6bda46f51f2 +Qx = 18e9f05f501c117db1cecefe444bfc2e3feeeb6df9e1517c3751f80e345189f0a7518e9 +Qy = 45efa6d2ada522644f9b4bc6fddd4a7654cc01550201a5e8db7ca5269086ce6e7bc4cf6 +R = 1398aad1628c4157ed436f27b3bddb41bab8eaf5c4d6b3153b019389ca210374ad301ec +S = 0046b8c0d5164bd7efdb4618154ea2437abc825f7eb46ce6e735d56621586d3ee1ce170 +Result = F (4 - Q changed) + +Msg = 09dd973543e433dface1642c147aee29878fddc99508599a78b108e622c2d5da46716fccafa4c82e101a565ca0f04a77095b82d9a1c8324a31e7a01d104beae2e2f4cf144dc07a5fe547e25455bce5036289eccc673232385904c7ed69fecbe7b14100e8a63280f427419c221be1804411df4327ab50456dfd408d45af69cdf2 +Qx = 11330187b39d066df8ed1911906c0da8d17701982c63c802005d6fff01d896253d91e3a +Qy = 1f17b2962ee886768d68760eb405092a20585b098c79c1274e3346fa6b053590f002e6a +R = 19c17d27f9646a3fad858edc7e20913c19af4fc6d2dc025dfb9c735522ebd9dd338a7a3 +S = 0e2239027b2ad9f7ce318916d1a440a7796c0c4398981bd78a0d176b73563d3b183c4b3 +Result = P (0 ) + +Msg = 44556d5112165beaa5134eb0105225c54358a018a0d09ffefaf7ba40975cd50f6d26ac79deaeb392ac4a9225b9e134ec358220ecc3fcf5af7a2aa32b84bed8950d3f70ca0161d0943a103f5972fbbd63e64504976aeb6c5b07b0407a779cd19d79bd18e634679b8f6cfd6d44ff83f4994931c030c0581187935079e360a53a4f +Qx = 6a53dc8d80f0d57de6630f043a4f893145a14e23e4e0dcdf77386334c06c93e29de9d52 +Qy = 495e596bdf9b8367b0400379dbe5bfd4a65cb7adc85910e01ea5d3da6c3fd08e0789ae2 +R = 18389318a4359b4bdce4eec54d1191919e457524adb2dd1bc9cff21a5a91275bc40a32d +S = 0cd0c8a895d7420c9947b4a1398323bb1c80a49cea0e79e64209fd35fef79a10f2a11af +Result = F (2 - R changed) + +Msg = 02dd98f15a5e25109ad8d3a3feae06e1dc168c11c83694822ba58008030db0a3a64c9638fdea4b9481fb0cf580fcf8f7b9efc8e81ca37435dce84d6bbdea7c74095a90e64e84248a889916a42ca6565715de6c61d3432e7c18405606a84884d8585959ad2eea735a3dd219ba2ecfc3c2820c94e1b21392679255a84ec05b35dd +Qx = 3a861ba0c865233b145e614fbf0555a5d8d128b0cd802f12c4317212366de4f5a3c3a6a +Qy = 0057749cf0421170c0d3bc0f4bd9e89ee3141a662f1c0ebb8e1b7d78ea1e7fc8a24856a +R = 1934a27c95593e74c8b10471baa30055ec4747cf01ebf1990cb9edaac80b5f6647744e3 +S = 13cbd71d15e7f0e2ed4031f49b52924d3976c1e16e85767c3d16ef3d9da6d24aff77813 +Result = F (3 - S changed) + +Msg = c6bc2a1ac8a20f487d8184cba8323be24af000ea703314a4b296ae50cfb4c705486c3e7f6877ef54e2171ab0e48601f0ed655086edd42216c87db69c84802d30590e525612f9f0f03756d6bd1f43700375e0671bff0b745d64161d2e1b294a8fb3044654224b4a528eb3469d14b5856c47a66604211fd09302e62a6c232bf545 +Qx = 511854178a0f8302ff4a181d5cd8c2929f2a26f39781add4db674ea32cbfa3fcd7b95b3 +Qy = 4a1d8318d11a2e096b2b6d6fcdccc05ca6aacfc5f8ab601bef901d89ad9e0d2c58f6655 +R = 01b6b377e8b2b646fedab1e7eb679314b3c82bef412a7982bbe73b4519464aa69d9f0e6 +S = 110e40c5f18f2439d549c8141070f24bccee198b0bb9633cd0f3613bf1007823dbc03c2 +Result = F (1 - Message changed) + +[K-283,SHA-224] + +Msg = b1d9ff0e0371c6b63b37c7de4324ff55c12fb63a7b22ed148fd9b2905d272b1095e4249a40eb9640851d589cb5a5ccfcd4959d967a0f985059904bbb832db2711afb8bfdcf3b31ed6614eef91792b84452f3211db00aa5a2a09aebbbeb519391b965c1591fd6308b684bd630d585d46607705a2b279a6396a8e643b5bbbdbbe5 +Qx = 2236dc88620c626644e1577302521da2a0c216495cc3f7b76050ec658eac9cfff178cec +Qy = 7dc546c57e63eef7faa541789f2146a687f99d8ebc5a64624073a1f7ee07cb299f93419 +R = 0e159ef5c6f0e8d5927e6d9686dcfc6123283e20f0be0ff1ae444c0eb15ac95404415a6 +S = 1e6973bb227114b684c5c539a12f3ee8946f89bce40df378b99641a80bc963509724748 +Result = F (2 - R changed) + +Msg = 956c593e5a0a26c2900a2c7ac31ba2cbc662dcddef96cfa73dc601a2785170d9ea7b930c684b81c8fe5863022230c11f64fadec7762c8c21ad7e5dea5ef0bc3eab7f5f6cda5114188123a02cf08827e107ba989583bc9d7d5cbfa8b2a0a651ca40e875b1f6bf9626ef61e6b1b6b52ee7bd94997f1f3a04df39e398927d3bfe6c +Qx = 600e9f7099d126b23313719789ef878ebde0e1bd60474d8cd20b5a50cbde5eb45029177 +Qy = 0b82b914dc0664656a0d939221166b8bfe083dd1c0c8585afc8e659b5cea4308a617e5b +R = 0899eef029dc2748a60bd591d577868e69e1628e3edc69499a177eef0e494a2d4d72a62 +S = 14a55fc93974a1e80a352da3fafa708f42d802557583d5342d8d379246900cfe1724887 +Result = F (3 - S changed) + +Msg = 9b5c0ff0d126c57d013156243d2121166c6bc41b800cb238029ede2726734ac735eac93743464fe5e4496b287a8ee2d4b21c01fb6f3b7c451c3d4e035ba963794e263bc573305438554025cd0459b664db449ee88ad793468e6be04ab3b4d5134806c40ab23a70fbd53de0f960743303c983f869a2ec9f6c8ba557b3647ad0d0 +Qx = 7cdada7e3e196e29f80dcd96cf40b6130bef40d5a6b12c7362abf88e94b68689ca02cad +Qy = 63b82d5aea6c226f76748bac7df07f7699ebecd125edc108b38b0a7623b728567d68382 +R = 18233532522daa25cd165e5904fcb43ee83f3382bcb86888d6b76569c69bafdac88cf2d +S = 13935429630c007cb3a90eeda0e133f246f14ab5563af099fe1bec2890c3e2bbbdd999e +Result = F (4 - Q changed) + +Msg = b32623a81911b1346d40aa23d1821de3bead78ef63f269ad44a137f53db17f1f311c82055646f306d4b850be8cd2cb79938b13768d70c85e03bb8782d51d8be0fa5797761f92e68421067bae9c0b011b7e28217575e86d53b39e6abf5ae4184092be0457e2aea9e43cb42edd35ad68420326914f0f0e9a5a652b6fd1f8ccae75 +Qx = 1c67e69ca0083e4f6eecfdbefd42a6fcb8c92354bf645d7626165b41e0b40a1fba28788 +Qy = 1167bcea83b343f37809dc6118587a5ec7ea1a0772a0cecacd98155733e26461add7460 +R = 185ee266ff5a5db751883c40f39a87d53f385882b93cffb93a9cf45cea34ea6608b47cb +S = 1fcdb3313c8807c2856c366604efcba090b0213e550ea58b36b3d68982aa3039187b018 +Result = P (0 ) + +Msg = 6610c6914d4a933d96b66ec019bdbec21d22eaa78b336732c958d80e650b6dbfb3d735d3bbe3546ec41f80732d69b20493f0aa9a7086c8364d8ac39a286df929ba4f100cf5ae90b3247d8a5521af4dbac4aa2a35676b30d85171b3ecd59319999012c0544c94c3c694d9c2e696e572c32934bdb91a71cc643e130438bb23f67e +Qx = 00635564f4fb3ad2052a1a69ede425d87b45771343ec1c0bc812fd9b32bbf0ec38bb95a +Qy = 1cdea0b07435c1da24d0535ed97b505cbbeb6f2db2e88d07de29b7d7f0dbff14d7ee5fa +R = 1d1ece23e99c30bc7d2177a716940225be7a5b7f69688b09ca67a54d56c3b31105b8fe2 +S = 1c11fc902854c79e308da16c68cb6610459f3567572f2db88656c3c28b8b8dc24a7ce28 +Result = F (3 - S changed) + +Msg = 8e148ae01943a585f379677da1517ac1aa6d2d39e9815753daf6d445e0b34ec1816c18f78e99bcae899d4f18b96b1223fbfec20dc753b1505298f9eff303a12d2542fdb1766602db0664b660f917ff8dafccc0dd92d161a3a7d3db2c6bf768a292bdf5149f7f596f4bbeef93e1cf0811dc33868b64c6087c9b3b8658516283da +Qx = 729143a34efef53df83129a7e8865395bc8a41eb8adbc7e06fd744833266579f9c0a952 +Qy = 58ae101c470418208b4291d393f4e0ece17946bd0d8dd185b38d6b4a8ecb609ac647b79 +R = 0d83a64984d56cc5590764d4c9a00047daf69513265b5f6859006ef6200a404e613d8b2 +S = 1310f4ae88e47253b25a958aa22bd2f212855f77b56afdd23b739f6f9d1173e68fbe171 +Result = F (2 - R changed) + +Msg = 173ac06aa758d7557127f7aa8cf7f07af4acd2843462a683d3f2fe06e3483c1459460b4aa270170e5ed7c0b8dc0c83e36805d0fe67a9dd6f95f0af5ba2a8647013e293e246cdbd42eae71de569a3e302aba9f648cca1f8b79569511cff42b404315b1d329dba0702cfc0fba9ab58f37e63efca43bb6f5c9afb676c5c5480d585 +Qx = 7af6c0da0630c18fa0bfe4321d4f3cb8af83a22ba65dfef1c62955ba9366ab7871f87a0 +Qy = 480bb54124eabf57ca5564d8d596c9072d8d00b786436426f7e919e307d926576dd90d4 +R = 1021f77d3318825b475b83070c0fd6a845025e5ea1021abfe95c7a93ad827941ba4017c +S = 162bb904b77b02f617a81effd334a627f2d81a2d0efc9ea9c1de05336183dc633fc708e +Result = P (0 ) + +Msg = 40ca7e16eb860bbd71c7ad23800f5c6a574dd332ddb1e215c8c62f451ba06a2332d71f21e3bf5673fe54cff3f68c7c9a48428f09958e5b990bdcb1c5bb0c781da3792f48e6a55eb01c8aba08abd87dd667f63a9c47a4e055adaeb0f8e7c62fd1847a48cc8e158f9d7d36f0151cd7cb47ce48351bf493d050775c17db4c315f48 +Qx = 39e5ace44ca8801ed5bc4ad3f7a5b520cf5d502aa39ef75ced001f0fb4ad6a951934926 +Qy = 6abcecdfa8c77173da58246a5af5405b3435c96501814b2262ac16bfaf0fdba4dd59110 +R = 13e64cb199307f6faf23168694356d997fa44a490f576bef91dcd9a1d20feefe9bc2050 +S = 03daf86a7c0e1a1f91727dcbc9f221d9941bd49ea051394b207cb4998c0a7b699895033 +Result = F (1 - Message changed) + +Msg = 755d62b1e040e605325c4eb749a58419c9d5b422264874089ec1133e88c816f0cf44e76a7da79c5600f06405dc05c4788704373dcfbbbc853acb45af7868f540e561da29e397507d13baa90248f9bc3b09352d4d071171189d8bb0cbb7dc8a7e854cc2f020f94e320f7ef89004f5af38ec2ef20a790ff97c9469af8b16581cb6 +Qx = 17c127419daf4beb059fd0cb633995ed271e7ea03c22f8fa9d73be3aaadc0492b19a932 +Qy = 3d1621a40c04098d40535b3a45f87384bd42b96d2b12487abd89378afe7b4a84b42c28a +R = 1c80dc4c9f777e7c05cd451cb4efd270b3dc828532bb06e51f17246a3f58e2ac42c7ca6 +S = 1adc988914cf9cdc1bb4390b20d1d3de53dd6ba396e79f766b1fa330e589bdb7d7ae8a6 +Result = F (1 - Message changed) + +Msg = 4586865318efc99dcb05eda786a64e6c63a28eb6baea7894ab40085fe089719e0e1023cd95cd2b50433d5c05a1ed5b02b57b35bbf50d1ada270d29da1d706ad3661e1dec3347acfe1c77395be373a766dd71f48324ca8f6ee1798ed5a692966b4ce7d6b323e9eddb43f5bde2f8be49f795f076360ed8a17b760279e92624e952 +Qx = 40609f6d837bd868c99461a99840ad0567734b024ca95592207c9eccd7e9cb49cb8990a +Qy = 162eb4cf1eeb48620a9f284c2622976adc663f40c4492e0b895849d78271714d699ba0d +R = 11cbe4a9ce3b05c8c8d1ed4c7870c6f076ee4f6b480f1e037393d44e9b1095a16838870 +S = 1a207657541145db1d79ae167e9355c2005db1b3df3d9cc0b3096137a59ccd6ac2a0f2a +Result = F (1 - Message changed) + +Msg = deffd202a7df76699bce6790dc4289d21e61b849a154f872a8ceca7035a3c438d846ccd2be3eebca718410f77a4370b37ae6f7e351e2cdb9dbf69cfae6f033a3efe1e87d27cf12906a266d440535529f4fda7da0a3a600946fedcefa3c3081ed5edd841489d8c76d3dc7a04867816c9c0ee60e620cbd043d5af92570fe807110 +Qx = 5fdc6cd42e13cf5d853651993facff3a7aaa64b17840e14082b1ba2ffe360d5624939e7 +Qy = 5946bf632f36204b21fe70ffa83a7e9c8eff8e20c19941b54eac3567c03fbbc3161dd52 +R = 10aab796849a26f96288a4729f0aa9a8f78fb23874f9267dd123aabcc547b65fd780c30 +S = 0ea6a8bb263db16554c227bd5fcb16385605e2851303336717473b12c832a74da6e94a3 +Result = F (4 - Q changed) + +Msg = b8c166a9dca81d5f81a0f6919823ff2e8490979a299558282c6cb704f8bf11e8578b0bb995ee9188ebd67a8f2eed82a1f01bfa4b978c67a05228f2419067c49318bb0c09874d1b1a89299c4cbcdba26bc87247bdf183293f5f47f9d3f52f1f252939d2dee29cd61912a9917169c9280781d36ca85d971d60a9aef90b74d13a47 +Qx = 6272c5749ee8dc1b210b9366d8ae5236df359b9ff071d8768dc01ce23eb50869b933fc6 +Qy = 3ffd36d6da3638506a2c40784ed6f56ced899331322fe669c8d81be24fb89d22cd80cab +R = 1dffff13f0ccaf9104163c1a573caeececdf315560b631c1306544f312488fa4d0f9fa0 +S = 1813869f51ba5e5cab6cd6b5047b7c05bb9f96aa7952ca8d70b77ac16bff60d2297573a +Result = F (3 - S changed) + +Msg = 902a2b1d8e4ea480c52805bd44e820d07918113e19aa9801fdf3e0d97de67e7004cb00fb88031c7d341d4ef9daad612d530bae9b3044659dac8850b7a29ac8630349a11293ecd55a7858739cdd34e80766ccc1bc61e97375b75d674064ace2826085cb18d400c4cfb790b6d0445b176bb3e9214e9644f4e2200d0a62da7e0bf1 +Qx = 14593869caad01146bf5bad5c9563c9261bdae0be7a2d9cf745089dbdac958802c96e61 +Qy = 6fd0fb2e3f7ad43d4a03c2f6bfc47beacf40e900463f4e05607684fe285f3b83e2eae24 +R = 0de5f5d33c44c31d11f3544c40bc2a0b2981f4ae503b58c1b4a60bbbcbbf7b9552931d3 +S = 1856b7b85d2c36632ad508c87c2b3ea19a3706a1f0bfdc797ea9b5081fe786bb8906ac0 +Result = F (4 - Q changed) + +Msg = c6c9cc3f35843e6f035d5722a3aad3e52364b2b08b26643547276072ff489dc31ff1fccd095f284ce95954ab4eddc115b573fbaf2456526077408cd08826c986e2abcc5ec6a61017a6cb04935f948ac693f2a857a1617942d71bf849841657f386f6b5f4cc768ee5d4f66f03bfafcb3851b6b07cd11039bc917bfdeeecd8d1f9 +Qx = 3c9f702d771985db453a5c0c930458fba25b5180a92392fd8d5f900d1f53f36456ecd89 +Qy = 56241254dbd654802a35e5695e9fb7463d4903a610cf0e2a02696485c2691b2d59e8f62 +R = 0f4a0b6768cdbff071b8146f31f1ac32b5474fb9f711cafba10317ac664d7d77bb99e1f +S = 1fc8a57176e09fa9d1507c18b5acc34aa412b04f0709433aa89b80bf376d65c37cdc3f2 +Result = F (2 - R changed) + +Msg = 05b6bac260754da6ddbd635d36e3d125a6dfb7e84b8823d09268c7274ac0021fca86894289e3df1fb4b8fadd1d462700f4b79e0493dcc244230d203160ce7d4b5b73a4571642e4da15affbcc7428a40abd79c4e45ea6fc835d549b699c62dd642fbb2c8f84038a14d69f76f4b31ece90327001a5ad7804d5a25520cc6a77d799 +Qx = 780725b220533772fcf564c3f3bb3723b3c8e85c4d544ebb995d809ffa42c1457598ad0 +Qy = 77173d960c0d2dc1ac1e31688b918c6d755fb906e76420c38fb9d3be7929eeaf72c98b3 +R = 19929cd1c8be4481938c9f7475e9ee831d08b5c048591957ba7dac6c7bfbe60c4a009d0 +S = 10f4bfdd22e7dd452d5b9f543c8f00449054e6932cbaa22fbf3ac9600141a24cae448ee +Result = P (0 ) + +[K-283,SHA-256] + +Msg = b884abe9ab8cc7f80022a1883e49c0a45a7d2c0e378ce72ac6dd37bfd05ffe69dc8b815c41d63484755827511223ab1d1302684bf81b1f2356263e06138f9a2e341a1da5b020a8a46a91673bd27139ca9fcb2a355da5ce2412c82fb57d9aad1742ebc09b4b3ea1509715fb7787f72dd6523a07f54c4c8a285b3789df5f882b7b +Qx = 0d7e249a93742faf10bc417a71d29ba5bf2c64856c1c1e82a033b8abbad471d1527e123 +Qy = 362eb55cd5b254667a165af27c6f1ad8ceff78a1d3eb24227ab16c02233aec7d055ad0d +R = 18e914222a04e787c9fb971e0996460358071c90e00fb54df79a7ca4130ce87d9be5558 +S = 16d7c46ab425f49f2270f31e2584fbe0c23cee2d8bf1f65112cc5838d8650a49d39b2ce +Result = F (2 - R changed) + +Msg = 34c261c3acce0ae5967f0fc91bdeca732fe85a5ed5bcf407be74838dcbd59d69a653ab606e642329947555817ed3f21135c5a750e1f98a338c800470972e4a1f86052a3726e612575a8121c1c0b401cf8637c37d440432bd2b34da292a6dc4a07cd2a962ecc54c687250606457a72dcb2c760fccf92e694468f07920563f9c9d +Qx = 015383b920b5fbff65b08563ac2daabe757e36c0179ec9cbef4232ffde8faa3b4e4be3a +Qy = 5771cc9aa6fabd6846d9d3efc2a6e754791028e1555f54f1fbffae77d15a8c019ed4dd5 +R = 059f0f77452464478a574a36b419317ed6e1cff78501c10caf6f705aed186bb7a17c72e +S = 0d408f78e5cd8449ea389e571f3f76de98537e61ac66308c4788868e9fe0fdd6bac6a8c +Result = F (1 - Message changed) + +Msg = b3438f656d29417f4427f55020e9ed455947314444fc90bebc20f523e40c59cc7d4caf48b4377dbf339a9730476ade5e779d38cf5002abdcef4725d8d367d9dd9823f189002e0e869dcede62983410162df77f454d0b6b59a277f0f419767ad4dc7672d754c6fbedfb4e51e4e2c73ea40976286f94a0dab75b4135180e2cd732 +Qx = 2d1c51f3e926f347f56df45f0ae13f1bb711daef34c3f8cacba660e3810c34061899429 +Qy = 1d9b743b54b389fa01a14f80ac2b0ff587fdf200785a63199b83de0b107830ae76d932f +R = 1186c48674b431b7e8f89a14772add063c7610f03fb55d1d89cb1dfa0906eb63038ba25 +S = 19929947b6f44986a0b73b06dbd8c872948d724addb5a04ffe8c12e8394a8c2ddf8acff +Result = F (3 - S changed) + +Msg = c566ee609212dde2ed2084a1978f6766b703cc033aa8fb4c707327fad41372a1defad4d5666102f787592bed342227d4130f3fac6a6ccce0e883f43893019b1286b3c11f3cbe08249e86eb0818f692474ae01646cccce3173f9ea66f09604dd4b15d730b0a51062f77ff106d83267d7aa38ac61c99c2397197b39da8768ac178 +Qx = 68483242383ed4ff57abaa6dff858e24dc217893f7c4a798169cc77a58f9e2c0146e5cb +Qy = 48914fbcb7974555649ba45bc230c03c625734c21fcdfaa980d5bb65989f19460e2c0f7 +R = 0593129cdeaac4e04821d15bb9c0c942d1a3b27d4d29663308ae807561aa7613279eb3c +S = 1f65d5995f000075ddd2c9f858c9efaf8f818ba0780bf0c4de7e5239915337c14519969 +Result = F (3 - S changed) + +Msg = ea2bf1062045fe799a33ecd899d0e63598325d00400004117baa99a90ee63f5eeeab19e5293fb2e5ab9c23f4a585430b2cbdd91c26cc4cba0ba4547dd27b6a730a5c0549cd5f1b5fac8aa0022b7a2b28454d143411dfae999a137b11ecd68d303abbe625c679acaa1d54488a336eb0cc9d1758884549fe10c37cde81c5b69fd7 +Qx = 5176d69c610481c8d49b06e517475da3940c9e4270e2ed9821ea21f4d96297fb05f39ee +Qy = 79087740a5925602ae7773d1bca9cbb5f824fb1f5791f66ca37e7046ad39ee50787ecff +R = 03bf4c5c61f95b0b5e298a91a3b2e2dca3ad66340696c608d6cf5cc22f67e1938bea8fe +S = 049776b29390c2eb64357a920088001b47b74a514121f693971f657516acd5d884a1851 +Result = P (0 ) + +Msg = e967b60cc05f56974fe9be448396e1333fc5f3cbb8977b09028cfb6bd1341f2deba7c94f537f994d660e73253f87fdcb5286a4ef7b682a92d58d5d7d13e999ad597acf313f54d594baffc94e41a50431a175dc1e3219fa05ab7c4d43bff9d035c47d1c1f0536c1d1694a632c0bab6865c1066235a2afd690decd22608b67bb50 +Qx = 6e0dc4abc31d7ff279fe26ac83c9e7e6ed185abd7d000e348e63c0c91de95c2a6cc4d65 +Qy = 6330d3d6859bbbcb125fc88d4d1a0f50d57e40a128979f5fbd261df1552abdcdc65ade5 +R = 0b6c837402c00272d0dad9ec9d01ae1725db37d8aed07b8c3fc99c019b21dc7836bef31 +S = 1f3f6f6966893bb5a4645c87ffd4e89cb57932fd223c5e2653ccb27837624a29d550b40 +Result = F (4 - Q changed) + +Msg = 4d3f69430ceed38003e0e1b70a7b9bb1c5fca3a7010d8b13e4db02433f5850608969618d3a986010cef5be77fcab263db0131ab89face589a667e81c3fcdedd3d9ea8ce04e512dce30fe8ada46a811456a1efafd87a9a215fe40b125433a62f639f7e95b40bbde84638e084f6a02ea367d51ee0128f4b5f0c0f03b26b551fe77 +Qx = 36fc3ece725ab5e4529f92fde8d90b89480fbd3e76e287f91c85a44baa49fd2c74887dd +Qy = 702bbec9bb279ee5d20b15e7b9c30192fc691136f8eb9dc6fd2ab4af20492a30f0ee17f +R = 0e0733b88093dc7f0a3e81cf14d5d796db69ba02c1d3fb7e26590c709dc426f2c008824 +S = 006757785f1e55be43069d37884be11c536d90199a8c9d2d4c0b3b21e646a13c7fec1b4 +Result = P (0 ) + +Msg = eece425dddca21aff6f2e6bde513d762cd47f3c26a0a9cec1516e9d092b0aa576431540479ee8be26a73d244c521b7844d7647cb6adf837047c2dfaaca4d3183ce296bf2d5569118167342b0dde8ff822a1ccd69fecc1cae1b97eb054bdb93b6864120a6ada5e7e4d07921d7af090f89496e393dd206ef87b45c133ab5b48872 +Qx = 53ca497bf91fa1e10a5f19b1b1426d39543ee9f14a004be255777b4a26b007dc7113829 +Qy = 0aa5c877b89c4744a9895ec9238c561162808b7bcb0a6bf574a16c6f7e1409f4a160faa +R = 144946785be2f3afeee93b77711a7e52b925281687b41bf79f7404485bc7c4412fa39a4 +S = 07b315403d7d8ae6b05c64fc115a1e44046f6723eff5826c0d9759118c2cb0f50235437 +Result = F (4 - Q changed) + +Msg = bb0e561bafb490c5d63a6800a303b6ca2572008834f424335158c0364417f0463ad5a8bd66167f3d55e10dd521fa40ad5b507d1948a10db7666eb08b4ccfd4caad9de5ec5ea30fed0c07189e368ffa4ab184ec0221bb7801081588fed70d0f1df1b224740816abf931c6afef62b243c5e4115d94ce59f1e0072e376ae7bdd072 +Qx = 50da838370155e67fb241ca7758ab5d778f74c9b9c8a9b7a9bee8abf3791d60ed644801 +Qy = 356b8f8360ce542710927c7e324120aaeb68d378e732aac99b800c4ecfa7f4a3e050d6a +R = 027e1209c65a19dcb158cc8124e2bc9af6d8c2898c6863cd0e59be054d77786fdf83187 +S = 04182873c73f84e8aa3744f614af11c3cd86f105095911548ddd20b77f744e877a57f8a +Result = F (1 - Message changed) + +Msg = fb2807630505d6770982aa72abbf8a42efe2c5cb1eefaeae6778eba45959977bf50f186c47640e8634a73fc290b9e81360021b3540eaa172724ace7dccbb024568aec504948bf78b9e2fa7ad402cd8ccfca169b611503f99b2325507b603365f12bf2b77a73569aca30e530beb11c742d501851cbb168401c103563986838f0b +Qx = 0f8052c723a008731f6356175aff46e389f749f484511d98bf01c2015282ec582911096 +Qy = 6b1608ff9c543a4e18627531e6b52ecd70bf53af8a260fd173ad03fb26c508a0c217ec1 +R = 0acc5838d77ac499c6ea172846471dd77f0e615d9242bbc46d77b4d737cc0997972cbe7 +S = 0d30aed16c93e8e9c3d1c17636c800d7610565060cdd9384a9b388f2e257d26a1097239 +Result = F (4 - Q changed) + +Msg = bc3ff6abe43b899a182c2c56fbd5c8556de9d7ac6b61e3543d478d66ee2c8fd33d2ee63ec5631a2396e9dec254c47276d1c24e7ea5af5a77e0c0bb36a7fa08bd06c10b6491918adeae41715215d452e30c5bef15bdc8a5d17aa2ecc3b2d3dfb44aae9b642ef655ecad785a01f147a119e13beadd5be183ca7e5531a2e0e196fc +Qx = 7e48e56d4bd75410703f3975ae3a0092261349b0f551a819ceb10bf1ab42f4d943b9849 +Qy = 17fc256498e61fbeefa355ee31a68efb477c4e6f5612fe9537f6a11e32d8c1dd097954a +R = 1accd9c7a65b7601e72f981cde1fb0843cfbfef9eb5a867ae690565d4a47132bd85a38d +S = 01a8ac39573fad971fd84546e7d044c9f6c0e3f2eb0699e55479f86d33490971e231df8 +Result = F (2 - R changed) + +Msg = 8371847ef04ed96c093166963db2da8d61eaf10558cc0da4ff2a7793b1e417c4ec4270f57d684c595cea7afd42683013f5cbdf1748f56b0c3a41d508e1a00540b97229f6d5d15c4ea121b0190a6581d9962358dc7e9cc7bfa33c05a65ab0c465a8bf8b8b161e9e3f12353310aa2f4a66ebad3c748cbc09fe132c6519e2ab7fb5 +Qx = 77eefccd7b8ea213c69d15761fdd52ef0305676a2f37ca83b3406a300c0c2cd0af71b7b +Qy = 053b1c487853241fa2c2b69f10c48aef3bd67d886eb2b07dc788f8b164973512781f6b0 +R = 0c8ced570044759c9af7ccf26a7dd7d3d136b194d5d3422ae37c8563a741efa992800b1 +S = 029574c88a062aee5e8ca6d913a7107652d2d0c90b1a8d12b032630f275a4660798ffc0 +Result = P (0 ) + +Msg = bc52973edd03558371c70878419b21b846e4c8c20dd92b5244c6074f707354bbe292a630a6c9026a14abe220143d13563c2861a240eee3062e5fe33e68b0fc90f01639ea6d3640ab7d86c87890c5da7b17c9020119897f43c332aa2ad25bcd169a606ce4ac334dd010bc0f26cdefbadd3e6799689e783a0c43011ba425240d68 +Qx = 58be59abcfcf562ddc2b47bdff736e233702321ec6e1e87f476bff36d3f0e9c349e18b7 +Qy = 358c7b379be92d9cfa8ebb33975643b34861324cc77cf79153cd0e1f08aa91431b1920c +R = 1a6c38c275596c6f071670ceb21c8556e71c3190faea9f2785f002c93327e209f267206 +S = 127e431963d0e24915b5c588ee1d515982b52b8a2d13e3c8f7db3aea0ac44117620ea76 +Result = F (3 - S changed) + +Msg = e4c6020db4d5e9aa6f2763c8593b8941a0f7a0df99e8145b3a807830ecc60d354e0cbd4513bf0f7d4a9861da836de949bcecf97c7a6b86bb98675528cb2f21ae86d150d6b80aa84ad6bc373a9cc1c6adfb1c3cad02c2b9414069d105e3eabf5f096d7c09f5b1c5de5585cded47149f0597bde32f7293b6b5b7ca97a88286cd69 +Qx = 5a50364be908a2dcc31d1ace649b7c1681d6d2069cf3bc04cdda878e7492b7cc0490512 +Qy = 0343b99aac7f7d2d8cb5e453feefda3b166c84bd466211cfc344542c723d833c864befb +R = 1bea936b2e697d53f50dfa3e120013d96e634a6e552e9d26cec5523bfda0426d29b9d81 +S = 0a3c5d383f4d322e23aef345b6f16079f44c37ad050654607c4cb90c908340f307ef127 +Result = F (2 - R changed) + +Msg = a454af54c133f330c63c5285ff2e8767628476bee6d1cc10e1ef5403e1eaaa62e488e62730e475f50892b346fedd5fd76e45b21bd1ba515c198740ab70464bef1221ced680ed9f7d4e3be36cfea8caf4fa3225761730dafcde12bc5a009fff2c0455fe8964e8252bc9c6b8735de02c0c87af91cf37d4d9b87d1568bc757ab7c5 +Qx = 798e0a29f5c0ddf329fbe3b7958d5b4a2f629616bc876ebc1512abe9136b56edb6ec36d +Qy = 585b1d692468b1946de176a5ae387d7878f4c856dcaad9c9b74934755ad57f49250666f +R = 0594348edb5bef2c8dc76de856baffa15b9a35cee52357195ea8a9fc3a96fff3fb7d6d6 +S = 1f7072e27d89b238013313564e34f0e221284f5fd2424b0473294abf1abc052f96a9b76 +Result = F (1 - Message changed) + +[K-283,SHA-384] + +Msg = d1a75368b6b83238b66a1dda85ab85ac264b28862dc3f8439f0b9c7314b7127627fc4b9e60c6eeb94c85ead7035379e47290683747af74b05398ba44a1bc3f9d1375e4bea1fe5721e104969afc0ca08033fff862174b8ccd59271ef20da0234a245d4e151f98ae1ae3c1db7a638575a4567170e1e342800ddcb56dbef95c43e2 +Qx = 30557ec31f7abb062a4af5207707a7ecd810341514668afea2818b5cd12daed0714594a +Qy = 71a7a1b4e88ed37ddccd6d7c660d57211ac403d53f6119dbd56d914fd8eba3ecaa57b87 +R = 0e6d687b3712a2a850aa771c408167f978c7e8cef500e12dd889da81d2c6288526cb82c +S = 0fa0119781a0961eb7b23ef184bbe6863c47d8361619df2972ea3cf41e3d5f7b2cf41c0 +Result = F (1 - Message changed) + +Msg = 8f5bc7a2d18b8b40d16304958ffaae2fa69804059758e1e19ded24181f98d9252398daa2f813bfa16b18abff691ab74b38f6b05b8a826d5cfb4f7f0e0b0ab03c7cee4b451a2edccf5056f5f91844dc670bffb2ad59800844cb31b3cadca085ea6a82143bef7d892087ef3d8ac943ca190b727fcf567d547d900d0f39a08f6e14 +Qx = 0349ac26acdbc9f4660914d318e5467b250aa7e84b93f0f762dfb6187120f76259dc251 +Qy = 0158ee9fd35e7f2f8023d9664be045e826ed2ec2700e57565189dea65dc7576861848b6 +R = 1fdb9b070048aa65dbe5a3a070ca1d02e5d07bdada5a82fe021fcfca7d952af2df418a6 +S = 0117ca22541e8fdb2babc84b11e74c4271454dce8337e908f8f167d15ef23333c3db858 +Result = F (1 - Message changed) + +Msg = 78cab3cae32427d516eb3b14828bf8e4fdd8469a258bda29999f73bac5c5440dfd3440c7ea31910f0384194448cd19c310f897fc8562168ec0bc526c4db5872f9ad7fda930928eb83039c867fb14eb3207a5438ad01cf39bd58081a06fb10c51568d5eb4d02a6e04f09539c8051321fae3f167fb95b9a8a70ebe44df897880a7 +Qx = 1829e6a31eae6aa373a69b1102a8a4a2abe7be65d06e37dcfde686349c29fe0046130ad +Qy = 214724fb16beaa7b421546c9fdd03591cd48e0c5b6d36252a3490ae699aa6c61e9715b7 +R = 09c6fa3bb3e9e684545af7d4f0833660acdc9fb464b9122c36cefc03a374114bc38b3cc +S = 1390899d78b97f7ecef9f33a82fcc25605df0b6d16b31787b29d8a1e5fb444935db427e +Result = P (0 ) + +Msg = 148c6168897394b736c5995137e9e96e507a8904f155c2031a9c5bff8fe8cb8279d77088c99cbd40c607266a87221594f42104f92c81dcb465834bb44558af09cc16f565e714c8962fbc06cce3c350a626deb11509c61cb25284a4d7de6bfea1ef759d451b5df045f9279a8b7e694a628873ac03fcf61e4bf502a763c1b9184e +Qx = 40378e0cdbd410c8b21d604230979a605ace72244a14011ae54629eb13fcb0d7d92f93e +Qy = 3c112322dfdca3c9c7e0323ab6433aed8ca06e17dc34fec3f5ccd3db883825e5672b9ce +R = 1df22e4ec6d4e9d5ee2b868f09e438ba935c21a4de1d749e975d319212ddc95201fb255 +S = 1b146c9bf6908810761dd98a308b2228538c3ef72e2f47410c843dcbde23ea411b80aca +Result = F (4 - Q changed) + +Msg = 98fefe886b57e112e1002fdaf9e3e4fd8eb9a6ede3f11799eb55a4b00c3f05396c9c9e2aa1ec17570c67578faa1d54acba2bc7d6d4bb6af3b8c2ecdd9ba76c41ea59b7f486bd631a0321a1cdc625ed2bfa4c847ecf6f02f72054122faaff13e69d33347bc2c3ca06ea0fffef30cb2aaff086594a4804453745146250e41536a3 +Qx = 0e8e125d91e223c6cbcf6b33c7763bea02fd3e3a2c9821c58e009ffca8995e6ff2dc76f +Qy = 2cd0a3bd7b643d2c3fa7d5fb3cf78a33bac95909a9df677fd1237a269c6e8876d1c5ed1 +R = 0346f7c261442232b1245f5a9297c55a63ce5dc07c89dd49a7057680797f554f87a9056 +S = 0400e3f16ac6436152443970981fb23ea9b445f3d7de5ba9f861ff5bbec34c7c0b7cafe +Result = F (2 - R changed) + +Msg = 520c1bf5a07246f2ba26b0c860b66253ac5723b0cd9c9f9614587d30837de4b7b16feee0c3c3cb17c231105c59b2c2e636d7d967505f5d0ffc85891d41df6a830d83ca67cefad3b2f3784293b3470f1f632246aec106b4552396a45525e5f4f30dce87cbcd0cbeef8a871d1bf8862387d5e8d43e1d219d5ed46665e2815f67f7 +Qx = 1954ee87c63d94c82e77d6d490a9677948e2a91f1d910f3f63cbe48b4cc4150002d5932 +Qy = 53fd6934f5377b024863e3b6b05bd284ce720fdbd308d914bf5722ae90b798a5af01b65 +R = 0758ac0a7e88c5228d8e109e8eb6b38803ae86c8dd67c1afe2656ba82c3d67ffff7a08c +S = 13eaa3d077c97a3a11784d48b6a0097f58baa775cea1741be272e60b2eaa186c09dfc4d +Result = P (0 ) + +Msg = a4edca2a2fa77f6ef6d10ea6f5e770b86b3fe3f271a01c0170f13ee5a5211f118ef0b7896aedad8c2657e1b9118098ca04e917a8fe64e6f49e0b545675bdfc982f260003a0eeb7056472ae7dbafd8047acef09a2855d5e64eaa3e344ff370c41c5d2f0b76fd96e15ed8a4e3bc0a99cdcf4b9db04c1a6cbc752ea553ce2b1efc5 +Qx = 40bdca3ee5d7e41f9cdb4dcdfc1446fdb9f9ebfb2a8ad0724624ec62cee37ff70d24fd5 +Qy = 76181a1b3fa9762f1174f057f5b42c9941702782338ad63789968de8294fb15e19ce79d +R = 12295a98dca2b687c9e3a14649629e68958336a507bcf932c1cfd1730bfe0491acd6f54 +S = 02e9b3fdad36c917c4e0106020f943831014534be805292da6a76c24adf5e824e65c071 +Result = P (0 ) + +Msg = 8a730b9accafcf0c2685406107e49a7d72a5df478ce7d162020011333d246fbaef397345b1047b47b75fd295df4e403c01bd884c2a0b087632b979a73d42000e31a096e4a6e3b866b8e5c96eafdf59a667d3fb94d575d48137a4fb925c72eb09dafaf5f522bb7189f621f841ce219d729e4b4794bfd99f0f1547ee8f5f70c79a +Qx = 4bde1e852ff69469440ed6484659ec8d142851784822624a3514ef3ad5180923c963a85 +Qy = 4e5e4a1a4946c0e33e7f06a0e8b1f1ed2c50c62e092e98cc98846d9f769b57df104ea93 +R = 0f3a5e4992c24686d7bbea0305706bce7590bde32ed40843ddefe363fc0512c96aab596 +S = 05361f79ea9a90d0e11e86b2a770f3d5577b67e8291b6fb9d4112093309722e2d4aeff3 +Result = F (1 - Message changed) + +Msg = 9cf50ac032dc20e90e735e9ab3149a450fdf859beb30827f73a5a5032dcea813d2afe2d78efb1562020e06167f3d202c3a75cd8672e752fbd8effd024aa6e87e37b4ca3fc60177a858a372c7130ef6eff59be8138c9840cf9bb4a671c312a4bf3acee0681df117ec43384e95f7b80c03b4b373d2926f09055736470961664689 +Qx = 32521b42d3048f0982c0300952f02d8248d5a09200ea80d840a2b1fea184111b5dd0de6 +Qy = 23c62bf31b40bcb5d1f606fe618e5c0b3a79808c8983565e9b98969c97ad800dcf5c6e2 +R = 108516a71fb5f592b02385e2f05014ead513cb08a872508ec3938f9ef577398cfad7b12 +S = 1ca2a9233e0add629a078970d9fca2ea9cf485ed8797895f8f418feb216380bdb735298 +Result = F (4 - Q changed) + +Msg = 696d0c6466516ea9cd8367bdec6b81a9c48f72b21a2211acd24c5296d15ddd58cc5894bfcc20fa28813ed8a44517b61fa534c24af70c924db3322d5973778184e4f21d965603295622434d4d32922691f87a09d69e08cc4730ba455ca3a7273d760e5b56aaa97ef9d1026f3e0eec407fdce3f6a33438c08649f242fa2c1fec50 +Qx = 6618acc848b5e86d08011e6da3cb3b826fa3610659db871eca2875db625c73d0f7d8313 +Qy = 6e9f212c3619bc53c1281b4800c2b56c1f7b5b266c0314e25d4b87156771cf2a0cc18b3 +R = 18b3680961db5de70adb4018d7f4495fae7745dd8734e3c67c53db165539bed8faf9c57 +S = 17a1fb863cf580f94205aa8c87b764497c0c45ef7d5ea1d08e8abc94615196c3bfff39b +Result = F (4 - Q changed) + +Msg = 448eb0495f0145cf149bc25e53c0b54f87b6836037097b0aa693dbf1c873b686e2e07675e37ceea83d30dc4573507ffe27bf7e21984a8d13315899b030022ceea3ea7a34b22c100130a5bddf01e7f7f36ee295f095299bc7e7d47611d4723ee3a0be4c6a48d4258604acf9e48f3f01e8f69abaf2890644b2a79b4447c3cdb608 +Qx = 66d8fdf50c52bcfdbba7f29218e5aef881d2954fcacc89d64bc2b02c22e80907f3e9f45 +Qy = 200826852975f54fcd57687fbc2925cdd59be774a17ae901ecef88ec36cef8239df2145 +R = 1df3d8a08e178c998e9892ddd48232599d3e02c843a80f9e3e0bc5a5e843e4334c58b57 +S = 12f76f39df51f1a895fc716775ae90030c8d89e35f61cc374bf1ec2efde3db395f7b773 +Result = F (3 - S changed) + +Msg = b24d4e8d40d1dfa2c06f2c91334cb4c63d67b8f776ebf4acafc9547b557bdf57d8fca82b10884d4dd29ec43b53fbc193b70faf40b8fd22ad76a91bf1fadaafd6b98d414678fb0069323a9e4cc47879e9a38aa5c2470fdead43f10f8bf0f3a7e7dd8bde83db19a7e16dee244235f86b3748dd191f404b54dc76f77937deb72245 +Qx = 28d8012843eeb4cda86e7276c8a0cd07d9138ca48d736a71557ee7e95cd64cadff694d7 +Qy = 74e6b3d52a2c119e18be93a04c43a23022445479d55d3c6352654226eafe6e5eda98ee3 +R = 05bd25c51c3e3436c76c36e985a9a09262d1c0271e06272bdf4a9e7a6e153df56d45ee9 +S = 07df9928ad3deba83ed3817ae7172bcc2eb140405dd81da2c39efa4732d71dfee444d64 +Result = F (2 - R changed) + +Msg = 446dbd9beed82ecc5ecb5f059e547e890fbc0ab3c9a91e0662739b1d9a8ea219f9ac21f01a33267b2d5d3faeda7c9bd26d168dd143b957ecef8e066a22560c0dadd3ce3a79cdcaa32fdf3d9038c4f721218d206c3138341d09ab6b360bb029977b825c9b141d459cc513824b9bc2d5ae2428bb0cb6cefe0887a7fb5f8029868c +Qx = 053c4c03c234a8e30849364eab7c6dab79aca5fabce8d499cea00d6afec321512f7a01f +Qy = 27d5d966c90eff85937d4a0a5103ecc4f6bb59d3d22b55e16ca432b0dd7b7899c6684e8 +R = 032ebbbeef4b6a73851885272ef1d77ccd45543fe0f5734b8bda09f98c88e1e48b4a619 +S = 159369325310421eef84a47225ab6420ba1056d93b41a9e55fff10dabf8641ecca8893c +Result = F (2 - R changed) + +Msg = 42de09342cb337cfa2befc76098a15db82769ef31237c68fe80fd438d3028656adca6d8e7120fcb308cd23f00158202645c735a81a8288b4e0895d0dac83fb9d4c35d482092a7ffaad3072b727a48e68ff92794871a935598e4ad0499fdd25f35147f057e8734a152dfbe1c8311722d2b2fd86fe3f143f1e24f7bdb34cc02186 +Qx = 199b2c1bd0e4c39711227a739c1dd8fb0afdec0c166ed0fef51f08b81180b4379850a07 +Qy = 4b7ac17e8068d9e877f803c5060fa72b262f0e6faba9bd04980e708db035e65b7a58003 +R = 103eaeb8b91d6c32e7ec1bce3955f063f1c81263433d17f87abf32b1768cbcb920d359a +S = 0bd803fc57dbcc3bac2f02d436dc3f8a554249c443779da946dcdc8558513c2893d63bc +Result = F (3 - S changed) + +Msg = f119c2f765b0a15c0265897076d8f4ba30243306623801f8e353f87cb495197b7dac9cf2b1d2a276d546bfee29c007d74150c1b8e81c9d4fbab0ddf733853918535512f14c02ae7cfe595d502cbcf0589bb8eb516e4dfd0f631c39f3618c33552d44ffb02f381e9ba2840eabf19efd14c12bc37b0bea5ee4d348ab2f509555c8 +Qx = 45ceacc5d65e3c5f4ec7714c1ab260f5d1585e800cc4860a45ca33fd8d2fc8a40fc8d65 +Qy = 3aec357abacb19c74444ddf0b18d26d7c7640224e5e87dd8f74cd7313cda0640f8f6b86 +R = 0e7567f732267628744edff67fc1b611a6761daa78bb3c99fac6deb1abf4c7ed17edae6 +S = 18052deca4bc73c7d6466209f957730739904526686359db9e41799272f54c0fa0a6257 +Result = F (3 - S changed) + +[K-283,SHA-512] + +Msg = 990cc5cc2c6d5b4f686d577333c0022974d47da0a9c90f0760bbee17ee953549fedfe2c387e957c8b90ca8587f9830df117dd187d4923a0cd7e747fb12f7513a61f70dd789f6a852e6ffc40aed1fbda2815934e42c4daa95803a1e0c0c68f5282e01c76c535699911b2c67da1d68d2571c5c090944c25bf00379a4d239847b25 +Qx = 01a5c92ded0ccb9e88f41bc08002fe6e079444b6bb74b83108792a65623c50e17ece234 +Qy = 1f50d0233378c3a8f5970e75c57b46b8d49a8afb2097c7690915097956c962b4dca9bec +R = 118a55b8a6116bb37ea09833713801902cbb3a4ba42e85e8573b51067d8a162c24956fd +S = 0054bfb90543fff32981bcc6984971d46efdcb0e7b8fbdbcba21427d884b8fb3ea9e266 +Result = F (4 - Q changed) + +Msg = e8cde5a2a751771730049beff69bb6f89c51b264a6083ad6764ec2332292db46262011cdd17cd733234a364bf10d7f6282cf32395f94fc28f886bf07322c6fc522433b070c041ef067902101f8eaac00b0b40ad5ac22aff3c07d6816036afa019d930d0f839ab9efc4e7f3ae822d57c9c91b014242366d99bd15ef87c642fd36 +Qx = 0b894bb3a92a465c5b7b8fd6a84e4cb285e7b2775ee3ea2c5fd9500dd06959f58eae6b3 +Qy = 66e00013412d948fd5848235ba12f800efb3e03e6367c7c72ef3b7a97f5ee25be55ef79 +R = 045a4fa5cd1b50f01a71659d6f46a15b5acfaa61253dac39adb767e00b21049111816dd +S = 078bf32db3ac337db094e706620a3b10be26479a92a36bf57381370e4fd62e8e2679a59 +Result = P (0 ) + +Msg = 69865ae03fe7ee7c032c9b0afb717620312a381842f4395ea248cc0e99f455e64bfb50c4e45a72373f2734e9361476b2516ea16820ce6e642284a241f1d1ee403addceac3b34e407d8d7f5b41f15066bf17a152c47380e10e2e1f4aa1d95080cdf20998b4f5bbca38a4f145bdcea0fe879118829d593ee2494fd270a1c54d066 +Qx = 3cbd86a96a5bbed7d67d9b67512d1ed9427f0ee0b664429506f1f7487999a1936633ee5 +Qy = 33f5e6f7727d21793a82e4eeb2348fde5d345275a95b676c4bb29d526611e83be4eef89 +R = 152adb127d9542cd6e26bb7cf9845a09406ff6da1769c277ed5b50c7f508240f36f39b9 +S = 17c52a3d3ba4ef891377314ee6cff884745d9e8bad79da9d85240de2b6322cf615b7c7e +Result = P (0 ) + +Msg = d130461bc0e03dff6485d64af558d125f9ef0544f8e7d65e058fe85578d4ccc025fd1611977a2047763295ab66fb0fb580ef1d3e477d7504620c71700278710cf928597c2bf1b64d36db42c32b1e80bd60454870e1888947334e8c9f41ee49bd6ddd2822496071a64025b702fd535e2375f26614a1798796c7969f2ea454b20c +Qx = 0ff1766822e4c519990419e5bf9d9ff0fc1eff5e3f8dab14ecbce1eeabe11219ef5c820 +Qy = 1616c546b7193478eca63cafcb8a838a81b15fa245fd4e45c41fef58487309ad92cbe15 +R = 1a8fc989638797d19ab5da69dc5fdfd549e93a8cd149220758189e8679b25cac442d391 +S = 10019e98315562e43ae52029620d2535d10f8da5d432daa20d09807395d6be74d973efb +Result = F (3 - S changed) + +Msg = b9711192421411e65b03027c71eaba73cd113ff7faddd2f5601e75b17086da14844222bbf197d54cf5df0eaf0df8413808de73abb1e599fc5aa3c4a2084176cc04dde5acf117c4ff65b87028266f8e18b223199c32f8b2b6d6e647eca10b490e9bbc604a5f8aded9eda1d49545f0ebd6372b4fc477b832396cdd6cc4531fb4b7 +Qx = 305483d00fe98d3b42e65aef3e31eca75ca53473fd94fa137626b661c84e05545b2390a +Qy = 5eeaeca6f1352e0acb13dbaf8621d0f5554ebb6ed7984fe6f0bf43df5b2f4abaef6857a +R = 01e76d04f1dbefc702b853b6b1035fbad8db216530b900347e7472b834f9b448c5dbdc6 +S = 198990fdf9e03e3aa426ff93cf6df10780cd8c9a8fbed899784e0241d86aa9e63ec456e +Result = F (4 - Q changed) + +Msg = 3760e43ca16e46f54745a04c77d4ed3f5f55e018aeff72ec58b02b087ab1be0e49e6dab39143c06eff64139bab88270043ccdbdf4f20d4e586b1413d462b26d7f8ec24cb8b1a37e50076530c9c6d4203c9fc79727312e79481d4b2b2f36eb9a12ef435a0c1bd3e97bd004c4f3abbc6d30cf3d9c65ad7d5add406993cbac0625e +Qx = 385bef8e2c36d8784382e52bc44e4dc74d30175e2ca8999c18ca940d06eced9456cd5c1 +Qy = 1e34892a9c071089599af1c062ae655ab67f46bc1963c33153d980ffcf386dd95e6ac2d +R = 092a7aaba00e51161e923463c24f83dd35879275e8e93143e24db213448942d8a09dd1c +S = 02fd4aba19a83e41ced454add1b5946b52d1e0726107b121575b4732b43a2504e666467 +Result = F (3 - S changed) + +Msg = 65ab07adba917b72681a139e3d5668cb44a26c2d04c8d24bc616344d025fd092f5b783d951780460102d68edba0cbdf2430f0d87f5d4ca1b1b054af2c165b5befbf414eacc5fbf77d36cd4d66eb147e15b177f5826a35dd59fd66221700801fddf02da9a18624d65ae6edd6337db8a065fc29fd5b35161efd2bea08a15c2e95d +Qx = 13714496c9c8d8ddfec9bc913b03e4835720b4f4b22171308a838b5053e9f148fe09b54 +Qy = 73efc3684177cd1f9cb04b67ff2abf27af51807b1a4f56ad49a42c2ced1b75d76df2cd0 +R = 11943e5bad38c88a2fe24af61544b10dd50841f4148dd27e6f91a3c4222b269245afdf8 +S = 0cfc496f1f4fb68cd726a7083a1533d849ceacfa3c261b6c478ccc225353d4492329e45 +Result = F (1 - Message changed) + +Msg = fbf42228121d85e17e9df4ef34bc1722d08df5f7309b1a777d6b58f66d4751e89c7e3d0a086c7d414b7ee091bdeac677d056b161eb3207c1f29306b91740a34eae91987eb19c82db6ff33fa36fe87d374226e9355229194a6d6cfddabe8a24892df41ff2850c702cc607f3ccd76190ec6552aed2dd57821fe5302971475d1335 +Qx = 10edb988c06586a77e2eabbbbe037715e2bd21ff3c215b3052251af1e16f48e878d82ed +Qy = 02a53edb4c78c213a4b0d428b253fd9316def502f83b4b2b5c1e28547c899f4d8ee6eaa +R = 1b5b500ea6603dc8d9f3a35dd8b833c81d5de906a1ce33151d86ccdd7bc7fdb134d45bf +S = 04273057670681df3c01e0a06476eee5410c93ba03a24c32dc44d349d0f3ed0e2b2d531 +Result = F (1 - Message changed) + +Msg = 48345da99219300a319288ef98158f5068bc5194fae802d3631ddefcee11eb28b401bc70e132291534ed9f816cd69c296702e5cc76a284f2369196b3cd487e2a6830e4b3b8ffbd073ec5c0ec9d0b9915f1cedee11f3da015cd209ddd38f0fa56bdaf5e1e973a3a1a52ae16e4b8e0eb440750ececc03ac0deacba7ac5a7f0d50f +Qx = 41658f68a6318c5073c5a0e587951988337295346816da0c0755ab4d8d901a6807c2a4a +Qy = 7eb2e2c3caeb11262e1a6c7effb1aff9fb9acfc7c5f1d20f38921d275c4884aa515e69d +R = 00d26ec94628ed68f87ac0b11b03fe17033a8f3fecb952988350fd23280dfee46567f50 +S = 13def1d0f6ba28fdc001d01b6b27991f10cae2ae28823f5026749a2d2d8e12879f8ea44 +Result = F (2 - R changed) + +Msg = 6b4817979bb26af3e78c7beeed2d862d42bf6d0d448f66d825ddd1e0531b2c8c1f7afc91d7882c8f1525b8e75816b8cbe22df4937b29d7d61289303613380a759c5385414c3ef6a78f9a6ab2739a9bf77b1a7b9153a537fda1ecd2bd9bac9cca07b6cd673a0558a0c02ed5880e3a15f227ce0123db33d50071df8f03cd582981 +Qx = 6159a70218e5196edb03321a933e33a7be9235b26fed416f0f4ccc5df6a78c0b384ebf1 +Qy = 6cfdac5b61bae55eef71502ad573b37f0483135e4edf7b9ae4d828d725be6038fadf569 +R = 156d538718115119cb6cf5c1feaed301d0938cb3d9d4447289bca23da72556f6fb419b7 +S = 073bd6b29349b78e19823699121eddef1ea7ed00b6323e881793365df7ed9b5601735f2 +Result = P (0 ) + +Msg = 0f4249e450388aa6c9f22730742d124193a7fb93a18f349be339ed04ad1074389d8670ca5a898194fde5da0ff0b674e57de7aafe47a7c00d631156baf562aec83feb4f18a151f508c0e96e71b3835c3a651b58e6d7a525d4185ed0e76b0a88cad78ca50913756b459141bef42fc4aab37f581222a1164ca8497eea28e8f27a56 +Qx = 0aba31d52badf2792ab950973f20b3a8856e0d275dc4bcb9fdce1453a3c11b00beb8f17 +Qy = 2fbdc1597eb64ca5bb6eb4d962870021a34a12865c700c6a27b977a8dbdf8fdacbdaf2e +R = 1eda7358b97e62cf4f31caa16df33df30381842b2e4c8b80db2a1b46ea14b68d85c05cd +S = 0d833572370bc01ed57b9830871c7c4f4a2b61e3771b7ddc4d1a2f467d2c681cb21ecd4 +Result = F (3 - S changed) + +Msg = fd23f96e2e95722f8c13333148022d8b9119ed9077396aaa2fdec50804ff6571363210b91063b72349756f2e0969ef2b6f40404169c401e0763faf3d1252a0de30c497e3faafeb0ce405a36918a13a158e2144d14368b47922e682d48a5d6eb41ef1406463ca007803c5f3b5ece0e8bc2a78a1d97bb6f4df4b7f817c93e07603 +Qx = 2969f3daa3d5be3483e6996eca16151ffd3553f47db56f43134a3322e0295f986c04789 +Qy = 08fda40fb3d3b50334cdcbc519075c28d5e5df4e77667ce29ecd678922632175ee5761f +R = 07b1457633a4c69a173bc731272eebc904b7ca3a1edeb3e11e9b2a3ff09bcd1a8a4a000 +S = 0220dd9d9be61589eb5d95940db13807896d05c161e8c414159258219573d2bb59715d4 +Result = F (2 - R changed) + +Msg = e1df6e110c92507d3995a48e71d276a310f2d06959a74c272cff40c2ecca5f8579315616dacc121a544e7fdf1370287bc3e1bc793af8b584d5060c151fed5e94db7ae13f65a29616987c36bfff432f188ebfe1206cd5bd3711c44afbe914fee2c4253282d14e577010275ec0b6d4989b3b533e1dc54adaf718dee03ef9245bcb +Qx = 4702512f991c687491df8b2e67a0040a392f8829b71aa3379696a29fef5c2f833085bec +Qy = 19160fe39a275d91188d2201cb05e41a90bd0b1a4a87719ae4174095bbf3ca948298f4e +R = 1b9b7fb91d17c2b3f7d7746eabb0834d9b14ae5c0df4de48227948aba725ec5b99278a7 +S = 0c3cbcd832c0d871a5a61a9130083444129eda930d60578e2b3711f34da15750e8500a0 +Result = F (2 - R changed) + +Msg = 02b2390f8986b925a180ca42755755198a8b4887aeca50fd7d2f025b3b9f8f2821b55440985e758297de5e794e0b2155340c7b593fed7d0d926c2f3079d7e9de85cb3590e8babfc23173086ccec261ec6748510343ade0e9b078c6bc50ef7934be44b578ede32be05dfe7efed1a8fe0bc374fd0c6f4f6e27ebb523c12e436af9 +Qx = 4adc5f01ddf4673ef3f40ec231cc31a32dabea0155d377be2830b7541f58b021965952f +Qy = 2f8dabb50b78006d4aae8073084bcd000c5839f3caa3025145f8a9f523f36eb00c16066 +R = 0f4b4d9a15b1b824eb9282368cccff9bb4daf82a2a68cded062c930537a0e453e819f7d +S = 1a9404cb8e614942ab3ceea07ce8a27f65919a4e8e68b71fc261064f0c067132191bb1d +Result = F (4 - Q changed) + +Msg = 59b673954c72d0c6b750fb8c6e8608cd9fe7616ff4850855843143ac809fd4b47b5608b209451c1416827d26b71941e13b94aa4563808e9125afa7b2992d17e9917e4fa003bc9ef6ff8ba287bc1034ec486459f4c1ae1ac968cf333c82005b28c7bb421419d627c82e0bc01d946e57334115b235191cb2c339e11f57d61fe1af +Qx = 7d459e3cea8af1d9f7ca6cb1eaada2c27274517ee1e6bd6330a2f11f28f46cf3f9d0e8e +Qy = 68240c0c769779165ffc0e56b95183f82f6d4cea8728eaa3a6eca7b7a03919476f880a1 +R = 058145206640d229dbbc3e1a762e2d85e3d8a57e29de748a73ccb336a8515e31a4f010d +S = 1da5dccc770a815bce7e3a9c117840b7461ee528ea70bc50fac2138606e58696490e0b1 +Result = F (1 - Message changed) + +[K-409,SHA-1] + +Msg = ff96031b33980b3a2c1f887db90d8da8f63a6ea784e0ce511a9d98610abf9ed847ce69f22bf0f924fe6ec5ac5c8fbb72cecbafc4209fed1391e6d2b3d8836462ce4af7da4b5d65d6fc6b495e6e16bac597ed06ed06c6f9dbcbbf70df60aad3413311dd25d851693db5da8c6fa92e51851cd39ae9303b851734d4a29e95b6d435 +Qx = 1827098c818ab246c69c4fc1fdca01ffd3190927f69642b2bfaed205cf2a63ff9bcf5fa0a767df5f82580c03459726cc076505a +Qy = 134d5d2336a3499a5a7648c0ca07347a5cba976a8717a9790d5c7de59c840d9cd0b54b9dca92797eb6648362f4a42e54b46bb61 +R = 02d7266219dfd9e1e6a86601412e5e63dbb5754c78ac9a3b13114af274026ab45293fec6856deccd02e661d2b1495b3f35658ed +S = 02e7f4066b768ec1fff2abb608a0b57996a4b857bb2084717c7edc43ba6c451e029f26781bcfa2b43cbaf1bee08b955b3d1f328 +Result = P (0 ) + +Msg = b70f9998a167fa400cd7ea326e265f9c9659aedb82ab15a4cb5634a8b2affceb151f38b83fabce7ec6d4060db40753a33172b5ac583394d717e324023052a519274fb3344f8cb7730ccfd403bcd33cac63a459e6af753ebded4d9045b0ec6c5fd6d9b8f00c177b4313a7c2e5288dd3cc8665507c1be43f00e8d5c4bae83d04f3 +Qx = 0fad83e6b385547cb07ed51f10ba23327616de2ad5d53c6be50ada35d6c59adbc21030ad0f591aa906d802ce2d7e7832f111d78 +Qy = 1eb0a050df99802e5396ac87b9f4799f85dd5dab68d115763c8598e0a93f2fce8402986dc36abeac3a1e44cf0502582cb089f8f +R = 017f2c52483651a0e5212624448dea67e32a89df1ce4f107d61d99c878f0dfb14f661d6c5a73938f9e52b2c0eb2d9054c748dcc +S = 061def59adaeae00358e28f19f305856b29de6521a1e5942744528a3063e1570df4c7601c4171fc699dc141307b50f35fd062d9 +Result = F (2 - R changed) + +Msg = 698301ccf01568c974b82bc50679929bedb336e7fad24df896c6dd2de4bd6068fa05900aae91192c68b9f0b508cff93223668937f23a9615828ea172f33789a21f73708398177dfc913a984b185d3a5a326ccb1f3748baa87bf0ccceb87945682892ffe117dce017e75dc5419c1242e017f931277f54817f70374acb55ee081d +Qx = 12a4407f06fbd673e1da11932cabf3c9f28b5481e9fdd2b5cc5c0ac0b302ba0c36edcc4f835016545cc4d2de8da6108186fdb82 +Qy = 1efde2f8fb0f9f34196b666c3dcdba4aae57723a0aa6920c7d77659e1dec42695340637a633614644d301033d9dce9e7d8df987 +R = 007f1a253402813dd9ea99ee2504c46ed70748600762c4111110ce8d6769265773c5ddb1aec12476c80aec5d6c737d499dab183 +S = 02f03c89452341be4c9e9ef3a3541c6584c95f21c9621b5c250e624f5e99de7ab30418704eee3b27c0f6d55ada05c554ecb416f +Result = F (3 - S changed) + +Msg = 36aac2c59727a43f349e1f705d8e380aa7732c16c4031eac558fbc3cde303ade2c1b650f5df925f53d372f1aabbd1f08e98124aa281e64cdf58ba1d45ab235d8192573d008fe76099ef61c777ef9a1ff4423fad63c34bfe62a0a24a4b540d35b02198154a4aaf69529eed9d1a39186551fda0c30eaae0d41555aca2e3984323a +Qx = 0f28b056b5190cee2b657ed33c23c5f20b35456407e674c4bbf528e92d9bfab95d1f953072b58fa884b6f2554f807d85175ec28 +Qy = 0f7612f46bdf0f4de756626262e3975aa10ef3db3b469af5efc1e2ac14eadbf28ceef116e66a532e45ddadb7d92e14e4f685970 +R = 01f2c7f584d82b94a07c2a1f4f574bce280260859a7219ba97cf2bfcb52a0ba54695a4b9f734d94424acb373f256dba1ace3c15 +S = 00754fdaec8086bbaed94563c3ffa5e06b5ce25c69158a1afc035a0cdb1bac6328e9e39df28b6001dd306f48f19486f4321a3d5 +Result = F (3 - S changed) + +Msg = 34b674db060179772c46a3a920ee70a406a97d86648a124e766f58c0b08eb0a532317e9a21133c9b4fea3abb4c61642fe0213193a8d9778304ec90f185097424adbbb5406dff13ceaa657610daa2e1c1f02b32ee3efc5300175460eecdbbdb415645bfbd26f76d8713b2b3be068d47ee41f8fdf0ab81257e1006084d42c5a197 +Qx = 13dbf71abf20338b921dc18a6d3f61aa5275fc96225372cc7ac1d379040aa5b5b567c6a82c38503d4af6c222b0b5b17361e3596 +Qy = 050686ed315dee34fd39a136b96263399ccc605d589b55e08ed1310745bee83a254bc36273b076341b7dc0d0ecff653ec7c7896 +R = 042d1888533b5712376314f76630f361cbd9b8e1bc9cad1d1a7e50af2dcb882224df668fd1edb77344d01a253a8245deb56b825 +S = 03594f818301dd2ee4698eeaaacce4bf2b837531fe0418ceacc3cea95af44d3f8ea4a3d50635d51a6b06c0541153655064d0fa3 +Result = F (4 - Q changed) + +Msg = 1174dbba45864fe0c0800d0953022baeff5e94ee8625f7039a9ff066eae95961811cdfb73a4167ffdbfcb9c16acfd8bd9f4b486caf7b3c4ecb37316756ae78537c3315bbf8ace90bfd1c549f0ca0eddfc685a0bd2a5e3c2a53c6826247fa036068ce50ab4640a4ca31743b0e111190e79c586e53f0d159b40d65e53d45c5f498 +Qx = 12efb486aaf8036a0d8ccb9e79332e482f5832aabc6f8762cb223761941c74c64a6aff7fe930d1c89e79a2b31748b04563e68fc +Qy = 112c596c688c9a58e2907dca089d2f4e239d30a1457eb88d32cc4a8cb6cd9f24aa20891ae957dfa56a777f2f1962b043d49a2c3 +R = 0025552ef3f956de4a9b8f97537c7912820829be58a4ce40f7afd3606c8c96c2d0155221e45187245c5c1a9a2dcfd6d7ebb737d +S = 05b998b6f74a7f01a054be6aa5c7c2069ce327db542ce386a1c1b2e8db97ab984f7aa21f6a24593e7ff6f26e7211557f4a840d0 +Result = P (0 ) + +Msg = 4bc2151f6c4927948d4d92f51360cbe365851e67af36ebbda3251ca99b6dc3b10ad2d565a9e52b48622b6a935b47b1da77ebd5469a09a8598668e833659b3cb2beec62d3b6af02aa55c5e960a41dac02a6cd48ac0e7f0fd522447e551e032b1a9f151dcb89404ec3f60a35c12bfaa469a00cba4183c639b482fccfd8945fd979 +Qx = 1d8edb626cf7fe16c3f14ed563a0ecbf6a9f0b223aacaa2fb3d7e34855b1b4a4e3e62768e1a3d954d1a11604c1522f8db71641a +Qy = 1baa3906790f7638bdf0bdaaf85bde94c555f98a018b9927e562c8493ddb8c4e17a689b4e6252b09289441bf253efe12f057044 +R = 058c30ccd5dc0d4ca57ec5bf06aa06477287a657d9b06dbb97bed2caf2501025ea73d867a287efc72a2e504f6770e74e3e2706d +S = 02b6fb00a55e553d9e773f450618100519d5b519a66a1def20139d17e738f90e583fbcc9574c130e83703f2bc033e3e66c775bc +Result = F (1 - Message changed) + +Msg = 19fafa0e1399467ba259153fe9b38e1b556b737b343f0b2a016e75191836b2d4be891227739dc0970886563e0d82785f40d2e9dcef19b9f6cd52ef7a34f065b058c6c4d3f04d4dac707b4bfd957939551e11742f5b708b09e385c38a6180325e5b1cbfd88eb0e51e2db2228a9b97a6f42df07aa1894b2b35f98184433c38522d +Qx = 10980df1b0b15ed925c62d8dcd9597484e166017e1bccc87e30615782d51cab5eeb71b45c24abdd42449b5a100e5bd49bee4584 +Qy = 1b679618f85364a55dc9b92f96f126fbf9d1ba23c212f1508780135f897ff4bf1e0e26346f5994242ca30048a6e3010e744bdaa +R = 05696e4f300f50de70c77c47b0fcd0f0e99217ec7117e7c622f0490f3be56e009f6d75a3d3f2218e4d162644a72d543683a9e63 +S = 0682412bf4d4f7e618f840447743395abece61eb4c2d1dc17b32a69656e8079acf94f97bdf0c4d3cc336ff6b321ebaa69c1c128 +Result = F (3 - S changed) + +Msg = 7fc93b0d50037b8b8f3032c0d23828b8d110b6de3ecc20a9ad408baac1c0581be8ee92eebc9c100220be58e91038f45229f54fc0e0f81297bd271b183e5bc2aa8772c99a9292251d89d096079bef17a1bed1667e64d1cd8fa981c860eb46a2ccf2642dbbe1b3a1d6bbf4ae72a1f7e474d83e8cdf0f20d89571bf2b3d9076f5e8 +Qx = 0e71fb4a794661a4caa91e68149b0e578fcefd857ca4259513c1ddfa26594ea1652ab46fe5390a6572636af948793cb0e4c81ba +Qy = 08d20329d7f2144fcdd85fead29c928d038413b1874f4014febf5344ea988ab128a00258a665acce4f79e8127acb73b5ba20511 +R = 010d109232facd3ecaa45bfcc7f986cb151c2dc76634804309fd4f5147da3987696698db3056962c27b6ac8005e8d32a51f8b65 +S = 0308858187722e98d6bc85ff088ff9f01f0f91b4e6536ba48176a4d0a7cdb963f54befed71a750429dec0f4a068721bbd69dc4e +Result = F (2 - R changed) + +Msg = 4cf404245caa6fee1614a3e9ca4cf86e7476cf341ab5b86c3c5aab7d50d309fc210c3e0846f7727494af9c2ec805b630c824cc80e242c2cef68dfc72b9d6be3fd403792ae61e9b736a742bcf9b327056ab400c3834fc7dcd0a4a45b47aef83b6f9c919ee4279a32d7de7d602c293415efe7f01e8c6dddd1cb415ab657299b095 +Qx = 1cc74168f51cf3b5076832fcba31aece9893dcef20ea7baa186313fd8316475459f378d4107bdfab1c9f8ff53b5ba7abd77fc7e +Qy = 012aee5bac842fd6c76f33cf61a4fb4c56548ad9ffedeb239ca55f73d659b7b3ea0a4e1538ffecf3118e330f25b6108670b6fac +R = 01fffe004c2a4d191e86485ebb70cf5eb31af473bbb7f6bcc97466a7ceda5a160af1b018eb94afff3b84fb9bc42a5560c1c7ee7 +S = 009b6746bd33bd1c82a1406295bed21248e3ec04faf124baeb17b7f44f8c2b1d1dfad0d4bdff78a3b17a7f9871b7624a39be215 +Result = P (0 ) + +Msg = 2221f7741856ce9a673c4c6b6bf7b7a8242c452d40ac40a2a1dce9f5fd937baec4159de0915fdd9418c1ee60a81d14e1b1414de7af3d93c850f2649b171fa2814227991a4f337a55ca06546d4eda5936769df0566fdd8483fb0c82d45562bb9bfe2a5c204157b7bed0e199e8c61fce8e050411d0f4eddad147688a760e7f268e +Qx = 1e2241fd22007b13c0140119b05ea667cd93c7f8eabb1b219408c2b2770e18ce9436371d95c50c3a9d26554f2707b255007f728 +Qy = 1374c49a302b2ce57baaee5f29f82e912b128848de40efb4ab2ce38ef05ff5387e0e923dba7775cea18ca2777183610e4054008 +R = 0131c1f4ec7efe39c6b6aed9fcc585dc49921656dae29a50d41722c56bf4a40b6266355d85d57a8a9227815c4b6e78b24b34dae +S = 07ae438541f657dca05c8d20ce1519661d698c989759d514ec10cffff85bf12319585aeee0249b20bffd6b8223148cca774119b +Result = F (4 - Q changed) + +Msg = b711587dbeeadb88f0033310bfc0b0665072314c409a15e0fabe7d5b41c389a87467b2dfedb128e73dd5839bd4b0eb40846e37c0a059c1308a6376f243f417cd28dd5c4aa63c2ac71725531f4bd62483fed6c002e90c9190967d3e5e7464d53c07d19c41eef052e4992a88e0c2ccdeab5e12bb39def97434353bab2f3b663907 +Qx = 117e63458bb8c3980589e9781ec2d7a674a93071b2146b49b62236037688a08eae510fad5101b9c26c442f193a524f1aa9da488 +Qy = 1bc9c50cd0bceae8319656f52c2e8fd6898eb5da470923b22618640f35ef56a65df2339d6da70ac4ba723d1e5cadf27bab60fbf +R = 070145f2ddb32c5e7475ba810edec79ccfced1a0c9b387992cbdc11239fe0d8cb431809a7b412488afb7422ef1c16e970f82af8 +S = 028ad78a89cf01e3f63a7c1506f8be2206a877d968b49121af7cfc8538cccfbf35638bd1c5b017a65c9a7e115a7466462a96c7d +Result = F (1 - Message changed) + +Msg = 3ce1007265a280bc8e199b9e3acaf69c2dc70b8f098ef61d6be6b25e1ccc773cdb1a931e89f954375d84c2ee9e225a2457c708d8503b6092d2dccbbade7cb00e8e89e8c6ea8b5f2bdc26b83c598c119a382f990c05118bacf373187edcb28f7519860ae00aa617078c29d3d2630dbb09273c054c508b709382fc3beb5ef62704 +Qx = 15388c89f2a2024b1989feed0f1831f27d10998f4388d560ae6b7394041138c8ed88ac8bec9e6c8b5830747722a05c975b7c3e2 +Qy = 1cc91f052af018b8a5f7ec95797fedecd40b63d8cec1f3869c68768c4d30d2b3fe453d669a315621355d1ba99012f423dd33184 +R = 0784de0f66b5b6b12388205b40db59f7050e1f45bf8bdbecfc06008939892f2745de81825ec1dfe2a261b26f08c73cfc17b796d +S = 035430979b041d8314e94c782dc09797a55f85f11988af6d47a4eecad955610007cf64bebe322741118fa3e3823b07e48356477 +Result = F (1 - Message changed) + +Msg = 999f4f26935ef6689ab166842fa80af698dc0c9509e388d2f165c84f8f33977bd5cb72a83f38ccdd1ebc77824106edf714362a4df6af5b3fbed8578fc217e2a725790e2d69ec0abb2a4f566793b4302011ffc11c2eb5bcb6f88c51d608c6d274b108aa69b7897c07f0514b093639c710696e7af28ba6ddc21b456ab522eb905b +Qx = 00f3c16b73303713cbba473f59b01328510f6c4b10752865ca1219b9ce1970cf1ca543a2d281fc845c21abd2cf0751e16bdb62a +Qy = 17888eb61b5f70bc0ff5b68505ee290e127202304112ea775ccf26bc2e8b5bb32eaedb17ebcd4af64ad0fa79aa8d37c80b06458 +R = 0547f955a0c54a13e3eb7ea3efc4ca0e37ec2d4f30b024f46ffd127dec8b6ef2558770abc98e905ba4f5df8114a5849b7469afb +S = 001be8451aa2049598c17aa09e88d38c723f5a634486c5b0d294a5dc038f594fb663743c564c8012f07a74d3ff8d16743560f6c +Result = F (4 - Q changed) + +Msg = 64c663c715707fdd52ee61398467818aef7359ce3a37364357eaa5a656e1009e46e7bb7d400c7f1932d13d453f5cec1e0a95cfe2c873821ce63946bb03eb6b79bd0ea247af3d75caa7c2e9b0e71e9188ccaa0bf6db1ca5845d2d469a822ad680ad0725d15cbc5cc11d9e2175e4cd77f79a330eabb346314bf0a2978a9b53b93b +Qx = 0f5383301a7dda1c90bd4c399884c4db494c3fbab762727ecba5fca846e6d3013d3595059235ddf444d383bf8b9951cf6ca0c8c +Qy = 0d67b7952444753c73013b80a98d810a18615ade1f49dd3a3c2f7af03e19d7e29a0054e02a123c22892c6297826adcee1693ef3 +R = 00afa56237fff0c4ee0df71d50caf4cc53d40ec89caeacfce77a41396f0195b90392956d9f1f95a99ebd688aced3caea795eec1 +S = 02bdf6eaed7224f3ad8a723a15924fbc30e84e687066deb05623fa268dfc2261a47a659d2a70158047a4fb1c22d893cef582154 +Result = F (2 - R changed) + +[K-409,SHA-224] + +Msg = 25e73452b0c271dfc6bbf3e1a8cfac82a8b5b81d36f5f52a863de78437855b51b22e501637837bc826a7014ea83ac30a4b16354764e63b8f3bd5dedca0e65ebcb3be5ce8ed19a357404eaa0fb05315da514d4054f1aaf4126a6d09860b82ecade29aa91aa1b710114625ed06f66e038c4019ff4598caa5d3687aff4317afbdde +Qx = 1a51dde14b9e7bf6241a944d98d8043b694f9eb5067eef94147fa74be4b86f4de5ef03e9cd712698689530f921662abaab4df58 +Qy = 1074c551309aea23b1f2c07ed77566a4d107a03a3af191cb970982f91834dbfc7029dca52d841ecec6acc1fd004342f31fad521 +R = 002e80a754f5da39ca65527d301120b599cf813e63e01da7e9ad654e485ba0be1fef518580190d1eb2e1e0c792fd1d8f8fdecbc +S = 028347336474be299fdb950c5a946b5dac4455bf99fed14f0b2e97cd00665271186cfb926025d256bb914a4fca19cc112810faa +Result = F (4 - Q changed) + +Msg = 28fcd402fc1bacf7bb54e3521c8a02f49440b5bec52b40a5086deb3ae19d763185657a0b321e5d43fda1cc9da30646ab61897644123ce0f1f456d6af0df180c210f1037e4f85d6fa2a043eb42259fe1930baf9a1de10a78ec034593aa3b51b098c0e9eecc84dda0482c1f60175e5bb440202da52316f794ed5ba4d7ffaae0f57 +Qx = 06fb08f4180bef0a636e2668ae606b42760348e1c602c197a14a674e69cfe9f65af4b3e42582aaa88c261976887564899d5acb8 +Qy = 1b96da1f41e5d8c1330d2473c252134639e7e6d8755b37f3f8ae856e64636ba773f8363c99cf30d2b18d8ae4a7e1f5f63086290 +R = 054bbfe6336a7912fd612453e75e4f6eed10694cba3a4fb7df62d4b85102cf7e97005d503925d3bb30706a261dde7497708d376 +S = 04e7fec9c66e4d7590b32af2500158b57900b6cd36c6743d234ba150b110290f74eceec2b3a85be82bd8db2f0317ff9ef504eed +Result = F (1 - Message changed) + +Msg = 82c8b6304b8e3edbf11e98094f6a1a7eb462cdc09ab9eb1ff71a657ad8996113fa94ddf6174e03ecaa22e2d6dda3573510f5fb0e5f0e5f43bd3632ad5a25e8018fc0d03d0aa77694abef668cb757f88ba1d08eb4ce7189c2b188069f9901f44b6cbfba9befefe71122840d15e96d4cc5cf7e7f817cb8c43f4160b275381011cc +Qx = 0cfac69a763a4f59f4b40f97d42889cef65f890837961d1f0b00fd8812cffc5f836e4e224b9bdc5597e5038d6c32428e49ca796 +Qy = 0dd5a7f7bc81d0dc82759c67cdc988a3286f311aefe646f0a0daca098ba0a9986877d4ea41130826844dd0bc7481ad84aa389b2 +R = 061180aabac8350a33c80dc576eb18d15546d6504c78f3fa9880b5ba046652cb5aca70171300d940c6ffa6c2a7b49d4e38f87e8 +S = 06b5d053e5566576adb8e6ce001d9e66241d35a859bac2c903dc8686283bd7003b8e41384371c775189e50164270b5ceb82c569 +Result = F (4 - Q changed) + +Msg = c777aa6b3ca339a4799f20b9f951ab82c432df0ebe80aaf5ef0e72bdc8ed888f18c44ad7c41bf7bbe0c8f627a530763907b1b2bed6c8bbb01a2c52bbc5c51b2fd0d6f0eaf206c2942973fa3d6aef2dcdbc7330345b449accd7a58c02713041401f37006eabc5a060b3e587cffb20423394429acc9b300f83c3057df05481d42a +Qx = 0c3c52cc679be17bd044a9029074093c3302415fb025a39fdc88291a87ae4d0127e6622aa6f77fba9eb33fb75d7bd2563c3d5c6 +Qy = 008cc865822434e0aa50b6c1d7621cbe973a9ab904e36260d6e0d45ed783fe4d8aff639f6aeb0f0269c2f4911f376c89d876d5a +R = 046e06ca1df5d90ba4a26ee8369f3c93b25e631d408649d7ae80c033ff159b1c0b97c47abdc4d7dd769304c13e862fdc3c80a43 +S = 04329df027685eed1695321689be8811b1f308e037c88b9b7a73c72ef56bf01fdb707c1b33d5ad747f65bf5371b9489c843e3cc +Result = F (3 - S changed) + +Msg = e670a3b76de2dcd84b6f8c41180a2e90610402ad3d51297233e2a2c10db38185c386c8cd77a95f997fbbab1a851b7394edeedd66a7f97c1ee8513084a409c5c37836dce97b43b441d65587a4c766627b0c13cb1dde3bb21007a8fa0d7ee989cc132677ea09cb3cd9f88ebd6d2a2249a803b6a42cf8d1edb5058f6c16c5a4897e +Qx = 0ce761c7cd5cfc7038212e5c1900e054706806d4d9ddff81b59f0f74be02b124b29d84dfd1608786a91cad9b1c466b19184b5f8 +Qy = 02232371918cee9812fcc9ef0e2a468c8428bfd14dd6eb85cd5b0dab7c21819d21e294c15cdf80904f3784c76bc7b12317991b7 +R = 014d47f013275de5a70421c3b650df712bcff550eccb52f9c803e1230d04d8f4a918e149f61091a16d71472d4772a7cb3701573 +S = 01018a75b75017aa19da183a384da985fe3cf16b4c2ccabc1b2eaae03f8ab25971342f288c1d4d5d64f5f9bae232b583a0d7359 +Result = F (1 - Message changed) + +Msg = 20dd31f8383c2f00ddcde7b4d601acbd50359e6e2917d08be83482dfb88a27ba3c8fb52d200db19b02bce9a40900e929215f0b0b30f85bd2b5f6f9499bbdd44b286f313b7ef3de4ef95dc3f6596c5ccb0e65f4e5e2523e7b86b39c5364b9be36d7d5da81869e481a744ba94e9444cee7eca0f4a35c03881b8a3c2f1b1671590f +Qx = 09376167aeb5849d72fa65268567ccf479206f5a4b0c11ddb73dc3a11b1e8b49b27b1a1c8c5b7b087c5fc5a8d1046aa83a6725e +Qy = 11e617b776856bd55ff8350173a3b0f3aa84e9a4fbf703570388bd4d22e8357a1fdd42c1adb2ee91bef62c24ba3b4d062a2d58b +R = 02ed6ff1c6864ff85ebcb5521b525d4c51e0e363f1be99b0d84bb42b5373f8a61c31685ad7ac675b83b44d71a1f359a2a6d2666 +S = 03a5c81214ef2914d6fdea3f85b89b2034d3a62c0c144c0d54706814be9b62b65398d2aebd3543092d349bf72d5470973c6469c +Result = F (3 - S changed) + +Msg = 52638aebf7fa01e6b588e2b3cacd0192b88cc0726941f2ce253859722cf1b26eae13b8eead1ca04a8636dde0ff64fb628a062c01df44a64337ef2141d5cc9bb47b700a301c073cca0ab888d5973f90b068cd8ebe7f447b3b3366c495c685a9a02bb35e4af65c0bcb942caabef7e352e119156688b11edd20a213d6c5d2671b5f +Qx = 015367ffb7aa168d676604584fb690d804c702533ebf5d8b47d323af53a5ee367cdcdeee5061349ae912b3fdace30ba890e690e +Qy = 1a065c08db546ef584259f46670f2ad166c8067955b36dbf0b62084d121b2bcecb0cbcd61a4ca05dae707605aea1bc76ee8a8a7 +R = 060a9b4db7ad064d0966ad2f2f6ac7884024e2c50cd536eb9c50e66a957bafb02ea8c49fa070f157644f099816f003173e38155 +S = 00ee3a73b7202bb9d7cb62d2f97dd88409fc6f37c462a08faa4076d00eaea91506c29ef4204d3d6c7b8d9ed607365d2b21f139c +Result = F (3 - S changed) + +Msg = bab02a9e4d99fa0a07471065fb2338f3ea0bf363f0b28426b6705d68af53b5815261c5ae48c65d4a688c44146f91230722ed6303e4946b0acf5315c3d0e4a0380f083d270dedea2ff2e5404bd49da9232b2b10ee7e6a573f29456bfee106939a606fcc8a3cfdea88627aa5a0f783cb09c480bde75f72e1dc68dca5e5a19443f1 +Qx = 00a5ca0f24e0d49e77503463d340a82cff9852da7cc3882a907dea4cb11836dcf56235eaf221e7c6691cc1e05c029a90b9bb29e +Qy = 04b8eb90b5b72dfdc1174af19429b5f926f3aa4da8e9bc7eead6bf5b6ceaf48247499b71973b5bdd687d488855edb2ad01b79f1 +R = 042ad6e85525707c2d09592960c6e8d65bf1bc10ae8df901ef949b582a9aa845c9691d5fedc1687d871853fefa23b69a2e6f381 +S = 025b222542b3d9f4cf8ac989e94d4ff302051769ff8ba262fc1d867de8691704eb495df6792b74f8e597b593998b003560b1fff +Result = F (4 - Q changed) + +Msg = f877425513c79280a30ad6ab3be8459db81de7aa5ce44c28f9fcf3e9b3538a8541963ab9126b5033746a1d6e6cc124b6c7b461eddf502c812e646440c29dbb851e7870c126aafceab1f400442c4432ba4c7a8a3f5c5f6c6dcb98f88cc40961ab02193b6f4bf521c2990fcc004777a3f9f5adcb18ab849dccfa6fdc5065f2e006 +Qx = 0e66722aa3620d57e8d297f8491c31815736d4a8d1f4b81c560c05d79a6cd6ead77577f2475dfcc3726c21240bac0a9f9426abe +Qy = 171a3d1ad3f0a542ef6b833c87548677f280d5a7473a9ee11307013abfb96edea03bfa4457b62ea1d35b40bde4ca4c4186801f4 +R = 051d4ce29992e72b778616bbb33a6a144657d2219ac26803d7ac20afd0265664b8dccb10cda10540de64d3e6dcb6f5ead94428b +S = 003444cce2b928fbbb29d86defe599e36ad5dceb9c6f1c514b4513c73cf6d321d4624427da55ae6f7f72fde4b3b0e29e4786c64 +Result = F (2 - R changed) + +Msg = f92f40e1a7b64197430d32d80c38f80b03ba86b09fcf95c5e9906eff7781b651f990aafb573f0a688cd159eb5c1014f08c45cd718722d4f20ad2b68dbb9ea6c3eaa7527ff827355fd033ec146ffda46b982157ded724bf724c63830c8c9b03636b497c8629f8ff01e3eba9f080cb7a29cddcf881416c0353b7fb8026d3de59c6 +Qx = 01fcd89187c98f0e079f78287a0d16a166e19e61eb18d14056c88d8435185f3303a4038b5175bf6f5e8b856669cf6c0b3275dbe +Qy = 17308944137b303cbe6822b8a8e2c71cfd24e5abf8e85dcb914a2f0844178377def874189ff45ea9818cd530861ac27052f1298 +R = 01549121d2e0e44ec3ebfee626fd4746469c654f03673bd52998f4d1f22888affc8e2b12f2f5f7e19a6207eea459500299fbfbf +S = 06c56331f0e31abec84d5693836ad869eaa9c17f206937bb9e7e5f0eb8bb468cd25e6bf14cb6fc403aa17f33d099c3cf6b3b51f +Result = P (0 ) + +Msg = ae4ab6b8a592d67289526da60f22c4f92b0efe612746248e117ba83ba0beb4e24e718441242e882f9e82d751e4cd0ff30d906585fcc8143b2dc4899745db35e57d38d6d041830fb87ba50a7e82541c89483ed72d1dc406a2ff415fff536148eb7beb4a5161b6365509e91a22a195ca89840f0d6b2ab240044fdab9c0e659c7fc +Qx = 1f61ceb27606f95bc6468e0bf0cf6ef52afae188c428f6ca29b8e5d6ca7068e6e5a6dae4fe255fd5c1b3f17ffef33d404c05962 +Qy = 050a23356640b92371ae6092e41e4a0844615c1f43fb5f8db96c22f284c7e0f5485350d92baaa41c00857cae7db1750edc7e8ed +R = 0487c2ea8430b13e6ce1efae70006f06796b58efb382aba3fdd096b24a0f4419d59797e481ead362af62e0f04705d5b79c12418 +S = 03def98c4bf52eea5b38f2fca761ec83c1540caedaea90f01123691b49d0c86d68697ae674b95275394d2165f906bad94450924 +Result = F (1 - Message changed) + +Msg = af0fd6359b62428675fb48d89b0b5b2bff9cbc591b5d39e9849c7beee96e837d09fb65e15ad3e5ae2101ebc51ae7cde771afb37ea1736e32c59ae03bc628e5cf0db159e39770d3d2bd811cc0348ed142e59385aa3ef26478d95ece3e95623cb05b320fee964c1da0c1758b31c2e40893d203657c4f20373ec6ead52b868745d9 +Qx = 0cbf2658aab29eab6cde6fc8f224ae41b8ce95f5f466e8974ee3e12f1d68185adbc1bbb5ca990a6794a30ffa99d449c3daa0a4a +Qy = 14dac0776a4956b4f0ea671e981d5065a9dda030d0b720216bf104295880b7499814a327eb20295d4f2cc931cd73b2898d3c06b +R = 03cdbb42e49facb2437303a7fa799cce3b8f4659042d3c0fb7de96c3d221e9360d099b0c546e490cde4e2d13c2911e4fe91ce4c +S = 009491ccd5add2c906e5bd78cfdb751cb7d383b56ba6d1d1f79f8d2ad7497d5d7ca7a784fdbb4faaa7355160a80dfd97283e2ba +Result = F (2 - R changed) + +Msg = 2c34e969ff6ebf0b6c4b3f1806329ca272aa1fcbb8e07281f9c923822d6d6aa4e257499e39449ca26ad93db8e1e4572f4edada2aa8428f17c9bd0259551a80bda97304d38c7324936b72ccb0449476036553556414b81c28a5e599de3e5458ca4b14d8c840a0306e74959ae509ce05210e09c4166cf489bc5329ef1c0263bf43 +Qx = 0b55ab78acf0705566cf5d45f9a56492cbe47ce4ff23c1558ff1fb98ae7e68fe0f4221680c1bd4dedbdd5511fee8cb43c5ff888 +Qy = 08e66bae2db75717eb635fa211acbabbdc5077864caff65d04802b3cb9aab9fada21279d7ca5a983223f39a772ae9678a104c5a +R = 03ae184bf66a0991ba2f5560ff43dcdcde7dda69db5ece674ddaacccb38be52df6d10cf771a4d51d0dd4c85a2527be147003bfe +S = 026fb07f158e4be060ad96ddb7110b84751fdfefff88e6d6d9e909397074b1593b5bc0485c6c5f446875ccbbc8a70a8ce724e63 +Result = F (2 - R changed) + +Msg = 274aba96988dccef3457089c99ce0e47cb37ac6e7548bf959d21983de26c3f0a256b4b58bce166c1439e8365d19c3cb870c4f8d8e1693da56ab9ea32ff7456ef317a75e7158b12e31f9d90c8d152b2215bcc89a32399d43fc6358adc331df0f4092771fdc98cef43c618880e3e725c5d54c060c79209671e12d58041a0b0ea35 +Qx = 19b86473a6c776650c4b9f24b2828c2f5aa48b0e7f07e7491b5641c5a336a1fd33ff62cddb2f2e370916a8e3d1f35c8bf6bda86 +Qy = 0b8cdafa5eee67fe715feb8a29e46291fddbeeb1a347171577f36c568cb248830d9b0db476828332201238cc7202e2167010e15 +R = 073bd1a1936b163b6ff80a492c80107f9471c85b901b4ee6fef869efb15e85574957ea20ebe3f6dcafac4ae26cca55d75a8522a +S = 027b817c87edaccc9bdf18b88e899ac6e74084212dcac6d9b8207d3a914ec839fb1d4f546ad347bbb9c949f7bc86081eb4b21d7 +Result = P (0 ) + +Msg = b4cd2d31e6b256564eb1c29374194402b9b463b46925ff69f00e5e0200a78fcdf98bf1cef9fb9b54a954e0ccb96a8486f1a5a143c511f952be4c9e928425cc967cd7e6c7c48357797608ba49806e0d90d116333972e4b045dd122048370124c46809f5104d2075fc2d53033d254b3e335063a86e53c56dad8d9d5030840d9e75 +Qx = 100fb187fa798634ada8d5f7dd61a8b18c5f8cca08be3d3e40efbc3aca63e6b506260b4b94fbf0a0d7faa2e75ebe46fb58c1c5a +Qy = 1428f99a262363236b0ab6d7458dc879863782af5a23475b08b0411b91c557609878d4d62008a2972cc0b38611933818786b7df +R = 012e95789782f35d1ef47e0403332af6c46b2f8ae2a8f4bee042ee03922b75340d250e216599058f97a1e3edbcf974a6c7fefdf +S = 023d5516bd31f49295931608fdddda66bc9a57ddc084934c8dfb3fc1b22e0dd353115c6f5942364294b1111732f34d2cb23a83c +Result = P (0 ) + +[K-409,SHA-256] + +Msg = 4e6b1975022764fe16417ccb9a9513dd2a60c1448626d5bec7b9c6a6266d12a9ec3eb7242cfc695b086c5a179e741fb773165c6bf14b7a96f7e6263eb1b81ec10325c5406b19833b01fbd1dbfee4a5b31eb1d5f0fdfc84c6118d9f6588e7bca04cb2e1b17daea3d87e0abba86e2f33adab4e5ca0de394f26b41ef66e963a21d3 +Qx = 1f6e283273c627ecda2f69081a7472de9bc2bba93412f2ebecdda4c983e35012f4289f278ef1bbf9a480e82f7480bbfb9799386 +Qy = 0a9d3ceff2a4acbfa4413351cfc60506ddcf878a1fce8b194942a221e166bd0aea1b6204e8130c00e819d689ca18b1c08665fcb +R = 01b3d90bc9df4a607818b9f6352d952c8f670797e67be2b04c53222076d46d533afcdd5fcc897a657c7db98d2c7452fe579d460 +S = 00c8a8655fc26ddfea3dae42862d7797840b765c75eefafdbfdb747948fa4add8cc219a5d4173d454537c12c4331c8f0b863c27 +Result = F (2 - R changed) + +Msg = f8e9604307cf7bca2122c7ac4afcef38ac501b35238f11a5a8f12ced823d833318e039f043b37bdb7c6cae73fe44a7ee9142c1da07819f0d45a300590d8affdd74d47f175e77c93dad7bac5c3f15f1414b97222c1ed76bfd13fd93746dc79fbb12be5475d7e1893e5fed8fa8d813e7e726e60491e98079509ec8709186200ca8 +Qx = 1a42a2fc34ae1c62eac5fec8e7cb012ba676e0f2733ba6f4921e55ac4a556a0d46dbc952c95fa66277973bd35448fcd092869b2 +Qy = 1c4bd0a23ce527980efd9e9af4b49204299ec62bfc53aa2c4df5c4dc9d8e06b32aed0d23f315200333b432ba59ac9476d2bf63c +R = 037e7387ac0cfe5b34389e6fda5637e02c9c2dcb479eea30db9b769cba8340b1ed11878d8e42fc2af988d99078af20d9cdbb5cc +S = 04872c15a507ca091e5fb9579ba87637efad745db54d1d18ddb24f004fd402752429b68bda20c488d5143c5de95759d0b5983ca +Result = F (3 - S changed) + +Msg = f0fe4aa41c6f5e6fe883a2df3c64c84afc7e00dde677f9d28c7d4d8896d6480c942d6cee2f7f3ae0f8c8b49455c1d1d75bf0b21e5c65c8eb2f3c57395a4133055490dbec08393973943d9e3ea25f08474c9fc4276033adea4022251b7016ae7ba5e18138bb2b7d4baa69cae339e96a705c060d7f97ea617a9496a108e768dda1 +Qx = 0f063a250b677d6d4933d62b89614b5ab184fa8d52b6fbb5a45e935478d202a0c00af3eea93ad2d650fb2dcd91c166772ee6432 +Qy = 1396fc91817862792be962eb45c9f4889905ad5ed1b136b441f3354f3801b3c98f13e282b95d39662d9e914d23bd67e2a1aeb7e +R = 04db1b7c59de49a91528f71b269f62c81d4bb13ad95b34fc358f7bf7afcb399ac4096e7742e04df8cf48292b39fbff53c429b84 +S = 01714263e993c04be72ba2412963492e3d9d0d66f2325f25049520b19662b2ee51d7f7cba4952c1b5f9cd79dfc06aee09e27823 +Result = F (1 - Message changed) + +Msg = 4b5482770df140a8588ddabbdf2dc2176b5aeb0838f800c424f5492e34414a0bb801ef5c90b2afedfcd3d96de0f098f3de3bf3c1a7d301822e19554ed338a6a58221042c8ad5bf5816cad9bde2427674435380ed7f17c38a4b2ac98a967f34e2b56a3d835e560ea5b8bb48e161afa06dd9e8c17322f5a8cd7b4e5877e4305569 +Qx = 19db5e3be49beab0a03ea672ef15386f9416eafc0d495aedcd3c76fd4c60826df8bc346b5006555dbd9c8263c124a311a8dfb0c +Qy = 0ada764893e2b3b6cc96e138b2c8f0176aeb84d4dbe7f495432fe3b92849cc30fafd125e827c88d41f5bf3b60babac362605ed4 +R = 03694726bc2cea70f6875ce61c35bd0f98fbb97f7080c591c3b55be8eedf2db35d49767532a2f99ae0034632548c6f314693d23 +S = 034bec44167238c60f94b6f6ec81a99138a54654e036450f85e65bf9c63c00b5d6e1a187ad1c092575defa3f7775d6621892385 +Result = F (2 - R changed) + +Msg = 20a9e879f3a1a82a60c9aae5422fe017c36fde89604e23bbc0498b275df54076fab9286875cffd8a6f571a8d5eef1b8708a8e4b299c3ee9665ae2c4c8c90ea2277b63d88b2d8134bf5f8cf4f2af47c016387fb617380c8a8477e2a60f8c0197a477fffde173aa6814542dc33805436273f258a63605934d416f0119cf5c4bf29 +Qx = 1c66a20f3f23401f6ff01551d2fb8dd5e1189f878267846f69c1970986b3b6efa04e2ca3439d1605cd947a088f29274c56c840a +Qy = 10d54fde54e77005cbc97276f71b58b1dd38b0eeeffc7c7dc2ba2453608f9e7c585f77bbb7cb3bf012ba359446cbd07051d6bba +R = 043b50489fc45049c7f3218263c5e14360fbf7aa45051ba9aa088f700032ca71f9ca4924dccc7cc4d027186c411483045c1f522 +S = 0460acfcb0c195bce3edc9e68f2718df328db2ace6d9117467ebf3ebb3ae64168966f3ac2ba6493d475c0e1bdb924af6a2dcc14 +Result = F (3 - S changed) + +Msg = befaeeb0171d529c983fb3431d05dd473b4e2319c1f4db7b93c6f1275ad1ccb8dcb938521f935113283e225f3bd17c047868ae27405917e46fe93b8c3cd4cc946c4c3215730f691bd0d43478d764d772c0b4f0267c6d721aab3096b1fb3410ee4de0e5c3ee7b0923069d03a5596c138f7e1930932bae195039ec4074c8a9579b +Qx = 15d46b0b61111479a386806d9446a4a4db0b183be5c0fe2b7a2b64b308dbd03955ff257190f601fa3c18071a782a3fbb9e9fef0 +Qy = 172f22515cf3c4a98bdd6e8854f5edcae4f54fbb9fc66217464b1ebe97849666aca457c2d58f40173a2713a61757b36de4a07d2 +R = 0447b297df9f6d38a932126d029398ddfb521eb112c78dc4b09c22240b06aeca5982fc1ad2a701244e616a953f88365c47a7c91 +S = 01714ff8f6018ef552f0ea3fdec65176fda2b4c9bc94a4e922083ac97f0c5754e43e92373b2a3a9e5c14dca7caea90a4a527ec2 +Result = P (0 ) + +Msg = c102cb7cc816a903e1a5af198c369641cb11433cb58e16e68dfa6e859432fdeccbd1a56371276292ac8350d0aaf7991ddf424041a90209b82c74a8de5b9557e5b3b9f2241431bafb29187d289f8dc45b22a260e01b249d9ac3fe90671535335037ec2d8c798f37c0f06e4056bb829386e02314b3d02995f28148e5b2cc1ac562 +Qx = 1ea708ba4bd5d915f897f95d4d5007af49f8f19564fa82f12d091244defaeac8d396adb0bec5350c5574063946513ef4a48395e +Qy = 0a0408805d33ba240e8e8cf7535c167f9afc7ef9460777385bf273010b2c672e046ef0f34f1148397a193b9d6c9ed2431cb5658 +R = 03ff6120070664d097f84afb1e88fd93c10378621deae6df2e31de393437ec8f5b8995b63c0138af2425cd5ba5155b02b46865d +S = 05347e9f468ccf646dd3d01084537ed8d01f8930643cb1f4448d0914e8b8ed3091bf7f9b7513d24270de637d44bea5e16ccace8 +Result = F (2 - R changed) + +Msg = 9636ab96a379d452231fdf8ed99e42b9cedf8183eb810329f994b01286aafd19887b347711482de94bcf12b8f02194102a9efe2b593c43ea396233a77edecdedcf884e0bdd2e8b546bb4bcdedb4866150ddd573d7d34e3e345771b5ec3b3814d96b7d92ae0b977cbcb496b7b5a733c5ab2c7252e1f2d948995c202d125cd6bc5 +Qx = 03a67447b7a6fe71082595eace14335714046ce8fbab880cca441d55721a9639a5cfe3b64a5db146973740eca25cb4156929148 +Qy = 0a58161ffc25fa2a57aa11722a6164c4a0ce5ef61718e8f84740d7fdf59aabbbe9af438110beb01f0801fc810952e5cf4ac45c6 +R = 054c5012d77ac38a4161250148b51a5e12ec3f172fbddc1fc20d9d23b8ef48ec5705159b4e204ecd5ce95e21589682a22debf5d +S = 010b0ecbb778e2b359c40399ac95df951fceaed5395350dbd85a1dbdbb353bdb388169bbad453bae2aa39fb419a7dcf253a5ab2 +Result = F (4 - Q changed) + +Msg = 71c969fd30efaee51c04041930e8b5ea2b856f8e1718b3697a5c2280b4c2ce790331e376844f5138556409509adc76cf556d2ebb09f374e611621536dfdc9d7b82775de74ce6045aa43e235cdea8d0406a96084eda4ad5da2837d0323a1b064cfd23f6fec47cefbbe666745a86f76ef268ae485a531f0fdab845864932f6ff13 +Qx = 19bd39737c83926c7f390b8927cd626ebd05c690309d521829947033a03c8779f25c3588295fd09067cdc303285a58b8768e348 +Qy = 1c698cb1cfbaaabf9b8bfd172a4c9523035535a5c6ba6a7576ad15938c3ec925a5312935b0ba0c4aaf6ec6016e3357f618b8325 +R = 04d9d06936ccb952940c4796faccf2f6decef1d1703e5c867675fc84c0a1d121222fe2f45baa71109b4e4f453890c8fd7e1458d +S = 006592ce8377cfcae372d3ef2ed3f2a373c471fd3489c857dcb98194cbb1cb245508af4f56861fe7984bad20226b960fc5ac717 +Result = F (3 - S changed) + +Msg = 3ecd70a383f47f7c65641fb86842b3346f32166367296fe1a06604fbd5744f230cd9745cb45ee0b18a510e7e77f3db91e319abd82fb42d05f8326a64e73c964c45debbde9de2cdebfbdac5cb19cfba01da56169567ae411ca7c3590ba7b6e011f2f8c4a98f52d49d9d4e2d22046ed0c74587a8c129ff7aa24873649155109804 +Qx = 1be644cd87379a46b3c2d7575e8ea187626089a5cf6e6732a47913202f12595bd9d2c194f2ce71e2a7fa0f8c53eb616a530a20c +Qy = 1de1227c868e029ba29ae4b08ee4eab64e9db24dab39e3e24464e626dc44975a7865aa3cf953116143d6d24d90143485345e77b +R = 03db5fd9ecf4aaa756db3ac58b3fbaea9888b69dc3440df686256e2b782104609e1b4ba86e448814fb370a2457fd1601698887e +S = 076b9043fa6e47c5a5a7cdebfd9e52f06ccb8959e56cd5dfcaaa9edcad94ce4bd936fd45ab8fef4873928151d19e2a9f7337c31 +Result = F (1 - Message changed) + +Msg = 6998564eb37fd0f84608a026d40ee5bd3d6089365c818b9aa0cf67d331f1df4657cc7820ca45ceb8b96615e2ba9fa4874ef7a3afa69eb20ee93ef9551bda21d5809bf33d6a6450710aeb36eb9014473c861e363a03a7d9901005f639a927ca778edeadd90440d96b1f411ccd665c215cc54d0a9ed6c4c573611f05fba98bf8d0 +Qx = 06caa25859862964d7294a903159742279d079824a08b800be1faf8ed251c3904d5e181eab2a8f13d8742a281d51eaf2edbfc04 +Qy = 022edc714dff9a0b207a38da0bcf2b699bd2d56f4f536340a05852cdf5e337ca83755d6955fc46bd7578ac73aa1c918f896d23a +R = 02b6d403b1014bb2bd8fe4cfdfd7dee1ac39db600eacd7bf320144092978d0547249e4c656059f381ef65ca0071be58f306c719 +S = 021c4ba6c7fdaf60bd027ac0ee6c7ff170b189e51187f33d71e8102de14f97bed8642dcc687848503d6c7d3119ca157cb577068 +Result = F (1 - Message changed) + +Msg = 50c0e9dff96ce29c6b485e885c90b10626504e6f089fd8b00b4e6ea425510b7fe34e796c71b1ce561b552958e00c17cb1b3d80542f5adb3b2bad804dbaa458d8f853a7351416616f6dd3a804f26ce2995c95331a6f4c2f7ff1b0b1691e3c90db6c15e602fe98643c7d84d09ca817e7d5144261d376300141627e1e5691f33ca8 +Qx = 10a6fc4edad0f3fd48d8babc527a6fda8ac11ec79bf5a0448d76880189552f8fe3ae3de01d9d5e63021db7db60f75e73431f06c +Qy = 1cb860126ee31c807186141a4de5be25afee780e1349ef9bbaeb0dc68649e3b3bbc3ae828c05b457c0017f2d809a3d8f177ffdb +R = 0501e10ea55ab1ba74d208b9857881f846397ec6860a1802d889ffcfbb2f0a4c9d7e73b142767a603674781114ede99819f8236 +S = 011012810e1fdc0a299d8b2d5724f849cad241b992015f209ea11f0816921217c6e4fd2bb8fe4943fa9ce2735e91c359e73ecc1 +Result = F (4 - Q changed) + +Msg = a29b6dde91d631e3af6769e75a5bb664ae95fd64be0342cc2f46edb53ef020a552b74e4bf1b03d80946106216db9f0535bbc5899783dd77dc4fbcdc959d8368d190e423d59ca41d84e15bcb277b790281b43211e43b7825eb3c18a78abe7de6a1253768c7e56f2bc732e0b7d1b999b7d0b18a1d0a6138d80eee241cfea9a7eca +Qx = 1c632ab4587444aa3481d62249fe020f64fa6805407ec9a6b08636d75efe843f63131b330ce459788a078d798eb2a9e8cf90f32 +Qy = 0becc3ea65663c54678fd59bdee3ace71b2795b87d5194db4abf9c01c5ef1be74d373739f44c5182bdefa57fad26b8491be9606 +R = 058beb756ca9c631584e127ff17079f9d7cf1547e283f816bd4ae4ef74c4531f29a60468396124a292205fc4f666b911a67eb78 +S = 0484f9eda2cf664cf98ce2ce4dd1abcfb2518f00077d3f98d4cec0e16ea8428ab8afe212123615b4fdcad4f54e3cdc796613c06 +Result = P (0 ) + +Msg = 9cca8d5d8efd4a815e1c410f846e1642efa8640f7f29cc60be4b6be1128f81677a7cb34ef0e407bc8d38c97e07af6e74c3928cf4b47129604b05f38461c4ffe400063687534936846aadf8e777d4e52f7066e3abccf2c8917d69f7b858860737fc96f5d2a3c68aeec61f657ca6c34254572c53c16fd5dbc8d31f01a19379af20 +Qx = 04fe27d48fe88d71766755819895d710292be5b04e83039626cc4efec4eb118c461fc12f9715abf19568505cecaa167378ff122 +Qy = 0abe19f36a4018b0f7fa477648d9a7732a040eea749cf3aaa91680d63fa8239765150397f97578cbd28d9c1dff4006265b7f25a +R = 020b87c06cfe3d05da015fb4a53ad05aaa0737cdd25086ff05241b4021c7b443490d252bc01bdacf0db8af36b361a7f6f50475a +S = 01623cdcdea9837b86406e2bd64af45ffe04820c2d460292806a2e25ae65827734acdd09b5b93d9ae261a6b07f355abd2daa36a +Result = P (0 ) + +Msg = bf3bb473df712924bbcbeeee6fe38d290405fe1a2beab90b4ce31babc5ac2a1d4fdb2c32cf9c0877042e140c0bdc84c12f9f98e7af17e74509a4ddd1d6769c27eadf491555ea6ae0c577d8405523605cebcdb3e3b83fcb07e38fae1c96ad583331f445d53dd6a2ca2a2f47b577881f017497d19ea9608e83048829e01c5107a7 +Qx = 1dac61d7c3501dda729b6164db89fda3182dfeee3f5ee3fdd97c1c1b8900e47d9e1385a59cc55c2070d55025e3e949d9e9752d8 +Qy = 18be39237a6296a7288d6674ca944a4c00565fb247c9d6781ce3f7405f3f8bb6ed5f54ebd497f12070c030509c55f1704e0355c +R = 021ee09ff4a77ff639f86e772814606ec78251b21eb96b5db795345631e5812b6f9779ca70f12e34384a29dea2cc15162ebdc51 +S = 05e98b64f078e1601db4905c90b56eab332f726c2ccf56c12964fcd3c11b3964c997072155995c0798dad5e688d8c1bc351494f +Result = F (4 - Q changed) + +[K-409,SHA-384] + +Msg = 2a79cd9b399e272b6f047b93f1d97c4d2895c6a26f43788e8696fe531d3b2a65661532357127396420e88e5b0099d0a08d466a02abced4b3f07831b242490e69bd1495f6d517ce6b335a5d82b1a64584cd468e4988a932458033b82001f05319cb71c4ea1e8c2973867e69383a659a8ce122c7e8016b2493da6352c99192730b +Qx = 0c2b2a3de502427f2c48b9a078187cf511d117e6e1c0bb6b4a7d06dd9f28e2741257b5a6a8da6272d038961275f6c470b5bf33e +Qy = 01b22d4544e479a197f6543a98fe1b75d3b70dfe0b51fab7040593b1f0ee6464dc2665a7eac6354344f7dbcec9122e0ef0b8a0c +R = 078f850c7fdf351f9258e0b8d140333fc180460368659c35421d5646491a2c870c82b455f1595d8c2fdf2b4180d149e7956e5a3 +S = 0125e37e45a4b55bf40b5752b42f4f9d250873c06e569716e944431cb2245a84bd4f81570b556f796561357efd62a85d6088b63 +Result = P (0 ) + +Msg = 18cb0d5da751779b563c4748f913c568054ec029129766f775f5d8f6c114e5d9a1a64ea65a414ee3df8ac08cde4f2320b91fe039232e2b2f2c42bc2cd7c0c6fb3354e4bf9fbea4ee756ccddad981c348c21d471ba79520ff18e99561524350e9e455df01e1d23e7c2217384184f8f0478097f8dc836c4b97c3144efd00601883 +Qx = 15b559a8de781d2037c28cfec048503ddd2db3c1b4fa3ba3a865d29af54e8d55b69d02105e6576f36e787530167dd6cf246df8a +Qy = 05936b463cbf13c0174a04419d858eeb446c10e78e178118fe6ec98c3c2e9f29163974a9f04a9fc47b4007aeec778fcc80423d5 +R = 05af10cfd3ce0f76f3d745164ff974de778060bb1436c5f6842b64e76c07388f6db0f23eaf60cef30558c32e33b0143056a03be +S = 07c73c351cd11504291d0802300442a9fa578355e5790b5907ff1dd1a38fabfe3bc0fc67698fb0bd0d4724cbc824d04e6625b95 +Result = F (3 - S changed) + +Msg = 54296c5607762ef00a84de19da0d7cdd5ebf63eaac8215be8e4af5a430ae8896d4f8cd559b1ec31a8959a4705d8766c40b984bb5423d09c993b1c96e1dd0b0579ccb691b6482b3ad7ea2c9448dd944b9fa0f0c4f6a1dc185e4859c6764f0f7d60479626fd57ea2aa6925b8470253b1fe27edc587a9bba99aef9525794841de09 +Qx = 03983e811335d6c5fc2a2bdc893e6d1e75a2adefa06be68ff6b8ce97555eb1d2cd2688c188ced5dfb291b0e29a0493aada22ac8 +Qy = 17bed3888fe98a103c4ecaf923aef32c01eec178dd309ef17a8351153b4f4557d96cf4ba0e10d142cee135cf02fcdf9fcc27119 +R = 0497e449c58fc5f70c6779bb84204fc9c0180f5b834503e7fd8b2eeb9acaa9944822aaba5d57b0c5ed5dcec7908b5c3eac124ec +S = 029ee8c456cd1f40360c2b0a83e88c3cad34b0f4bd0615f45e38cf6a66301d9c2d3222b8947c19e088434c6d460c37a0d5555f5 +Result = F (2 - R changed) + +Msg = f787b582112b44655828e5bc247899aba204f80c0daa4ec75147b47412978228ec303a37ed16f2d1706b6493dd3d8aefdc6920844dbc59a1c9d2d1826c844c5f5ecc9ce8be6b913eada2ff8e198733b27a2bb3614e5563b98596c7eb4c9b0802400225d75de1dabc6d8e83480285a1c51b11631ce30ef38f9580f17a13ca375a +Qx = 0223bde9502db7d2bbc5aeaf53e9f73e99ef26d2e5986a759f09f1cb9f7de0fa1c6d60c407e799e30fc6ee3198dbcf341f055c2 +Qy = 1f3f40a985fb508451741abbc224339692df6d3990b3a4cad641a3198a010bbb854a7026fc95559b6e60afeb29932b61dbf2912 +R = 06890bcf57c5673db99eebe3ddaf236bb6cbfc9dcab8ecb40cb305ab76fa3de7de75e4c92b5ebe66fcea0b6e8d210e90c2e8063 +S = 0322aadd7aacff765dc95cc46fde591926cf9289f9f5a328dc2e89f23a46bd4f542ffcd70f0a42711a719343a5f11b715615b84 +Result = F (1 - Message changed) + +Msg = bd51f104b3d348062b614c4f59b783d085d1f515a84c7ed35f61df443fa658269518f44ba5043f99e189512a19c72fab52db3e0f92d9192938adf42ecf114a7ee25d9d8986d72aad0c251d9c0cefe9a2f439737d89717eec92060afd4ae6890845a6fb7558c1b1e9c87a39f2382e364f755129b82f2f28dd8c3667039f9145cb +Qx = 0dbe4289c0f7731ab886d7ec92e78470d464ecba1716d1bdf6a555e3a7c2055a5cc584be46bf6c5f5b2bda1e356471e1703e858 +Qy = 1d64e1131239a9b0b3f4b494a26e9d06bc69d923ac5f03acdec87f65182421146d37987479c1499a899cfede6f11b2951b610af +R = 069b31f63f4ebf2a180fcfe0151cfd07e0aceb91d66e79504750a6fdf0378c60daaa13cffea4ffa887adefa4bb122dc3ea1b1ac +S = 057404d8f443bae9617ab90234cc2b475c0be7a0805dd503d2ac0def26b6f25a24ffc87a0edcd9ad06c1250d51850755961d008 +Result = F (3 - S changed) + +Msg = e1471cdba8e551ebc4ec954365d73c5d94bd1549ee8b9ece034c551de2af8ba56cbcfa4eae07bd833216aa079242da41d471974a3422923fd970d4121cf76596ec88651f2f4eb79c7541eca0051fbd44967f7b8ae916c65333e219bb7171dec141440f294a24301f0649428e6604205a5320c8efc05aa15474bcdb1d3da842f0 +Qx = 078c118a622f883876dd430bcf9a74f8c34bf3f684c0fe472da216d77c4b646a5da1ed193baa09b82760cca5bdda22ae115a520 +Qy = 0dd9f76d399490872913f68eb6d1cbe0618ae6b31bb0c620d07cace2cb5d1343544f744b246f9d4fd335cf43c16c2aac024123c +R = 07d6efe9836e1ee9e9f3f6b8e60c348826227e5ff3d6f3c737c2105a8efa487c59702335b43c6cd72c83878e1bf38bf10804c9e +S = 02e6ccc6cec0455239ca2f86f9ad83f06d095154390a7ec1a0d8ef13d5b568d5468061f7f270eb004182dde0989d6751c0468e3 +Result = F (4 - Q changed) + +Msg = 697c9565caa1f34a177a73401ea36da08e362b1aaa146cb141a638dd4e178e85d614918bcf1d77d4ade925879b7dd0e3826dd9edfdc7dfd5253de67469c2afc2388f82f27ef3043ec7ed7c63c299c8821a7055649c787e6f5f7a0f5ed9f075d019ad7815f7cb3572b8b99ef6f739257151df2817fb07b8b9622af8b977d1dd72 +Qx = 1ffc263b85ff79fd9641e2b6431cf10b863c2dcabea2c9d9fcb45c6a72fa1ab5f7feab5e2e7e6b168546c0348ae7790de0eb78a +Qy = 0e55e2a6244db40212d5ecd0ddc6ca78e1bf0cda5e55fe2c27369b6a8f7ebf7e28dc953abba1495773fd3be817cab106fa698a9 +R = 076bc502f4bb6a4d2813cf2f2528bd852cf091276db67176e525ed85538dbc77e303544fa1d842c00d06e548ec753fd78be66f2 +S = 050741d64039d91f7eb960709720cd28071740792d9d9d8096ed3613cb80079cd2e5341cf4996794ce1900b071017f05b335f2e +Result = F (4 - Q changed) + +Msg = 0b2fcb09bf5fccfa59373b6c662ee650d49e4a5cb1e0a4ea9e10ee13cdb83c424e3b5da6ca58abf30d5f210715e94556e186c1a7625313a0bad38b7c2085518a1ff33a330a1979c5af6eb2128d03a6593caf3c21e755defb0fe3383134d570769eab6d710a5b359a9e9f793a51b4bd0e47de210b70ef11e7fc418c26ea8da4db +Qx = 00c30a469b9ccd20590b1545b14f120f083ef49ca950ab8955784787b8761a3267e39a577aef9ff99204630bd0ea1f7654512ee +Qy = 1c0f563f5469a9530efcbe809d6716c52abd4c273ad971918b953ea473b246416328f0c8ee19ce208dd4d5e5577da063c0c79fa +R = 038bde5248a1b99fec905047276ce0ff03dad77832a8907622abb62cdc8d4e1fedcc7a357aba543ac9a2716db6b447de0633442 +S = 028efdc8d213bcb206937c224999e2331fd48b3a0ee7a4475648aaf62ab73a0bc699d11d688052339410465dc314afe238e4b42 +Result = F (3 - S changed) + +Msg = 2a81f4d434f1c01dc41f9118716ad077277c5973486075b8870627548999e05973f1b5e65bacddbdfb7d6dca6812fd817b8748b09d33c7a55cbeaf547ba4d3448d4c218590c0fed06c70c7b6e1edea9553f244b7e7b75b23a9eb734387c8b35eb96169f5bb75dd2a6c7e43ddc11827ee809a03a90b076c49d5b0ebabb70702f6 +Qx = 0a52b6c9458b48b54066440d2389610602f6a6b90135f9f8e370946655358681e0ea4c1af5e113f6712f2a2c3f5653fbd9e3cba +Qy = 07d790c77c855c030237f2b4bf292e868ebd581f7d90437ea9f8c683b428d7c11ad62dcc942184778bc27a4692ee7098c24f934 +R = 0347b88a5a5aaac8ecc3cb3c287415f6609d321d07289a185c1c4b8e224af01aa64544754e1e7525ff786edea253bb056e28f92 +S = 03def1855454ac7f063ec908de443fce975d4459c01dd4363442b2565b9d376e9a5b3faa1970b34e1ef631d279cb33776c5faa2 +Result = F (1 - Message changed) + +Msg = c9df3ef3acbcc08f8f188b694e53171ba568fb9486fc8c04b4196843eb70b46099641ffd83a23302526945038eb58c70ae2883c1857a494d5ea2c508dc84b6186b36449f72e26672e76046b7fa2843ebdfcd59b69c80353c84214ce3e4deafd7734ebf0e67c1e8cf145dac716994a17e7d5dd4ab0d5a31863aa17d122e21d0bc +Qx = 1e6c37baba66630847b9d81f3f8800048ca2c705df68b6ee0c38a6beef5775409e6f1a44e7d695cb1c7ac4800d6136b450f1868 +Qy = 0bfcde2176248717148c9ae7f430adc79cbcdb59a9e388563c2912f18a7edf0c0b2e316b9f7e62b03c7e126e8eb23d12295be86 +R = 051a057dfb27434abbff14d8d3cd7f34409cc2f3cc78d0c9aa3fa323ffde6ca5ad4a5aefac31027290bea941c1db2f3ead73dbd +S = 06a1d93476249e23d8a9263397b41bce8b5ec015bc960bd2d7fb538236348093252411b8f3d9f549f59b84b7a2b952a3eb3ed33 +Result = P (0 ) + +Msg = d5bcd759e66addadb12512b52e5bce09dcb0306f43a177e084c2a2db0a2e078408efc849f775515a98169ef1dce69b716bb59fac2f485cf01029a7f75c82c34e9de9dbf685afdbc8647f883ccbdabc1f0f0282b93b0fd00d5db12269c2c4676a2f18ea4c631a8cc83b785dc5a768eda8dd71599da59e0f367dd83d1dc0cb688f +Qx = 0c1ecbac854510a8509e705639ee4f7f31d7ed10c98f143137dfd2884b8f5316be0808ec35f0ea3d2194a9bac0168e13d6f26f6 +Qy = 12292e8f884504221d305d482d9c33dce54701d4ddcbfacf0c2825d285cd4b287efde39cefd28ed0359cb0c974a449987cd5592 +R = 07f26f594aa855da604ed2f6d51015b587a964bf32e8f88fc3ccec8c2262e2a7aa569b33f957afc8049c7dc1baf8a6382c3e853 +S = 011c1bc339b3ad9496115da3c82bc4e7ad50f14b8c725251b36cce488560983d7f64cfa509711aa80f24bd4cae54ffe613ad272 +Result = F (2 - R changed) + +Msg = d4610f13387f80330be5153cdb6caf7449bb0a93c51e0e70ef7bd75931982cc61edd4f33ab5c77e539d4af3c847f0e2997ba6d53c64b7418e4ed1924c09342c91f3ae502aa6989dd4696b196bd6b81baf704a9e14052d350feb81f1a1c19a9faa89aa343a692b26411927676ec58461b35207eaf074740c3f75b387893fe12cc +Qx = 18efa586111d97c455a553fdc5ef4aad8227e3955cd2f67fbe295a742c1bf5e3a84d5ff55964c1b56ee257e4870ea6dda806b00 +Qy = 1b98a3a8d6325c42cf643bbae7b857a013b6bbda26cdd16e8bd2a2a3321661dd30acffee20d7fc18294782cc659ebc51f7cb773 +R = 002ac884badc29ff875f89a8b6ad4b70cf61c284b110da796b588f6e7292c57a5c11e222c10956bc8d7ecd72f578cc571280b0e +S = 078aa041c7be2623f880d382f4771ce511a7b55918924019a771f788221bbd7f89a7999475ff9e6683b9384bdf91bc974bb6703 +Result = F (4 - Q changed) + +Msg = 350731ff6d7b8b8ec9169ad13623e60aa08ebd5cee2ca1fb993f668ca2132d817e827c5cec014a9f695baf39a57c718e95d4a4a3f3dac6526cca20a4f17afc65043a3ff92736996ef1b1b02439af7b1a61207b8b5ff8df4d26e482f77280da6a2b8072094db7c71e55b160fa18002305465d7c094f8f6ef90e0c05fbbd0b7902 +Qx = 1f0d3e905ccbce6068315d2346c048d190dc30aea24130116d474a46d0834c5fb91c059e78fcaf53a582495be3856d3a139ab20 +Qy = 0c63a778733de1f7fec213dcbd55472eb205cf6a7b63e8639f1a4538d1a5b1b768997d68c3ab7f127f5c006db09c55feb82c386 +R = 07fd288b1282d66ea916b7d3b0c19e6d132a02c593b8158bf16e8da41acf14db18d365fec2b434de9693f8477831d3884159c92 +S = 0782992fcd4729417c40786302b8b5d5fba60beb2963f9e5c83f6de54a9ef8d823c58aa1efcaee88c9c563932235c1b83a5af53 +Result = F (1 - Message changed) + +Msg = 8208d60aadcdd4e3ddc7fbd04d9f81374f658c485847a122fc30cf9ffa9d5d281bb623d096793d8abb5989ce8983d6effd34048cb979c945fe3f727042a4d61c87c44ad71c2c06a9ebcf937462e58bf40be67701048d3698ea40488436eefbd5fe47964d5d7475bcc6829afd53cdcbbd7f8d4263ad08303109e6d730476ba51d +Qx = 1ff5c13e54e416e3207c04770e504dd590abe5b51cdd2485d9744b36c63bc2e2ecdf77db1bc761ccfeb5748a1de69ff53bb2712 +Qy = 117db3b49b6a783fc13e8024973829a1a92618e620fa4f09d573572cf1cd96a82b4c874c736c338664e487b17d82de6c0a713b6 +R = 042edd4f4d385da4b7d7433b419834916f264a4b714ff6c3de6847813bb62fc5ebaa7c6f15f10c1bb30fb2556414268d70aa9fd +S = 0686b4ba7942b08872f964e425affbc2ff386682b16a542d4a3a80e8d6672ff5296d441bf49e20132aee02870bc8a4bc42eee5a +Result = F (2 - R changed) + +Msg = a0ebef3d35d901c81e1ffc52f5b45be9bcba0dd5e08307b7c5b4e9e9ca03f4c30451d3a12810f0efca48dde9a76269e658b9a623a590dd6c1190c70518790a9ed7ed5772850b49848e87966228517432ef7eace11b33536b17a49470c5c09d311b3545f2f739c077a7fdf3be270e4015f341b0f4dd3f92361dcf1532d7cb4f78 +Qx = 007062fd86930d24aee29feccbe0db8328285932463740d3f6379dfafc929663a8d0df85f0cde4337454c228980c8cee6ab37ec +Qy = 0e34b65657692f38dd7fbcc78b66bd748376b29a5970b553031e4303ba6c7c39c3e13d7202e34a621a86293a2bdf7081878bd64 +R = 022d1f3b8c1a14af47d0c1382d8fd7f4d5d82b0ec47a0660be700fffeb6f822b91e56f6bd0123497aa81876ee8b775afb155dd0 +S = 029a2f611dacc030c1efbc627d8e9a5d3efac838d2d5a57025ff327e45e507f2581370af9b88429b35bd53f02b01f96528c4bfd +Result = P (0 ) + +[K-409,SHA-512] + +Msg = 31d67b0e21f37dc3af6f29cb0e2e91e07c2436d8f0283449b7c30d81271a799c13b352a68087adb396d3ad64ea990eb0349ce5339bc9f675f60a0065e4497d71fbdce4e8ab39552a520d5296a60fc469557c71e98b03ca77864da4118b5f1691149c7ad251aaa8ff1f1669f57972d27fec3e13ce53df812276ecf7eac0bf691e +Qx = 17da5afbbef582bf455e5854e52850c9fa59e8a203fc8d4303f6c2552b68e0494a4ac6e81575e00e9450ac331425e7b24ee8cd6 +Qy = 125c33670f9789cbe503215bbd5f05a3750c6888a3974ab23acef890725cf90a86db4d3a91e9f047bad6d5238b023c7e02d9c09 +R = 04016061ce56d01f15e1243b49b58141f3e83b0b0fd4ece786d2fc966d6b46a5b2b929fd5b264e912cbd3b25b920e86c172d975 +S = 01c267ee7e1c39379972a4b98b3eab1ab9d6ceda38016595a08a9bc624e984becd0f5d07d51d955319a649d2896e6cb8016c332 +Result = P (0 ) + +Msg = 123e5543dc835dbf6db0dea42eee46b86f9b27a611d170cbbb3d30305ec36bd02a2e378082e97e6e6d6a05b86a54102d6a6ac87a4d1700723780358a5e3a97b5cb9d9ef5bf24c8bcea963e83f416d33346c655af29fb6ab2bc105bbeeac9a9ce3c2e56f3e15112416ad5258571ba0ccf6e5374e0c8206580d24423e3098f48e2 +Qx = 193aaeb5a88f338cbcf7886fa6963301f6a6fb6b27ef9da31dd58763fcffad92f90f6df7bd4c97d41ac03ebaf4aec144520119a +Qy = 062b25a583450ed906ce92473716bcdaaabf12bd9671c06eaf9db7645210688211aade7479656b82bf0b6c235d990161a228881 +R = 008c0f6af47e8abd6cc14b3c15edbbd78d1041ae17db909c5017ad9d5864a6fd2f630f3f6e36db6416fdfd4e1798ca071fb76dd +S = 0549440edb7ca9bb888a260406b6409e10f4844beee48336d9dc4fe086e1da0dcde5af02a66ba932619733ded8b0bdc132a16d2 +Result = F (4 - Q changed) + +Msg = 67cf8b910ae3edf98bee404f2dadaa90ceac0583fd3addbba312a9efe6deb4ac2da95b18e9781467274ef78b8ff4320cf552f4c00d3bba87bb4725554584f115667437ff5984e4f3063990f9dcaeb1888a8dba5f2ca8420730c9cf44314d6c2145b988480c04e89c305aee3b54ee2f82acf85fce5df8af1c5dafeb9d32372bc1 +Qx = 151dda5210ff162550384440fee4c1e3be0eedf6b037ce731b1f0e98431b3c02d83ec930ff12e66f108061bf6505f2a3b70606a +Qy = 0adf2411ca3b9df89e1c7a268b11073a7bf7df93bf89a11f521b67af146ca346279c6c053e0ee4bcbc959145d9174ebbd1e1d9a +R = 061fb6152e1f9471938f126fd72b3ad3e8b0cc128e41f747c4f1ff4ff6c5243d597d16e3642a5453416b64d5ca092baa67e8bda +S = 05e869282a16724efaebae6b0fee66191fa581d09247d435fd4c6ffc0ff8c820f6d243b2a89694b8d266ac4b8da0cb150a26018 +Result = F (4 - Q changed) + +Msg = cd106ffa63211039d3c52670272b24388839bae5f38a40e9f26733511d8106789546a95cbde3355fa9fa18ca1c900a897d407d146242042c6df1c10afa795b97a780ae8a0989ae5f652c27104fefea346ce3e777263161a80ed84486834679a6205908ab145901017ef3ae7fccfa2541dd0effdc27cd98b63e0593d89a5abdc9 +Qx = 0a4b0b97c6d4b0d484a41136bea96716ea94a23d7c1112af6963c76f93355b5ecafdf586b244e18d1853f154908b1ac162313be +Qy = 01b076df86fe05b33308ec1a3840c0b3b6414a10d08c3c31eeb70d0b834670da6aeb86c10fb04691e16c6f51ce9178931b67808 +R = 004069a0979ba1b0d49e79ec5fe19649d0ea48197297e1bf73abf2dea21a98b58c611683b750161a39bf1922c8da5e5dd01cc72 +S = 07da2ec6e82ee62afd87bff99b644da3aa758c11534227257af62c46118c8cf6ca4faac28b9e4790555879cab1eb12bd7a3a73f +Result = F (3 - S changed) + +Msg = 809ffab50bd4215ff479a8c8bc9f3b7832441936a323d9c029f761e511777b5fc8156a765b1d15989860eb848207701ed774ae343c4028287ad4e7d6906904d32baae28352e9dcbdc6346cd2c80b6ac5b86104fd41fbf56d4e0cd6ab9eae22f673b6cd3044c8c256d0dcae0e9c4f8ee980ade06f54f2076483d73927d15ca57c +Qx = 0be87838485ad753e1cec23e3b7ba12bcb97f8bb5d0ac862f0551f2796309f6197f567d036a604092bf648c614c4634876f49ca +Qy = 0153e56ce9d14a2857b3c0b19a7616a521d6fbdaf63494e77791421ada4944e141b1609841773b2b1d6bf2242c3b8e122eada5a +R = 0393b0bb4c228b8742bb175b3a32f75a2b3d2fe9cb20da0b2e5e4144b849c683f18db427d95e386512bf31de49befbbab89680c +S = 0233dd4391e81a6877e25f0bf69435e43d0e3db6c06bc5d1dfd5132a7688abaf57396a54e44aa262627523f5385dd03eae6f8a9 +Result = F (4 - Q changed) + +Msg = 0e340e00657e79990adcac50624a241e96158c9580b5b363c589532e2ebab435d983b4ec9e9106d056eedb2027499854be6460e56f177787809a5cb8df9da51ec9b173a3498659de4bc94bf5a88b093a639d014d116efbbaa89b9316d597a8ebbc6a38ba7d88fea12fa6c2fa7d773f35827e0cef91c58202a4a516787d6027b8 +Qx = 12a3e99a8f3ee2a058898863458aff7d4f57103cfe9256c126878edde5536f8e52aa9d0e044c1b2ce394ecf53b0fcf862c28420 +Qy = 190a9d564eacc913c3aff4a1651930bfdd62752eba9259a0c3cfe8654fad4c7e78dc25429821818bed9a704a1e46059520467d3 +R = 063828dcff96c1d5dbf35019b74efa528292caf56800dac3502d173085bd60c28f35198e2a4199c4a3c3e392c374955e9a6fd58 +S = 00cdfad4e8c6343847892eae6e8d88fb836e90d0e73b037025b14bb084cc1d2044c79ed0abef5203c5e5086913d1c58c42d2716 +Result = P (0 ) + +Msg = f593867e251a32b4fff21a5ec2057e95c1c137a062d1eab550b9cd81e2e1628f39eee18e12269ed154c536ed8417ff759a912f214aec3a8a41529622ba325145aa076e57f3348dd30e597839b32071081098e79434582ed5731490278b32cede1d8cf1ad62fd87523d8e8d62fea8870ab884e828e0d0c598acf5a90a87f59093 +Qx = 1f4e94dd5ca2ce9bbb97977e01485fa4ece539fda3bed8029a716c5f96203623201ea3f76c8ead9c726f2672db83b35b2db7008 +Qy = 071c8ca3fe236de06959100286067ce9361e4baf38142081472c828818cead94cde80f13d2759467a484bd43d7b745d23d9f180 +R = 0539da6b14383ef1deea14462ef2f772fed4b80aa03721a2bca178332c41eabe1346c1791dd337da16e6c7083de1f38497fd6fb +S = 011a813011acc459fef99133074dbc5d5e93c995288dc689fa8e46b569896ca0e36cc8767de1ff72ef5e06844c67ea732c15c5f +Result = F (2 - R changed) + +Msg = 4d2bf759c15b32719fbc2c29c40ac5dc54b74efcc07d046594b94dfcba346fd8c63cd1bfe924ef52574fc2d0cc6a71154930944a350ed36010e2ecb4b71cd0c115cc25b402e9e8c6769eb4839e509e3e77c5e13f4cdca1cda60837e328df03c11a4ea23d6e6f7a19cf17e387c14ea9b7aa93b96ec0166d0746694078a1bbd254 +Qx = 1e1cc53b58098758383de00013f76d220767b4d0e4de71843a7bb6e65aea23d2b1d86f762963a6a678c5245a69d1aef9779c410 +Qy = 119a72adf120e11ff700714b6c7e20c8632cac20c2d13bacbb0a793c3df02ef1b40c73b65a24f6973f763fdfe0a91a06b8d851d +R = 04b4f952a47f59a4985e5702b8ad8fb05f7fe58567417be360b8a28015400ca958853dbd3d36353658a94307c104d0656694b82 +S = 01359ec54e34de2f679f067d9ac37f5947c508c363eb8fd5089fd9b16b098fe9edbd648c26fc58a913b2aa67c23e1adc401c896 +Result = F (3 - S changed) + +Msg = dbb4fb874b14b8822189545594bdd265cde8a20e5d1bc73d636a50b6398b76708f45311fc38f82603e251e48087028650980bbdbc99200f0a0b5fc1d0a6bca5766f3f7c71df33461ae1284f9827ea8bf92fcb47b9533c334318392dc2ad68976fbc566492fe6c2d98f55dbd76c5e63a47a2cb5d7e1bfe2a24f596996df186032 +Qx = 16f17c45d6c3a2325c880401063c27346644a5e957cb315bbb286909a86cf2a322a62d07cc2a8764068c75d76fec4f94d6ea3de +Qy = 05a8930a8201837304ba0100a9b21dd4d1c9a519b8cff9782feee328d7acf20dd967c84153f8abc480a0a2cb033b38ccbf7dc37 +R = 05114d2b7f14779355263880e05920960f4df4435312000f340b3cad8c08c52272e384d0adcd97f133bd86bcff79d88c78fca66 +S = 002ded29852bc2bc10686cc45261506420e5ca962ecf2cb55134e8a21bec2b2ddbbeffe725f43c53c9754ff2e632efbf7ba4145 +Result = F (2 - R changed) + +Msg = bdb67e832e002be0bf6ad4b4d482c07a1b2d9b54d1aaca0cc0d0c6e372b1eb67abb29d4393e6a6ebca9e435dd39fb73ab7898af34276c001d3d834d507f8e1efe99f60c9e61f82178cd99366c3bb65c11ce089ba1d2a96bd81f29c3e95247e7becb236dd50f823abdf15e782c037ea77973066dcbf7080a131f80bcff6e18fbe +Qx = 0bafe72a8a89f32aefaf4cda5349946619cd80e7b267b061a18dfd9889fa3b6dc58b1f6ad7c2e327fc85edae5e2461caff67f6a +Qy = 16dd89a73fba01c9525c82c0adfec7b78d8a472458ffe07934e1a2267f04b7fff86fc825476f644a3644614cf8a4c156d8b6da7 +R = 048ee0fe12e99267fe6acf7151f10a16bd4598a76391f4ab151ca877f5d05a31f1ea050551d210dde032cbfd43f096132a575e2 +S = 011a963100bb72b601a91b2e4d669df39db340dc9a2f0d7076ae6fc12c999fe923a201e2b4b30f5eb4049d83c7036537ca0ce49 +Result = F (2 - R changed) + +Msg = 840a1d792e021479e572b7f63ce342e51f256fc92d76d22544bba811402071dad577dfe0c44a82cbe7a504f79d0e86beb640acc2fd19c8508546a936b5d1e028dbca0d5de92a8eb73b04e41d55da2991fdc8f1bbd7fab969ba63b3d926cbf8d1bce6c72d0394b4e3a59c1177fa3db79cec77f37c99a9a3b54a5fb4d996d51f0b +Qx = 06ff94a75be9726e61acda152a32fb2e3cd8d3de914b70dcd187963fc7186f8393e8f2eb26f2b8fcff250dcf3bd212b6aa8fd16 +Qy = 089d9ddf33c17273556419763e9fb5f4fff47fef7902284c56a3b86c0e9b68c1ec38329b0757bf0d5c4bd99754ba956ad36e75b +R = 0162df9f543e32e8729019dcf1fd5e79654429aa076229892bf73c3d3671fe2afb477bca34ab9e8e0cc1aa621dac83a9838eee8 +S = 01268a1336f8546043aeb46e33089ec5e0cb165a525b19c428971439a1f9ad3906fba8e9258281c05d399f12e114eba234b8160 +Result = F (1 - Message changed) + +Msg = 423bdff735d6f79f96ebbdc2f5e9325e0cfd3d8f26fa60ba285e1458dd5a720ae4607f2e3098cbf86d564e23747b04bc7bd1c74116bc737705dbefd394a600072788b516757a5b7a519a7af6c8178986b26d0b795832bd0c75199f820a3a97ad64cc5cdde81d2ace7d7b5255c0ae86dcfb48125b480c3851d288a2d70c89f63b +Qx = 038c0166237dc03d28dd8990dae8cf2b186a5262a20438726fd4925f380f13b3a6cbd772bbb056df2de943cdde18493bf057ab6 +Qy = 11e3c416e8b7f941b99599bc05087790cd6eed6d378994db41ebf710a85507c5b660cc4e6cff5104cfe83660b8072a2944d5d2f +R = 07bfaa7dea618256ceb422dbdf6ec91271815a71396ed3511cd41f295abb1e96df350e1ad6fa6a50686c8fe73c1c34de5d13c0a +S = 0130aca6b726d2ba94edbf260e8f5b0e06834f785308ac12f5b84837195b675ada300e4b7c0d9589f094a7ba6ae22693edb9435 +Result = P (0 ) + +Msg = a24ce25d432d3d6653f70dd7495c9f861a5e15785c11e49cd050dd9e2ca75a63507c98b89f72db5f587c6e1184cd933c62519c42e36fd286c6ee9c598603aa4a5bd6b603184e1cbd5cddfe8c7bbae61230f4758a145e3b149627b9f9926af1b39aa6d62f0e94d03deeb6597270f9a476b94ba4bb73eec8a311d5ae56f455fa1d +Qx = 069587845d7c3906c82141df1bf67d68fba4e949ca7ba4080e76f2c8077a2f9799c5312bf7be670578f0e18daebc43679fb519c +Qy = 0749e8a584c16560ee16b26ca1279e44ba5f8a5c05cee30decb93f7b5239476536f7a403f03158ad8bb36ff5b449025cc8e1455 +R = 0162346db59d206fe625c884ab42b58cfe0c1115039a902427365b5f4380c84b0bc7181b371c6b8f4960ac8fc77ea033c4dfac9 +S = 03903be60924335f45bfa5c8976edda29fd99e0497c8a9c2265d7d94316c55268adc56a27a1a5d4172b69bdd859106a572fc75f +Result = F (1 - Message changed) + +Msg = 5fedf8038b64c5b3e432f307705e5c5efdf89b7fd6b6e9babdcd7759ca4590265c9d841c681232f93b9e794ea45cc21789f43ae6bff7d153d5decd59fbd49bda6c58d66c483b6afb6d7cbfa8e0d3a144f65a9154d60af07d895351de7799e839e58cf0b0bc6084317727232e54d265d8eff97897018cf906acd36a3a4156740b +Qx = 0b3eab1951e6cea0fda96f4ae1f1d3e4ac6b413550dc5afb53a623fabe049687930fcfac03050f57c90c58c5914991efd286f12 +Qy = 0541cf5fd5fad1e08beafb7f95ecba043fcfe3a913af97b3f3d6de6de88353a450e57f75ec935349a25f6c1d153d0f6649f0c95 +R = 0147a8ad42fb5955e31ce409485d26a9162fcf48800336fda27a570418616a84d9f7a725975f755186c2dc02f13a52c3f315763 +S = 07cd563e31b8b4e7e45df34e8033ecd3cd534416f7d17c29dfd046a6d11a3f7fae88b895f173b537307944dd9fe9ed3e43bf889 +Result = F (3 - S changed) + +Msg = 46cf346187232bb8c302ce62117da0d5da12407b3ed58f0f84951956559bc903c6c5a17a9eef5df391eaf1ead44ed02f9e4071a7f8ed6893002fd35ce819f87da4c8ec660c58af1c3ed3547232b4865fa8f3f56c5088ccce8989b654e779a19be473f7235f8e168bb186bb0c64aa4c9bbf5c055317b76bf60342a2394eda816f +Qx = 02067200425a87319be7d56502e33010fc8c62bee611ceaf696ac4c23db2d4eb6db9ea6bd0f05a0d9fb90cde161bfda8cac628a +Qy = 13f23f863285f568816a6f9a83f30afaa3a06b246dc05464bbf47c6516d885b28bdf06f42b4656154f5ae02cfd1e401d67f35d2 +R = 00d766274abe2a240b46ee2cfa7bb79e4d601dfa5821726f3df38c5c94b369fc259510633b873cb6adb9dfebd0f04a109491a45 +S = 07abb1207fe5a7e72dcfe81095bfd1748d89ed165781e33b88d0db28001d84d75fd049e541aec90843a84bdfd239a708d6319a0 +Result = F (1 - Message changed) + +[K-571,SHA-1] + +Msg = f2a0dd77292c5f2b8b33a6518c76840e85c6ec548e9a9068b3428a7b373c340dc68b1ffd699092765082bc680d5ad5246a7f9af7f5e063416cb319d678b57ea9910422360c05b7bdc29105145d9007ce89166df623f317ff1522443ec3dd2395c3d83b39a2814358896060e7f0617716196700c937145c69fb2eb730486eb3d5 +Qx = 3a1cf63f6f23425677e8a98d39b1c17979edea6960ec6d45aa39c679f1a64307af20982aace72b655f511c04ad98da5cf0d6cb3f3d931751fac13932e9b96e7dd06feca488478b5 +Qy = 5096ccf1dbeffacdf0a6b18622e708549c0662011c4ff529940a9203373f28f3cdca5c0c7f4aad30cacd92dd525c881ca28b500c19c3bbc8692c109d8f41e19159096b2afaca3d9 +R = 103189f9abda55b247700a1bea6fc8c8cbf17035e66749519723cde44e36eadef20813b530bae3375c4940f22ba67b2f542457d6b1984b2670d6d9d3a613e341471ba705f46e41e +S = 18c53211cf01354150b06484031ab7c42e2b6f5356a41ab12521344c462f6a777d7b2f8241c9c82fbd44959a44cde0b0535d0112d57d46b592f4a2a72932fff1a6ef5989eb1c67a +Result = F (2 - R changed) + +Msg = d0751d7c2305c40ab4b40ed19538530f53195f765fefbcf0d7ec304cad8c0fa5ed544243fad83eb47f3ffe8e9c14df5c75a226967db89ffbb0ac60e1d324dda875780463a94ac520d7656ce5e74b38820f33987dd216ea40c6449875b5c48785951c208ee3a0e0568eb04d600f1a90556a691cc5b6ac32edfb4c9124f0f76c8d +Qx = 2901572ee1a014acfb3e69f08ada986bb559ccd4d429951016f0e461cd75cdd7283d33b56e995ec7621cbff48fa3ee523c8eafe4aec953e4196665598a86b00efb5bd2801b94aef +Qy = 62a2d97176667703e8cb1081d6c28c977df1526fee1b36c4567d3262c081709ab464de3171c5c413a14e23e68136603dc5af2816f80918da13dad0b1e1d3fcfa6daa1cd30c0d48e +R = 073882e1fcbcd7ff44a6aed53d0846d02d2c97b43acb20173f05f4a795187cf496342cbe0b7d86267d0204e29fc6d43c52b251827232b07ac882ccd95f23a1a1e416e7fd931b1a5 +S = 0820ee8282c5c58a930efe4a9e2674e2f861390d999de03c3347cf4f63949c582dc93359a65d915d3387cae1f01eb7a503f3e1a5c0c52870f0a27c7132fa89bbaf949d4abb75b45 +Result = F (4 - Q changed) + +Msg = f67bdde8fbf38c98dae0c600f6d22c8d99cfdc3b8ae7b1db666d6a30efeb50a1b5cfee4e251f8e6d74150787399c89d99a588a9a48b4323ef2c21e098d75c894fd828350ad3224ed472a6eb2bc5d5dfd944ec5f9169d40ab037597e1fa6ace67198227441d4b010ccfb7879c3db75b02ee36f7c58079fce8b067137618274856 +Qx = 34578aa77aec9a9b3f789b2cf915ce71698f038ad1d202caf10ee0af2aed19d02aaafb9fcb957fa523f0cacaeeb08a193e0d43a22feb42ac9e6eaf896f7f1db8c7576d6031d0369 +Qy = 262c540ac933e86ea56b03029d54eeff784347fe99f3e9e988d46ae2c50ff1f3e0d683ada1b653135d064729480b644612aba3f0f3307cd5cc9259503fd54e7dc812c001375c5ec +R = 1a839bffe2c811cc09f5f36e257e1a793d63c2913cc5eab1ae273c3b36a595225ed98896808d75b8faf815cec4da0a462b59aa68e91f3387de8c7f4f9607a116a058919dfa6b614 +S = 1bdab449dad356b2570f42e354bd04bc3bb1605964a04562f3f218be68521bf2bc5b17aeb4a3d3d3940b6116fdeb456e0eca224aa62ac3ad7d2035da3e2c0719a47cc7cf6b4800f +Result = F (4 - Q changed) + +Msg = c11fe7016c2eccd75db4586f95f4395909f515fd08eb48974114a4186fb847552a1eb04e8170a5d2ad2ef6ffad911bf106a903459f0effab74f44abf55307b0048c6c67cf19fd4e5d9ebebe568afd8a55a4c36e07b3f1f8db31b32c799fbebae19ff1a893bbc56893d7a482ae761e7bea59067765fd71378678398d77f5b399f +Qx = 6148c4efa7c244f3493d2c4aef920c025e1288f1e25b1ac20a6407fdc5d5d3c44894a18db1e68271e382e9cc25ad83724ef68c86df09324650ca4cfd4b7c5f467903eb7a6f74ec5 +Qy = 6fba84f0bf03bdb239a1637ce3d0cb92b29c32c9c10b7e3fff2b369876499f77ba8723bab4abe1979575e650c51d5098ca28310c5af4dc8eba8c80026a76da006113e1943654cdc +R = 10c6072c0de068bd3ffe6541810f79643a8cab298eddaf8b7df0bc360f8c8321e1515832a286d32bdc22195a339ca37c5fb4858aabac7ee3df7c5fdc40f0b08447cf84654f7a65c +S = 1c8001b73adb68525eae1b3ac4d3a87d52bdf983f247645ba7b6699433e3933d17013fef2ba7ee1ae4921dfadfe66141aa783937f1106c66637d4fa67ba0499e083af69259c2319 +Result = P (0 ) + +Msg = a266f8539bd048f3c282686c7d2c9b3f1977f9a9772a6274f84d8bc655c0b43eb9dc1b56b332daf0ae3dabadc12960f01948609deb1df2a57ed796593b4a3c54af33d122c0aa9d4c533129fdf095e8decdd7f7371a6e2707eac2ee3c273f18404116c6eab8e7d481c9fd79f95828ab217c336a5981b00499a70d34dec6d67d07 +Qx = 01518627fc3abd9ce4907796d14733157af11c2dda4df9409f2474be2cbfb755be92531a6e6859a94f41162a323c963206902c1aa304ca6fba4a5f54baee6746fff71ba6174e5a4 +Qy = 72608619ef30a18d4c749e501400af2f3d64202a0f290cc28850c9e369e817c036781851c04af2e67b063f73c9301b4bd9fcb0ae57097eb1d64f11f8a2204bdada1c0e9079fa07b +R = 08f31f246b544a9c4c675eb053f2416ed901220338e31b34ca6fc2fe3bf9bde77e349ca80add6eb9d1af04d1a4f0b93b02d789bc5219272e779bd4c12796e9fa4c58e7965e524bb +S = 03dc7713ca20adfefadf1e84abcbe73b27fb28cb3906a49f582d84c18c3c6d20cece0c5850f5efafc3856d211cdffdfd2272cf3f13f8b3bb61b18b3b69566136f987e644227af7e +Result = F (4 - Q changed) + +Msg = 62087f938492d1394d7fb56d9fde8d702df6c9ad9909bd655280064bb712fc6198f58838a321b535f6efb815b4e3466aae86d8fb416fc719810518a001f69e91be58f1338ffaacacf2e31b3f442f150797f4d0ac28a802215447cfeb742c1cb5af003b9818723d68bea11fb30bbc349666a4c679a35f0ce027f2696e8774b7e5 +Qx = 1f18a9d2f1d81b39391b14253d7926ff5371d772fc902c410dace371a2379c12090edb0ed97bb01dcbf4ccdde947bbc544bfb5b45112c87677236519427f9a41df1dff6a7159882 +Qy = 08582aa45d3995c3d7cbafc4e18198facf9c19adff525f3e8ed24932b9372bc074f46a04517d76e1899f20c2df3d17194ac72e6aa802ff644b5a5c0a705e87c7ffc85bd902b5b47 +R = 1b6da5bae0eec003d2c8939ab1a847a12df84e75d7996dfd22df84a6c0bf7dd51cbdb4f8277b4ec81c17f48c5dcded507935feacc015d774ef1ef5fbe0ec06fbbcafbf6d139c642 +S = 1f527aab5e68941a0aed644d970b9b55241e234007dddf68bd544504cf6932fa0fa4731962d4c74011df8ff44f5ef64c87110bd951928be23a2a6097a139eb209c711008c6897ae +Result = F (2 - R changed) + +Msg = e86099e1425d07c54579eb60ad8822e5481c31715125cb107b99a3643d6f0eedb600312fb1c907cc3b2993702ed1a89b7ce1158075120a6e75535d564ebcf737b3e1e355e07fd852070a3af212d6b7fde1a7db4b47f48b269914fb013494d4a124981a309356ecbe80767369df5e0b724607e1f310597fdb79f736fdf012cfa9 +Qx = 25c6899824915491c77cc849a0da706f8104448301608ca143341cad0af02b3884d84a72f542296e56cea4e6606b312186d3ba5226e898d8a7b4336eee4e55987551794236eba9b +Qy = 14034ee694801289e947aa3fd0dea4170ceedb907725c548575edaa7524dbab9286c23ef9c5a36d30f8642758aebf23a047bce720206921cb2d964c39342a477349e1cbb06cac65 +R = 1b14c9929bd045c63252a9763710f9c4da5609b15f5683f366e4bd7ab8cab2dd109ef005da9096062550b56017a34af55f1dc1d81c3b0aad20dc57e4ff208eee7216715947f66bc +S = 12ceff505fc5d565e3e571ab9f701bec1d8742be6092aa40c3c1c70bbabb3ad8d576d0a8686c7206526ce113d48664645bfbbb8a8c577d97c2fa6e5ffc646d30dfb1d67c135b12d +Result = F (3 - S changed) + +Msg = 5d62937e5b38335280d9217cde834db2316765b2d2b251f291530dc69580196fbc066f7c0f201b1269adb835aa1ecdbb62de45dcc221da2d447d85d62dfd57abe6af559397f59c7b72d4ca6323834da6c04fd0e12fe61de0a348ff78079c52f8c5a6993fae2b892327cec9bb3c9d68e654110156a6857a898dbda6d1c02229cd +Qx = 6761b27cff4fb87d1f4c8418ccc29d617e9586fc33f19c8c48b4f963943aed59e09e531e55f595e2fbf93fe805c1f6a893c2bbab6947033450e82bbe42c6a092b21c31652fe3576 +Qy = 07e922e2eab78dc1966317ea31f37dd45e8f76939510c3516438ff340cf5e7cb413ff7292d9679e65da7e0a01de83b8115761879a015f17ae986f88ade419f6fbfa536ffcd9d769 +R = 0e3286325c26d6998f817eabdb74283e21319a35632473aa0353bdb699b25900a3b5567dfd04767f5d1ba482c4156ae780d494a12e9540863c136e1deda7430e076490e78a9c23d +S = 08a9dec4520bd14d68865192ce453752333f57cca8b80c4c74501e55b6f478c243570487bdd49ca481ee78a9624df1c7b9e81da793dc7704046cd19e80e3e03db8c06b078509295 +Result = F (1 - Message changed) + +Msg = a4e2d157489faf5752ba7116325fecc8cb64621a48347849fc7209d5679264088945fb9da4814d56e2a7c4847a39049405299c7ab004a8d21cba8120c7af59e5be33f11f67fdb7e855249c365b51e1039e8e78abdbee0102c72c9f3feff8a18e5afcf9b8d4b9f0409a772529bf295d4fbbbb50759d6316f7a55aaaaaf2d6feed +Qx = 3551d74bfb2bb5966d42900b1411a32a4411b724f24ceaabb386968b521bbea6daba4023fbad0f8d9f7c637b2526f04d38ef18d49d789df5c376a0a74ec4cb9d100e5b6832ce8e3 +Qy = 7fffd1d3f8487aecf8f62dfc908350937429a54807bf93a66dab185d1d68e3a9b5f94ae5c40511ad7381b9088640ac8161ec4cde1838e55f68c6552b38ed1d75ec105907c331606 +R = 198e8e6ea7882e61b583e7f38ce1c54513c16748d039512f0af63a7fc8798adb80a219eb6d380162b8c4420fc2ce784dab983826dbbada52c902f16731a4904ed60ed07ea909af8 +S = 1b28d532e77a04b0a12e0ead8990fb1f5360a1db6e803cb0710af023865d8a07561490b92990432c10ae7e079e6e66cf6de23cc9de56c8ffeedea3958c07f2b4b05e58cc5229a1f +Result = F (3 - S changed) + +Msg = b7586c760226de0354be355b04d30f2048473e7d12d87f7d1a643311f3b0b7a3e1f91f67364177368ee1f76301f6d9b137600f7d379765858e089f84fed141ac8500fcd29ee8d177c988f7dcf6a800d302b1b49b57bfdeef78b10d845b1dc255a6869080e33a6ba6daa328a453eb0cbb6b435d06189236c22cefe026396fde41 +Qx = 073a704351555fe2c3f5013031ea4ba55af8f2db056afdee0cd3a71577dabdcb8a2c8b9fe20c80da284c8759c8ffbbed9fd3ac80eaf626d9a18dee89a9aa8f863c3f37d06b6b2af +Qy = 45a927f886a690fe521ad347f7929a43397c1d52c0a01926dbcbf2c3d319d8073b986d422c3db232dcc1201bb78bf5fb031a36b1a6d4d208b75136086a86bd1c6af612855945983 +R = 11b2590a571cb4d1b2cf7a1f46c3a0cc00ed2db1989b5c9b886fd4d1a7a59bace932f0d80411bf992a6f76f3f05a30440121e01d1f0c21218d10e1e881740397899b8539ec5420d +S = 07fe4df66a9306b6f77702121faeb2420872673c216195e585893173055728f27b0ba992b9c9ac2729b17091435404a54a3ab9e42d9f9b32269a8b31931acb48868808fdb4fd167 +Result = P (0 ) + +Msg = dd6fcf16a11ab7040fc3b1c012b7a2e98e3770e03a1382f75f8e554e09a86bc768c81fdafc141afaddb01059d266ccccb8e8fe6d89ec73a6fbca47dadf42c6a27944e046dea054596479df25857c9b5562bed2e20183cec0a4e7a6f46c48506f6df14adb5083e1d4c018a9ba5e77b48f5cde1221ce11b02894f8474c44d3d2d0 +Qx = 34453b18b0132eb5ca9fa76534721de2698816ae3f36281eebb31b4c2bae9a932d5de5018cb9f7edc870a3471e56be561f74f1b5b76d3e8910c43e2ec6b172c2aa774a2021d0f95 +Qy = 0361d9ac0e926878393b3e29d3850acd9685192ce0e02a03bd966acc966921c2e7dbf310c07de73f556bf2e9e2dd80ce625877465ea51b2aeecf9d669dd3db6707e8ab9c54376e5 +R = 07f55816110ab11d9b993a65ad9b208c255833b5c05ccf5704ea5b2294737556bbb26461df8280eab76db465a5cc357c9c7389ad622766e2eeeb2fc599e66dbf575bcda95ce5ca3 +S = 0130be52c1f0b3059fd4e5f1d1d2f0b958bc90a76e141234fcf1e27a1ccebaf4230ec2aec5116304ef75967eac4f69c144509157e5decbccb83d43c045be65e939bd4d0c1679321 +Result = F (1 - Message changed) + +Msg = 006ebd67a3322a081afd2f6529e8af8f7ac7364a27194db15e50d23e3d1a6ecbee292083c612a4b74924adae3e5e56e43960f1eba4f9ed13ac1d8b96643e2c41a3c67b7d798471cc653ec939eb203647ff04151eeae8136a3ca6183e13f0544f675e9dd1c42b88969a3fe4f8651f432e316294bc6ae1319b46e941bb759cfb7e +Qx = 4500008b2a5301751dce307b0fe9d632add85fec1af94a2cd6ec98d813dc047a36664e9514c7ccfd87e5c11adfd6b5e0473eb0e3cc2712d956a221f8d9788b6de69d37ac79a9e28 +Qy = 06a77ef79c513a54f0a8d77ac74c4dd923a4e76326b7aae616d67cfb2bd05d2ac1928c1680585d3b6ffc0122c744a4170b9d0de88596951333c99b77ea74766a7707e36ba1e9552 +R = 17cd33868cc4aa9766e106c2729140de85efab68fb6fffbe3534d35ef700b7c4b59ae0369839cd04f6c13360c4db0be9829801d03dc7e7bb4dd7b21afcef9a3f551d60cfa87034d +S = 06ed974cf512d2afec226fa2ee22353ff7c381b07dafcb3fbbde037c69d421a05d2b5b21d5fd67a153c7c1738d60b7924fb06f8b4173927b6702251dbb6d2f1f88d3aa211147361 +Result = F (2 - R changed) + +Msg = a1449ed8653be9aa885c3f2ff71df312848d5e25aac48a4d70447639252b6c9528539e5e175bd45bd4d21ce8750d506c1d2fc226f41a191dfc24589ed2c278c298bf5194653feeb9bd210d3c8c5fa2d8597a3384cd522b1e227e22d9cd5bfd6157f1fd40ed809bba14dcd467e063c8090ae2c70677025ccf95ed0753c7b125f0 +Qx = 4142f2b8058cd0cb849f4a6c367d149b4022fb10898510b0634050f821871310051deeab671ad3ce6338009edb2b5ff53cbc6e3e19f585cf7f3a91983457e9115dc65cb4543cc48 +Qy = 5e07fef0f629b9725840992f46609adc6c7d78aea53687a412aafbb0f0102e95eb10cbdbcbc98d12dd86700dd06619e8bc1d5923bb782c4eba0663d2a216709c9325490157737c2 +R = 0fe5b3d12497fa5a25901711c39048128e4741709d6b52f06bad7e666c6e56f5e40138d202a935b84b2db51a1bc67991945de3a6bd64937909316100bddb063e3d76c541d625aeb +S = 13e950b3c8f4b750b749d8282b95b3fcc3f001e232478b43793e03e1a88b56e070078211d4276fc0462f83f599592491a393873832331d7e63b6168f0590a7f869cde2b6671addc +Result = P (0 ) + +Msg = fbcf9c1df104e747f1017a45694b4746f459285ad031eafa4be7f638aeb89f0aa2f04e96ce01709d33f162150312f6e90b56d75d5032feeb7601c4b7678f01cfe36072c0029b0ed9814508c4d2525513665594659f52f8049eb81f55e70a83caf8195ca00088009d04c6f09515f73c37ce219d5b9212444acb163bd02ccfa3e6 +Qx = 05b47e43cbf715fc10c25b8e6613e4759541b9db58c9be4d8888bea1f0e45793e9eb6f2993a6e780407a0f2ab9e74e193dfb76e7884c0f596b30bd42aa8a62911d48c205ae3ea91 +Qy = 4b4db74faf05de258f7345e723f414dad574e3d0bf189fe374f220a4ec6f098f1497673ff5bc490ca083531a170a84859b2bdfdcd12ff8eb62737665b71d20831133008fde0f7da +R = 14b749efb0e147567c62aaa005ed6c0fb2b4167309f903912bd63ce9c7f83236b5d5b2f2f810f7e048b75cfd806920837f5706dd8c0c69435aff17f81fd48f58525511ec35d2c99 +S = 0eb373b32bded9adc24b2fdac6d9752d5e71fc025806011e4219e4cb9a3f0fdd1e3cc146a15423310ed39ed4eea6c6d7524cc0bd96f933bbb96a13dbc61dba1c20f2b27097c215c +Result = F (1 - Message changed) + +Msg = f22b7be9f616a3cf7c7b403c4f7cbc2642a3d3310834d9cc43263c74422a492f0e05d1a6635b9726a4ec2ee7e20770fc3319d6a2360eefa8d71f0a99c97708d5a85c39d3142cca7eca0d186a010d8f53b5313b82e95d8742acfe7577cae27c85a82cbbfbb716c672a8e1c1a4ab7ed98b96b8445043a585e09a56eb9e27647643 +Qx = 764f0a90a5d4ecbac706ad32bb0e9297a65e1c760228f55df4df85b1f0804f9d7eddc6e25ae878b395f0b10cb497dd44607179d626b843f0da81e695f0117b668d6c257c7b53a8f +Qy = 772bd088eef788c4ff350753640b02d7aaebe3a82776f9297a97e4ee25dd3e28eaa3918ae9d804ef32594af8198082bfd4acece4cbdb06ed14bc6bc45816f950312bf8ef4d0db43 +R = 1c79e43631ffb37adc3362e684f2064550858eb28be0083a35691f3d168ff908d060d2d18247d0ee1883497f7b1085cd33e8155b5b66671adaabcaee439eb377bc1c4ed7c854381 +S = 1ca3e0c9145fb2ac64add1d76763cfdfaf7a7128c4aa2b92bcb388641a26f572f53de708b769647ccd2c333429ebd45c6fa4eb741d4fa8f866241bd940459b23fad15c1ea60d0b1 +Result = F (3 - S changed) + +[K-571,SHA-224] + +Msg = ecd95f6d79d303fe87209b71e9e93e1a6e75c720765c5c55d9b65960d2bb8bf0134daa15feb15075433a381855f497193d6e9ec3d5e249a469f6dcba2752c68fe7f81d137fdfb95619a5d188174509bb3dab9bd1b471474645a96a40e3dced38f922d88d2947eca05ec16865f0c296d09386e2307a187360db7fba1fc97b92ac +Qx = 3b545264b60be53ff27ca7f2ffd005df64aa1fcae3e1c5b2f42abcabd35f698bf8276d7be83a540872729d7de12343775d6204f132810b18f1fdd19f4e03dd14e7bf98d64133e15 +Qy = 4e9b1562ff211a82ae5aa52c307bdf4e6cb58354596d1e58cb4267dec5cdc89248016e6c9b3f8a7bad1ab9567b165630dcc4eec78531f5fa8c0b2cdd6f25a83a3f0789a46316258 +R = 132382ac5f1067a1e8a249f95ff97e5fdef38541e158e8ee7561987aad846f1dadaf7b9b97b4893b58e0aa5e204e0c7ebd7c515da172b533b1f100ee87e8b04017c91f56b014263 +S = 0f84b28d006c3c103529df38c3150d0ab9adcd3effc52096b2e7a96693ce3c75f241bc851f896d8b9a2d5472e69faa9d9a39301f78fc42c5bd57edb6c5df9360214b8f757d27986 +Result = F (1 - Message changed) + +Msg = 1aa42cc95c48368ee47b77ddc28f387b7c0cd915135d3a2ba08c848b81f371fa4069e5886a4331db67c62983b625c318123410d83b0e39b01f0746b5b885bdadfce9ced0c990e4ac6cb4b88e83d73fc6634b23ac2b08158d196718d0df6584d76167504cba09620f0c41990adea68e2a296fd4bd41f12c154efab32a970045db +Qx = 1c713796eb5e275d76f7f84b8c2376faa1fa62c9c0c133332b37916c53b8b65ed10339976cef47af1463e27c1d60fcbdb46a9a77022c55f4250f1082b3c52ba25fd622612f4efd9 +Qy = 2e7bc6e95b47aad0c94550b7e8a951d7c480b35c1f6feeee3884ed04d4a16539989b615e892ba088e44cf125d02a98b172f7ba67a44c5049fbd4ed8d29f4d277ff1bd25d8c76306 +R = 14d9d6fce9e096675892fe933d2ee7834e849523589cfb2fefd3aa4d5b324ee0a5df733361d3d743ef92f493e0b9cbd800207b6ed407820573c0b2adadd67def812fa3ffa1c15ec +S = 0ad48a7059760f55940389182a98000b7a8f641bbc1cc2fa47295c44c8e2f67cf9ded17513ff860cebeea8a16a67a491b4db376e50d94a602125625281927c01c42969d1e8d445a +Result = F (4 - Q changed) + +Msg = dd54ccb42b96185fd7fc49bd36a3d302b3b1c9497d7c947a4b0a503b2e6e1b1b31e6305f3849eed58a3c33e36305cc135305fda80bef54d136470dda4b1a84ff15f62ced87b24324043a14476d41c603abecb45cea6f65e6df8a898d197fb6a520027d5dee056ae2dcb373def91313d2ce8a14105e221847bd561a1545a62a02 +Qx = 570945fc0714d698b2f7dcce60ee4704a75c54c724708bb1aacee31b05f8bd7543686804559549168a6f6c70efd95907b27fa59db5c7847a156e9eb6c09d5f004bd05138cb3606e +Qy = 3b89882eebc269cde0e4f31fec0241f4e216374fe8d063be5456e0b25cc6e3a00633a96c122ccb0b9c2a17a41e55f3f25fc847c8bfa0e3bc9ef778cb5b5eb79ea699b3cc8882928 +R = 0a7d55e95da5317bcfea3c673f6ceb92fd77593912cd622f7575bc7c2b7f0fcd710438d93c9dfd2ac07acc5b600e51ff0eec130cc7cfd7be396a93996e55a16318b2521878fb8a0 +S = 0f4a9a429bae5140557c0984bae81211bf6b5d0d8394bde5992d36f4af2929e770446061efbf98d16c9bf75665cdcf7be5500c614a1536f7aa638f676735d8b4150cc776b9df266 +Result = F (2 - R changed) + +Msg = 13e493e15004f37a6878cc0f7e450265a59390ef97337729a1ceee8c8396218390c5c0c3dfd8e7f373d893103b84e29b48bacd203aafcb4d8933c4b23454a438cf73763cd00f5fef28598aa1b23d2c515810674d6419b19fb86ef850e9c74735bb2c99d88868ef0541c4200e40d03b5530f04a52363a5b26b9c02243af580905 +Qx = 4cb6eb90b44b31f2d79e9dc3d29c100d48e5ae3a565e8960ad60ce338545625f38bf42c88fffa8e622cf143323d1d76c2d97316bd086bbf4c723c56601ad8c750d4cd0dd8d42ea5 +Qy = 405d74ede964a4d6d87b6d41e4002e22bf18abbfc09e3513d022ca4f4f68ab430a30864f2d086cf7c5ffe9913c4842d0c72ff379d9de1b1cd8defc8bbb149285a14cb4e19c6a4ba +R = 0e1f215d2cb8ccde79b0e7970cef329e373ab5120f0a767e9da620227e25b04024461f4f355cc7287441b0105fc650a785c83eb43f7cba11df91643c9ec492417dcadb848ca42ca +S = 0422d084875197fbf08de7ade52ba6367b320a633256852336ddecb64d42177420d84e646b56a23f39b56b4a6580e1498cac720bb120669d17434c9cf0cb0db540b2b10968f5a8e +Result = F (4 - Q changed) + +Msg = 82718873f9957ea3f7c89f8fd63e64729a5c85ff7d6c6c049a0271fd9790bc8acb3faf6e068c27272d45a0077ce899917b3c0aba6d95f960edacdaef4c44019ccd5dda35a4fae9bbb2a71979395f5cfdbd548bbf3724a2de0322d7bc318b0b01d81bc034458909c60f819fa6c08509a0e718632d19a743aadfe13ec218b43c50 +Qx = 334caa5a76249dccbd3b275c567b5b50a2428a4727fb5e85b73d5f82394c1d0c540a899303d111278365d602869a483d87fdc840550407f196f318558169467ad05a79d897aede1 +Qy = 2902df5d26582284e38995713d7e793d97d425965846c92d56481a1261eaaf91dd04c430453ced727ae603e2348805d637615c8b700780f246232268d8eaa98f915031476396cea +R = 17d47a855a0c270f08acd9ac5600a3bf76da4986afff7bc125d0f0da446c64fe2d77e2d94f767de3130d86e01c06ca62038a6f91b173a6c3002f90fb97f540b297660e27109db3c +S = 05d34459f1a5fb774816ed3ce1bc7dae14d5a130515256f79d244bea642a76f3d58a3eaa9d52a4ff3e6f3c326d4689318adf90d7f8cbab832c952d83387a353e3518c574bb72225 +Result = F (3 - S changed) + +Msg = 25621bffbe11e080afe845602e03ab9d2aa3c215229e4747efd4397bb629a997dfb0bf37cc5d704911db57a34fd14ac5f88b0d19509c90ffe21afb3117a8af04b83c7b081209a2c7c1517e97f5ecf774a112b2131a0b9bfcacf6a2888d0cfff36e9298a4a0582a106abf665da00d97d46a4f89f2d9015c851bc3849f6b4bd051 +Qx = 1c85fe5e52cd9e6b41955128f68bf3eeb71ed07ec10750b2b93ee0b98eced32611ba9f7cebbe9281852a47b728c55fb005bd132ee7e416eca373cc3cf29a5727b6e3d4bdc3f31a4 +Qy = 7186ef302303f07bf1440d06a04db5c3d88f7f8e566d6357867c3e70e8fbe5edb4fd09c32e68260e38456667bbb4e289cceb6e2bdeadc69e688f1e799050e01f2efd22f615076aa +R = 0795caacc936fd994fa13b3ee292ca818ae0d7af07ceedd16406d431ab5466286ab2e6a69753a53beb1d929cea1ace36cfa8f9938e53190a6b25b8dbf50072cb4560d05fee60c59 +S = 0f03aea3b5ff906b739a178d986c98930f5b405c91a24c07bcdd6d468c07e8343007e7b3058afc2c16155c9c35700faf5bd5a0974baae0d8c2648771713e5376bb39dc9003f1826 +Result = F (2 - R changed) + +Msg = aac9f8f2777ffb02201d1f115bf2c8a5b0188110da9c1f7ab1693586dcc106c00939bfea7029bdf6ccc68a7690f42178d9acc32ee887286b132667f554c0d0c7ecb1c27a09b3ed569bae2e9dc34acea3b17a9e2f8fa9f1c259b8dbfbb42f6dec20ac0d3059daff3be2d4a02096b4956cf7d47ec1200bca3fbddb0736ad300a58 +Qx = 50f5c2d1dc6cc1eed4af35b787d9d3e4a70eb28a3dbf4e5f92703abddccaf950730c9ddc45c9129f9a216aea016ea71264995124900c756e991abb0174e42c87b809273e003bac1 +Qy = 1a0f73d178ae24d84e6a23cc3bc3618ce235fb98e8423b2e1fa3fa0eee87ec2360b12c409545780184008be7dc1b4881834b32315d5e55c68add7ecf945680f43641c4b2ef80321 +R = 080a1d20918ff85fac391c6388f22ab68c4b765ba11a8b2cf69f1ecc153026b164d3901911fe2564648a1e355ff668fed5b507cc2bf47c7f5882e89beb4b82799a699eadbb5f0c0 +S = 1353953435aa7f970a4e9dea048b27291ff48d835d4cfb39ee0a0305e1c323306cb69409f386e79512f4701b67ae3ea5e4c54d45403bcd08ec6cbb9fae864369fd7fb145ad4a5f1 +Result = F (4 - Q changed) + +Msg = 3960001807228dffd727432473ed3efcfc97d30b92bfbc02411b64ad4a65b2737b39ed06c071334c94b1f98aa7a05f94fbef556f7fff619eac47a01288a43581fff3eda79fbb2bdbdebf00619db2896bdca0a3246503bece87ac26b8b1866754824ad03fddb86f922210716eec2664465b34c327359c8cb2c3402701a24a4ffa +Qx = 0f1ecdc52dd3c93db86b2076f7c3a1f42b1988197a0a7adb261cd83e201b5a34a7eb45029635f4fb41c997944cb4c85a4e14826120e19e5d5909a0dfe2473c57cf90ac85f28ce7e +Qy = 238c72d7de36564b9e695fd080d11ce417376495176a486c98f939bf639767e586110e18fe651ffcfdd5e3f6afcf1452498d3b9ad1775912f8c086098073056d865ee6cc1607fc9 +R = 19f94499833e46f9eeed3c49e6a1b2b57ac1c0d916cbbd0a9c2a710f903fc2c5c8e4a328a5c7fd2b8ad1901f51fa02dc95453db4052c14f533172f617039798cffaefa5e45f6b31 +S = 00b9153b9aef95dfc975441782cdd510adad4f60e4b4be411c13cce5f0448ad38674093ee59f6247f58ca9937c7bee2e6c9f434ebe53146bae8bd13574a78fc0871d193d052ab32 +Result = F (1 - Message changed) + +Msg = e286998b189672588c8df83d2dd2abbf6ce8b23a65eb90e08281563c40f2afe717ce114451f73b8f781c5a1e059ab7610a6b0380c050cd028ce892ddc2e42cd9fbb4dc4048052c9d68e5c486f95a573db8a1f1f2daf3186023c3d9568d4cae57777e8919726e906e42850959e463445a604c316fad71793c45e467cdead3fcba +Qx = 30e833df19269b1dca7c714dc94f3cb9e35ecf4fc2212c4f20aab610e813914497ec03b392335bbed358f1fd2cc23fa78433a52a241ea8d7e5055256b40e53d8deeb2c479ceeb2e +Qy = 2931ce960092be649d293bb8cc76333868cf346e0242bb75474acb62176fdfcea4a4ddbba6fb4b2cca9c01457a0ac7457c628fe4f5e5e5ec100c374944ab9aa7adeb349d9b37f33 +R = 094a94e2595d8a2edc6eb5ba16af13afe47ff0279670e99128846102331bf3c30512d681da392814b336aebe65647f79d1cfdff78723251192d1c93b03a6b1453e5f51f7525e154 +S = 05c51bddeb6d32f713d8bf18279002a9510fdfd87ab25f03aeb7179916d9f0b789228fe44a4d84e65147c584ff7d8b86cebb2e8d9283b625efc09f84e7fc144db6ef2897e65f617 +Result = F (3 - S changed) + +Msg = da9adca07858bfaceec7ae20259d6e866257bc593f44a24885161e2caa819171188894726c0a9eca56cdc455eb4ff197294392a29f7328d312ded6f91fa3cc8ac077591cabbd1cc601101635214ba57c5fcd9195f14eca3361483daecccbb58870b27511dc4fdcde6854c6aa1aaed8fca6f41edbd9cf281c853a1995a6874d59 +Qx = 27d39bec7efba264c01be32fdd0867d45e0192af0357331a90ba7e9744c3d8a2ecb81be303195e0502d4c80ad927d067e1c9f3395e488de526682c38aeaaa3ee6fc9ea76f59a705 +Qy = 22cb62cdafcde9da4d1ad03e5e57d441a0720e56622db7edbac2cae74e9acef1b53bf1375fbdc556372572b70d74ead32fe1baacf6e03cadd655dc26e22d520bba4a6285a336b79 +R = 191d88403a0a4774ef96f53dee121ca2873963a3d6cfe8a105602d95c661bcbbd6198e7bd23c55302fc019433457f13c000971ae94f92011433ea830e2b2cdfae7c45e039b79d52 +S = 03fc07747d5c9cda2f2ce8e26448aee8f5788a1d303417fc8ed9fc5b685b1506960ce5426875745d2edc0d5e8c706e7342d55cb2fc9bcff09fc32db1f027988e593b76021aaaa4c +Result = P (0 ) + +Msg = 0549bbca9aa9d93f02fcbfc16d604db872cefe72cf0438cca8ea80b5f241615a9261f94b2ee588cd4907b2750a1c4b0b32ca5ca3408b6369513d420f727be73ec63cfb332b2f799d05d5b08b63066bc528959ea616f0ec745b28c667b85e69bfe4646a864b4affba2aca761287275fd7cc0a0e30b05ea00a79e9874d6649b084 +Qx = 1fc8d390267cdf1f0674284f86c8da0c85b6c2a69a04ef9812770aa681728815d49a3b7b67ecafb9c41de32bbff6229d9d1b45806bd42bcf8170161b800a63e216378189e39a5f4 +Qy = 4a5682d20b9c20d6451ccdeea96a85ba01f11bf1d3207bb16aba35b5d5d9e333f9a069c40dd924ed4bb6d6752018e356e83fe24f0ec4d8844b433d01c84cdf1a185aaf048cd16db +R = 00f31fb66a668a3ca1a78703c7b30d0d511b5c69c9b36a61d83bbc97eae2fe4a3666453a5a65a113c16c14c077aee76ae6009f8ab3a203760c3d5125e68f18bd23901da157083f5 +S = 09eb7a0581bf2317023aebb3bb9ba9b4caf067b55115697eb784f4ebecadf77e4e4a49ebe4e7d61be593f571cc1b9bc257a92a357eebdfd572de292739c152b064f8ec89d7017e0 +Result = P (0 ) + +Msg = 62a1cd6b512172c304d3a2ebadfc56221ec8b5e7d48b1b8f8cdbfd15d330c625dc7b09a0bc0f12949ebbb206ea282f072b22a06c69b90c61947afdbbd08c9f3a77d945ee68dfe6567b7b616174e4c45943c4f5bc7343cd6006856c1fff6cb745d7d8a187c0243e37b078599c680f2a0a1d96d3337eb872c668e0aa038ea8808e +Qx = 0b02325c7830d3134f473a1a447c208b76c0dd3d721389b71d0b8fe74c4a2b88f031fb7eafab271d440c2c5c82742fb50babe46620a1fee41236959fbfc63ec5c0c0ed1adfdf96e +Qy = 594bd6e0e703ba096768195608c25ae893958a0c76f44e9aae920a50da5ebdbb119bd67c03e7f225733890d090cf0717720980d70498a40a122ce1ab3d9cb85d0c32b17114f36f9 +R = 1cec8a00f2fbfeb456bcef62e96b7b9da152363430616df57340d18b2dbc9baccb559d8ee870b22004c9d2d0e3b53b42023ee400b4bd56dce63fcebf36ef83e9403bed7afadd8ab +S = 1235aca3b7adc7ccddddad9ced6b3d2b80f69cfc07bb5d71abd6f5c5e7940447e7358bae182aec7cb919d9900fd333f2cb494a5368d4440b27636fe1bc5440fab8008d2fdb6156c +Result = P (0 ) + +Msg = 0e567f30906fe84d83b3ae03fbfcda02d1d4996c41f4920c4d00eae7ce9a4a4804f608b5eb01f16f254ec23cf2f08454e7e4a1327f3b495bba70e0744515d8f126575c3171cd3f7a41079d99970219e16e12b9c5ad167c1a478f5e25fedabbb61d90288da6145cff21b6a5e835b29c31e21e7bc418a72e5f8e485c7b6ab2df5b +Qx = 17503beb4e2cc2ac2b649d8c38d0f9c02cd888ef0586d2757239393fcd2b9f1c3bef32fada01ea555fc04c976637993926a9b0b12897b6220819b48a9a17363f8c400e17e957b36 +Qy = 4031a5af0a3617b27aae6ef45ab6dc01be8246a996cf43dfefc2726235b080bcca6a52df5265b51260edb3cb4099425d051f0116eb0e64aa28aacec6a617a0435369138e7e2a97b +R = 0541af5654c6f6a307575d621dc07bfe95a2b3a020e5a84b895bce917677d43e8e08bb27fd5bd1efff2d4f0acfd2d24077a17f424ff240d4054a828930ab9ccdd20cf9e50856ba8 +S = 01fcb95646641da9cb05d2987fdbf3595ae5a1a1b97449426ee66360f93669dce17f6a98fb3f61cb5a0602ebe9ddf3aed819fdc5a892b335f348459ceb48aec2a84a046e279cb86 +Result = F (1 - Message changed) + +Msg = 2c85f57125be7eb27d416bda8363fec25b68d32661344125d5aea9e20cf003cf3ce01a8c977d21b44239a25247f82e13289d9c030a9c358dfb92cef07729d6accadd286b22b26fff34b3ac45cc4735d62534cc155c1e2eaabd10cf30b9913d923226e545522ec213ac5fc5fb6a2e8741d874d706d54d3a06dd8e3ab0af978d61 +Qx = 48b4432f72ba3d0398c541b24570de076096a5c3e5a490a8de52b3a994abf7b2e8f7fdfb02841599718d9de400a4ebf1772ffda1cfbac6d8da88ac37ac8b131a53236e844e56341 +Qy = 6cb540d7caf926ae1e00c85f9cf30d8e4ac113cedb33e87e08a5a247350a99643c6e8e887a4b95e7eac8e3de1254175cba21efbff2d1a8b108ab10b053eeb423f6fe1d2c19ecbab +R = 148452e32a5bbb04cf14baec5c7658ccfaf73af6edf373f58d975fafed27e3822cdec1a615e291ceb66f5e71cbcb78afbe967565bd4a4191d5e1f4d4d759d5b2c9a6b1af5d81dd1 +S = 06a8fe3036cf46d01827833576a156b8fdfd047a8a42f855f6abe71e2a22e0b2b6edaf161236a99015aa7608665eccb2a6063497ed47056d9d7c2f713aea8da26ddda55ca4567da +Result = F (2 - R changed) + +Msg = e58f7a387f55727547c6b21746b284b9f01b952a082cd3c31793ce32f3d355716560b70b6b94e22929de088f3c1a5af5330c8f68b5575a70386e6cef3ac44e73423e7ccef68bf4e437cb966f0db221e580e78fcc2b2334fab819c03369674b6f44a38a9922fb39aa0174bb1cfc0e0225d4b78506256c9a4661005e1ad1eeb635 +Qx = 3afc11fdbeb442f457be67f2ca4f58b4c83c1d79688c7d195945581eb2f4323abe8f98925a77f4ca58c13049b2f38117d704ab043ae72f74ccdc251f1b27f41091189c4b4a95bde +Qy = 5bfd460103bcc8a5d2293778c0b735aa6e8889e771d5cff373c6f8a6a4f43336dd7b859f6939a692da4fc2f9e00de5b969f9a894078a9fa2bd19e306b84d4de7d67555ed4352c93 +R = 053a6a1b6ae2e4b5c77364bf169ee0eb132a3018dc647b8f6c86ec1600f357d8da40a3fc3e6cb48be77228df94926571badeac2de01806c126419d82f9d9e8e7b9b4fe46325c0ef +S = 010021dafddcadb93d8c2520f71cb28d40d19b12bfd38af9debdf7b5bfa25ce18f2335aef6c6148bacf6113b0f2665373379c6487e9c1b8cc695b915eb6cd52f115ede6c5a840d3 +Result = F (3 - S changed) + +[K-571,SHA-256] + +Msg = 460bb7a8161f9f87b2e3b9c4a90ea3883a8e4a0d147f10faf571a67270b5b48d313bfc4c0bf0a198a0fc39060657d0c63d8d76a448fd8b9834b12b061bb6bd8f943b7f0b6dd63290f294a0d92aac14f911db221c5deb674dfe8e2fba3bf660ff9b9b29864727817c7ac2bd6b5f7bd6e671b6c5e06011f6da6cb4ba2a6bdbec09 +Qx = 595e4bf949376b9f84e25f1cf748b1c1206e99caf36b5488ddb54acf06f31a2ec0092f6faf2d31b33b573894b74fec3c701cef543484fc5abfaaea2f44737e7dc369de7077fa54a +Qy = 53a0970af043fa733102ea8e9154c206aa4db46fc2bce45066eaa23bca2425a669b4e25302ab7417113897c21c6d4813faa55a9263a2ae921145d9db36fcd839743f3bf2e6ea17a +R = 0e6b97fb4d12474c86a385ff9b9b51b2847192185324c2afb2720dc48d902488215a7a22ac171e8f6ba15a079ae7c85074844b2f5d1028c8d50008d7a544add9af48c29bd07e865 +S = 06e50bb209279ae5cb1f782c3d3eee07984d56de353fc9af1ad56725e2a826acc9839d8756fc3b18aa69b06caa269e6fb8ca34f2cfd675dfdc5aaf490aca53d3e3247c75b3ce1a0 +Result = F (4 - Q changed) + +Msg = 2fb114a4900b7df5e4bf05ff6ca78029c406c529dd4e1058ee9e87271e666d81adea6860f92fb70ea2f327be1925e15b5d3eaa1deacf2608beadd01066cadc07069c1d1cbf7b41626c14695f93cdbfebf3f216994fba1f4d70fd2d18607713ee94a986dbb365eaf5c66bd9057dedf3a401d85cacdba123f55afe6681673aeb29 +Qx = 6dae0c6788053d15f6facdd10a8ee8b69247c9db64fa806e2d1b63efc8577459111e53c2c72dddb2244109c8439e02b4f45e16ae7a28422174cbd96e106a791389841da0f14e134 +Qy = 1b103e819471c38a02432374d96a018a568d793c20812a15dbf9e1eb6f531c0b653a3c91f7e67a2d0df196edc3f5c0f50742c57c7ed77eb864b9ae221fd40d973fa7e2341bc55c7 +R = 02af273554ed8e7d5c6d1a0c995528bb9961c7d0019a68886711a863b8583e5d08e0e926b3318bf4668f44257a39092e662e5324e44d63883100690da7094199fabc1a2d731ff9f +S = 03af1e0d4733aa4b1e3819ad8215e39b3ce0e6f850039c1df574f6d2edb4f31800900c61b9f7625c218e3a7e066e259f6ebfec63a50fb1b75aa65507347a3e92ca756e5e8360ac1 +Result = F (4 - Q changed) + +Msg = 8a7a83f0677da8a71ac6452b350197eb608c12673d402468f4c16395f68ac08a253ab36f9879f56a6a8c49219a845a977c3b7cb3002c8f162d1fc4cef07808ec90dc4fd418e4f85b0bc62f58e12b4c5ab3f62d4675eda40a207188edb112242a385f199680ad68794c997a1126e4fa4cd349d41ade9a95a9f229d35b90e9feba +Qx = 1d5bbd653a4025ac1953df168b367294d3232c278a35e2b5800ff5aed26879be1719eed0982a04014c7e502430624a6c0fe279761f433276ef26752d29a2d961e8b932c49267e42 +Qy = 2e1188d57111fe94f2229a5f49093dea227ddcd154ca5eada47e9b60b1b2e59783562710cbefcb8955eefdf8f08484aa9ec676bae0bc0355d5a3618e2ea74c9a025ce4b5a4324de +R = 1248630a22b0f9e6d4986fce399d0a8bb4bd0c0b4620c0b64e30e54f118d666a462f5cafea58958211de51554f4ec35a798e676c9b8109d8ee6903b59e1c3f0e2729ac2ce57d95d +S = 108271fa245dd7e45d19c7ae13f075816d1394bf883f75e8997b78881b51c6cc8f2be9271eadec84d664dbe91dd80bdf39f82da549568ca7583e383e8805173a533a1ace755107a +Result = F (2 - R changed) + +Msg = 03a3753f1ffa98be3851717993b4d7e5e33992770fafae7f998a6a40195bd49b82c0135c2fe28c2f91a3397cd8e9f0b285498bfa0a5f31eaef9c75e294b37dca7bf259e81ff034b8d1e7e5495997a461de1c523f0ef4c78e49db832cc93eb50230934e6b58d9ba781d3e9db24c6274d1e2b4b4ec8aa2735acbf9f67e1be57a74 +Qx = 5f941e075552856ac66139c47e98136d7c18ec71413e17de33347921f0b06575269597a0e7481179d549eba832fa7285bd76734aadb16864758673aece6ebaf37aff1f6091052ea +Qy = 067b6329dbe147bd596e90465ea977039712ee9bb14dc7aff0ce4aabd0cca5e5f3fa7ce75d123c78d40acb063cf512528e0c0644d8de797fcc4bd3b03d2fefc625ba5d543f19c19 +R = 145e3234ba0a2848dd22fac5b2faf246f10068452ba71e9b9093e0b7815633f27d447bbff61a9ae277a90dbab46fdf5467bdc6bae84adc09ca9ce45813b03e3a3103c49a209c435 +S = 19100cf49dc725b06e7ba5eb6619bb2520908c658298af884576f05c4e7bad26b769ecfc5aa130c901f8ac86619c002f44465733435cf81e8cd6eda8e249ad25804f3fbadb14ffa +Result = F (2 - R changed) + +Msg = fc86ead346f281ced3bce375c7923d0c404123169e2c2ad56280b002a25e69b1e52bbd69fc26b17922b20db067d3387e7f254e09b23e979681e0eb958146dddb3db2676a833cd3d0abe29a8fdcd6d52bf75db230f6bcae5edcfdda61ed6961c8cab02a4d1aaecaf0661deb1b51fafcc3b845f34158bbbc93a31009ac83b979af +Qx = 5365da6587be2996c33ce94afdd87f33e0fad5aa52ad2c7d6b80c7a5155fa16634f0b1a6ed7208fc650d3c162e7f007dd66b9584e9048bea101f00ee2f567b5a73623b6e20f9443 +Qy = 6a5274e9b78ba5e06dab3a5b5f3819ea87e3c4ea998e667dce7149b255eea477e9073ce1cac58f0daac14aa493b9a1aa9153a7efb8a4f95b7e70771f30728eb86fab0256f0c0f0a +R = 03ee00a4c861ffa71be6ee34711e66f3a55a63dac3a929899da99e4a4832bfce8f069f71b2cafd76ce7777aae57324cdbe817e370f5961e79336b49b491ffff49015c9e67e6215f +S = 1a6db0c90e310b9602ab198d617c68f263cef3dd70907b4d17ed6111048d3d479449f0e91e682f808f99fe2f0639093fef04e69f3386fc3cb6cc85788f960a963352fe821a1f653 +Result = F (3 - S changed) + +Msg = d8759160235db45630bdec695fbf3e8547438735f0de07f96ebbbf95b45fde331642ae6e54a33d22c21d2aa5ad4a896dab5d6559095818b6202a77560eafb350c80d8d85b68c1335bf2388f9537cb10efe7a10460e19995e02d16be8ce1e43b2db4d4c6d7d132740f1eca1edbeaff5e8cee0547fcd835d873324548fe71a8282 +Qx = 5ce78c7d4582516e07c33bf39c93be1c3e077c0d9dc5613de592dd77894399fe10a4fefffe410da2b726946e5e80a4271d3e7c80f0599eab8c519ecff983d4a77e5f2195c1d2f57 +Qy = 6102058df8c9f6ead0320474f6166660a3e3be908bfb5bf6e0b1a13c7ed568e9f310b8564dee034b5893eee91674c307e7fc02d82d3aefda579370f260fd95557d0317468194877 +R = 1d289ac62551aa5b854fe0a7aadb4135c41f44bb5fa0fa9f892fbf217ffdb17a9de2c25ee201307be20722dc8c21a3192999ab3ada367df745d783822a2dfe68e00ddfb8cc47e29 +S = 11fe19ed0f0eaa4674bdf5c747a8b6c8fc1d457d318a35ea7f1610dbee22fe48e2f2a5b92349a362e243b00f4732f74fa8f09dfd2d5170783b88ec5c06d2fab65f31442d6278dd4 +Result = F (4 - Q changed) + +Msg = fde80778a74102b55dd940e4b95674a5c20e99423c5d54d9a6d4d6b7057eff692e3090dfcd0bb12c2ebd394ea9eeb76e4dafb4ee041a53ee89fff8f5cd7d238d1508491de977218c06e3770189666584954bb0ad4b1bd031877e5ba7a33115b279983785331c5821ef2c82ea0b92061d06d596bdb8d1a9f3c3e609fc254ecae3 +Qx = 1a743317856b398f30dfaa274ff5feef4b0715e786884d181ad26b20297f94ea28afc22da39b146af125358c4c4f6da692315cddbe4f348f35b9241a0ee4d80b2558bccc59105cb +Qy = 75ffd0dea267210708e0a8cd8e56b5f8dd32e4980ff7783c2a3129fde5cc7d588e16fb5e93f524f3a404e99a54997a322bef73c56a524f1e1c6ef9281dcaf8e300a96ff8b8e1c0f +R = 1f72219b172c395d58f4b686bc92b209c0205bfc417d4035c46ca179e47eab48897c50014818c334e16c11d9312246c3b3a024038ac2e56fb15b402e4687e6cb61fc39e03642c1b +S = 1e83b52feec9680a4f6759957e96e0a399f919bb537985dd7e2f9ad38a65819cdc7a5fc66f89bb0f47efdcddd560f37a3c4887e7b1cedda1726d46d51bce58da8a270e6e315f699 +Result = P (0 ) + +Msg = b8af402e458ccb633adc72285615540202a8f912fc66c8bf5f3e7e0a16c660450cb155122fd1b4565a4e83396da7fd50a1dbb760ab14dd26684bd05ede120c04edf684b44ed4a02a04a7807b8acb26733010de35c8778c72d61bcd80bd13e4a4de7ca0f4dbf5a681cb883ec6b9820f2d0d3aa7f9d1c5e266ddadbbc1edb0e75b +Qx = 07460a566c81d801735add1e306d10d081caaf63781b7a71ffb7fafd95c6c79c3b04d246271aa52352ab2c8aa0d309c6927acc0093cb2b3f58971962cdb9b418d5f5ae728224780 +Qy = 7ac64890bfcb791d3955c13919acddf3b451dfc4e507bf4b9b511a0ba28d8368289fa64c20c3f475ce3ec0c578bcd2f7605c0f71b6fe826dbba972fd1adc3a39042901a8a87d4bb +R = 07ee8d85a19ab2cf9d5a3e1d16620c5fc2bd7b6d66abbc469cb6223577c18020043ff6caf02b361a23af1d052b0619625d001668af1d8d114ea98d988d3623b5271cbb23e2e95f9 +S = 06f6394a06e4d63d1db8a3ffd9d589ed45ef8d630ca2c303a1eefcc9abb9771a5759a4c080dea6901317ed8d06195e0a0078dffed282cea5b45c0606d087c03ac1f4c2c6cdafa1d +Result = F (3 - S changed) + +Msg = 120b41ed651be54b531de971a0a6522b7df5595172f51a72f77da48b06db4beaecd1644dea0f5dd7e07d6917f19f4be8c7c48d1fd13bf86f2768e2e21b6014f0bed8459f994f32d75925b640234174cef306f80870e8fc4598fe4bbfcda39ca9d6179f57d6a99487af64c383f6fb579f5e04c5151767fdc7c87f9bb00285da2d +Qx = 553ef19f58c014a5384bf5c9bde8be189da61b8f865fcadeb5fdc76c3a36278d2e6a1ca5bbe6c2a8f5a65f2125690703b792ab7c0ce63a16dc8326667a2acc593fd07bc9e8509d7 +Qy = 4037a7af7060e764a3f5c4d0706552a8206161d27a45325797ffdb027317567bef5b6508b6ab8b379612c23b8b13195d190fbd52349fc2d04f0442dae1a0fda04f2b988cc2a5238 +R = 16ea329b3c9fd74fce05ccc16b748a9a91b6d9abbf4eae6dd9b0c229f68311207f8407ff5a4611cc15e0ff8485a35800fb648ee56e1d85ec0a40af93d50de5207cbd2bafafb0ee3 +S = 01103adefaab95f1bcbfc4021395a7571704bfae395c260bd9efe54cdfabf56c3400151a107f8d81c7238f38998c58ad5b932e079dfd33d201b4e24630b8170548aa91a6e4ed934 +Result = F (1 - Message changed) + +Msg = df8c251459a4e82ad98bd9a635649c3782b1dd8ee11b3369c60fc7f96887be887f7b405ea965df4227880d071c2ccf952ceddd5a63a8dcc04e15d48a9c727c5db8d84e63d08f6933b4a50a4565f6f29077049ffc10330170e97391f61b6e6eeab6fe0378933b1d2d1bf6a24b3309ed8d998887bde242aae62c87337551a47d0c +Qx = 121d53c6961a37ccdebab849dc0f14068ed48f6b4031e741b56ee8dfd5fa71ad414a8bb4d7f84721b473e64ea0eb5c3406eb2ab558dd40a5f209fe3f5b3507fcef8948e267d26da +Qy = 6017d8b466757470c45af29908c8346e6f22c2916e99d1cdc271b16192485b29a1049bede83627efce8be4248692e21e7e299dcf20820f6e9e11280b6b402fa48ff9d03818b2c90 +R = 0f654d937d6d8235d3b818340b2d8ddcb4fa3bb41a09a109af8801e1aeb681cc27948c6f0bc11cec204ae7ea487061f2e06ab63f011b78e931623a03a8f6dbe0ccb72267e5f478f +S = 1b376bbbeac1549c85601000e7ee16df2426209a9b42b55158d2482373659a78a0c9f1a66edcef57777dfeaf573c5060d8db9453e15b305801aae176b1845157002d6e1644276de +Result = P (0 ) + +Msg = 1ddf937e12b016eaaf996b76e51fe8837a74e9a9fea3e636143a4ce5b9fb71e0921db2b168e2d7973a8c25bd28e236bff7e9a8ed8f1d992945252ea21387648bf66685e38213b1e80061eb1789363fe8623673f25864dbadac85e762039cf38c7cd550e980449b01e4b7a349f699c74cbeded3a32cba4ba4815381797a0bd42d +Qx = 0a42c9c44c49be8f5068309dae43b7d9ff90cf22783381c3062bf20365b406e41ca8082b1876ebb996feb7735b1c094ac4b85afb0ae701dcf7eb94c561521fcb309c3675d2fdb48 +Qy = 23e45e76183b80e2cc8d4806cdc437195a038a6f8dd0eee132d13f204f4aa8c5567e18ea2b17e37d6a83d594f985df30e4aad3fd408a11e6d85e7aa5db63a71d27fe7d0daf6d4b7 +R = 0b483db2088b49dce0dda82befac987c10696f38f3aa24cbe7b0945a2dfd6a1ed4d09ee47b3b19d2145229510a0ea215fb3abdcddf861dac142666025fea8e0de77af9145353d1b +S = 0d367fb5d396cabcd0370b8cc00640672cf4ebf83a18af3fcd20a75274b00ccf83aab20bae4f644f20537c675ce72d5abab1b9ce2ab2c5b6d7cbecb10ce3e8946d5d85586a5d237 +Result = F (2 - R changed) + +Msg = 08de9f8fdbced59d31c8f89a2252a1fcfa8bd2e82df5533d9841a9e05e978eb8ee8c347e02dd22a0fdbdfb69b3f98e5649b8140b61fa4cd63e295aa6e33d8b3f4242b295d7a6cc8b072e46bb6e9da8c95d12e52dccdc01111f425186ecbbd8e065989b791176cf569708fa8c99a8445f8abe3f9aef36bdbf9672b3d3d4f53c7d +Qx = 17136f5842b3d543c84b234dfd6a0b91bb2431366da9675932db5ca2563777e05dc9b317c5247c78f92dadf2fc1ab87f85740ca0e52a48ab247d2984300bcd77c7a8d701daced46 +Qy = 103683cb309b14d662b96e8555459b40de829f10370ca7747e93acb193141b60c26a631640992f686d94ab8f0e044b46608d756af192a0608fb262245c5224d3c077e84eec3998c +R = 0df63d107b3548c00d4e1a5ca241489205fc2b8834c91932c087fa2414206199094f9b6001c681a8115ce72e2bfcaa74755c427912ece182cc923171596ae37a0bc18ddfa28be81 +S = 15f755f6870ebc54abba2f05f9da5f0ecc48c0b0eb57d7c92406d0b1591395f8d41453de0d77d2784b1fe40ff832f7dfcabd4bca06b2dcad43a49ebd0196c60b5ca9ad9138a100a +Result = P (0 ) + +Msg = 2f8e19f1e5d5cd35b93af2e9c5dd6a6c50286ff907486b482788f75dcddef0fcb24203897c6bf30fcc8b4cf65fe992138eb60d957f2dc7f85fcfa6a9041cd0632e809a21800c1f1e32760f1fc74ee2eeb93b93786ef7695e48dae5c94231e6b184a981153481b400f4a6691299e4b7d99cfc5d158ab6ce614daa64f14c69d20c +Qx = 759af6f994ab199741bb78ce76a71f012d17728d363afd4b170a0a556f5938c76ec91d47f7059024392ea8c51161bb34755a27b2105fb2118bd25e3062130607fdad1be4d3dcbed +Qy = 4a2b2befdc3514999450a6d7c50a54d72900313ffc4e204b12999569b70cdb5da5f6790515c39b2692d3a1a210e92166e5112aa6cdba02fb777baa9f21be20a4712c004f83c98be +R = 01dc96f14e408fd8b5a69c782986c324c8e38d9f4992b6f431572e58a08347806fe18c441f9c9cf5359b1b8dd0bb6023990a1433611e68df793053dfa5be9d61455f0e8d13c0c40 +S = 0cf712c5429d6967a45bce70d69fe282814b6133de15cb85237bf98796350366cd6fef55a659653d0058ed853d4ae0a27dd5d7b8822d7b389698e8703e7cca3c3c88fcb2081faf1 +Result = F (1 - Message changed) + +Msg = 3cf870d3412633b5757c1abac181b82a261bdee39d49d19bd05956d54c0c347278da72d101fa5b928e260440857895ac8f2616513167c943dbd50eef6007a23d10b42bae22b2ca80c09ebb113c32d3ff144c70326e4ec15d4586d4382536c164bbac4cf4dfe282333dfbb19fa826c6d68e286d6f16f72b7ae577c2eddbc8073b +Qx = 7397f0a36839e8e37782f2b29cc2cb35308df50b7cf2e7d671d2023417bdfe7099c1373aa7efe5391e28c33e3a515f1dd3e47b21ef4788f0ec7a4a5ea7a024549358c4486051d21 +Qy = 2bcec8e94917b4560ee1c5e9db05930d5fee9830fea72571a5c99a7e12f916f80c22830e59309f11a7b211e4ce16499f3e0a9fac2cdf4c9cc627e116ad5dc02cdb53664a7639647 +R = 1c58d0c22d83ec4c7aeb802a16f06ced0f9f34476dc6757b445200fb0eb6290ade23cb674152f3bf4575ace8d1e2485c8f2e5f9dfca965fbdcadcb61bd420aa7556b854fe11dc3c +S = 1a8febfd48965a5cb2e5fee457b32b979bae6b74cc36e1586d9163e80d56785ff754d4cfaca990ac07b4a21b1dd6ea772f1f0b8931cbf058221a76bf73bf6d9babfd41da2cbb7e0 +Result = F (1 - Message changed) + +Msg = 0fbf25af2f74b491683bf78e6b2ae087e17e2b8309c44d9d0f039262f00043604ef006d766cd65c112da0f2478b04dca7aed11b3865bc0c8adeaaf7990636c82fd4b5c8b514926510d3a7117038caaa2ead35fdfc143f025e547d89b3dca18cb4d714da56dcd7ae7d93d4859f787b003fb681df53a9e1cd0fed262c49d5300ae +Qx = 437931895169a5da9a2d0dbea0e16d7e33875a1425d4a55bde3184de48657ed44c8a3655931bad97da21de3d3e29638e5dfd82ad95043f6f5ab4ee18b507e0e0cb3458ced63524f +Qy = 357c41e21cc68a40eaf4407fbfe323693e84195f3e6f6bc8c222d86894f41ab5b2ebfb994aa92dd751b44fec407d2a9eaf8123d0058f4405859be21e5d46a65fd4509dde835309f +R = 17e90ceb1d371c32158d1be04f6752884f3b3e50ae47e2f61130d888f7040022d712c9352e47488fddfee1abfbc5f833104f869b397116e8a00ff51b884a7400d09ad09ce0c547f +S = 0594c914805f822225db8ac42944017a71618cd778ed798bb92078d6d675f9e9e80f97a4e4704af70fb8f9b908032a330f7841b2a2ce8b19e2ce1e21ea4f22f28112a6c19d424f6 +Result = F (3 - S changed) + +[K-571,SHA-384] + +Msg = 1ff5b900ef55f88e15bc9dccf7c438a96a2fb3f222355f0a15f2ab101d8517fa0de484263b803bf0e8dab2e9f5aa8247cdeee96e4f21508f0312d7faf8ae6723d015177fc64251ccc7d09386fda020e8f3ef39925eea13f3a52336efb1292b294e10283161008dd2052743858d8a4566289054e914099184c6c91f694aaa58d6 +Qx = 670daf52374c10a3a6d0ab0a4cf54c366f186acd683c22278935e30ffad95c673e39a3e2696c601ef0f2ee44a9dbae599e20cf447f2be5993e2ddd0ce69a9a46fdaf7d9b717400b +Qy = 3f5a6d140bccc48e301b32b24063e9ef4e283098cf4ca097181a0c331d35bc6ebb2dfbe7c394db0fd3ee1e44120cc16bc8718e6c4f398595fa048ba8f4687b723713dce59bf4979 +R = 147a0e30ccd25c13b739f1dd382be2e2c2d5d3402228730df67b6b8da8264be8cf609b76a1cb0cc93e4dbe27bfafc8c5d3389f8b2f0077fbbd884a218f7b3abfebfc20f1787bcff +S = 031d00428add063c01ccd003d001fbc02f6c3b377d64ade7ffc68c8f3c4c0789dbc03e4139587815701937c118242b8b41d57e38faa06eca3bc23eb246c424fb1cfadf1daa9658b +Result = F (4 - Q changed) + +Msg = 8ee7ef50c0d5100ae8a62b67c519fe358f437c977cfcf53535d436fe74a8d9125ac777aab05f15613b066bd51d61bc46cc31f261de4fac8866571575c0be01f5015b320199e002178c07a4d43ab0f459cd7f7a701c061242abe8d304b85ae9446c9cebbe511695c8e776a5d2fee6d440d2bb07d4f84da3420cc6543b7b1cda95 +Qx = 1d38cf3f5ed5f2ae8563548dba8b9799a5e5620ae8455e9f7c7f73e8ddedb68f93d7e463693907dec5bea1eaca43f6774c52474d295f78911b4ff5e659ed470dfdcaa832a99f46b +Qy = 22d6d4129dc641eb80e7f62aad06dcb2df22b1cce086d50cea6cdf6f80c7c5e4b6c7d637bce372f6e907b875b5f9434e64517245cb782bc9970fee80d171d70731181d156d4aa94 +R = 1f1a29c3894c66eefdd67874e0615c4d314ea922d25308e2ea008a4a78006fc0b057d4a576f6010981b0d5d20164738ede0cfb9151fdab759b222dd41b6ca5a2f44818a8a4252d2 +S = 18f47485f03107030100ce6e11d48035decfab5c214fec4f9e8a84deadb0b0d554f45e58e82bb83448c9e2f84c271e69c703dc5dd9974fcae7a9026c27b402c1f88b266d67ac565 +Result = F (1 - Message changed) + +Msg = 3c9440241dae1a68be4ed383001ae432b8b305152e48e966db1879a34e60075326d324a376969613955958a4712e4609307796cb6ba617be3d2f6610fc965cc9edd132816068a8c76e5c32330f5f9a189b099d9a6a5305cdf2c672d9ffbd8549899fed3cc73f4e739646b4fdb3d3ef817292fdd0dd62714288e42f91f0b562fd +Qx = 41cd837e624c156a1c2d7b16ecb20938be4d0b56a0a2aa1780319b0d807acbb039398f41c90eb2def60c71428b59b3aaec19b9ea67d97f479f1e30840c81d93133f76a52c90c832 +Qy = 2c047a4ff425ecfe4da8b98abbebacff0bd86d1e33f2c9dbc9e627da44d75e98f5d28c8d9f0c581c5ad13a67069bd7c3c7a79ea656bf05ca4c46c759c0cabc70da8b1097f503229 +R = 10aa8c6e6b8a6f778eff5f85734b5be4886583e06a21a85abc0c1c7fd27f76dc28c8da069439b52a596d16a9e41d9509636e34ef959ac655163abb774484269bc78bd96d07c6515 +S = 032b260d2131beaa037f40725b00702aaad9a7633bc51f7096f956ad62d5f31425b036b26fa5552515461b47325eea3f1a66e13c8a2142b21e0f500ec621d1c9a2bb7d6bbdd64ff +Result = F (1 - Message changed) + +Msg = 9cf3d1a5516f48152ed1e7b4123c599f25b17b7ff617507b0b4bc49f340a2c593b59166a40095035fe51ae0d125ad93c95fdbd3dfbb3e6bbe2716b2e084269fd40f84d19221c81e28b20d772423091da6721c35692183bf6410d9029fbfcf7390c1e84a1bd709b48012266a175d48baf768038ba10df3181a3946ca270c701fe +Qx = 3322efa2f345a4486b45938187937c10b7320d0948418e4d0e34266c2845b8500ea1832858d6189a2c44a22406eea9310225a96402fe308f97fb54bf7611683efc41b515a839a20 +Qy = 25824562ae2068577c5190b387041ac27e8db18654e67edaa9928f8fe3b0d04373333cf49a78fa456427badda22e11eeb4c77c157d19433a25b83bfe3316af582dd3c2b2986c4a1 +R = 0575d8836f0f906f38f6dea6fdf14e50eca432e5754b26fb07585ff5aac970b1d75295cc1b7bb1f076575fbd6a845f292bbc00648c6d146c98707ddd4989914af09fd790f58678d +S = 0fd416b4321197653ce896d623873c12e4adb9431cbca3cd311db40aff374221374a3ab03320795c1748e834e5aeee665c7b20115490d1383ff5953ab279ca2a343264af07a9839 +Result = F (3 - S changed) + +Msg = c169a8bfedc8a1c773c913ebe996c8fa7bba9435b8ed65c4db7202b3dc79b3d1548cb2cc08695d6a7ff4d848404a46ea84f0157664d8daf1d6b78a034681b465a26ef36575a6a53be5b0f9c858dc218e8dda39dc3f4c8db55673ab5cab237567e8131653d2abbab89013bf5999744c5c2a598479716b514f4c8e123cf90e1fe1 +Qx = 1c23b36a7a7e8edc2383c2f7fd07c0caac8d76da668ddd73e518983bc334cad22d3e3aaa59edc88fc168bc0fa1d886a9a8a67d62f693fc6169379a39bda93c8fd1e2d251f3e84ab +Qy = 529420b6c157fb51eaae5c0441a70ddd4be6e8c874834a486b20c529fcbfd35236f68ead9cfcc5c378fce3c337551a06fc5d14cfec917a3fa8f9c9e269939d9b9fce03d6b798cb1 +R = 15ee5f9185785fa1f7820f7f1a5e0aba87cd4a18af61cadeb03e3e35146f7add8f296f6d8f9aeec7fad7f0511652c01912e3b6ec51f4d22bdeb56d909c9bf0a0ff6c199dfc7526f +S = 1c3d00825d0dfbae281ca9e856aea4a0856e65620510f08185b3334eb2e7b757dfc1278436c31ced87abb5406ddf4c2e709feddf26f9dba078212a078364c99a82e7d843a270691 +Result = F (3 - S changed) + +Msg = 298a1286bf8f086ba726c57641d27f52f4ffc543b1f476043042bffdba33affb30ff3a8b678c657158d1842f76e8535d23ce5dc9692c02f5480731bf8903f981115a8b57c65f2cd4ab2b5a4e8bedba87ddc513eab1d9f86780a3fbfd837cf9ce5a007579560dfa1ecb279112feaa6ebb8a0798d14399629a1edc974e0965ca3f +Qx = 05fb5499f2466bcb41a63db142d762c36ac806bea6e3c9fe02bbc9b6a611abe78e7b9f7f48c876ac624db6570c38162045e8e6a20f698068fc1da1d806a691328d13d1a050efca1 +Qy = 71d761d683203f871e2ea785be6c2087014ff74a52237b02497cd951c39cd72386beebae06a127a2dde320ed4d7bb1ae2f12fd161b2369145a4bd8bd82df13c49518065b5762a72 +R = 1188ee33a1516fa802dd6e24297d60fda394c7ff046c86924823eb547b36beee248a4440734459a326241408d32d29fd06b480b4497b722aa1906b184b82e08355b0060ce7f1c4a +S = 1ce0bf85d76f732573507a6184249934684fb57ffb0711d74f216c60c81644d5da7c8940ccbb363a3004285c96d1f2d0b7b3604afd94e3b10f790f2a1f9b4e86ac76a039903a49c +Result = P (0 ) + +Msg = bc7fb14557cb3891951d93eb88a284fa5d78aafb46d559ed2881c495d627d2dfe3e7a8c801465e4267ca6f7a15311e186fb2e82aae5e691eff22a1d5202d1ad0d6d21e05ff4a918d3947628daa0dcfb1e4d6781eba259d0909003e7ef8c5df92773d7bd2d8b4e32dc5841e2aefb4b8bb093353bbeafc6815c71b3eb2f60f5fcd +Qx = 49f71e39b9186e225e2699ef160a5df514be285b71b00e90fb8a5bb6fd5ce397343186a8233099a448f167ac55d635ef8ac2531ed8c06f8d66c4b44b899f9e0df387c92132bf0f7 +Qy = 4337529f501e9037f8b05d3a309b639afcf2d64c0ebf83e2b9e2cdcb6a3f3e4ec65526272828f33207b26d1fcdab51a3ca07d84d87447a712eb3b310303ea520e44e6a3ada36dee +R = 055fd93bfd37b3a7086862df1fc653eeeab817942f80193e85c14f67a41dc5e2b3191af157fbeb32618cd431f431b0315a4a894fbab9f02c7d061b7d11e86af996a1fbecd7dddda +S = 053cd1537214cc8652deca6f7b0730bdbdb84816021aaf16dae358e9d580653a57a98f82c46cbc5d556196f6a44e31688e5a18bdb102733778d8a0506f9d625a600bddacba582d3 +Result = F (1 - Message changed) + +Msg = 8a9540c6df089a6d4b2b5cc00fc9036a84a1f83321848d1dd0b7a69d0dee2bc619b7333a4b273f7c315271322982338d4ba09f951a692c964decf323ab251d7ceab327ed1dc56a45c8e0757bac8be5e0667352974153c96effa520b3eb0e3bac47b8fd67a5e0c20f723c6955d6bf4070ea24dc83252e96d3c6a4eee7e8e70fbd +Qx = 5ccdd7e5bb9e678ba6a2c7c207f9e3f30de352bdca399e61504e972ec5bcf79f819c9ae7cec11d2a59143c5b6a3b262d407568ceaf350e81b4c15d2660913c3b095626021fb28ca +Qy = 162826946b2dbc494d735833117047478fe78bc4217c4b3cdaf3edebf654bda4076e8b7aaf773faf67abd9d6023e63d291d92ab3e9d60bb0c3151cd98264b2dc79d70ee5c101b24 +R = 1142e950350d4f8fe208f5bbfe3f49a990349c2a1f2643fd15b400cb501b0164793af8218e33368541994d233ba5f02cdd94c0b02e7794ba13c397ba8976333e886108a812f15aa +S = 0a2e62c64436f77c35c4c8bc662b369877a72e1b08133813c9e096555169c5a28da3ca1a054f860862cdc3f27ce7997bac59d99f7bd28166b3dc6d63261c4b1f203fe21e6a99b5a +Result = F (4 - Q changed) + +Msg = 8f0ab2997b27fc795fd73af5971cc395b46364f735ff2a92afeb19a124f30273da8d2d848acfd548f365b6f13e239e74f49241ae6afa26aa3bd530351b6777da5a2b46071128adec65ab2b2b94e553c9fd3d9860753d35a49221b3b02e4794a8b5521c5ea17fdae2291928fc1fa8ac338d6029375ef5d611ee2c8e79e9dbffed +Qx = 1b0aa79f7c5b46c65a5a0a0561c7edc9c48838f3d36e939a9c5885ff6f0dfc7f54fdafa152917728c291bd553522a03a677136853958a3010e1daa96ac047ceaa5c7cb428f74fc6 +Qy = 3c65a0e5b617bae456e5838a4c5368798ab0f3c7b4eb4a716bcc18b50372460143bd50e9287f3fa8aa7d16392d191e2776c7701d7692e217f75e1eb816ae7b676b88f7685613a50 +R = 19b2ed178d33512dd8ffd8ee4a9aad4e019d84aafc89aeac23771adbaacf3d4cd8fe548317a6099164d2d7bda327738f1ca1917342529ee99e97f2f344d373b8340a6c7544abab0 +S = 10f046162a60eadd5e9560485e5c8cabc87b0de87f5846fbdb22fa33052c61173cb94aab51119ec467fb3020c051846245c5a45b04f1d619f1e52a46bed1415f4746417f0605497 +Result = F (2 - R changed) + +Msg = 542c85f3351a79e4dd068dd82c5e463b7c8bef55095f341fca93fd29e9b11dc97556a515b4d2dccdb5b81c225e7bb884e72594002d3d75453261cddd387581766f9831a1d5ce5676ffafe595fe4436af095079cb9aa7b8e966574cc08627bdff277aa54d5540bc06bf9ded22cfb4024218400c4eebcfee57b89c7c5ea157491b +Qx = 3f2eade801efec8ff500d62538b10a6ce0875aa4306652f50141eab355d9e26c7434dd2a426a3a3fdf1350dd32284a7c9ef54751441aa55c1e3f5fb8795e67be26554ae54035422 +Qy = 7f7877aed1bd14b70026384eadf8d559370e2d0777c1acd2e1f5505457dfbf059805c29d50a6f7fd53613a2677798e0f2f5a9a094b8f0e78bf517c5496811a2e910ecc11df9057b +R = 05794f294272045b9b7ed93c8643434b1646a85bba0db90ea5e452dc7714e51ccb3571f6236bf4ca0cf3adfa2dadc49ebf08a342e0bf8105f593940c6cf09ecf3cee93c3d1b6ddd +S = 07583000c324dd07122b0b71d424222de47c90ea90093b445961c16175b8863840c0b830f4f995d642d75dd8f01c870cb8c82dcd0b8ff56ce52e40ac66bfb3d708c077e5b7a5f31 +Result = P (0 ) + +Msg = f823bb6c05ecf8af94c04b4dd827dc5ff1c2f4d3851c654893580227b72cf8468f4859e854bbc59d9b70c81f830b5df220ae3e807e550b10937fc99c1592b9f1866ce8213e37323d75e7da326e8f2fb8c7988fef496bdcf2ae2d9b2ed3d7da05a9252eba03d642c2a388b1e2422b63b220f26540a394f5f34fcc594a4b981855 +Qx = 6e9c75186cf5a151e34a2064fe758fd135b7ee85379ee0dc44da62e9a55402cc21216430345175a4e129b4401a5609ccaf095feb07726abbb881def109e027326b8a12310ecc789 +Qy = 05da8b654ca0c561d0a668e5bd1a26d27f641643d5bcbc0795af9cca47c608390909e0253380a441088b7ede8493b6ec3f01172b50afe71d172c375b18b95fb36cf98422c6abf4c +R = 072d3034642ce93f3bc0ee9087b23dbbef0e4252ccac03a8703c9409b295ae8aed7f670cf2b4e7e9c210a831ceee6cdbe974dbfb37081468c4c4809346ff67afc82725396a8d36c +S = 0bb34efef31d4ea845ebacdd7bcaa6803b473fa79c5f05244d713ff7723a89e8b85eab132faa746b397fdf9c20e9192b93799d7e3769c626e3f0eaef37eec26d8bb7776ea63b725 +Result = F (2 - R changed) + +Msg = 74f559f69162905905dd3a7e15ba118ff16ba96a7387f93991db04ec0d84f8344d4cdda08b504dd8c9f7f21d64e622d17c69bd474e62c51d415b0db55f921f032e39ef10a96748cbdf2defcf9c0b89e04ce593eead759f12c2ebd8df83ebeed09f4f6c20162c318ac84320232d8e94f7893788b4ddf39a0a500dcdc5777ab45b +Qx = 44579c6625fb4d3d1ea84c3695187bdce7f9a0fe6b2202c202993061fe3e6025e7f13f1c5dc328c6017995e4b026a0bd819140b5eaadf59b38f7000255a37e935a4537e6f851186 +Qy = 254ee7b3de1078606327e7a1f22e4b51db26326553f725906923dd3bfa7a13c3aeb6d93ec02af8970f697f286564a330f6dea6c2729c510325ba3a437bcd6ac251da3e45a2268d3 +R = 074bfd1fabb735a66c5cd10166984f72a41f1c3386fa8d05ed35e4c7716398df1a2bdcde53830a679d4aa2be60345055869e503285386c02a3fd38d8aa0159307e1c798a2a29042 +S = 081a3fedb68e8868fc6949f544ea84b033ed9701670055c26828bfbb25b3809f0f97c8891f54b4e8b150ae29b2799dd127b235c3865a5d13488e5f38583efda93ff14907dc0151c +Result = P (0 ) + +Msg = fe67202261eb1fe6e6fc5d2c41773dd1c22b5c919bee2876600c692054abbcd566e5e2c645cf7d94c878cb1588b0f9743001f810e8ccc35fab0a449ad58784946456007c5065a5e37fb3c2b7af9ac0779a7c0c7904756ec561863782d0c509399f41632a06e0afeb9e0740a68c1d3dba336e935a895bbe668ccf826548d51923 +Qx = 5398f9d63b98b13a29754b7c4969ecfbe40648ace03747f4352e3466eb6c2c3e3f6f107ca33fcc92cabd606d97eab594720821bf2623e0fe1488aef3396f46bef79dbca845c89b0 +Qy = 31df242b0009a92d2bb84c176415c617cd593d6b2e26d14375fe5f4090d3b39d7b114dc093499f16bbc051e954db7109662cc868b6a110eec76af1eda5dfabd72f1c47c70a3cbd6 +R = 108813e42d4f419ab5770dce45511b2efccdb65f26b18629627b89c752b0d2f32b4264b1335afab6e15138f20e6e856064796588d3a115e085c41c5ccbfe49b449c1b8d59c5dff0 +S = 1242a636a61daa49beac63528f9ead119808ecd4b4cdc69f82b8391172af7cf3839c275380f49923f8c2976994d1de35ecf1949d3fcf280826f8bb64e1572356310b9bb150239a6 +Result = F (3 - S changed) + +Msg = 7b9ea5cc083e45fe0307c7c3d365cb17a2feca744428303fb17ce2420aa7cb406ea5f50a746bcfd0494e88e950f293f777012d8cfe710047b8b3e48783bfe723e4bc41ef7be2de4448ee2cccbd06ba983ea75d9f3e9414c5860ea2011b05b39f74f4b66edf399bc4cab7d4a94b6a5de275108de2d65357e08caee845abac6ec9 +Qx = 3e1a1554291852a4ebc7a698b93980a6e6fc943d09cfd43aa6e74ef896b028f9dfcc3670e69a362ca510729c5ea2337a7f82651b4a5eecd518420a465a1d587b4ae75b9e0a03333 +Qy = 5312712f63b6107d3220503221b4d9d1b8a77e096a54ce89004b3b086a3de41f15c41f05f6bc7ce06de8eb23183638be30d2e0e6ae7ca222f4fd116fe1ca5c6168d04ae3ef08979 +R = 06a77db2e3f7cbc831c214a8e88d2b2ad1f5ee8c22c5bb51ed7bd47624b4ceb4bd8fb82795dffb116302a51a066e1c0683166281e65a20cab8d25720797350d1bd2668365a8e4fe +S = 02bf59ae01e7e693d55c314e909e810769a11c08b17b1077b4c25221fabfbccb32a8f5e522f8210d5799c1a5d110cba8d95e99a30c707181fd9232ba600575aae9af2c76577abc8 +Result = F (2 - R changed) + +Msg = 918b744bd595729ba14a54b03b897a3341e4f67e701fcd17f58480c3477afa41cb99f1081a66cc8d0c1e59575d97a5e8279c1ce8a5dc1bdf1512ea7d6f3431307bfec9651c95729d922f46f42cbd6d0dbe7bb96b2a187e204ec5d32ea50d9b16c973f637f76b4ac94a4505675420f0ab9c227130595bf74c57a1cc84cbb6b6dd +Qx = 53ae552f4c4e9e118f42bb67aa855b5a3403f422e215b3735cebda3036a73a35d4e99121f8982f8d586dff5b96a0a6553ddd4cc40f85584141ffe5546c7c5733f3a0f10e0a46311 +Qy = 0b18724a45f1a1cde683e1d9dd7a9984a537b9cdde593ec975220821e4ef19c0817d1c7f3d8b9e399ea0cf2267083ce63ef55edc3d86f43e29bd791475dcfd0924acf2c90bf6c28 +R = 19b0628fefc0f085c40b5ac00ab7ccf46298e57b7c0bfdc40c79c72b23b814b6a095df1827a5c4b29c443ba44d92b12330116e024229914de218c7c0ecbc46f9d2cb2aebd70ee55 +S = 1807fdb0b1bd0ebb502b425de82363945d91e743ff19d3a4c4ecdbb6ad4209e35109ef5e5c95cd1d6da30f8fddb5d88bfbf375056bff3c81cf1bb5b014606cf5c18de9554d46192 +Result = F (4 - Q changed) + +[K-571,SHA-512] + +Msg = 9f8837c3cd79cf6560ba58d2976dfa5821b1241c4f5010dc51bcc779d2b1c3914544de60125c73492c0b1093a3addb6d008433b95c91fb28497658421cb226b4942e95dcbfb858964d978fa074e940a7d4757844e167c051773977f397b0ec421efa2e8eb4cf583573a41365a9add334dfcb89a2719eb43dc3f030f19e62772a +Qx = 6264f9fa45f65beb6a5da6eabffc3669197c8361936cdfaf5df1bd17b13912eeaa8bbdb183ab157cadf23a834fd961eec71f9bef0e427fcfcaceaa38ea513a75bb9103e069c98b6 +Qy = 1d5d56ec96891327bc220282ff97b3f178d3d3e79f2efb934c589f096edbf78fdfb0b1a4b1e1ef24f7660ae84a4c2fe11842f2a6f6c5061f34058ced96ef122247283a36b5f624b +R = 11dd8d39f35f7bdc3c0b2750966f77c0ec275985f9a0a803c8c82d9e281b7bc41cce0446f3b10f55b076453a1758b78485f175c9a31e87986186a583763a77716fd7672cdee329c +S = 1fb18599f3cae969a34bbe2488437eba02112fb19f99fc2303c26b123ca2c7ebe56885ec33b7cd299ced022a3023cf38a5987a9833df799c0ee5ea44d717ca14e75c79567aa4b6b +Result = F (3 - S changed) + +Msg = 650215ea6ca332ecec2681c630f44bc096ea2e7331bfb0afa2d5cedaa9a9185a3e4e33f5fbfabd53e34791c6118ea917b7f3f84ac6b46976179438f59fc48665d3d4ea4e42412b70be7b171dd25d5bb52dd0e360125d44a460d23ec05896bfa2eadefaf10e765ed1bd0fda982061028d6dad54b6a0439d7a64c90a500ce94497 +Qx = 49c4523d6bc85692198ed75a9c8d50ffb9621930ea7c8db9cc219db602bfb87b543e26401a802c3c07165341eacee2bffd62bcfe9ccd2b6fd402245e0b43ceef84116eb943bbb54 +Qy = 6242ced250f763680c232bc7c890fc04f21805357202786802a6c665df525d6c7acd07daf85e9a59567a069ff418dc23c61fc36b0215ff7fd09de1d955a7d2fd5941f35d85fc1a6 +R = 072468e0297af88caa29adf98896b2e47933e0c7de5b8d59682d335015d58bf922f163499a0ecc8fc9e57118ac49c82e0e441ec117b6f06d1902f40e5fcb1a264dd718d3d3a4105 +S = 03bb1d4ae149464362942e9232c36eaac2229f27b90575d505eb4d74cc764de7975b50cf082da3c98f9d4a6efad0c72a07cce492bc7ddbf6bbd0ae1939d62ae947c60c3cd5cd0ba +Result = F (4 - Q changed) + +Msg = 7eede0cfe07fcb63ffe755e6850f51bcac8bb021b6cca4d0f74e2bb94f6e25db03dc9caf1000c12bc1c9a58cbfa6b3f3a2715682d9de53a0c2688deff0402a684cda5801281afb9519b002bdc26bfadb1a676ccad338d2e94a331c8bc61bf642b3f42e09adc3cf6c9fc8cee32c3bc9df5fa4efbc95d2aae043b5c532eed91993 +Qx = 58a268f8f6acbf1e6eaf768b41fea5f3fe1de955d217b38aa0a0d177f38fb5555959dfda2c4a5a07017c630a63f1f12b932b49b3f4c63b88df940cc0057be9f751574d411a75911 +Qy = 685aa85a9acca6202ea39a4ac707e7c71a7d68654aa66877f59d201e027c05c798783a3d249ff7ce5e4ce702f62f83e5d0e211fd549f9e9547175d072a4c69f1f7e6f2fee79a03d +R = 156de73d8f47245ff8a48f8a6ea83304e103a95a04b685a9970e13b8e1da8aa4f014fae3779364f9d48509ecc084d8e92b4539296e2fb648519ef517a06fb44cef98aac27336b49 +S = 038c43641aa56f02d511ad64fdf64f18622380ef0d23cb2fcd58e80c8d29e3511764ecde6bcf837f4f51b55a261b5525420602dd00b12c313357b7f88a7d5e0adc3b63cc3543fba +Result = P (0 ) + +Msg = 9d3cfc9bb655ade2053a01e18e4b09ea7efc70f4826c3aba47d89d10dd1f87624fd37d3dd72dd8f44b9aa590123bf5a8b0919b8db79e0a6ef29ec76d72b83804db87dcf371a15caa2687e5ec638602623735b575e0e2694625a4523f185c6ead2c9c2c6c9af91656239e11e9e3a67b54ce87062b62a14c4a42dd9eb38dc431ec +Qx = 4a40715ac2607c7990ca2c5955068550fb6763672ac357bbf6607db4a9482228a00d9e5102fc16dffd1169182a95136db51738733032d645b88d484e9ca6d3943955e3108ab889c +Qy = 06dc468d96902bbd40343f97f9fa06b0fe522a5f02bf6aa209034e4526f3d6acf52c3adad16cf0c19244699c4d9a13ad9198167b51ab7e52803fc467be78ae9e33247125c61a791 +R = 0b63aa01eb8d319cab96807870e31bd6844137472b6fd37eddd22834f6dd50dd36f98e0db573560696e49d307758d1cb650af00434680dc03195dbfa037f6896789df391bb47651 +S = 09f6be893285e402fb52d7ef861386f05f8756b03982e06ed55577f2f42fe412442c2ac50a2560fead9bf6af1d9a3c9a312f6c7cd339e4a1eb2348ef32e866d712ca8e402760133 +Result = F (1 - Message changed) + +Msg = cc0e30bac67568edda2f6ed2dbbbeb2b03770474710a8db2694603a41053204c26c0e7d728a0bc80564e8d3738fd25967348807204892f41fe36bdf68b886ed43413f4a603f5964595235c62c24462a219efcad7624bbd8bd87717239ce3e4fb1b631dc0abbf858423573aa8f14453c8ea9d280558a9933dca94d96b917c8d61 +Qx = 3a9a23f439980ac6b73b62195584dff7cc164d7b596992eab1c1f5ad8923bb2f68fdb28e613ea88423503e32ca2b082396872084941c3282ec8a0029118dc830819c863930b5ce7 +Qy = 3912e88af1210012695457ccb1a14463ede520336f7d5f36bb1046e7ec5699698937826cbbeff8e0696a4a21a70797ec5cafde8220b3ea858fc75fd617369bdb29335032f5f0e6f +R = 14b15f0c881f3f4e2b70230327a4dfdeded3c3046143a5480eb390e80a6ad0bcc0cbb148d6e202bd7f82f4b68ab4172a6b86c6d8c9baee2f701ddf2ba484c4bc0348b8ce71b209e +S = 119fd2bbcd86354c03ab2aaabeedd63637bfa8790bd75deff14699bb2accc39a11ca92c1c7d98a7b6d438c3295ad6baf900632aae2e228ab983080da729fc2ee2f591cd0339cd7a +Result = F (2 - R changed) + +Msg = 66b09923fa0f544de8bec9be1f41d4ed8fca1fbeb949798129a412e40be9aa9fdc51fa971280aeabd38cb238dd4f5df829a9666181cfac35c94b9e557e4c55a2d974e7999f79c91958d60e3a08821982e22d622b5f4e11f62965ec0425a006e8f3aceca8c518e56e5013eeafe9aa43f9e87bdb809eb92db1e9fb138103521050 +Qx = 24f18f3d60f4ea5dc7f8e12f280a886a586117ee299bde40ab53787fdf7e0190dc4e68f23db3964f8b584b879f66a8a03e99ebf203b2c1a2ab6e7f2a17bc4c48d86424f4d1176a8 +Qy = 368abfa7a40007b24a64b7150960a782e1c609a1d645c0314008a349e6c79bb6961923f09d755ed97bf032b9a32e451558ac9b46c96b8db9b371dcf3f92c86dba434c1e9b7a5895 +R = 179790c89b7f96ad125fd7aca27fa2f168ae962244a2414a88e1f40f5ccd70593a36b1514e67e0959881d66a2fc7e151aefbeebd2a8ebe60490203ab447412d0125c1cb47b90d02 +S = 03d9570da5ce18b797c0153e42ba42c5b6267b47c7a5f09a36b2724e7206327fcdf6189061792b0b49dc8611473514ad19f5329689e1a4da43230ff070a8747760d110fc9c2732e +Result = F (4 - Q changed) + +Msg = 4d405c2322864b350283661c24b74a8360da1a0408372adc62da16c816ce04df3edbd7fb68d3fa122e6ccb2209d12268f90181971badae3d87b43545699ff9fd9cca9e2a6dae1e00d1f3e398f5aef7ffdc0a9ea6d46c4b5ea49670e3b3c833fd0910d5d050816b117d65938bf6b4de949d14d1bace9bdb4b33d13e976ff9961a +Qx = 418deb9b835a6c9bdac09035b4bddfa4bcc5ad359a75ac31368760d03baef30ccdc663f2c71ba2e84021042d53474d8b0aebb7845a226b18f89cc174d6fe30cf42a51ae1a5cedd4 +Qy = 4d8bec4147321e65558e350f32a93745fe956aa911807b6948e4641356c27c60f196891fb228a991d246771da297f07d9aa39689ac23eb2239f5d8510ca03044553726b1ec5dcaf +R = 0908db10d084dd29e34435c7c5670dcd457a6b22bf6023c625e12889ab40fa2727a7a14eae06773806f785623728dadbf944ef2a5bceab92e36760563e6e97f2bbbf2e39020dc92 +S = 0b836d3c2cb3578f6f861772e9a3dfe3a0b9612836d9947aa270972bc1c25b166d357b2e82597aa96d8f8e8809467376b2e051cbe74a50088798a89a46ca39342fe12377a5e9638 +Result = F (1 - Message changed) + +Msg = 6b7341dfeef015038e5b0da24fa9236149a378fe9d78a6f0d94051c24341755e441c04cdbab15ebfb491a9ad814e7778606b17c4da40c202adc86c35b525ce30cfb160b68ad9fae5e990419dcc2aeb3742d4503d7251926400a310c763cb783a58c9285ba46f50a18bb919c2144a3e1f0f11609aa4d21f9237846ea4bfedbd04 +Qx = 197e499b984e90c899916c4137a3e953834d8b02c8199e80debac857afec69e693a496d516dc054aade700379f98cead1d6122d26f84e9a0e3049d13b7f543caf76b3bea401c1cf +Qy = 4fd01b0aa758deabb0c6a8c94c6062df0f5af87c12cc4d9791737bbd2dade8f1edf3570232047ef059296685c9e92c14439e78434cd9cd1007adb4af7072abeba3ba2a1a1564b5f +R = 11cdda397cc101d04e01bb7f30afc0d0bd5a1182bde9c697747c350579f7a1bf9ce55b3bab1a79ce567bb4fc88623a1fc59f5e42210a55a4388f31a87ff6b9b52e7c9d306baf923 +S = 0cd35ef24e6aae750c867b954df759ffee0acd5477b9ce8b65aff5698d261a59d05e852fe5decd524caa2130a26ab7ce45cd48ac9df5f8cfefa12e11b0410dbfdfeb0f0a3517690 +Result = F (2 - R changed) + +Msg = d6c03d0224cd6ee69c625134aa342d5dcb483ab3ad5bde4a2a808f1b34ea363df41cd2809c49cd0b461779cd795310376e3f74f63a6fb5767f5e7e45e6dd5ecb653ecdcab3b863df4c2268ced5fd63b096d0cf6ed1ea884be62f9218bbdff5f7d3e2c25f3234612c60f0cf3aed69006496c7383004c74113e0b8fc6d51417aa4 +Qx = 144cad226ccea7038c30695780d66b88fceae45b2eca249b29c8da827e2f70b44be47d6faa9fc6641f4c822e0c17a04b648594c3fab485d7d2fcff73b34af7ea02d7fa809eb6ca6 +Qy = 5ea5b58630f798ab76d3c73a6d5bd9b99a57d06c167889da83027032b855ac63a6b3d9921fedd2f65a52d804554123effc885a986b3644c044bc1763a4b59a2ccb24951cc6367cd +R = 00406b6a388144ff058363d792e27cc710ab76586e83abe1d8369c0a487346d39bb1dda42e4f1b94b3619a5a72b0753b529226277c5357280336ddeb04808a07d293184be500108 +S = 1b49b422c0cc37e99b13260c7a704d9c810a45623c16d95c791a906594e28cce110cad644a10d4048c4539803e714dcb8f54570736d67a659f9f8eb43d7c1ac2ec3f1d486d8d7d9 +Result = F (4 - Q changed) + +Msg = 4966108e23e98119225898d2fd23f2754b0a5ddf9ef91d9bd42a561e53310f14b28a6becb06f6b1ebb29d6bf7d39ed876f7f39524c3cb6f1655a5a2f9cf7dca3a2ae5dba08f0843f138b423af769d8c36967e408e6707ebf46a0c2d97d0bb3689dbbf76de78cefde7dcf6bd2f48c752fe888ac99b43be26a60b762536da306c5 +Qx = 757ca451a17a1a2646b25d5664a84615f0a5e0938690d5e47c10344ea07fffac390a18d6357098c31e85e88278e70a88d87b2f442a89491bd0637d2ca14aae6058154749b6ca976 +Qy = 7744cda5483c13fdc4dea3135b1d91731a261e678483c4ccf1cb167c4f6c5f2bcc8669b8f10471286e201f1d8e06c2ebf2cf88815e57bda8f4a10836456ab68cd039f68fa00c431 +R = 15e05857457c692c5088be8a7e821595ab82e85fef5791ff4f9a5a88bc54c2d05bea6def12c9372e2af871c2add0b5f34f5d90dfd3e042aaac0656bb2c01ac4ac8e555f8d5a6061 +S = 089ab7743636a397c878dd167c46739150d87e1054a81d402c952dac6400af04b92c2494483eefc7e7cf480c6ed24765cc0046f178f9f31cccfbd00d57740c3ee1e0df083d3cc01 +Result = P (0 ) + +Msg = bfb302063a4def88552c75881998ff6d2f471567d077ba192a9626bf726147f9dbb8186cd97a7a957cf721a00f618ec81bd18e439b76459c8a471e72aadeedcffd570c6c217e86a8da92885e88bbcc255319eee2b1e30dffea1ea63de4302ca4171d65a857744f35b3414e5ca747dc9ebd933cea9f81d39118bda8d1857f00d9 +Qx = 086e881b51fdc7f7ebee15570095aa5e35f608a3d1673ed1a6b7cfab08b35e975526a1d3a236b39038d7c87a9d2f3cf4f75752f31ce6f7b99cb79d089f1f6093978eb5a18198c33 +Qy = 55a1867b795d67dbc2289b79f39318a0946cce3244db6cf7c7c3c843c92468df65b0b0230736499c231362af72c141df08c58be03c66dc043ae964280f4f4b1e712a2c311d36053 +R = 1b9e83d39d09214482b412d4c88246add95ef1278bb9de1cc5455aa123a5d72f5aa2b57b288608f6b5f9802fa93ced4eadada493b2078d3b1f381b200d3bbd9c93316a2aac177b0 +S = 06693203b314f4d3a85204c45ca6642c1bc79d96ec2fd1ab5aba237afb2a26c820c7e6bbcbe0edf7de8e7c2039f367d7b9ed41c636b6842060c3633e180907a47e665be4876ab32 +Result = F (1 - Message changed) + +Msg = f9dbca02104460bfa337fa27c8892c95b5c6b429a33961e2c0971ff94676ed0f62f6b0e463a0a0ef89eede3be3a6a91983e075b049d4e34d9b359ee42e20f20cdb6fbffdad9ed9fc85c950273e0244f7c731538dd3896e2315eb85b467bb71900e323c3d08c34bc107371962c104d8fb5fa440bf85d9b938ab1b5914fb712352 +Qx = 3ee3d98aaf90f758bd7e1a9a5a4285f31365e93118770591957e30c91f882d024fe2405c83115003d3013ec8f58dca5bef0d3c77081d3950be54da9816afa2cf2127ed72708c6cc +Qy = 2a04b8809bad265e644f1e344fd2c5b4d9bd41a5229e2cc6c23eead68406adea8d9903b4a6116b525316be78dd2eee308c859126e61159c53d6cd0b81e463769d19db15539c507b +R = 0070553e2b3438cd8923f11cf6791203a6d61667ff1cdeac9d89c755125ee76f3521f8a9343283c51dcc3b2bca5bc9a5ec6c512c117ac24fad978a0bb720a73644ec72fc7eb2805 +S = 183c7aa16b8dc196619f8d26b0f5466b1f608112b16b7770a10effc06882a936f7e3c8b30c9e54be50e859c712be3d0beb338eb28a1590c12836ab2ae8331612d0cddcd7d0efc50 +Result = F (3 - S changed) + +Msg = 60d62e648bea0827e8b942be0f7f7467ed5ccb5a2b88d9e4a64907da6b691e7cba647167dc90b1845c55019c2e4dfe1a1c2afabe451394e15b63f9e4b050ffa2fc979a599c789b1a39bd62736ad2137e3be553c62c17e894405cf2bb83e544eba7761f3e8a646b80eb2ea01a681e5def1cec2820fb75c755660258dac20d8751 +Qx = 6ed08c85de4bc403a55b89c4c8f4c5fa6deedef481e57f3fa45bdcf44127216ffdb1ca131f6031053ed381d7914547c6f5275d6b6f98862dbc572cb67e377f9184b82ac2f8c772b +Qy = 0804964839a2c33c1bb28777814aebc4a9f7aad3a79b64e6b92daac5e7ef042cbaed7fc7e4316066064293d039fcb18b24c5967d44b9067a22630b6b5bb2392fbcadee8f3667f7c +R = 02c6eca73b4618f51713c9d050c67927baa66338f6ee731710d2c1025a76bdf13e4b476dda22b77a027ddf71a00b582dd84266b078ed9877325ee86aebd71b1d774e5df6391c876 +S = 166f4b228d1c7b6386dfb68fc58c80dc1afa4069e5883dd90923af493988972b54b8cea50918e3a24067eee8e364f2efd626b871d48d5f9358983f724e68f709859fdb24a223819 +Result = F (3 - S changed) + +Msg = 3f57d1209b18b0ca7e292cf294dbc54171da17364e86bd1b06f31c288472105c5e2f26052926962ce2e889b3b4e9887800a0fdba01d443523562f0e053da81a9688fab6260b4e2bd1258f764710383b1cd6d271451125a82c6499abce89334ea03293ab757056d9d1f1df811e538dde99f17798daabdb622184e2df3df604e80 +Qx = 5a53b989f65db734f87789b6727998d5d1cb5ad7a04d8b5e72aaf13b08fb6977bcfcba534e0db330793c73e4d4594b635e8a60754cab7b442009de08a2925c459422a91335575b0 +Qy = 2b789f866b90668a024606978200c3ffee152d41c6b51bb6594924bffbfb7681b0e6f821f59fc4dab55bbe1b19c535e25f36cd5b360862d785f4ae0802614c342c2910a9dc27720 +R = 0fdc2e4bc89d842bfb207ac21753aa3ae65e9144ae1db8fa2ae96964be15f4ddf4df3e6c34ac4caf56cd441fa7e806bb3ab3af539b401ca7cf1ea743f80ea6f1806971c20924a48 +S = 1ffb3214354b87da861a1367837ac908c73b3da317a9ad304aa627663aa77effa43761163898768978b88c15b67debffd5f1186089940e7962591ce144a51baa4bc2ab63a27ae11 +Result = P (0 ) + +Msg = 5f20e5e6efdda404db6cbd40297580806d8cfd334cde6b7d967421db79d4400827f824da89c9a35fb2d84334afdfe8a42efc175fd529855a5213794ef9a4fe2738fd9f5f13f94a25961e113dd30077b4a00b2a926d121775a424ab163c0d18970ec0464a2462d2229d03a1d1208d1496424ed295edfb8fb63f4ea2219e9333fd +Qx = 41c5fbf3e3893e074f8278a1ef806ebbe8bc7bba7d6996cdfe091d1e0c5a0f634ffa75ae1ca850e980b065b02ca1687c7c6ed5fe93bdc163e4dba449b3242a06f52de10093cac4c +Qy = 0b4e3d2f9cd75d975de2daf35adba83689b6bad53b40a774f6945984c141e539593cda46219aa256b0c33b1dbead24dfb26c88d1b209081b121516ca7cf0168b700f667a60ab4f4 +R = 13a0618ad2072fcace54926c778355bf0537670f094a491bc6c75bb9acab7c1f6c6177c8459897128b91e759db5a00068b6dfdc908a39ff01b31ee206ea4018cd1f31d7a7583f60 +S = 1cd09a35124f6d4fda407d9067578511522db5496a1f728250f2f58605484ffc123c476d57eaddedcf6e27c147cece6c602362f2bac28c90232436f273d2781a6a803a23eb11aa2 +Result = F (2 - R changed) + +[B-163,SHA-1] + +Msg = 72bb3d1b6c484b7fa901e494a6ac2529e0f5b62c6d95c7d07396fe7cb6af1205bfbed936a73a2c48c49e797582b03ee16d8309e41df6a394087685214f06453d9a58cd1e5364eb739e07222922c7ffb1f308ccb5124c2a0bcd3dd19a449f5b6a19ce33e1dc7629fe2fc954fa4c8f502ea2e2e762a119668c770a4a08323724e6 +Qx = 5eec9ae860e02bfdd99b738850aa416bacf3d6aaa +Qy = 0ab40e936a121092ff66037474d35dca05c7a8982 +R = 2baa523c6cda5ca114027db1ca943879aaabdbcd5 +S = 1048653729a5f6f990c29a1d78a5d29fb40c7ef53 +Result = F (1 - Message changed) + +Msg = b4ebd1bf667784588dfea5e71e8935ce83b71de479304d99c71ee0efa054d520cb39904dc4995fd901d6abe69cee1493bb306c442651ca96e22d485471342196952771a953984d44fa3c912071b7363a361e0de4068d7142f8285a9b1fbb1a26cebc05acc6dfb447ab1f084d73260459a362396c7e2e0ed3a51ddd043d64db4d +Qx = 1cac1ca426fad2038ebc042227ab21f414ca95aa1 +Qy = 5801d025ae9bff93390d06f6f2be43e0e81288946 +R = 019e12ee51bab5ebc96f63a755be30d076abb9a16 +S = 36c5b44bcff98064c2239f64ccddaea8089c488de +Result = F (4 - Q changed) + +Msg = 6323a6f76ada9be61e6e78e2134ecc1dcf39b84eb863ba8379740a1d753b1617713a46d9a57b91161677365b46e3d7b6cfc463818dd3df705f49eb1b422e7b2fdc192012633160f7ba192b779bf081e9588a42acba449af297f78d0adf4619643c7e7c9b8f9de9b0c9c929f9c6c79176b9c3fe2c715e43219bb1ba5e9b8a1682 +Qx = 60657087e87924a204a8ceac89c8ed16372aa712d +Qy = 4f30aba97437fcb17194a43a6101006388133b4bc +R = 20ecdc8c53e992619d94b515a97968c8bd63011de +S = 08d397f221821e48e75a21a233e0c0813a16d93ff +Result = F (2 - R changed) + +Msg = 4d87fe7ad7c677a00e6b2c995a1f41dd09e038369b278245b80e826e155d537291d2cf9c0966082159fb920c72f50da6d5ab5396e5af55901cc692816c780bdac05cee5871fd0a072f17fa0d86658f7700d036eb711b5143912586c642dc5c3ec3ba258898ddedc63aea0e4746d301d056d036cfb6fe5ad079fbc7e1cb620f3a +Qx = 70b44f783dd3924d7c285463b5536ee166f466ac3 +Qy = 76b58416582720c751fab857fc13e06cc106ec9de +R = 22a6bea700d49ce485a43d843d7462cd632b81717 +S = 052c7fe1c21052d67fa52cd8bc63a22b0c2e553b6 +Result = F (1 - Message changed) + +Msg = ec14c2d17fcaaa1ed256e883bd0359c2d44a82d8e1ecdaf2cb434f9118d6f3fb6ce376012f9086747928b3956eff4228abab43ba6d17c1a5b88596b47edcd1d6792781c3f9c6e216aa29611260cf9b985c3fbfbdd9c6d2af8239d36af416877a01d54476c947ed708c605b7d525774145f3d6946d87adb2c5e4595ee5714c999 +Qx = 6665cbc7a66c4028e76addf47f66e5675a0dcec24 +Qy = 01e5674afac10b235d0130b7e3434ffebc3ed3ca9 +R = 013f9fdfbe434a144fc3cb8d4766a74a1bf248037 +S = 29e5f8dcf3e94f9330f3655c8759bc56fec2ccedb +Result = F (3 - S changed) + +Msg = b72f09158e501ba42d48d3726f291aa3f404c2270d2d0109dac5f3f61f5338b5d9f568807e7121880cf70740e9af881354edc82fbe536c0ed14d17da5b28c46200284747b94d4d5db2e6f1f62eb8f26686b1ce763490938d4917676e13e8a5476c7b73bbc7520aa786dcca34958c713459f9504047f82bbdea0fa3bd75d89803 +Qx = 5849076055f51bd1656fbce3fde65e6cbf3fdef95 +Qy = 51a818ffe587e25182136ec797443be027cbbc48a +R = 190a2a051c398a7b614913e3d4bb019c6122d0f45 +S = 21548ac35e0c147d3ade61cfeb59492f5df320d98 +Result = F (4 - Q changed) + +Msg = 6d5ac5588da26e16857e603721712af97bbcdf0bee6c31acaa221f8a21911d02eda02bdc4ce45fc7b890ede3a2b0e8e7c1dd672c9783ca8a32f1ac026a71b9540bbd418fbd413365ba953ec3beae59738d7564abf9768c34587fa38978bcf54e8b840075f37433a62c4f36c484c660c3a7983625cbaff1afa210536dfe6d3e3b +Qx = 6cc96d6f6f6c627815ef00b5257e7be771bd70f3b +Qy = 1579ee23de4e414968688c5dd0f1fae24ad5d9486 +R = 3ba3b2bd63bcf4587f2da902549d4c3232c5c04ec +S = 2033627edebca4b50ce7fcc601454bdbbb2d4301e +Result = F (3 - S changed) + +Msg = 21511fdf6eb605dc495540c6a255c089c41029f2793ff501c215efd266dedfa3c94931c8773b4c3bd453f56f933f2ee04371ddc6a560fac8a4731f4f84af630960a5bb2cf3df99d5dfc9f51cb270d43e15d2a4ea6e56696a74ad6cf494b814fcd56e5bc53cea5f2fdc9b2a6758a6727627ac856c8b697cff4af9251687a40917 +Qx = 67a8dbfb975727acc97f0b6ee69871a6fb502aae6 +Qy = 773f3453492fa0079757ce3ced6d19a62770c0ea9 +R = 1573ad2152ffbed8d732837cfa22d969e1197b184 +S = 0b7cad7fd59cc9ef8b663b9d3eb5a0ff51a85b50a +Result = F (2 - R changed) + +Msg = 619df18ed82b8aec682508bda14d71cb4926ac8878a7ab694d4249163d3202668ea918480a94eaefdc918c556a0d61ff9cfa6bcbf73113271b3b8fc75146749e7245ab9c1e21cc02dd39c77bf73c5fc57f1115f660b158089fcbb323637ea9429cef9b6171325a5d081788bf67a505c01a081a7c6d881ed848317232a61474fe +Qx = 34aa4dda692c6ad9347d60755546e3a1aa9ab3279 +Qy = 537ca8c5cbabec8ed83668436fdcc5ab43937756d +R = 1f3ec6cf9761fb8ea00474337ee4b19c3fd2a3bdc +S = 0d3a5486b189df1d86cd5e22c7e090fac71d6ca1e +Result = F (3 - S changed) + +Msg = e0bdb69ac2a7280021dd21574d5b0eccb9c685dc3179c33801a07b7e7350396e0652c7ee5a9a9a98a61fd3cfad418d9baa138d6373b8775dec4a39125d68cad5029bada2a780b74e59632a88678b1bf3001900146542ae06b9b4e2248a76d3b60c9f00c465840116a0e9a1adb09b84480989b94e565e45ff3e24af80d1dae7c1 +Qx = 5a34d80836fc9e6c9f0836d0a1a9f4d5df4ddd4f8 +Qy = 214281701f0934592fa1db180e632079ecea7ef69 +R = 26fd2a40521ea6b9d44ef0f8567bb3a05ffd3c9ab +S = 1f4a865880b3852c6f4fca1ad5eb475b991ffdb92 +Result = F (2 - R changed) + +Msg = cf595acef2afc0dcb73729a99485611e553625bb6f95111241df2e05a694365d35005ceb7a27e6ca58817c6ff94872b6c0c1cbce121d37d8a01a468787e6337d9402f935b68b70835df8a5d72de847d7c37e62a282095002d3bb8e03866b7fa81d00202c7a60e1604943b3947bd6b60c1a44c71897bed9bf07ac448d30469346 +Qx = 524dbd975aa32058697369ee4bf7d4235d3119bca +Qy = 2ef5b1dc73c3b4fe92d9df5d1350c4f00b60a7f84 +R = 2a97d1c5e39c96d027b62306c0b9ecdc6d0005b49 +S = 1ac3d253190ad17f3981ecc34cf4dd04d9444f1c6 +Result = P (0 ) + +Msg = e6e3a774d2bd64ce9ef2f114259335f99f80765d8ae47de18eb4bcfc3241b2c78d2bb2c3a8954ff4959a3dbb9d6f39b1c82836991e005d21d39a4dedd8ab0da26e4db8cef26305873570ee3ed8ef67bb4f017573b58947f9c0c6b777d6b03a9b17c0067dc0cb9351e09db3de3746a2b0a2804ad9dd0a35f8e2383a81a2c7deed +Qx = 4d6553672ea655b5cdf8f4102a56a4bd5cb9fcb67 +Qy = 707e1a944f0bdde34d270561065e1986718e49473 +R = 300940d55f78cb4092da2d7106c1fa41f375dc467 +S = 11e5046f7bb75eb60f0ed163ae3f5b470d6f4ff25 +Result = F (1 - Message changed) + +Msg = 5f8a328003fb66a42280ccfd95e979c27cb8e273b9b88374786335f2193cc17657c8e91d17cf550ae412850568b24c6296bef7ea0bac4bd369b24a59d7b5db6621b95be1532fd2cf78962f77c1250128e44d38b773ac47ba354da2db258491c65bb3575ed6cadd62c6c0a23b3e94ea47fdf9dbabbdc225fb97b61a0b43916340 +Qx = 4c17763b41b908d5996b2ca81948e8ad0ce1a9b07 +Qy = 623eb1eb594618fd2b8bdfc634c0d6a6178d42f95 +R = 19430563f1d4f9cb15a69a518982bac9a33615406 +S = 153b8d92893fdf3d5464fc5f809759be68a559efe +Result = F (4 - Q changed) + +Msg = 1309fafcf634cbc1630bd4dd017ffddbbc9e83ece114ce0cbe4ad0115fb52502cb7eee6bb77ebc0c8fadf7ed5043281c1ed667da240592a00c1296c0d3f27e7e277797f47f9bb82ab02dfa8f26ea4561235c4901b44cd153071d91026f93fd6b19c9db7e3f144421be5a125661ba9e86591a998062129ca627ce9a5af0ecd6fe +Qx = 081caf4d56975505b0ae50c9f398d79aaef3a8177 +Qy = 2516f2244945af77e4ae4b3bcde6f3bb7a22d26c1 +R = 1fc0fd53cb1ae2abbe7cf5bd309e9789bfced2001 +S = 10e4b562df87af3c0b0e2b157497666572c6bf9d9 +Result = P (0 ) + +Msg = ce34fea8bce6a06ce1a0363813c01536e3879c406781bb26f044c6a3c31f7c18594287293a64e999218b1c8cf28a75da8e5013ea29befb7a814332454fcf2e3c60ec42f8a9f852bb1af00fa109790e5067c0e2fd27b3be44540f8233386e8a8c2b07293b5deee103561ba8b4198bdd51543312f040d40f4049c16f74939963e3 +Qx = 6aeb6b49c6a4a7a6b43d72cec614ae5cd026ed302 +Qy = 7cf6c8bb20d3a16ba5e59a736588d6c34667a337f +R = 0dc41b52acc2cf13513014c6752aa888f69aeb399 +S = 1c526c6fc1a77e2d739829e2be3745f43dfd9a66d +Result = P (0 ) + +[B-163,SHA-224] + +Msg = acf027d3c1311a4c8ea3299ae6020e609935b7ef88bb773556e9ab87138dccc32f481d6e5e81506b7ac7e8e07b72539139c168485c97b657d40f0505a105107cf6d4de486bddc6b6b83e994daa1697092761c129b4c6bb1833576463749c038beaa59c07b0b1ee70c3b5876643cc03cb6223c87fe813db8d207c4ac6498a2e3b +Qx = 6fe8047f2dc25759b67d5b236916912da9cd67b6e +Qy = 4863f665b6b53adf53217abefa61afb9a8a256a6d +R = 06175c7394168abf588b710f6a06d8075a08c2d48 +S = 1200a7e035c35760fb859e757eb7d460852407f8e +Result = F (1 - Message changed) + +Msg = 8aafa4f2af53d60d020a65a67c4ed8590eb1d8b254c130bf3532fed269c4d613c01ee3024db3ce229c5e4981ff74fba890cc8c375d41b2d5e3c09aea63b554b0f9c0281b38798b3545c148bb219309a85c6be5e5577f69a4b8e4bb2216722ef7485d9addd9aaa51e02d0d62f593971467e7a44f680584213d2cd4b041d9d196f +Qx = 585e1c1e4c7e15822870d1c244dd6aa34db541765 +Qy = 1f1b25e8ab7b47d5bdcf697dbb231458bc9dfd7c3 +R = 1b456c42970d38c8958929556b14623092dcb0960 +S = 03f93e8a1224f5f389094447fccdbba90ecbb6f07 +Result = P (0 ) + +Msg = c075913f562b8eae3a4f9c00e1116ea713b41bc202ee365f5af5da19324965930f721a625c3190e7c73b20c3139a883b0087d7ef919bb2b3e64c76cb4b982bc5bc474283a2322df8013d2340e80b4ae554fc0bcb9b053b06b37fee2372e5728c35a383731fbc84c88afeeb99c5562b92542dabc6504772d22448a37a4360fdac +Qx = 66c143900c0048a4917f1710682b94908639a12e8 +Qy = 3010601f3f396c80c80f3513fd4aff8df20d776c4 +R = 21da8250a00dda93d798a54342f6555d28c7d1146 +S = 2c475ebf4586d8cdfe85ed8eac9de10064c55ff85 +Result = F (1 - Message changed) + +Msg = d335620d13e049b7f1f53d6e5274892e7ddd7d300f6704048c4a8fa08bfd95f9f497418fd229db8890ea09506b3ffb208254ccc33c4bf944f998b5838ef89a42de0e94f576321e7bc4863cf04c134a99a043c401f33f0d9d2e9b331e6cc9b7abe6e1956f9228096c64057bd675527bc1003de11fa0698e12ee35783d03d99d89 +Qx = 468fae3f21387a8f137df18ae4844928ebd52c184 +Qy = 7bf3cd58244ebb1c59eb5b6d55a4984718fc804d3 +R = 3c58343bd0c929ae571ce43aea1a2586e50cda3ef +S = 379a6fadb3578e4eeb87a7ba5a29ba52bf84a94af +Result = P (0 ) + +Msg = 420ab6c8cc2a92e1e24a0b0b20a70ef4e4b156ea4ec58f6b4fe1054f10038eb28d3e748a7cd393c8d6d373a03843acf2bc130b9ece304b2acf5acc58b459c1b9f3f455bc1c98095ce4619f8bb897a0d8fcc77ae91a30ad7928fb42bc35954fb432eab3945d9ad1706f72ef457d64976ea5dce2bab6c01e6c98cde9ec3ef152d0 +Qx = 29f2a350ae651af381b86ec7c72634b4a39b204f3 +Qy = 347f160e02195337ae111c27354e4e67d481e5028 +R = 0e2128ca5b787e8909a7e0f342b1adfd44bbe27e4 +S = 100e6e5e8e785fb2352bffde55817f0daa7a1a124 +Result = F (2 - R changed) + +Msg = da73372e2e4764fe985e3b9d1f17ce512ddefcb503436e06ba06daf1c5a1d8f6d1d658c17f56f2724c65e60f4c61717a8be388e45dcac84dfa292a2c5a82a8ca1472c52eed853af19eb697b2da7aef9fe59c341d04bc7e32ec2d2cee496dc2a8b911018e17393c52f28fa5d41d0ec4f9b0eb32fec1f6eb2884b19c7a2660bc78 +Qx = 3f5d3c13badac97a74eef137bd36d045bccb8ab86 +Qy = 3e0b1353af0bf5d4de7a70cdaf3c6ade3dce6c729 +R = 0a35a12b30b158c37ac907a3572bcd06734137233 +S = 31ae63de5655418304fdbee3f1a0b650b5afde732 +Result = F (4 - Q changed) + +Msg = e235092aba8f9947f76d4a4f7bc4484a1a43a7411a9522f4293ce5dfae284f30221e54ebc32329efdea1b6228ff09b2e9eca2750f2b0c79b6a577cc1ff78685e7e574c90c77dfc66821d191e4a61f036a5488c276edbd77a22fbaea39523a4d9f949dd7b02ba7a526853881d32adfae69e7078d5160c55a70a5474d71fc0e748 +Qx = 234089bfd0d482a1da11158468ecd817b577e1f36 +Qy = 027abdfc8aac4317584e8539ae641118bc0b1548c +R = 0c7927d608e2dc26cf5beb632e4178473eeb50780 +S = 1b16c05f341a9a23db46fb52e87672da5c1a3a882 +Result = F (2 - R changed) + +Msg = 3e5b5a406c0b8644c1c6e2c59a7c1a08b6c01c53be1f2d866868599097789967038c3bf46a8ce6354400304b0df207e4a87512a5e206f39fcc842b3abbf7cd7e2ad0f16ed740f3bcb1f37a7a7dad364679f489019f8f9786952ac1e0cae6b15dd2a36050a74e5babb51afd9be943afbc0b13883999db4c6078a10a860cef61e5 +Qx = 093d0108e94d00ae2f090254ba53e6b4b72feedcd +Qy = 159f81390e7908e18ce79ae615dc5cd1ffa158d93 +R = 3116a0b14018918354ec5503369a06e2ddf441d6d +S = 3121e8a1812d6302aae0b06b4a2a194738636d83c +Result = F (2 - R changed) + +Msg = 1a3e41de7e864713f32b264a699ba3e30370d7659c2c3e60aa20cef8e2ce5b46e033a099b4602bdcfaa7cafb2382e1b6ad22bb66102097290be62732fa62832126ac984ff98ccf3f55bc55335cb960b6e5d2d52144ddbb840bc7cb68384b2ebd5af9b3e07e2a61512cacdbee958e46ae089947b7702f3e1cbf9fc9ab7b2246bf +Qx = 52a1b5cc5d4cd903d68aeaab78b1be421a552ed30 +Qy = 26e11b9d52a2e841108790a8e0dfb922b2bd68a01 +R = 0a11cf771690e3fd0e5f76b41db0dc74305cb8273 +S = 2d61fb8e06dd2797b34ee57bd609e19b27de727fc +Result = F (3 - S changed) + +Msg = c0503893b09f917a64cd4d7325320b57a1680e6e222a6579b9723dfb063f4386e139e7297e33d61aba7a75637eaa0c601480c38e21344640d282ff3deb715b710474a8463a5ff04d0c80f26fa6bb56453691641469027dd249b18ea7af6acd40af15195dd124fb74f50ea120f837c6d28139a7ad144782785df2a1be980a73c4 +Qx = 280d1bc7ef1b3bb08d99ec0849e93f4372705402b +Qy = 013b61471b3ffb706449d325edfc012479d650091 +R = 0e08068f060b29aa45bfe97b3657c6256722e8140 +S = 27027da469fb939e28ccaf11725c4a206470f94d3 +Result = F (4 - Q changed) + +Msg = 49ec726975a89d920199295634b9e4409ff5db8529d63a8b475a2520c5760799f53dd444714f72b4c9e10bda99d376a1ccaceef31101c12bea3085c29216ea4ef59e13e472524d48a7e64738fd404b9a1219e7f5915d0bd3c9475f35e82124bebc46b6cdb876fb155806da10dbed53acef38248bac23e9e66b069056825befeb +Qx = 3c3df85144cfb4309a94962fdd8210ade4403d59b +Qy = 18865efadd0c2e2bedfbbcbe2249f8f9a6ebfe0a4 +R = 2321c234892c0f618ab3b2757f2d6cfcd373026ae +S = 3309b1d25ba0d7732eea3f5d9941a2243ae92613e +Result = F (3 - S changed) + +Msg = 324fe92d287501308d18ff3621d414259483633ddbdac0f5904a795d57b48c4f60ee295b008705017ec2340df9574235cfac2428bfc48543204b279ba069b347a1998855f9b3b98f99e39abfdd1658460bed72d4a1c6f13012eda44762942ae2c1afb2d82eee1d9e500446934e0ff1301063cfb1912b548877f8ed0eb930a059 +Qx = 1d6d4d6f4393f678ece3e0e52893f8563747d8615 +Qy = 57188602a6ba66c578382508f21952f993bbddda2 +R = 1f723bfff1041ff5acba45b84fb55b40883e62d63 +S = 178ef00f9d82c3410961c9d7dc8be88bfb27e5b79 +Result = P (0 ) + +Msg = 954f4744e4d8be4e69399a2f9548279a9fe8b2e2ae0cf9030cf77207b8b6af38d17fe494346496f6547a3295b14c7f16a1207dca0c5a608b604663aab055ffbd91155b5b250be1f1af9cebb30b7c5ffaa31d88e51d38013a28655e08973e61ac0f72e72d35c395b0329c832053c9a711ecca21c3ae23826413ca3f9bff33ca06 +Qx = 7977a0b221c433e5a30b862de529ccb2c00e63273 +Qy = 5dd585aa2266db228767735ff2f28d3cadb4bb763 +R = 09c21576b7f6faf8d4b27376a446eb9b7062a699b +S = 391abb0805fb2780f1c580f185a2336d59f83cb52 +Result = F (3 - S changed) + +Msg = 3456cb8ae7be9f6c901afe431c1835c111b90e3fee2566640a4f77f2112ac985911bfcd73fe919e81efaeedbaf98cb0b4f6b19c2c7ad8959dd833bf02ade65e930fae67c23caefdf59157b3d0a30f10f7ad846a6c42d7b1fd23c996c7b91e3483f6e6b78230ab321020fab14786d904bc3f92a00476128719548a3fed0ec7309 +Qx = 4be24f26af640a46f65847c2d9ef4d0fa02c05850 +Qy = 5d984f9d002f5a23bcca794184c45cb82e512699b +R = 2a4a821e781a0958794417c72c4b8cb4ddb406cfe +S = 0c319f196643f1c244a213a1b9acc4ea46117411a +Result = F (4 - Q changed) + +Msg = a2e74c77b3150463bcc334427b5c59262d79a7f14c0867bc16783a00829a0049c3d4eb580ec5578fabfb30063e0e5ed16f417367b771b20c387a2693691ba9fa184304e3b1b3010d5e16b688f7aa7ed746241181543004bb60d466c92501c4fa3da6e1466b050d97cbc08ff426633b2291280c2d78b845fdd25c1034c0b2d921 +Qx = 05d53394f99480bc36aa9773de6c7b595bc3d7a09 +Qy = 446db1ea34aa7e7d514b4c6a1d9e9c6892d7a994b +R = 2f18f965286ea44272113c47e69424310c7292750 +S = 37403c94ad93c4d4467647f73bf6ea2fad8930e16 +Result = F (1 - Message changed) + +[B-163,SHA-256] + +Msg = d71e28f1d38eea0326154d78109b907e59d8fc679ffb730819ae144f8c04ab21e35f937a5568f1b9b657857ab9d21cb63466b769fcdc06ef3961116f6c09a81d56586a08ec7572d87da579b0fa743196b5724f5f883ae4e7747c6dcbdfb332734d2229e842951d79beeb5bffdc72941d6d0c474db4ceccefd2d215028143f85d +Qx = 28c5c9d46450ea9c267f8510ef0c37702b93210a9 +Qy = 5fa5f4acb8c345e228477db5f51b2860aa4f1aaf9 +R = 17df984f390f689ae4556217f12da4c282ab70f58 +S = 2ef66dab9a2753d66e818d9a0afbc81cd21ec5677 +Result = P (0 ) + +Msg = 99dc739aa0e8af7604247b23e0d07d6a98f22cbce297d9845e78371e2bfb96cb47e483aefb55178e5f64c4ff9f8b110eea3e60a50656233b55793b6017e864f2610e343410f9ce56aade90aa9901e40b76c03db277620faa83e029df1a6562b524f5b170cd5873cbb9c9049277a00baf82d00639dd9ababe3fe632674fd68270 +Qx = 4c50a24fa97a9da834582b87afdf1e2ab468c16a3 +Qy = 6ed3f30ce8ac92fc9bcff8e8cde607771121da9b6 +R = 0ae9a37a8ec2997bb94a770eed842e128c0dd7370 +S = 08638b7294cf664b3f380887330f853a8eb9242fb +Result = F (3 - S changed) + +Msg = ca4512c164d2a3b935afb09325d185c36ccfb2a806751803e5575566f6d42433432d30eec11b39a9951ff73cc17c13f886c17a8adb38afad04b35859aa239f048f0c5028b9130b9f394f416ec59bdc1d6fc207c639c65840652ccbf41ad2c8c313c45e5e7b4ed7d102ccc4f8d8fd372b752fc0464241feb00e65b30029949600 +Qx = 2ecebd10ff8c2a609bc61e9d7adf3ede1df72c3e2 +Qy = 1420a63ed0100621ac66e5a091e0fe15a21ce5899 +R = 0afe8835d758a3dc23730edf2665d367d5054269e +S = 3b4fde9a5bab82459ba1dc97d1d4a7dd4d74cec9e +Result = P (0 ) + +Msg = 609660735332c3e556c46e433ea7ee4640392899b9dcc13596bdd9c934ef8dafeb7e4ce343f75b8fc64f197202e097abc3435e63b367944129154078d6397c54b71bea92db386db36f435e7e59dff76d3611ed1badf9d1f851aca456802d97ceb318a71dc4ea174dcd1e5edf88afebde118a29b2ae25314d10f0ac0b720aecce +Qx = 0560aafbd210bba079c91d8baaa32cb567f99a611 +Qy = 5d888f7201729477b6a19e711d030e092fdf28189 +R = 28e4f9aae1cf5269fd2e735a019d89a6cc9290d0f +S = 2fb89046189838cc3c5bf1a06a467cbb99a95f37c +Result = F (4 - Q changed) + +Msg = fc0b4e94904aaa0d1cc7c01a257cdf76c556f2a6256f706d2b410dcb8f3f435ea1a96af30dee343c1cddf0a471a2bf004701545334f15b0c259ad97ee3e69743c41050050e20925d410c79a01220654bb4ae39564212ac40761b8df82e95d4b268ae12c4ee804e49149b07227199700cdcf354ead172884f68985001f84ac1c0 +Qx = 3213e001611bb966bfc0a140879087fe04d9166b0 +Qy = 696ee474d446dfea208bb7ed7d9a86025469ff570 +R = 3b323594ba62bbfd9f2627ed68ce778e7aa227f0b +S = 14111ddc38eef82c1b4396d23f279d3e84293bf07 +Result = F (4 - Q changed) + +Msg = b0b4fb49c2f768f9cfb80465b872793abe68abe6c6bba81c67df25967816f275915a5adff2dd0c3536a92066b35517f6fc83c9a155e57a66cc618f789d3d6712d4ab83ff2ebdb545cbf50e3b3b9549d68692827b15dd31d3aa957e7fb37e2617069913c0bf3382c441b08d9717f777bc2f9d5de7cc8966b91afc5ed30b21fc1a +Qx = 4b85b07a0fdb9644185cb83b1b54e2e813ec02898 +Qy = 5e212a6df2851ff7a60eaac9d301086a0f954c967 +R = 019f18ff6319c5f11fc2dff2f2ddb54d4c35f1f44 +S = 1dc7592aa20f675e2a6548e27bc6a6df86f71a8a7 +Result = F (4 - Q changed) + +Msg = 0af238aa403fc1f854f3ab403005ab3137a40e6a53bbbbf978f4ff24db4a69ff0f2be2457e6cf745632f79de671f0d293577c44327f08255f0eb5d1e46048c894d0094be8cf283477a2824bd83045d7bc675be25492180d8da4d2b113d1c730167bebba8dfb14d332befdd069a55ae4f9e2d19468f08b56a2e0e72126adfbff9 +Qx = 3b29bbd06235d89dbce629e0bd3c86c5dd32fe93e +Qy = 6e1283667175d1eead7441c56970ebc9d0f414af0 +R = 23ec9f6e3050f90b0d8612d3730d085769901ab05 +S = 3209a58469ad4830c33e5e2471ca5e07150f02025 +Result = F (1 - Message changed) + +Msg = e24d41cf967a127d251f0127a6a5b316de530a56b8e9bb805fe760ec561f21dc89cdeae9a46968595b6287c102d97185441123a09b47624fba4d2b99a430c8e80fb5976b8467da82849790985c3c61ed81258a603f776dba84b9c83563ea2c1e2387d060eee6ebb426c17b673cf7973a81fe4cf958d1018c4730c9b394c00832 +Qx = 181c4b29c8aa9612861002149c2460820e2fde921 +Qy = 78ccb7d57a2d41c89b948a286fff6b460ce394c3a +R = 1f068c3a2146347221d2d3078e834c52f5063c228 +S = 2a652a37c61fc3f998d78a581439f8a985e8d731d +Result = F (2 - R changed) + +Msg = f1bee575e7a9de83594c7050c87e453a9c6f86f3a77d939fa5f9972a0c4651dc5c5579c38336c69459775ac8f82bec868407060c80ea03126a26266ad5062b13421d025728278c762de6308901b88ef1a80a6afa84a74bf95f4bb7439fdaea255b201de6c7886794f03326352e92d8ebe7a44c6c59b95524d2eb31cc4777c070 +Qx = 592a9c71fd0b0056ac9bdefdae6a6265443d75931 +Qy = 6b07367af2a3a232e6d3f8b5803a0076ef55c5ef6 +R = 3d39d0d73ebc1909eb13048244fa23cace85072a8 +S = 1df8b09d6a4e40b25476337e30ae4d7fba0c22e06 +Result = F (2 - R changed) + +Msg = cf0f2adf9d558d1a3cb15324ef900c57194f8c8719e1210e1cef743d752c7b0b38a2b2b28364e4a049f40fd34ded493ceeaf59435550116670f87f59f99889b57e5920528b1c02bb4bf77e789a97d83ce11c049c8cf010ff5a16db234e1aca0de8a1112e28465bc3ca6fdbd4f651d82c286fad3d390e996679e3273712cfd62c +Qx = 77634b385146c3baa0e125e42ea94d5a85ccf68f0 +Qy = 1b86db5b1bbf830c01c9612569564e526ef4e4d6a +R = 0c29ef36f870d815638bb7c04ca9e53906a2df631 +S = 0df6d065f07e569c2e683061efd5a175394c4868b +Result = P (0 ) + +Msg = fd7df224f8fb7c77ff194718ff9084475f87650eb04f477ddaafa8216362fe36f06dc0da84eda385a14ba27c9b6a887782ad3a4fd2dbd9943000a38d4b0e040997c441d12c112a5e98b77993c338cc1e1bc432102072166d3edc8ec41a684d62d647791f5c02a1efd5d169bec56dd661c4281f8f2ba583c137dbc544f3e65fef +Qx = 05fabff0e6e22541abfbecebe9babffd12455c33f +Qy = 033f5d04df7a718048f964054ba9f9c6529a7415e +R = 1dd0cb5c7e43fab0008857519b691f3573d512646 +S = 246094f9f2b7160230f5613a7b9f1277a7d411249 +Result = F (2 - R changed) + +Msg = f8bc24400d260a04c3ece39e53f06ec1211f1d1519ae25f0430c7f1bf37d6f7de729f3f867437fd0d6e28ce220eeb580bc27abc796e5bc3a466207691a7627a2aa268f43d70c69335fc5bb73ebc9e9ba9010f8a0833cf36689a114dd23d3430297920f47328313bb4899c68d84aa1dd8ad1246937bb44b3633b21ea45ebd2e74 +Qx = 11fed6cc62eed604f15afd49d9cf299c0a126566b +Qy = 199a308c7f1091956c06386e6be8b8dd0fc73cd52 +R = 14b78f4319e1e904e97f6e827f02d8657951e6312 +S = 3fdf9583f518f2a97da666e059d5365f1c1c78f84 +Result = F (1 - Message changed) + +Msg = dcd171a1aab4a4a359cda388d60ab8c828632f749e74f70fc0087fd2ad2b7d1c221da4b3a2ecd5269566d171b5cb0fee32268a631474c6404df221ba4a16c9a9b100a6841df3c399b0453843613ba8dfe71ff8daa77bb4a327239f8cd8d7218edca425f683a88582c3a999738b2b7dd52e842deae5f8cb5aa6d1e22935d79bcd +Qx = 40c8984fed2038ba0fb2e013c372f611428d3c87d +Qy = 5bd85bd23ff28f781386696cf4bb53ad0bdbe8381 +R = 38c52ba04c18b91cf02b014d5203d22b010d8162c +S = 0e205797913f6afc3d1ef543029c6bff1e2321b13 +Result = F (3 - S changed) + +Msg = 108c5584450c0a99b3cce79e7e69719213775d0d1aaa124e95261d44876bdbde3fd498e5f092fa8bf2e79e03cc05d0a2ebc304c09f86e938177b6c5fd2fc3cfd77af66910b020e8281fa14af52f740711c5f6e1dfebf267981c0ae4d780e755cb58585aaab8a0d27168be9d01979ac85d65395a2279abd0a54e33988d5e888ce +Qx = 2436c4c6fe51ff18ecc3fa3c5a5f9646926efd549 +Qy = 18f4cdf08779a84c512d6f36201fa793e0dfd446f +R = 2fc563b0b7e8851e48a21475e20a72b4d1a2e4246 +S = 3b7cd8b9453282e01f31c92a2dafd81f292eae4fc +Result = F (3 - S changed) + +Msg = f28f9187dac174a8771b1b89cdce4d0b2025454171b73e2fbed16499db8d59d77842c31a4e490d916b68dcecb722af6c4163642ed3531371c4a05f748fc80f78326662f44ed9c2ab390ccd31ff4f31b16ae836ee3d63285b57cc5ef127112b810dfc7e15a057b22a683f4e2f6c095684cb8bca2a1319a43bd51a940418394d28 +Qx = 5ef882d624dc2dd155f8d894b8a84711aefa54bc6 +Qy = 397b2a2bf24ae0123d2bb7c5fdf289a3765840075 +R = 39a35e2a297904e4b7fd1a811f895dc47385889f1 +S = 3aff0672c0d0f6fd5b7e83d7e1985cba2b9b44ec1 +Result = F (1 - Message changed) + +[B-163,SHA-384] + +Msg = f71b25d76e5926dcab67faba84580e54f0884055f59e864477274b1cfde00666a9156ef2570fa0e3ffbd1e41fb39479aa0e27e77830c76e209a200040a3bd649b326dcd7b8df65ce81dde679a968ab357f2709cee9252830d8b9a81b5d5bff8c3d8c42b23e7bfb87b9d03c5106be003ab4fe474e1e628e0632820a337ec03999 +Qx = 5454b7db786688ed04c418126d7406f18c0dec0af +Qy = 6c7fa751461477950ae090f420db11ce7101e7a5c +R = 0dfa87361051ffa7f226abc2e20df2c7feedccd96 +S = 1c621e13b983723288b57888ad6a93b9229211a73 +Result = F (3 - S changed) + +Msg = 26eb55b622125b4ad309d1ea13dd9e85fc82e849eb0a261c9e961559b34646dbd051166bc12876aee8f7cb13d6f7cc3b29d8832ecef294a87499efc1eb3f42f9eae6db153f5a4a691ce3ae918a9897f7b8ec38fdd87847a04e371db00595abfe3fc5d2ba3109ed4736e5ee48a721fee04ed2d98e78bc1bded9920eb75b441d76 +Qx = 70394dda5b4a859eeaa9334b974422fd8ca1d8c65 +Qy = 5a7fc827ff93f9b848f6e1ef1f369f7dec1519e2e +R = 242d506bd38ebbaf8122b692e1147b8dd2f40a3fd +S = 197c19f4034a4473a0323ff49b5a2b891c3adc438 +Result = F (4 - Q changed) + +Msg = 5649fe8392b05acc167d2a680b8b004bbd336d6bf5c0c58d4ec1a490104f4de2656cd9724e0eb1b90fd7d9e57bfbb871bf609268c34fc98551af54098fa50d15c4b237c2b953febb6caba87662b01191ea139ea2ea67c6a5a39b375038a14601a535983de3d2b3f020dbefdaea114d3b75f8c292c3ad0c96bfd728c8c092dfa1 +Qx = 4d836ca474b201d55e7404af8bb87d1e18d0f795b +Qy = 08548321c0b863fba3bc81fa3489b75a34b4cdfd5 +R = 3a706344252c12693cef5ea5816bfda6ca522d1f5 +S = 16e176079887c335202823ff61a3e7f0ff15bb14a +Result = F (2 - R changed) + +Msg = cf71e3ffb9d5aa2b2cf486c60ed9a6f8925b5a70230e3205a1b3590b926c6edc971088a41cf7c741cad11cbff58982dbcd9d162a602071571bbe69ac429d94a6cd95603c7ae0d9ef5829671dd2f5a0d094190c7bc81f71be648fd811041af92420cff68df83998cee914700a37bf844b5835b774fa16eb8f282905270a0ed3b0 +Qx = 73553b9813f20967ea43e1db0accfe6650afc47ce +Qy = 424a2c4e363ea25746e13543c68d11be9bd1aa075 +R = 353825002d905e77b39bb7be5f7cd1f168ecb4e9c +S = 026b3c0a0201a8029cb3ef8d9cda4ba83be4bfa60 +Result = F (2 - R changed) + +Msg = 552d4877bde7ff57bfc59dbe4c26adf70487f5f916961f710928f9a4e1355abb88a765a008126f7b23d6f0877204b1a409b117064e319e6f46bd2baa473cf64b589ca4ac7d9bb04195ec590661697aeee760b0631aa1cac0ec20531c79147ad9cf1530676a930ba215fa7f2583ec651ca427dbaab137c4a48aff025c27459701 +Qx = 5bf20d693ccd5ec2a5aec29ebcf43882614af4250 +Qy = 2bfef3ea1d61679481a8242b5fd8bccfba1e9a8d1 +R = 121bfc9d067c83be1d30ea7f85aaf4802bbe835a0 +S = 18fedd877f2be503b3a07332b8ab40b340bbdbe63 +Result = P (0 ) + +Msg = 0204851dfd17c1fb6f049f43eade2931d746f68dc89a92563e412fd7e424b71cc1d9b047efa672b010d63ae35fe325af841c7a47bf782ec40e9c1307845ec442345208d4339aecaa029a6706b14c880ba91acb7b03a96d51a7fb3837e84ef8ab1f33bc17329974b5bf5fdc6624720ec8a3e64dee4c9695959b62a2fcae6ee55f +Qx = 6638717c3bbdb55e3d1e2f8af4e1ac6a96e716204 +Qy = 0242a160b7395d2a768a556828150a8ff2e49c30e +R = 1f9beec4e1013a92a382db68b0fa157ccfdcc8a3a +S = 3c19468b1362a73651c68a4117e88e52c1452cbf9 +Result = F (1 - Message changed) + +Msg = 2468f6c0fbd9af1a3dd1442082d7a3939f9f89f5e260ab427d46afd3f3731e1a611307b0f9b2ca03b5faf3f31ef511efd01564538005f4378c88dea71ced1476854b0f2a480bd482b5ef6efee1c053828e211ed0a55c8aeadffa89cdda329660bbdae7e1aa36945e61a375136282f03b8168ba2dc4ee808ae4534d437e6a8b97 +Qx = 266ae51a5d30dbc1ee3afdd6f1d17915102cfcafc +Qy = 3f66b1af32f69260bc6b7465984a9fefccef47124 +R = 04a77b80e0e5c92526de57700615c9b29d98d40d3 +S = 3bd72bea88e4f8e97b8df06d34bae4bb2f37aa3ad +Result = F (4 - Q changed) + +Msg = df7280dd142da7e4c7516527b319815554ee9e559f7e6210f52c30a8f87f954c8cc4b96cf259f9bccabce4eae4a19b7f403983a30a4c250a639d47fda6a7acee178959726769ba7a9dd7de71f331fbd9deca514e5e87f9eb22814a0e1afa7c995d41ba88d739afd035bda85f330c5831264d41029f631ea6602f1b48ddf89f9a +Qx = 35e95775a337e1055b87e3b01d2d35c1c885e9197 +Qy = 526728cc4820bfe2d1c630922baff77cd612c6df3 +R = 0bb1185cb02a89ac7a57a9d5daa5c953632f87bdb +S = 3b11c0e3ec76f79036373dbff38add2ba90d9acc0 +Result = P (0 ) + +Msg = ef674a1d185bbb3f94dee6cfb74a4e0982f6f7277d62086ae2b691bd1435106c9c8b195e8c16b304b436c6b00c2dbba1eb81a962b9cb96949c43b123cccbcff2e1fee5f2bba29a6bba50f16f1228060ca39ab46696a3cb45868ed727a86328c76c06909e19ed331fe82e034830a7bb5016bc277addf3173b4b8bf84e48c59bfb +Qx = 34a224c1cca69b45821697085b1bc721411ef2779 +Qy = 117543d6404976e5f70e228d403322374f2477fd8 +R = 38e2437f2ba29ea131546dc032916856aaf6f63aa +S = 00762c3670c4b3f8a59faf0974ab9d87dbc540212 +Result = P (0 ) + +Msg = 092a21fa1d17961e4859c20896867834d40e8b27e41be44beca6ae2862a997bede72a68086af82f90de511b995287e9d7c151350ff4e3e4b45cc3bd35048f7a784f92c84f0c1fb6d45d5c77ef4c4ae11b0d67a7f5a89d0021fdae1d74fd5a0aa3b5889fb0c226e5f2d0c4bbd186408d7a20f1c0c85080adae26e3ebb81fbaadf +Qx = 037cfc839a24a54e24187853d759b38aa92f6dedc +Qy = 6af5ca2d5bcc470f3eba96d1e0352e3a8b8ee6051 +R = 27292b9e84e4f09fe9220365184f9e45f9e634d1b +S = 06504ba151db9291e610da5d1bf86a60b67c65819 +Result = F (3 - S changed) + +Msg = e27a08c388ae3f5dce49519a07878efd09c9b5a4204a21b7f68002198bc0a7cd4f8c1b3d952d92e9cfff33b264a6bd339da823aa221337d1ec787989b40b5df4f6ccded1c9cce871072c58227e6be755afaff21e50fc2885595cbd93bcf3e055940a6d4dea93079f3ec8d460303ccaf9c415f6c3c95ad89c9a898c1e9a7fef9b +Qx = 7c89d4f1ee998a6421e5d71458fb1f74a888af0bb +Qy = 6885ac1e318fdec1dd8fadc057c06e350af9efc85 +R = 19573942feec6901937f92b3a31a335eeab80600c +S = 1443db45308ed7b9148bd680587a1420428ef53fd +Result = F (1 - Message changed) + +Msg = 1089be0b4b7531840e84921b5de6514ccd29612c9ed7e687fb994da0b1062394fd06d30c8c3f425cc3a05e9a46e055d044ab15e08f8658fae65ca91fac592c0c5ea76ca93d64418ece4270e5cacebbb2cc3c6a1126764dc822af73c12f3c8e089debc088517e2a14559c0bb80c26e0a405b7e827a43280381fa9236fa146977b +Qx = 1dcecfc3ae4ed750eb6a564f0f25393ac655e249b +Qy = 000f5c4c076cfb2ddc4a2ac066b1fce1f823a94d0 +R = 082eedfce7fd389742000af370dabc812bc5a8659 +S = 16a6176e093b35f6c6483804bce328dac23224ab9 +Result = F (1 - Message changed) + +Msg = 7ee2d79c2a2cb56312d200208e0e5bcc8ea023171a15ec619e59e176a0d8fca44ea6b39f04a9663f1db12aa642c7c3991c1bbb2213980d68f1035d2882843774e1a7ade6b13b1d90ff099f96b516a8c494bc4b7373bf48e6cddef28ee7bcb62d23b1ad03e33f925ce78af321f7397e6e1b0912ad7935c30aff1dfcbddc2f0966 +Qx = 38cf4ec226adfef8c89bc29d82c44e5c844d5a829 +Qy = 0c9e1057c6cfcf33b9db2806e5e009f6448e03541 +R = 2c3327d89af3ca1627e80c5f1f0f7cd3ff837e0d3 +S = 36246e19a9a7dd5063a54292a003d945933afb739 +Result = F (3 - S changed) + +Msg = b114132efecac3ee7e1015dfc4442305a57a6fe28bf80299faaf66b0366ee9e95ed8ca3ab322b2b82752f7731c1e629e5318db4a7ff9dc7d26139940562ee9cd7a37c5d0f4f16ec0e622ff46328fec6839709c17ba85f2797e6c621add0bce6a64e7644eac3476ff9f6596e9c4945b91b1caa3191c4086c934c12b68193e3d8a +Qx = 5ef214d347433c5403e0b624f16380f2f97bec04a +Qy = 444103759ecc9bc972a351fef899cbe7a68e54394 +R = 384a416ce259a8a3b89187d530e5abc772c915598 +S = 2659137fd4966f3aea9676b1a4be244fbc634ba2a +Result = F (2 - R changed) + +Msg = d195a831e7a10b1dec5728d4d156e46cf8d7eb569a44803a3d1bad3a44cfce9bee69b5a7aff34a0512d00db0ad6d3c93ed68c35c0385859b3e34a017f216bf7dfe3888b5335dd4fbd72c7d17ef228fdd635df8b57b65123f14adf8db4ce70c122adf7400ddcb918be836ed05985f2136de357a2d6d47aa19090d2db3850d844d +Qx = 7658dcd142307ada8c050e28b153f73188db5ff86 +Qy = 166a54db18ba4de4742940068860f383bf920c361 +R = 2cdaa5ee37657aeb777dde64feca6271a414f8545 +S = 2c8e57a75cf3d3bbe7c86112f86f383af5eec3131 +Result = F (4 - Q changed) + +[B-163,SHA-512] + +Msg = cb8b18686b4b107ddc3af6b22cfb49a7f90ac7204b0da7d1801eb9f96cfa96085bb3805c56171dfe0ea1c03b8e2c8c9fdb1761fe9ec94006be35efd3f3a2849a6516eaae9a433033f9008546f4a02f23b06f15455b6ccbf48d720578054318e50921d9601f79fbd197c9d0348063be3b992eb853eb6cf399bd409d49d0c7f853 +Qx = 7dffb2183e217003bb9ed5f74f1146d38bc3b91d5 +Qy = 3cb671a581d207d46bb7bd91c779054adf0110941 +R = 12b3c02be2e0010cd78ea038b4f12405628ffd759 +S = 11ec80dc4f4f66aa8dc716c290d540da0b3333169 +Result = F (3 - S changed) + +Msg = 93c2fc1dacce2f5fbab158990f810da3e23728b855393acce022dcd118dad50abd0cc34dc226b83cbdf69ff71b973d33d1b24c643cf6db04c99a2c36fe56050085d3d07daa8a11169aff8b9d24f8d3ebeaca7d24113530dac40f2e3729691342432fd97481b164ec391210296fe1195f0dfa6075f2aaeb8d7716ee0e3b7552ff +Qx = 0517a5482a07705505f94c52a48ad68d09d13ef8d +Qy = 7eccf66096d3faf30113624e5a0fad2bec42224c5 +R = 05861e4dcfc8948daab674e0505e2fee70aa9f806 +S = 180c9b07c384af365e3f7a92fec25fbfc00d7fced +Result = P (0 ) + +Msg = a4bc112bbebfc49099c9711a92cb8a7d2452ce6291e40feb585379711f16ae97fe0e895bb78cc836fabaa1efcfef4d8e29aea49b8c0c592917b911f67cd73463b317545e556d4d9a3ea1b641b7efc90fbbe83e05c9c79912157fd7f828a62bfc1ba9cac050b48c5f3cd3c7d6c3d86c619e28c1ecf934a03841ba41c2b66bf861 +Qx = 58ab1399ae7bfafd82374cc218ceab1ece0c4e09f +Qy = 12120175c9c86dbb2840e1ad0bd52569194aa2c0f +R = 1224d438c4bf6c5918900d1a887c37bf51532ffd5 +S = 2ce70218e1e9f4f27c7246bdd8483fde394a1575b +Result = F (3 - S changed) + +Msg = 537efe1202c80df23d5e223a282eed633b2868c7cf1c4271ad26e2aa983c77ce3c56fd2b958821d69d7d745cb90cb1edecc5da05cf2dd1393f0fec13ee8fff83d27d225aa439c3699944b9ba8f36be7937b7777b0ff783cf99c4fdf3883aca2a47ba36a4e38ee5fdc59c8ef627a2a009fafca5ec82dc1186c3600234f11ec8c2 +Qx = 0f426072404eb6ef20ef55cb89af34a4fff2be7d0 +Qy = 5a1a5622f4a2ea6da84309987a9d85dc3979d4aac +R = 29544134caff1f057a46c28db716701d6ce032a9b +S = 215a980d609529a5a99a8511c073b15e985ca560f +Result = F (1 - Message changed) + +Msg = 6aa008a0d951bba4e4860d166b988e87bbff11cbeb7dbbbdeefb7ad3d25b5c4954abba6908f2656d704befe3dcebb6007feed8c9c8571a68987b99b620e7f5fea361f2bfd1ca228f720710627d9d1c479833afd0aed8578d2a6a23bb60161324198f823452992773ee365bad2b04119d6016925843548adc1afa9c9e1dea01e5 +Qx = 212d9e4403984f8aa068f513a78407a34e5bee705 +Qy = 75a79942fdbb0eb611cafa6bf59338c067642041a +R = 16031c9591efa6a4c41fcb8714981c33fcb835fcc +S = 300e7699188dd529adb9f02055297e5b48ed3b6c3 +Result = F (2 - R changed) + +Msg = d6c695bc1198608da12fb6c05ced78eb19ef545af5a1bf2a91984d7a858922dfa265457e945c0f654e2ddae7dd46d2a76fd9f1dee31e838deef49169d4c229e9cbbf0372be69b2c0c06d43979c308a3f31dfbb3833c400d693bed7ee2bd37e6c418fd2b31ac7f3f1f4a6c168e107e53c42beaea250225addedcac9d5f0500455 +Qx = 0ea408b3e8e2559af25126835f3d8899311813288 +Qy = 57c0efe6fbc4923037185ebd1af06114b02d493d8 +R = 0ff152ff504c59181438c2bb901075110cd2331f6 +S = 328543010125ad76100eedf981d3e8610de1fc370 +Result = P (0 ) + +Msg = 6445dddab08e2ed69e7ebc91073f11bc72a4779ec4afa777d819d8c6fa4fb6dcbe75a075d6d838874f757f65651db92337a190b19703f9e76decfba94ea2537b45a9bf4e5b9100a5aa935473f7df0621504c32a3582de227659cb0c51e1921222f6c4ed4f63a88c04706d78f7b63967e2de6f169b18ee158f534f15767e8a69f +Qx = 059dcf2d322bb7cd0b3b4c6250dd20ea246b8796f +Qy = 7e3821d0d2166bb7a8897fc02b86ce366f3fa11ed +R = 1f935e5ed7881bedb2ab1b9b2a656a138166a50f0 +S = 28b784b8f43f88441d5f968617be96f92e94fab0d +Result = F (4 - Q changed) + +Msg = 7218352c1392f733a1a57352b7e65cb4a806e0eaea1d9aa49e8c9cce62ad3017c055d7025ea50a319317c74933305a0c41e0463bb4d93a66620146eb7168a1115d0c4f068d8ec182301e09a389bec912c924267445423c7a2776927254c92b7158420e9efaf032e143fa40a93930080c96d51e8f1630af8097e5b9c4eb9839e8 +Qx = 0ff212bc5ea4fbd99fcf4276569e306f6b890b47c +Qy = 1f5e561b8d7a2cc0f3fc5bf0424d8b58ccf392231 +R = 1e297af8b65fe65b8cbcf535704a3660a34231d19 +S = 3efab6d594195902984f62e6d9b7e94954db3a59f +Result = F (2 - R changed) + +Msg = a16f81430d2b6e77f6cb38cce537d5e6a17555619fc51a53b43e0aacb6d96ac2f7bcdd57732534c9330ffc8cdca069c689e83820012f5db8918f9eb0be1480da2ec29a74c67982110b871e4e05d3f44dc35a68d148158dc705b34b508d1c8a49e5ce17789977546ccabad228980a06f3477153fafdfad2dc951df9b2dfd536dc +Qx = 434e6a816e2a313cd6a95457aa2ff6decb5d687d8 +Qy = 190357e7d1f7c5fe836a8fef14352885c8c26d747 +R = 0997a25715c7d4213095679cc081fad6cd49eb242 +S = 160788247bae837e21eb19033d68b204217124b63 +Result = F (1 - Message changed) + +Msg = 0b2cf8cd4d27a0ad3ad7c2fd11004390ecdd49ae32611b283f090a18e3caa47b5bb043d0ca43b725a8a06505be770eadb648c578711315703286c585e75401069fbaa4efaba245692ac876c61bba4b4a40f902cbf0511c942a95e69d5dfac0502227d3ce29597d2a77407baa6d2078f45aabd0107b4fde1d1775f23b866c0907 +Qx = 0fe31a3025770a2365c15657027c493bc64120098 +Qy = 0174a69e2d15c7a8c1ae57c7373a22402bc31cf9b +R = 22b36ca239e60d67a9c69f8fa154346a8aa4d233a +S = 10e51c73ba7b9ebab2cdfab1afbf759e4c2270664 +Result = F (1 - Message changed) + +Msg = ceaf51fac48a93fffdfd066269565f87948eddb9da3a1592b28e8cab3fef6ebbf9df658b803d02882acb94f3c0d7c384413b6f0383d48c3944da7c3859d194bc887df974a107a62060c2bf6d6c343415817dc3020969ccfdde150f0f62d79a6a15b2e25d575b156de061e57ae073d411445f221b2a55f55140017da0de261cc9 +Qx = 6f2a651535746305a1434afee39314321c65d0e7e +Qy = 40f1edf0f3536872d55bee073b5fc99421042cde2 +R = 16441798a2421dfa103114bc58b0b2f86e047f850 +S = 1399e3169e10ab2c987b8425c9a2f68338581ba22 +Result = F (4 - Q changed) + +Msg = 66f0d6342210bf0d95a2b97b4918d711359ff5cfab21d4509c15784b207e55894cbc73647055b8a8e0f103f1f86ace3dceaf06296418c9344917d05a9361224c8cf8ea477a838ac71acc26c83035cfab2c92f3f0f884617b749f512d41bc7b8acc729d810ae3a5f39f373f15c32e67c9eee8ff6614ed2301ca0772e489257feb +Qx = 7a27cc680b70313f26c3a1ee68a8722e0b682f8a6 +Qy = 70a430191bab1d0efee6e6eb5b16bc5d49ba00edb +R = 2cfe51c2719cd3350dc8d3b5becb36905aa4c7ebb +S = 103aa37429163a543f0a91a8acf9418d4655b66b6 +Result = F (4 - Q changed) + +Msg = 8e8527032efe39ad0918f03738f6a29b695234b3fa5cfa2d17d91c16033291a8326ed4c69540d6ebecb6553c4cab1399fe8eb4aed3cf9085a0fb92ea8e561ba1bdc4c95568f71e6025c5e723fe66212becbd47967bea34bec20ed42727e997b49b3cf848f34bdf86d2cd273bbc754eb68a1ada14692e817d132c03aae63c8643 +Qx = 3f3bf0ca1fd81ff2903de75537630b11802d044a6 +Qy = 09548857a0728729e5f6423154da33d415ac4876c +R = 2b83775986b8480da5ec381ecaafd1e4194efc956 +S = 08694a493bd4a01cf30964468bad3e5c7177b287b +Result = P (0 ) + +Msg = e3944b54a743a63e403fd644976a8a12a012f3918a1bf89c81441d2c3c9eac783eee24e7dd863683576596566a6e34a98d474dd58fbd8f177c9c588166024ff179dc9cb69fd37b0d8593332bbed79769cc8933c8ec8cd964224858a701d175a1e0819c9055bea8f54d242fd1e4dce613a9424b96b53a30b4976eac9903e630e1 +Qx = 1e7786adf872033a200005b25dc6dd526e432928e +Qy = 4042a8e8c21256934c9f1f0cbc0040a3a5271ce76 +R = 2943396bc27268c4decfe70b20e33a0b1d71b60b6 +S = 3d86b56c99d905f64cc3856011ea29749d4e69aa9 +Result = F (2 - R changed) + +Msg = e6515c7decf8fbefe253d55f351481e981fc7e0ac2745101ef6e69c06e3d84d6b712375088a74e557b704dae4c4da3d8cfdc1e46fe9da54461d5b61c37fb082cafb115916f3e85995cfba5f37bcfc2f7bf7793a6db423e305f8cb4a61a96eccdf557e4498978b7ffa3f89499a77e76813012cf39f714d2daf0c093af74280cfb +Qx = 485aaa6bd0b741625d6b2f007468ba4d9383959eb +Qy = 2bdbd9ab14bdfd6f6d23c50cd61afe688d05448d4 +R = 2429d8fb3115afac83d3882e1ae544c749a410433 +S = 3d88abd7a723807fd7fb5992194698ef5482361cf +Result = F (3 - S changed) + +[B-233,SHA-1] + +Msg = 744a77fdea6c14f225a88feb9efe631b01585293fd37cf5fa47794876b331ae48fe9100a39d22c465b40783c1f7dc167f088379eaa22d5aca0b1a04684a1b956b6944fed4dce640d893ae6a1172a357c86a5ecfcaa06a9f4e13688c173134b4b7f2b6b2f19df365a28afee863b7a8cb090081cf74bb7349de622aed640e8b308 +Qx = 0ca0345ec8fc76852dec14020148e206b8b68d1969290034b9aeb2ca860 +Qy = 0fb1f1ec816048bd52d8ee78a8bf4248beced050e4a019a2dd3bac39abb +R = 08a4602d4c394fc5a5035fdcfba2b4c5c8f2ed750314beec41c483baec0 +S = 0cd334f1a839ea39e9e96da0f98dd7f3fb1b563fab547770cefb9460d2f +Result = P (0 ) + +Msg = c20b46e76d666830e2c66a1e83402eb647a0e3077ce76854a9fa98b917ee81839887165afd80be2f6d7954be63f1d98eef645ea224b03b8cb2f0d5b16eae163bdfaa4f81c059c1c83509a4a0b3b2aa54e89cb878eadf5dee3406e1b5641484d7fa5430b597c1d719a0ced8f452ffa76ea22ce3f009fbd76d7455291cd04e14c0 +Qx = 0741b05943e0c1b3d3704fd9fff3679097db57185008d6ea6431f210a01 +Qy = 0c4bf756686564dc6f561fffecd69c42f3bc0ede57a02c656fe471c4d0d +R = 0ff6ce024c264fa7e54b80318b6d1f4d8c092f23905b625e3d8b506fed0 +S = 0e6e84e605b9783810516a9066e0a372a4706f54ed2302493aed1713333 +Result = F (2 - R changed) + +Msg = 38bada9a64f708642923ef8fc5c2acedb02b5f7d1714319a8753ea45c89d00ff725fa9fa3e9780471715aa17d0af7d16fdd2636cc466fedd8540c3229977f3e8c73d9932fc4e79e857fbac862eba0b0c92910ce57561b8cda03a57cf3a1b0293ab1a44a28a82dd2c52e3de3d41e1c631b9e15558e74f1c9f9f5247a085434e41 +Qx = 14f0830b3f22466a6ac8ffff040d0e16b11b57c51988142d79cdf637ef0 +Qy = 029e931a762fd04f3cb00391718367492cfd30fde71e816f202f2bcfbec +R = 0eb60b050d0254008bcf3ad49658dd3d059725705ba47b605feacfb21b4 +S = 0b132577bbe5c4f9be6c343052337f4f19e550332c2974e80af6726b8f3 +Result = F (3 - S changed) + +Msg = b249aab0e994709f836f5d9847eb369ff88416ddc099eea66b4e8328f5e8f3e1ac3e3b799083d02dd43343cb5213810cd122a031dd6d271dd21f1af96cbbf00e26b09ff5dd7f728b74485ff37349fe06b2798b39cf3f15299e4cbcab4b6a1e686a354bf9ab70e3258d4992d8bb3dfea4f4e32a750ec366bbecca6dc042633249 +Qx = 16856542f8b99cad35a30b9aeccd1eb7a4f4d23e71fa4f57acd58015b4d +Qy = 1f0f56513bae5879d18432483d532eb299397f2831adc8f143d8608fbb4 +R = 000aaa206b2c8704085c3b520cfd6e6fbe9c559331416ba3c81f82579a4 +S = 0e4960e3ef27e40a332038981720a83194f8394f762b7d175360c5435fc +Result = P (0 ) + +Msg = 02d30cd64c298f92254c1c4447da275c524c4ceea08678c8220ac681b0b748f3419aa65252482b3607c0e41d37412eac2a0318d4c8a3e40b2e543cb74b27d7a67d842f8452d3c587ae46254666e98235766e0a1850b5a294fa3980ee3a7ca0e78bdd6998f0b3e5223107f73ae40742027b64e6621ad4ba9866d1c9983780b303 +Qx = 021906fc3338dad97a51dc99ab6df0ea7ace8ebfe4b9ac244b08249734f +Qy = 0221fe6df9297a19cdce70ceadf2f5b20b244fd9fe8be08e16057dae8d6 +R = 0484f1bfc85cfa4667a553ada1b5f365bc3ad014b229f8992ee2e82d0ad +S = 0238d73b791b5821b5591b7c274a5f682fc77057f1b4404b1a34f8907cb +Result = F (1 - Message changed) + +Msg = cbf7cfa38dd35d1b246b9516489f82d886b46a6a7a478bbf8acbc7ca9ad67a9f1b0fc85e42ec24d9858e4c081a48153fe8af78022ed7aad436868baf611b3f2aaa957abe77b54014eb53893ab5743c0b4efac0b83e4c12c55720f3618455ce187415ab698d0f23dbc79e338e10b01f488bcca8bbf83b6461d0424a6bf63772e2 +Qx = 04477b42ccb25b2f8378de7b304812422342aeefac99b5a72fc4a60e286 +Qy = 0dc131f566ca62831d2eb35642cd745f6af1bc0b97cd9c13cc0f5d035d2 +R = 0671c5111321aad4ea520b567fd8d169fdebc8ad6eae82d71b97dd26e88 +S = 09b0287967ae607075deedf0ec2589dfe22fd8d7fd332b169fed9d7a0f0 +Result = F (2 - R changed) + +Msg = 90928807edde21f7b30258e2164c949e7c7ac4a60875bad735e0640f913fe9da07a8d0d5443ba41317cd4cc872c5448175d2d95c9bb407dac027d29f9a82e08b8674cde0d6d9e4d43a89e61c7c5c412a9d1bfd41f3e42506b3f27e11f5c250990b6373037fd8597f10c026e84444694250f39564b02b12479fafe770e2ff7655 +Qx = 1712c14e0f22792dcaf7d1a76fd727cf1306cefe6702f92e875be177f77 +Qy = 1b3b5049f11206a1228ba6d2dd038c7dfa8c0b182b829dd935c8da3e62b +R = 0f233bf6c387b8948b0c7f9e12928f354547f58bf4f77b07ba54569198d +S = 0be3608d29b81b1d3185ba6e51a8ec1d2b787f7a5e3d0e5b78604691357 +Result = F (4 - Q changed) + +Msg = 3e56a556f8ebb8501431c0d8f3cb7077d7a006af8663ad1c518007cf3774f1129b2062637fa572e9b4c00a233cd88deec0d1652d8e4aa8adf83df17159b72596b62d105f3d72c5bd2cdcb6d0e5b28556f8aead0230f3f5404ccfd2a452f11aab9bd1adb8b27a0e6f455ae485433b38ff6ce953f8a7a7e5e096249596fcb2e04d +Qx = 0af676069a4bf1ac421aa518725164a40a304a21b7d06b3450f6ff8f920 +Qy = 003dc1f261c6726216c3aff4f20291b9f1ffa6bbb90451b7b52efaef28c +R = 0993dacc6b565bef33e786d5326fa5de98950d23c4a00809727d8f67f86 +S = 0282afd17f70cebf3538739e5038a374d6502c99ca75d3313138faae8c4 +Result = F (3 - S changed) + +Msg = 03922726dec89eef7ca00bb2c7b311833ca7e84bd7b64c4ab7f70b278904760d063e62e8f0339f4a2d735371493e4bce986c38894978cc3869f0863565b8cd30957041049fe94992b5aeaf31938caad9b142aee37cc4a0538e802a32e4140187f780de924a812224450ae570e5493f03c604703f4125f60b82c34218676067fb +Qx = 14cef63545e96e7471ca39d4c146c5cb124f555b5b2958a7442cc28f7c2 +Qy = 0b43b9ab99d2bfbf2a109e92b502b5ca579daf6a0cf76ce33e4a75536ef +R = 04cf3f3c51cbb6c57d15700ab100204cb7e772e3fe1decf2a714d119000 +S = 0e14b144dd4267a41af1336b0e91d7b26e2536d955fe98137bc4fb9f274 +Result = F (4 - Q changed) + +Msg = ce623433ff82330a9503a716ae1379b95a98e09a4aad9cf394f4860a7034b4e1bf714f9a2749e9a23eef67a3a445294ebb365e110165d8b03b9c5f044b7d26399cc682b83ad8562f688991d26c6ddddd18310ad2eec8d2c527d5e947631d759348e63862b2859d29885d7131e27d4d4e43cb27b35679745613a8384ce630e228 +Qx = 130a76ee3ee7f14d74327bd5fb1370d22c0a170cef693758750bbe3d735 +Qy = 1967167bca4892ec69e84d0340a5d534c570db67f6cb4347184dc29efb4 +R = 044096e2dc59f9482f2d56c2b86672451384fce0748c9c6dc3690587879 +S = 0f1c3a39d69bd86493a8e12e2ad88eb00bf077ebb7891efbc7f42686afc +Result = F (4 - Q changed) + +Msg = 0bd992b748b62d87c08c8203f72239410c18867a80acf33b5b9ad632a1117b72abda3021cd56673caa0d092fb3ba4bc86c47620d4789cda3efa2c774304881be42c2986df3a2c3c8769a8946d571c09ceafc1fd56827c18442ded3a53747f6dc58d389016485919eaf536fd5c52e9e4c453883fe7a09354e9ecec99ef160528f +Qx = 03c9c8715cea7e6e443fa496c1a7bc09d8bbb5c32e060bde77bbbac5e8c +Qy = 0dbebd9ea2e53acc29178a69db9760d929a9cf02c953950a25599a92352 +R = 0fff2645537f4a1e6564836d93cb366eb60645ca008f3da9839243e715a +S = 05046e8959c70b864d47ebb1801a1772d86ab1bcefe9ae8e5d311e81dc0 +Result = P (0 ) + +Msg = 694b75d242df4b8e8bd770125cb496032708943355e2ea3779cfcf3f4560fb1a4a6e905106f1179de0b75030dd1554361cd189e9bf252e9046673103e5caf7aa76ee703e4d50b9250e2920a8cdf51c93c14b4b9df69439d0c28edd0766640b8f7b82d5501c8b1e093e81bacc55ae418d8e8e8662ecb323b23164159038af6f8a +Qx = 1a71024103bb130e984107ee81d354c56b83217fdcacdb2e64d41655243 +Qy = 012666874fdb6bb2b596cc1be9f33beddd4b2e1cfc5a57011d0b9a53523 +R = 0b855f3ea51e216e682b7023492c7d8eb30b7e10e00d31ebbb35ea4843d +S = 04d814555d3e8b6390f9bd41915c6be9272ab688fbf98f421f811c30c9a +Result = F (3 - S changed) + +Msg = a93a7822dc0867b6253f0f57d9121382937f6a433519894adfacfb521604c6539bdb456b32a18f9d8f545cac693cee1575c18fd37b590b5ba59333c0f2ab91085ff73023d7c2ebbaac01b24b3283ad49591fb3f47b65a80ded38f131019da4a5ce471523e3ffcc7accafb9b7dbea41cfa0b8fb4d1110cdf0298cc6c1e43e9a6f +Qx = 0b05596be5a71ae568d80bb89744d153b01ec8a2d7d6f13b9cf985d56da +Qy = 1d053cf34b1f85825f5d35c5d4103420f6efec41c8d795fe625a8ae5fc4 +R = 039f0a81042bf15d2731dcaf3ed4f09a5454d671c5628ddbdcd64e6ef64 +S = 0ddee73a50f4a0a9ac4b33d583d5f04870498c7cd3b6d8b013a830de7ad +Result = F (1 - Message changed) + +Msg = 96cdc7c47ea27d3fb8dc4f730a6bd7cd6aa8510f15bbec39bfb6b93226f451bf95164ae46a2941a3df455a723f9aa05d9b05ed5858c33b82c81f4d5693e3f55880ad9ffcd5ddaa6b9e0dfbde3082e51d84dc6b69f8122bf5781928ae6f6e16232925a5f0e7acbaa2e7e7e8605f0da05a17807c878724ce9f66d8aeca73e9975b +Qx = 13fb7fa5942c91da6ca27f0e734c6198c1853b40fe45d12ce2119bc1463 +Qy = 00b389049d65fde06f704583be3747c8036b36777d69d45f3fb9e013800 +R = 0b7315b780a13f828fe297c0554492ef50f48bfa486f0f55e173f975dbf +S = 06fb683b2be20f48003515a5cbf710c92f8d1cbb84a5fe3aa74b75641d8 +Result = F (2 - R changed) + +Msg = 88681654fecce3507227e8fdeb9dc7d971f9270b556162f62d9311193762e8c181f26c1627e5d25820bda10a2fe1c1a053059d53da62a67f2be07d0763493034b0632e9cbbec062e20dbd61fd32f2430d51106d4981733a2118828b1847cbcb4fe710dc469f26e8837cd4024946bf7642526827a18da82cc927c7197855d4a7a +Qx = 0eae871ba9999523d12680d9cfeeb90e9e63ed451b65dcc6cb46e00f1b9 +Qy = 15fd52f75d25368a82da3182f655f19de082794561b03b0d45fa0a4fe80 +R = 0d2bdc26c6d8b9e500ad7611c444d16f114bc028b678d8c92e5fb392b39 +S = 0e738f4b607cc6f44da38c90028cf90ad6b63aae0f44cb07a8bd7dc369b +Result = F (1 - Message changed) + +[B-233,SHA-224] + +Msg = 7243e6a8e966e138fac8f4a757aba92b96baaaebc05e665ac3b2b391da505e80f1e957a1e17f8a1a39756eb5b666eeb6344457e90c60921f863795a791708b009562b72334520b533be64af343c344fd73ee8f59de16146ca3b417e6430980ddf2e47f04f1b169c1de5a5932ed576ab67c4e11202a3639fdac63b5046b976675 +Qx = 1b57c565a6954dfa86a0b14787b156951fbf9e57d38decb6023b91b6609 +Qy = 10e7f602ea0af12fee22cb3b49577c32ea9aa1607e95b0c33f17d2855f1 +R = 00bd52ecfa95f6b4e3a338193aca06b6e26f5933e483f35d16954a42385 +S = 0ca6ec1f6969358a6847d99bc417817ea4dcb6f769889959d155de6662e +Result = P (0 ) + +Msg = ae16bc56a2407296862eaf9d95a04126d951de6513f1556eb4c2f7a3b55aa8445465a170665b1564380241192747df99e144e1d0d4167d666ae3fe663cd4f812001329bc3694e8486ed143c29e1d7613955a151537855964e3d1d44cc230d1a2d23470d249be9d2edcc21cd09696f2e258d6bb9b762218d59cc1d8575ea2ef87 +Qx = 0f66fb03145c469d8e66f4652ba46d2fd0b69933beec68d0772cc373493 +Qy = 048ddf8bc2a63e909f7e0faf70401aabc71124ece2dcd8b669145be56d8 +R = 04606d0ae4aa16786981816976e9a70b2229bf26e3f3a9e7fbbe0b94e73 +S = 0ca233a85ef4eac46ebcd211c1f96aa29dfdadfde4036c0fe94e16b8683 +Result = P (0 ) + +Msg = a6b7ab0bdb0b964a4f8ff03bb5936fd80e6e5945af5909299b8337952a6a84f4efc8c32ea11508b49b8c618b8ee7dbae03edd3178dc504c57a2d321ba29a740022d8e51e7d85fb2d238794e3667748917aa52724c6cdacadcc47f88364cc23f11b0f147ec7148fc700ba8e10edaa976a2c2e607e59e7c0098c33b3043c6c25ba +Qx = 0108c663d999dbab7e0e93feda239401a3a4dcf9e77197f16d16ed7a532 +Qy = 064d34c29825b92f7e279cda8adb684a2c27bae41c73e1bdf011cdf0ac6 +R = 055bf87f72c289541c2229c13e595c16b032b335d2e089cb62f2930e2ac +S = 091b6d7a779b5c7b44fd545ac6ffc8261b4202606189d82feb91383bb64 +Result = P (0 ) + +Msg = e6324c1e54d4c2c2595504541cee67036fd16e0b0aae7456995c0f5a56b6508e08c296d45b61d0f5c4a42fd16ed0c88acaebce05b8709ef0b0e5050984bb95987abc592ae5e8a3016c941ee78646f2a7b137b97c9cb8eb60a9d5bd4290850f45d5339a861486456ae03fb0711dd2cc09d7decdf852a8034323d7ad730a0d27cd +Qx = 07bfed9d0ec15bb4ef10c9c50b0cda5086361213524ead8a0fc91fbe05f +Qy = 0f3fa90f7d3d2c64e7544bc5ecc98f573987a063fc7bde66f7200e1128d +R = 00ec3186fbbd08f0957d64440edeb6a195b3d2d1a0d516eaf88349939bb +S = 0f162c94f32865b1f2b89600a5896cc6bbd9a2c640bdb229c829dd092dd +Result = F (4 - Q changed) + +Msg = 2c7f61cc29d24432c3b61a6a90ae84322d75e6c9f14dfd7d924a7dac6d430157648cd909372ac142e70ad371b3205881fa006f3f14983ccddd7f4e0bf57ef12c5aba582f055f793efab775c026091779d89a8294795a80768cd360433b39ecd7cae3f6bc093a21d20b3fb90a5eb379b6ffeb76b103560d777ea071431c457d3f +Qx = 1733c844ae203484c9047eacba786cd82455334bc3bf996338aa366f419 +Qy = 15c2e37144be4fff0a03f75c957b0f1a7058cc5f0986c9dbbebf3bf2184 +R = 0b227e523c3bdf8d6debdd41fd68e193173cb50bab173bde3887196b004 +S = 0b9f964568362a1c2af5dc3326d8a42abbec0d0abc7cfe6d01ff13d99bc +Result = F (1 - Message changed) + +Msg = 87b16033c4874b884e11051fbbce08c97ad7d6daafc495f6ea3503326b6dcc217b34b28f470427eee75b961635f3bd707632aabee0446f6ee605156a2369513578672a2482f5c10fcda7bdb84e8cd7a1eee594e3e1a5bd68b401b94a90ffc837f511d040b49f2afe980e1cdc3d576f66aefbc7e2ecc2ffa947afeffc9fe601fc +Qx = 077f22052638f483f29a138c869eb65d109f6a0d3da0fb9d472bc9731b6 +Qy = 1c03b654c391b23abe9c8751cee5f9d797673458d019e74e221fa6092f3 +R = 0e5b1a4331aad4fecfea03a02e9ec6aa5f20a4711cb49105768511a2a4f +S = 0ec56e2b4f924793bc0796a8e06aa2f44e52962006264fbf73a4ca1d9e4 +Result = F (2 - R changed) + +Msg = ab779a94b2be05a4d74093a3481e2ad6c87a9b1304101b56e4ce299ec6144d63bb5ca5f27ec2553647945c58e5e531d16eec9780efaac043220a2bf6d1f6ebfc0d034192148570d835b06720fa1d4b99501ef9250a0f68e75dd6f99d896f03bbd27b361abefa4c61a21b5700a6853ee75f5c2718ebc488904b85f7895997f5b9 +Qx = 03ea1d537682e7024639b20c555c14cddcf82938186cdd356422ba4c438 +Qy = 13442c08bb03e434203de53af9b01d6e186f0d3fbcc6e9cafbfb44a35a4 +R = 044ada3ab5013e12cf9d166baa39f334da30d3c41040b429715836b8c31 +S = 0115a8dd2aa2cfe85dbfcad17824ff3efce339ab49155182d8499aeaf4f +Result = F (3 - S changed) + +Msg = affc926eb645f29306ebb5eaa51a917ce56b3b8adff3b7ffefe4af4d07c3ea72f271c0f2b3969bc6681acd12e1713f7aa8ad138d14667de0050c78c669bd67711c21a64fc52c355b8cc50f8ea13bec7137a5938c340130ee9aeddd1d1f284db672e4f9e77a37f28554d0be1e71e215a7a28eafb53bab15e5461d05e67c242cb3 +Qx = 1747e62b14156b8da5a6f977e0ea3e3f41e513d1b2f47b825eb74e35449 +Qy = 18e73f9f22b79f0eddf8bd3c77b17cc0e19f0036b72b66cc9171b2bfbf4 +R = 01f80d137dc4106e38936f838f14250d1b3a4affdd187470ba6222338cd +S = 008b010b94f2407649d53ee4f8d577201c99826684400ec91f7a90f8cb8 +Result = F (4 - Q changed) + +Msg = d2874c47f2b41a072a8896c10f5bf92a7eaffd34bbc125ea3f6cfde46007fc6b0564686690f0d644ece05978c54c319df570028475b45dc65dc2c122c89dedf6337bcd32ede39a9c6902cfd7705e83ff41add2905501c33f1748c503cf892b069dbabe6b2b8eec76f140f006a00614d0408ad4f8b21b7238991760925fc21ace +Qx = 0ccebab719c3e7444515834fb6ce8e3443036c01de8e80780826d38ade9 +Qy = 0e4ca763458837a9067efdf5e2b5b1361d9e391dae4c42ac3a7fdf5f63f +R = 0762c2ddff3ac06c2a78d5b6120d62eab47e8eaa09ce8b935843bee8e2c +S = 0180b7ddee31934c85c5449359f8837acd8fd4f9bcb3115e7dc07f833f3 +Result = F (3 - S changed) + +Msg = 5ef80748c21a4588d4f65f563038c52400213eddc01f2975c97a6c8fdc07ceba9a3b0dae323668ffb7ac11a60174ab27354849637759393aa26689bf85f7a99d9dc58877f8952510a2005387ea3b94a4d3558b0c0c75615a5886d144a09606d336585bc738951a8d00d0d9156d870a8e45377bfdd379d594061ca2f04dccfaac +Qx = 184a3169a750908b6ff1ab0d33d6a66ea8fec9fd3d209c9a0a7d38096d9 +Qy = 12dcf8ff71a18d2b986f60497f302d39c73dcd3de06d718d04762165e1c +R = 07a0b412f221b07f37a25b32b4117e50af926bd7f62d77e7b61f26255f4 +S = 02fa36137a458739b7434b3377981d3a8d7c7d52ad660f2d15ce53cf400 +Result = F (2 - R changed) + +Msg = 4ce4f7713f08ba708787a248d8a6bf8af40c0eb034cbb5f2a7fce7f1aa76dd2b6e272762794cba5351af09ea98140915126908cd1b175db1db8b3a7dff49c4ce6190c201d326c000d552a864197d98c3e03635f59abe3aa862ca8dd0fd9b2c7eab710a4ac4476409df603d01810e031f9e4c8243fc6f8f5e66b629c58880960d +Qx = 1690727d24272006da1d47f593a2f0daf3521e44ecd8ade5d8c1a6d3d48 +Qy = 0704e3c9be2db685228c010974ff51247d3f1f1aa3be451e12995918d3f +R = 047865c687a491a81e6452632e83691ab07a52a5f53ce2d662eb86e7145 +S = 03e12721f962c9594160306167b1fb0dec472667036c33b6dd1a17d8431 +Result = F (4 - Q changed) + +Msg = 1689be1092ca3b2c1bc0a1c3a45d0c71e6695343800ef900a7b5bc06d5364282440725690f3707161d5ef44817cfc30a31f1d933f165e436367cfd3b8db617cc4c8645b471f50aaa72d473a8019c212fde067338920b90176870b2e1cbc298dd115c8c3aab05bc66f635ec50d6c47f77a4f91a3d796cc48b7ca54cb75c36b99c +Qx = 1e81e4633e5174488130d086082a935b706f2034c31ae2b3a56fdbb2639 +Qy = 07084e6222fb541e80a518b0ede3577b171ac2d458eed5ab36b49ea5964 +R = 0de88df65c00aea91ea019436b9ae8644e35e1616d9d38e3141cbbc2eb7 +S = 05976664f5c5d314dd0eaa9ad46cef898d6a72399b4b5273a59d04775a6 +Result = F (2 - R changed) + +Msg = 7c61602c427e48bfbf1345a918b47fe4b564e0ed01f95a648731e838da381ae4fbbe23c3ba18805e5a3f055fe6bc86d3d545275d569375158c3a50de5ddb8c1f911cddc47924439e8b2d847291ac7bc3507eed3fc28afb3b29f7e9994e9e6a5e65233673e4d5022c46e2db916974e584eb0cecc5062b36a14dc6451452eee661 +Qx = 1d256dfda6d9733e650d2ca811064113bc9bf1c97993424a7143f4b30b4 +Qy = 1d07d6caad37a8cd00215f5eee28b280243a2c4b8366d9681dddfb88412 +R = 01c5c092dbdaf163efa37ea625817b442dbdbcc93d260d8fcf609f717eb +S = 0ed166f03d7da32b95abbdede361a64e68dda39f30ce773cac570272f2d +Result = F (1 - Message changed) + +Msg = 4923449c2eeeb3946fbd5035aa499035a172202a011bb9435c88b10f3d5db327b440d944d41f9f13fde7a531801c107b36e246c27c752c35eaa451406e00a0141d66d46bf05900db7726c16959ab1b2013fc6f4751b05f77eef80e0267d97ecdab1ab788598fb86b43aac850f70832a93045f19b3f08f2a8d92c49bf47bdce2b +Qx = 1d1ca664ecd0c9c7b90ab1cb709c13c5c134d99cfbfdf176a0395947f22 +Qy = 1f8939dcfe4b1d009a4b44bac72bc809b9d1abecf4615649e8c06913975 +R = 0a906efd5b94ba85a7569469a507cc28103c391baba0f378161d147b5be +S = 043e7c77785eba03bec0c2f4cd65bd37009ccea520cdcdacc8863f03c60 +Result = F (3 - S changed) + +Msg = cf053a40f7b715470226b65a1a37c32f068ca10258470b7cf1496654db4fe26408a6e5dd845cf7c9bb09649f3e852ce39d2e94bb5a16085beea9399dfc2500e543d37543dee82db06328a48b747ecdc2a9e0724047ef44c6d7ec6f49349fe685dfbdc3bc49d15c79b46d723e58606cc2bfba4f6791454135654f9e3b1f417cdd +Qx = 0342c7eee62695c659c125daddda1bd8a1f042c3aa37bec98b80bdac35f +Qy = 0ab7570d4ad5ea3dc8a3a7406ce672de989b1885d122bd8024eb7ea250b +R = 0200b9f5c3f77006eaa7bb71ca3f3354eb9de78ecf7b55553d376e12ba4 +S = 0122183bc636b2984ebcced82fa3752eef226423805a6987c1e0060580e +Result = F (1 - Message changed) + +[B-233,SHA-256] + +Msg = 14dca9cce04604ca01214fdbeb87389559350957b14dbb175a35c705a8969664a2138d72d99a973bfc85d95408086140588f1e7eef8fcd70e37983d1ea1e7987b2defcba6f13e50c6db72819207d05448e2f5a49d0f136acfa5d440331b4dab0967da7dbc9a77ca5ea1c6577af97218235b302b7e1f8fb07c8f601795556da32 +Qx = 151cd1573ea0e5de917effa185747517598db76ef15ee32e22a3630dc96 +Qy = 1ddf0918097dbed1897af3f96ce389183d77ba368d4f63e196410e3e4b6 +R = 08dd34c080b4be097a378fc6274c776ebf61021f3dfe8740b94e17da7b6 +S = 0404dba4f3ad89e02ffdcc9e30f751b0e4dda8b633becd75d99d04209c7 +Result = P (0 ) + +Msg = 31747f44907160d70a8a9343c41929f52b62d1b804a58026db905b865ce28bf37eaa6824870d2d43163b502d718364d3e73363b66b1d4cba22972825aca4a6375ee5aa2300dfe29f9eb746a463b755ff06bef80338e1315fcf6aa484f8f21ac71f806ec6565fbeee68a59832709e7fb0af31feb0b96da991283f8fcde78b1285 +Qx = 0e1ccad4fd82ed18668766b88cc42ceb350325dd874566821fe6d0b9dbf +Qy = 079f26e92b27ecf34b36c6d39156253564301e22d491b861eb150b8507e +R = 070eafed083b96a9b454c500667d4706fc1936beb04d8660f3d04cdf0dd +S = 0c2b4934d736345f9de221511eac69eeb6ba878883740d8f0b4a21daf2b +Result = F (3 - S changed) + +Msg = 360433af8697f5b7de1348921036d7c6ae54cb48cae7d130fc4e4de2118126cf4f0e80257a1e40abe2d611ec01322ef7669d80c04d3d14ef2170f819f1fa39e5b029a2bc1a690634b502b58df982aef454b4a2b9b764303b6cf23c3f77a50345f3b57dba1974d52d1a30c3e16cbea20920b03ccf694a97cdd240411da27911e1 +Qx = 0c6f27d7811d072bfc26f2df079f1e8ff75fb8100ae0e86ab56bb6009bd +Qy = 1c7275cae098a1d7c358a980fb0c902b06522929d126594ed0a1219bc34 +R = 0ae602ac70b400f1ca00a429749f05869da2b3c0d96172c166207f23134 +S = 013319ddff93a961703c2a4610e30ed7ed902f483fccf15520b5db37d30 +Result = P (0 ) + +Msg = 83df74ba748adca8aa68671f2b8868462f179f2599afef4e6fdcb4515bae37b1e9267b4046b33f985ad8ac72af02ecb4c2decf1a243ec3e15da8a83744ee018ce66e6881a3f288880f488a7e4061df412e405970a5b9b026207155599ad7fa3051f339b0f522188a85ca64babe677490bba91bd5f1147f393a798314a80fa78c +Qx = 05a751feef7932f9c0131030e9ccccbd173f55d2b0ca011aea0feba15d1 +Qy = 102aff4dd99376d423f1b49d820df10da97dbd3aca3a1a393fdc3933df0 +R = 0f9099ad19c9ac15c25091b0f6cbaae636e52701bbe9be5957de7b9f32e +S = 042ce02855977863f2f2e4cf6f3655b388f012ed272bb29af5ecc077e49 +Result = F (3 - S changed) + +Msg = b0dd49bac9e30a869d828fa00d7669f3b593606d035033b6c5da9a3609dc356bd93b119961e9bdef51874652d836b18bd2517569b387b61921ff27ca491f72dd5940b4e2bc2f558d22ea7ff2a2be982d9e92e6715a0e078fd7907fd94a161f49357a3bfea2b61431ba146883a9146d15cc00199a78f896bdc87685592ffc9f90 +Qx = 1edd7e3e4462d17cf7fb101214f788951ac84be5fd7e7a9b0270ff7c746 +Qy = 1e0bdb080806c8f5af778790a9fff487c507e49b371835c41c2dca2b8b7 +R = 0ec94ad40d68e0229869473d5cb2c385be359bfb0030ae2162ee4a7abe9 +S = 0787dc167c8ae5a0708d98aa89c546448b93f0c4419ab52b9260991d0d2 +Result = F (2 - R changed) + +Msg = 38e732845f8c37b0c1397f26f2ae319d860bf367213801ba9a1bc1687002234ee45f30783ded466422bc7dfa1d36d6020216abc02458e4c4385f1e9f497abc31fd27a0a1eb34812d8a08413ec956ced52be483c16fa99670769629eccaaf9da9059e26abe0357201a6ac49df8c4d78cd67ba5576643595ef412981c0917319e5 +Qx = 048cb415b977f9fe531eed005217c72942a4f20400d796c4d79ff2fa77a +Qy = 08148f826e03fa03f113189338df5b5bad3629758014550a39d2fa6b553 +R = 0483f0b92cb0dd2df9a51641502dc617dd3f4de54a5837165efd56b9121 +S = 02bb28c281189bc97bc76d743c78de394e864fcf5f7863d693537fc878c +Result = F (2 - R changed) + +Msg = 6eced222042b022934dd1fe7fe91fe256f4e73c7b36b0dfd1baeaacd59642759df76a396354a61d4b9a9a1052b5c0848d8f80a0d698cfa2561ff7711ecc2c3088bde255b729432340a1888a7d7c09403503a8438d9cb8c3db165e776d3784a3803acd10c2446320f9b15939f8b9d23845f2dcf0a68adb4357498fb392b2bb139 +Qx = 1249f7554df301c3c9636b4d1aeafd479d35fa89d422452b6fe7bb52483 +Qy = 02560b664412c12d594ff0d315d5dc2e393ffb25edfd89f8e8b64fce32b +R = 0e35dd8687951bbd934ee7e097ded8944f23b116819092aa737aa2652de +S = 0356c3cd129828cc44964b258877ae835b38c887363515476fdc12ce455 +Result = F (2 - R changed) + +Msg = 7831d59ba11e3df8e09d957f94b731f14fa57bde7426dc19a55fb23bcc6c2a89659e7171b4ca92f9263d76d6489c74e91abcc9dde7ea8822d3746cc912b061b5290e8eb85629535c0f66b5a94cc8de4b23b2f60d7a0dab91e557f308b18accbaff9d9d365cf65a9c8f81d05ce5073c7deec19439792dfeb08d808afe850bebae +Qx = 155831e6a962f9321fea3c8bcd8ab06559cea3db4b88f702e5980b1fc3a +Qy = 0d4fbefe427565cc8424a33ddb0cd773c2c30e276400e93759875bfae6f +R = 011e76e35c036c23a7c9ae16d20d366eeb08bead606c6c49a8b62156e2a +S = 099b96b5f5730cdc90294ddd9da65356bcb1800f1149a78495cfffbc78e +Result = F (4 - Q changed) + +Msg = 6fea571b21095c6b3a31f4f07f3fa3c0c05834e450e98c3ebf1eeb2a9dc0b44b793c6d1f46a604bad953114ed652434e5ee7c4d573d786f0e3a0c499ed46637ea93ccf243b947f4087af0d8714293931978c41f2e664a1870bd054d017d963764fd4863a59095a48a4df954f1eee49f7f2d17d795594905f5b47bf97a2128079 +Qx = 1f50b2038ce4536421c03569f27565f473e5bb17195ee7035c84c878eff +Qy = 0462500017e0c991faa3d67bf0af3e8a6385cc8724bf792d4c31cee9408 +R = 02cda64a4c9c4fa59bd6b8d28f80e55706be4bea6fb358feb73b44fac8a +S = 0a3a256cd449827efd8bb97900287004fdcbe0e434f15fd046daef5f3e7 +Result = F (4 - Q changed) + +Msg = fc237728722d9fe8d6ffa9b6db965ddf1623c3f53a1cf58847b2a07f147b93076ea443b02f8c6d6f91b384ca74b41bb065d701182e1108c1160ad0aa2964213dd7a0f256e97404fb088b854467a68a3522100d92edac4435063769b2628a6d64aa189671ab5fda7acd21fac97110193ba8dd913f4e6a9809529369e09604838c +Qx = 09bc5423e4cc76e88ec52c1c87edc9e3e40948f956b465987556584b805 +Qy = 0083e3d67df6fd813065010c1ae7a711698e034c938daa897e4a18111fe +R = 024b588a198795e3fbfeeb0d7cfc32c97c6abe09941964a5a1c8939c7df +S = 05c0f4210dc5fa4fa0b25ab04aaa56bf0fb1dc84cd6af997856e0617cac +Result = F (4 - Q changed) + +Msg = 149b965f3ab1674d81c5c24471f31712164f842bc87d92cf3f53fe179d431f516aa1b3b22df3e622cd873c5c719663b12a94c4b8b0c0766cfd3fd4b1ca58a0bdf118f5016fb5acb3b1baffb5264537c339e370dc92574947a531a2598cddb687b0725c3b4061a73d22520a18af18bcb528d40297026fa26ac2f750115ef2cc35 +Qx = 1bb6566399b8e2cf455f9250d3761eccc3d1a37b998a3dc67421749df04 +Qy = 1351ee94abfe7697469b7c121e86f7afb4b5be100ebb2e6b2a010483bdd +R = 0b5b78b971fe2e53037c5b6ac6a90a9ef7735e7956bdb98a148978d1adc +S = 0bb4ff80b3b38caafd48b5ccc4ee140d9ec17f0c5f028b8d804d5394ca7 +Result = F (1 - Message changed) + +Msg = d3f769987aa7ea90f50a0a3858c672a40a46c2199b1efcf657fdd14f830408626e5d1924f18f7803edf65d90fdfd9f7762e08842dc9b70febf2f0d144765c94b1e175a931c84d99a14ef70ed65ca7d005ca3c59419188e2c5cad0a41394efed55fa85726a44394e065870a64d20b2037a45553ce1862cfa733c2743d3830f911 +Qx = 00942822bb7be5325e0f0cbffe69a379350e31a7fee9500d9d28cd6bf2c +Qy = 05901a92cb745dd6cdb76cd8c35cd6b4dfbab3457c82b1faa94d71e78ea +R = 00d170f9a44dbfeccb64b6b59c834765f4861ad40d7724a29267e36b64a +S = 0351946bde68c3be081bcb722a480b2b362960e94d9935035600b1aac58 +Result = P (0 ) + +Msg = d21e1bcbc007e087f0d0feb7ba101b540ba80538014192a733a0b416530be1b444f3ef791eeae4984b5dfde6fbfcef30b83a57b4e892d59db0df574049eab30965626899cf77bc1d1e57738b598b7a7c1e8ba0be6d9715dfe7c61124af4b196150616e6331fed3b9967d5748279b100a139c1e4a5f63648a11416a2742ce390e +Qx = 1f4b4cbb41d6740361daabd87a839506e88336aa632e8af1ae1f5e40fa2 +Qy = 18e4d984610b400d893fbcf5943a7998a1385e957f167c0f8e87c3f245b +R = 0b6e2504df1b50e0f5c9fbda515213e3a418a26b1025e517344f6f93eeb +S = 0aefcaf4e4ea6e9114666a92c9f8d5f4eecfa9ba4a04050c36bd916a79a +Result = F (3 - S changed) + +Msg = 46ee26fe1bd96f634e65344b6fd2a44408d8138a7b47b99f55a78bdbe67e8e4d006d54e32972d939362bf1b8cb292b22f691de05142aaf30f11d42a6268c7420576094b48b110816c5012908480be9f712254ace06eca523d387309a72fa153f66fbec3c6104f8cec3e2ff2aa9140889f374f4228563724f59cf09f675f0c796 +Qx = 0d1206f262fe54d3b755439edb90f1a255d1553e797941265fbeb899e0f +Qy = 0b610c46b025e7c492f72f5ba8f2317f50e1b271071be320186a5e7377a +R = 07826dc75442fee0df95ed0585a90dd9ab77e1cd71a46d1e60fe9725dc0 +S = 03e6de945914e07051b2a3a6a872896ecec85389d7fe6a84dc92dfd785f +Result = F (1 - Message changed) + +Msg = b4a89366074c924560ac597435aa9fddb2cac32fb64082e1d13cf26c39fc25194e4e4911fe9767e1321dee425d2e3e34f8cdb3e53aaa989a5d9b24463db4a6d9b4a795eaad237e661494d7332a0603b46126b28aaf38e191bf2b9f6b85086c5c65b741d7d39667c9afc58dddccbd706103b2635d6b5508758162f3fbce793b9b +Qx = 029790b11fda08399b2a2344605083bae47e245db1021d7a6222ee9c34c +Qy = 14626621fd310a7f30425a41fae66c5c6ca678c48f20049144fa19c95be +R = 00deefbea44d10b171986f843c66174717fcfc94dc30562bbb6ff04a094 +S = 02c3d81fb610aacb33398d3744e4d427be5c5c03d53d58f397b524e9b48 +Result = F (1 - Message changed) + +[B-233,SHA-384] + +Msg = 8d4d5b4480bf600f6f4f069428b540534ddbbe99476684c0b9e95214b870c8a956a2dcfe0d62b4d5e314f8f1db8e6021a37619f6cf338f11d5ee29a813727e0813a2b0a18e7caf1e11828250e7d9d04179090f6de8f2d0cf7519960658c05f6e13a1479f3543e4cf26029f572af0902a5f1a72bfaed1373a43ef601e339e2b7d +Qx = 048a5c8beb2c9f46e3db3e4c03a706ef08f875581e09d173f831d6c7a7a +Qy = 0a38906d60be8866fdb611be5e3d1263032bb0bdfcb312389f58ee6e043 +R = 0877e1b7f0a77ad6639dfbb65f37ea53527a3ae03dc3508366aa098d1cb +S = 07f5a1df84a6631c834eb5daa5de288667e824bd3c4ff075e1e6ab30752 +Result = F (3 - S changed) + +Msg = 91d68757fbd02af491752aa911b8ece157ed1e0b768c610435f903da3c831a10ee8cf6b1241243de6107fa253ac81100042ec745a600a7997e5414f2dccdb40ce0359827cd0cba9cca52eb5bba60f9ad988d04b3bb21533463f8648f9049d033951a8c989eed028da419c76b1330c0ae3b904b5292e9a3f82b880fa3f9e249f8 +Qx = 128bbe64650581535ccab9860c30024c26a71d345cac37f7eea0d001776 +Qy = 0eb4596da8a5b1b080ad590876f0006c991d656d896398dfc10915d911b +R = 06cdfe7877e9425e555082c7671b0b64c5920b2b6729dd49eb4ff502933 +S = 0c09b3e9c0fba03c1822341aedde08ab70dd13e1dd2b027cd4e6e7c76d4 +Result = F (4 - Q changed) + +Msg = 385e85c2e92133a2a5f591aed85ec739c484e551c18a3a989f0028331a57e5c8709db582c6fd666c10ab64804b6131dd280ac9e3013a1bc025f8aeae9e915b52be17196e2ccdd556edaa6f445b8f1174e4c1994788cc1f9005e0673ac660398f0e2f55f76da22df01e570b8041d45dab5d37fb3e75358f9acf709d0aae0a5497 +Qx = 068caf30607564d5fc0f6b9be1aef78efe4412f031640f84a595ff8572e +Qy = 07e538d22d10c522807aae9ee7240eff81f933256d803f69203ca102965 +R = 01d3f2d9970ed721236ef643d7eb299fc5ea5e3e5b7496b8663b9d9e5ee +S = 0a6cfa065ee6385a739e16eaad801eba75e7e0393d9acb1632d0af8e71a +Result = F (2 - R changed) + +Msg = bc14d4b95fbad65684e2c3f92de906648d5ef7f7f779a3563040fc9ca813d81079c2c0140904aaedb21f376e9581d101d801ea7d451042e2fb4360ff473746a950b6302dcb392640a9dbc1d5347ee333c651c0f25f76cda7c4e4f7706d84afb0cddee84d94e7ffac8d678b72cda8e082f36d7a59836c0d414dbbfeb3a0c2fa26 +Qx = 0b0875b543b76c90ffa8d5be9b2492cec2e918ebbb6301f5047b65fc608 +Qy = 0fda3417b4416fdb9f5bb3c9abed2876e6fdf38bff4b53ec06ac4b05378 +R = 0307ce2f97b73dfd06e7a219450fd3fda6f9de63934ad7c406a1285643d +S = 052980a81d6f55af9cf28ba8e8db99298b2e08f65bdea107c683f42d8b1 +Result = P (0 ) + +Msg = 9f75e0f86dc66ac66c76ff33a28efc866ae54cc308164841e07264f8cac6e39acf4cb05e61f39804847047aa06283bccf3941a9a265f00026062c7be17414a761931d84134068503aae18be5876f24c6f30832cb7c583c22bf06cd0f823547d633a89a773528ad665e4779f4b72de384aba9b951e5f7a8274ea586fff7aa69a0 +Qx = 0a93cb5b35d36fd65dba88db02e236a77db4d65aca3c80fcc16312258b2 +Qy = 0820bebb70aa571e5a70c861862aeac17dc5de75ef93654b2dbe0944d4c +R = 09ef6d4caf5cb0d65aec443bcd3b9679b254b7ec43c593f7bea444a3923 +S = 09c3f0669377dfdcaca274387bd5323756da1701723065e718a0a5c05eb +Result = F (2 - R changed) + +Msg = c3fe44f42e58d7127347904a4a36b37cc90bc5767559f54ac8434efcdcb023a8bb8deb2d5cc9c749ff4f3a31aff52cda42f7d4da6301863d97c27d2c4d159e2793ab93cb05de06ff53fdd1ace6aa8c3440558f7547f993d35a66d8e464c8ca29aa8d9ba0a111541b77d9d54d4ed597d045578f15f36a6c9003fe05ab762ccf78 +Qx = 1bb7c0eeac7136e3014ad778c661973d76b3b2c239ce08502d4abc136a2 +Qy = 1dd573e62e6cdfdf46e7c5ecf7042cc13ec70cf30e9f7378d1bbc270f3c +R = 0ebf3a897d71b3f537cd9a20447ded371a491d37b7fce45e0dabdb82e73 +S = 086098ce635cd93f5e001d2fbc3075ab4aa24ac2daaf75a78ddbd1bd4fa +Result = P (0 ) + +Msg = 7cdb24ff860d3e2f5c2abe3ecb8e80a8834bc8b0df0c35919a568a620d584b8a1b4a15a80c21ba226bd7e1e3c993a2dc3545993de30fa94e4e66263659adf9b621bd3bbfde7e73697ade6ceb4b66db081a3142003f84cbad790a759f1e8b0dc984cf9244a7b27c4efe68f1c1b4053acf1acf296f07c912711d7ef04560c129b1 +Qx = 0d1d8188e4b0b51c4680c183c63142b5d51a2119f4c5bb41f64dac18c71 +Qy = 0acb8ecc4f438a045da20d26afc1c593d1349865e34e36a4ba00ef3bf14 +R = 01a28ae24a1109ec841b38ff6ee065b65ce1f6dfb7f8c320a347c66834a +S = 04fdeee6189bc3b50645e498182f801a9e2077f208638af639863957c0b +Result = F (3 - S changed) + +Msg = b60cce2a8dc19e7a6f6596c7995ebad272d41a6eca574ca59073fc02c63327852e00fdbf6dc4f4a35f7e8bc666da6699d6a673a48221689df443f8d038cd16c8591888beb5a8a0e67cbc21f75edead54a1e58b41a94e8872f670f86535d2195fae135cec04163ef8b54b6447852f63ee93fdc807c228869923770936cc08f0ce +Qx = 1e27168d90e74e65572d088bc6ff63e6fda30451799b1cf1003c591e3a8 +Qy = 149ac866dde4b412653a960f08f58e5961cd9f7820421e9093ed01c8de2 +R = 0459bc46e2d9fb2cfb79ea217b0e1c4f48507bebd71fdde14946b87dfd3 +S = 09c0a8c33c5b6556c58787da1118922a2d36fc96dca18d2710b2b5b45ae +Result = P (0 ) + +Msg = 0f916d43642a8a858a9e01329cf2440521adee2d9928a6dec989e16831b070a2f32ebb190c890eae28befbafe26c1fd99750932b44b9a6fcad4d959960cc42ca9e0780baac4e6ecc29e5d4fdb71157ea32e28d54afad50d168626a687716e50ff56edd9a4e7e88ee387eb6df5d12da690844fddb0ee743d19c207e9f3b138e6e +Qx = 109e868a6d588bd21834ae591adcdf95f0253ebcf1e4f54fdede5eae0a1 +Qy = 06a3859600a30303655335df2e8850a89ab6350abd715427dad9dc9050f +R = 0633d3ea6fd06f355258321e549f630ea37f907a172929bc81c63e45320 +S = 0fab769c1f072f42877a4c2783863e222a029f1c241d53d15a9f9128588 +Result = F (3 - S changed) + +Msg = a89cabd94bec776ed2100ff753d651cb365d50e1d90185f9b278faffba316948958af55092dcd31cb294c02b5623099a1d014ca2a89476c832161309754252f74ad53162712fed36065110659be22b4a416aed8df0ad47fa07ae8aff198522c8d0f4b02d8047fd459abb57d7aa0b6dcf3ec524f6181eb68a04efa78597fc55ef +Qx = 064e3229b0f62bc9108ee5619e996761c6bb0f6cc9774e71efdc1e53012 +Qy = 1b2713b973f9c5b522dcd38ebbe65021d0b31f1ca230523287143d83ff5 +R = 0fbed8ddce993db52180bd21ca42aec4308cdb6f8971c0361f855246bc8 +S = 0f07eca9208c2878ea8915192c905bbcb7a09ef830dfcb5779298def221 +Result = F (1 - Message changed) + +Msg = 154da53af0487bf4d793c9271afb84ad157ede4e78aff3fe94ae308bc6e53209419be51917b05efa19d3dfe8a748f974a529d1f1566118bee84b4e2fa329b3ea771eae32982d147af925e63943aebf7e648d200df70dbcb1880c945d55569ad354c80a0867e83e29f8d3a5edc69290dec283a19c96e5ee4620f7aa013d0ea168 +Qx = 1bf0c16fc313df5334fbf7319f8a182297e774a422b60441aa4f088d8ee +Qy = 1ed9d14b9e0f35c264ef78333ed2123fb4d1cb1fcffb732c830f2671773 +R = 0002f5dba7fbe135f45b947058d1ba4cb961ca5c9a91425bcd3d68f1fae +S = 0104b5a4326c33c208817ecbaf578453a20051025505c1366202fd1269f +Result = F (4 - Q changed) + +Msg = acc7bcbaed4c2f507e15255a36c0dd4ad05fe0254f4d8078eabecf1062c0c11d29a8edf70ba6d31644d5aadd1e14844eb18a99de9a02bc25fe3502438a3d9fd84011ddb0a010b872ff70c540ba39479f3ed2bbd00dbd664f8fe10350b9a3e6c3f968a65a2a71706682d9246228164e77ed0642de1dfdfaf86775c6a4b1a1ea45 +Qx = 091fb85e4bb07934fb9d9764824bb7b21b6339342b34f6fcd621fcb2dfe +Qy = 1e552e7415b5c40b618e399a9c31ba8e5ebeaa56d975b05b01ed8749823 +R = 09cbba60299c72a2074aa6c945ed51964cdc0b03582d305b45118358536 +S = 0408267e47edf65200c4d6ba95de6a09cb2f033f38d67030163ee9161c2 +Result = F (1 - Message changed) + +Msg = d8dd68c55f072151cc832486093bd93ce8419f61269e4c696201693f109e1d725c81b712c9afbd41e814049a552ce3c2b9a6d070445f9179362639c76efa2be633a4d0404547011516e1b0694dd9204e1d5f9cd3f3a1c2b1bb943c8d335aae9eb6bc8fe751f3280b2dfe568ab6a1a3070dec7c9f28b9bb879f7103cf66fb0e3a +Qx = 1f3907fbb5a8c615af6962389afc86d1c9791ab630a9544ba04522b613c +Qy = 1a8c260cc3b1b7a2041763c6dc8bdd60db386eb65683499041e0b4886dd +R = 0265c4087828ce031cab67f5f77c5963ff97750d190501657d8d9d0cddd +S = 09160d47a2fb24f21396dc4110238c58bd6ee2b032dfe64699e9f7f4cd0 +Result = F (2 - R changed) + +Msg = c14edb2d79f93bbcc22b89759cfbccfb9d0052a20208195245e6e2a7466100806d7ed97e6821f7c77dc1bd2c026324a21aad4dac8d751361a25916727d042a245d873058ce0a2b3d2fb4d53119bc6bfe25d062d19f28c2251b2d40a1c255a01b32133713f39ce57304924bb115aa1a313886c391e167ec1231828455c8f5e3d9 +Qx = 021871e59b3cc0d90bbc5a447e815de2b0010ca9544c1bb389dbcd4fe74 +Qy = 1bbc21ee4cd7d290257b57f91adef2891afadc327d34f5144acb7dad4be +R = 035992165f2c64991383fa1141a9b6ffd15e68b5ab2067284e198319c97 +S = 08f04a839bc3b33b1378090b0c371c3acffea2b4dd462ca43ce75fc4009 +Result = F (4 - Q changed) + +Msg = 27c332abac3675adc39163f1c37b4a53fe156108b36b44b6f41e4077105821987b0b6bf592c0f77a8f042b4d29122ee01889f7d25861f9199d047efdd617ed0598179b768072fee43c8ef1891ec898b72bce986e98a3495e0776e28d714f1ea1ddcf919ac20fff105a57362551c0a2fe4d8cb359c32ae5f8d609b719bee643f4 +Qx = 16b797c6b2481fb8807e4f40ca6c7b3b4a348220ee9248a5eaca4567f82 +Qy = 0b813efe0225dd57105212c75612c7300bfbf3f7fbd6e3d84636ad963b8 +R = 0b508a4e1a1ad16e6a67db96ee4bf8e3f337cbfc2fbeaed280ebd1f936f +S = 0939032b77a16ce8c6fed3611ec3d2c9a42abf9bfcfc737863c0685a3c2 +Result = F (1 - Message changed) + +[B-233,SHA-512] + +Msg = 7861570574cca866a7452debc199dbc8e5841388396194006dc1a55991a9156d1cc512454efa8b30fa29daf080ce964fa2b4c7f35f7a975f069a3b43edee373f07f2a9da5d71594072906c992a7eea6e37f2388838506c7785c1f955d6715e596f307d103b544caf58e8c71c604b57e30fa9e02a2e0c5cab600e6f490e47e22c +Qx = 1cc73412ef5ee9bb62a4ceaa61f0b0ec3738c1b9bb6eb749f1a9eb92993 +Qy = 059b8d5a98defd8c812a6e20fc89b7aaf840aa2f3c2661e24c0a7713b65 +R = 0d40b25aac8d97260e3689e766e9cb3470c757982a1c7cfb4fec2432711 +S = 0a2ab64ddda5582e3c2a0d100b45013500a30a2f9b0092cf9f208e1ac1c +Result = F (1 - Message changed) + +Msg = 0f5941da2b9f8115263a3e332bf013e3e11829c9f2bbedfb6ade3e052785a9e351b7e5e723d2739cab124e0acc86c2d44f32ceb7bdc76dcf3511a69be316ea7de78b2b0298de974e3feb23e0963890b0e0e5a874642ec22a055d9daa9256b19ccb00519add7218fcf97ce6582b0348a653e9ea048f68cb0f542baf7e545d005c +Qx = 0fe994b1583eb56dc1df2fdf459547c99bdb61a212df5d9ca4de61ff4f4 +Qy = 0a1fc56a6155a7bd09552cbabc479fe0e495d762c79a1226686f270e4d3 +R = 0bd32bf317349c976028bd6fa335edbce25459c88de0e4295c913885cf1 +S = 0e74d27fc5f99ce24ae02d088fff249ad681aec823d6c72f6caa3f62b1e +Result = P (0 ) + +Msg = ae8e3a0e7e0cbbe33d8ee50514fb7f624b125b4be37534fce1b916a206772efbeb3e5ccaf69692a5e09fe277a9097a65b2e8a2c1fa067e2b1387c885da9b364ad3e488eddd29cf104fbffe025f0f9e1cdfffaa5dbd795286d83e3adfb91ba5512d78a1a5777918f5d268ca74db18e6339f3d597c5221fbffbf313c9df15dfcbb +Qx = 08076abb3559bcaf54f42de0c5987fe999f02147607a7ac53b4099d917f +Qy = 1d4bef325785dca546660629c29b0e07f9ffcecd287ec7cdee0afddc42e +R = 09c531bfc87bf74d09af6808886fc14885be7818b6ce6a9a8636180cc12 +S = 09ba74446f4505abc59324b8aa752c6e7c7c34c3ec6077b1df19ca4c378 +Result = F (3 - S changed) + +Msg = e884102e08cc78a1e5fc5feb2afe701e5bb32fea061b82a5e27ce07365b9fb6f31bd84f0a6cfc4ded99657a825f2718f6c13662cb11111dabedea271d2f090d57c37102aa2e75baa91bdfeeca65c49757ed23bad4884ef339b940c6b4a2b6ab801bd902524851a4461a17f9ea6dd62af16a3e0ffbffc9bd05632a8bb3478eb8a +Qx = 151151d61510ef23a9c206cc8451bff1c71f39358b7c62c7eab82b9795f +Qy = 02fef05a5d45b49aa521a9aff9cfaf432a44a0c819682c016a2a21d8478 +R = 0b3fd7aaf49f7440bf925fcf3342f86b265fd923c27b5ef64b15368c150 +S = 073d0a1abe05ab0e0c281a0e124ef4dbf0055927bb7fdc994bf0ee052a5 +Result = F (2 - R changed) + +Msg = af05b2686ebbc573f982be8dc5e3527be761d47359893741f02ff46de5544675eb4e542c28040488358e19ef4e2e489c640d8463c91f17e32feea8f3f6f55fee2dc2eff1bb246e2e37d7685e86effb5dbfc1f10cdf93d910373fc182842cab6e539944ac15fc8e9337d9d48e74424b63820f16c197dcb2a2a5bcb52416d4eb1b +Qx = 0767383883792211bc119e6f123c6a82d51fb811b96b08e91920d0bc0a7 +Qy = 02aad93f3db7d799e321d879bdeb2ce6e7008edb33442d54f91c6a10f26 +R = 07e7d1ec464751acf817213c24f9d967a5ab99ec34195ab9f7c9aab37a6 +S = 09c377f88e2ca3af7fbeed1a88428d58acca00043fba4f6679d8f8036f4 +Result = F (4 - Q changed) + +Msg = c04128ac25d88a23a578b988b26f6602d4bec68ffb860995a714f9f52751b9d1b2301588e72f49cea9a4b94a4fff8e0249af7354ee3b82a67cb72a55fb9463c5939ba92217bb218a5523fe90dbbfdc3122b8ab40b42960a36122f8cd963b0ca599485dddb4f2fd24983ae51cf0204385540e1f81064b7e23769ca3eba1915c29 +Qx = 055c90aa63841bd7f635dd0d323bbc05a0028852c7f7ca07ab1af0547e1 +Qy = 0cd81aa8a2da6e561dbda0e86a8fbf256b501f4729dcc945fab3600c093 +R = 02becef30ebb2e9c3dc2f8071dcad61a6d2e4c4fa2da7629e78c91e310c +S = 0baef1a1f4044660ac0f06030b5eed3023fb1a115338a850e002ecc7cbf +Result = F (4 - Q changed) + +Msg = d4810f16002f09de55f44133e53532df34c985d8efc260d4f1a35f148b3441fcb2dd1028e2b6883cd5275e2510c566a0b1045c985001d83c1af34b2cea5b60213c11d8b4914a5247c8c83bb348fe8ade111c251fc237fccf06aa5064a5417f2a6e3c7d0130e0a965a57d81888cd9afea93549fefa63b277d1bfa2fed82547df0 +Qx = 1eca3eef311a8bf4ddf0321066ce437e75384b6418d4bb2ceb104201cf5 +Qy = 02bdfa2ed5fef7ee8fadcf3689a84bf2e79132cf2ee4da1296471cef30e +R = 083970b205b8ae9335ed4d2024bb51d63538cf9487715f7e3be12188e07 +S = 0e77ad1b663688ea793752e4b2025828436c1b650fb7b45a33fdd331e30 +Result = F (2 - R changed) + +Msg = 9e7c707a94006c81aeab34e6354a03259b57574cc4a32189a37f3fc3d60dd9aead74297ae1220e4d183489a5dd7d904db3e29d15175e1e8e89e7e4033711ad908aa8baea255be589f3196bb0c30eced84ea8727954ef80458d4d708b8dca0ecadab58b7bd18e65c84ac988aaee5e377746a82cf142faa9473728bc9e02a4be78 +Qx = 1983d4d7760a953a2316fe2cc1a420a26b213cf0cf3d5617c2093d9eb5d +Qy = 0d18de34082f025dad15c77999f8e2dea9a4592cf8bb21931de81095bac +R = 0f668fcfa17a9e49a054eaa97e9ddea5586d1c33f14560caed208a592e9 +S = 00c3b3e5974f66e0731fcc166e63df5ce41c02a678a8b5c19e5dce1c7c3 +Result = F (2 - R changed) + +Msg = 42576e118c64583dcfda31ce2d586cd673cf87684fe588b999ffe35dcb144f10247fbbfbb2af65a6ec22c9045aa0f7d7cdd4c3a012a7fa9451ef71e9de409bc1182d79f8787715bbbebefafccbf2c945ee979336d368c002c0ae4e017ebe4e23d30bc5360bc5c4c56dea6106bb7d12c0b1877f4a4a5148dac4dd7e50565b5257 +Qx = 0675382277849b6ec61bcef8b834680979cec2ce3c2988db0f3eba601d2 +Qy = 000b6674698adc29d6f84ffe2b8608b9b53086ae25eb0b5b5cc9717b61e +R = 08b9a5f1c89aa47faf4b1c18f4b7b8ad1896f56564c21e0031d8330973c +S = 0529d8fd216c23ab98896154a8bb7d5e57370173c92360765770dd6bb57 +Result = F (4 - Q changed) + +Msg = 7d3263ac9b2e5d62fdf0540944f46366e80fd3742233ff1638bfb9d4924189c30d2b405256abf6887437dd111bdae0c18e7147ecafce88efbc87111eda2b803a4c02221139068672f50eb152fdea0ab51ac6ec8f6c0edda070be28f246f94b9042f305fe4fd766db9928b69a992874b72d36938ef65dcd29b328db610bfe5ed3 +Qx = 05e2328a93bfd7e2bfce5ce216a4283997588a6966b747df1a1785f2d80 +Qy = 1de7f72ae87bd7a4da66114f40e9dcd37362c5d9a70371172316d8db402 +R = 0c8eb205d8a3c6a5d91d13cdcf9f9db16e244b93f075a0736256a630e5c +S = 0248f46ec8ad63bb493ca2b4bd0dd32a7372aabe9bd337cf61365606401 +Result = F (3 - S changed) + +Msg = d28f9c7f44c68f6db7a07a9b63219408ab526c066ee0c49526da76514883433e846d6e69c617c16d1cac1133378f10d09f1b7cda2a12198de7430533c1851b93786b992746c190f84c9125e0372ae15f2fafe20f823b0c9d1aaa111b00322435c9428d1fef4ac0f27ff15f3cc646e58ef4456cc0536683d0cdb9284f9dbd5b59 +Qx = 0b6d3cfa7464d76693596775853b2cbbcf927840ccf4d21987eab1ce476 +Qy = 1bc60d1683f49a1517fd005a390fbbbcc39d4c624386dd2fec1d8933c57 +R = 0d3484a36bf916430aedf37988a41d2bdc9703f22424e322f6385a4cb8f +S = 021c6a2923ad4ceeecec232075ac891260c9e7246aae1606009a18ede8b +Result = P (0 ) + +Msg = 86ef8706138fc8c8557131259ef400c6e7d01e115cbbe0a15185a59bdfd7060fdfe2593932d93dcd60d1def931200f4eee38c43395586dd49530e2dbd73d0712da9641de5dca4c0150333df73bbddd32eeb8cf5007b2f055d6700befa303b14c549835982fd154778c813da3384d7b4f88e3facff7930634f29d6f408a45d3f7 +Qx = 16c59b7b3dac7e0a5891c3dc98016c60f8b837188d3f667b47881e8e601 +Qy = 1baeedca9003ac7052f1ae73c598b26dd9c3571db762027a583957aa763 +R = 0a844818b446c83779148c275e84a73c41e88582cf0930bbea1ce7c32b4 +S = 09a30bd8772dcb70f770f2fb8be1f748eb2c5f5e1051ffed4840f47be4a +Result = F (1 - Message changed) + +Msg = cc4cf5eb34dc920887bde3353d17de36489cb06fe4cc84252b43313c996aa2f0a007237d386bdbebea5a25241ea31412e620cccc9c62e78b3d8c1869c42a851a3796848e18ac42f9f278054d8088726a65931b52e9b0649cbf1a8cdaea8cacadd848f5c36804c6bbcf4119112f9db932d03a71f5d2cd9f5dfda9c9562072b596 +Qx = 00466df5519321bac519359c1d28952b1d56661b12630c83e6513d1e7f2 +Qy = 1e01be832d0b5ed14d33a0a7a32d572d1e0a66cf5dc0963b501a59c6bfd +R = 018fedd7682ca1c28bcae7a274a5f23dcb78dc962a497d50a4df6e2ca1e +S = 0bdaab988678e5c4189f8b6c700bd2759631a26487733546fb4fa397ab9 +Result = F (3 - S changed) + +Msg = 38ec537319d27e9e40d8c42a13ebe06d06f7447ef3c39db660931e9828991d9ec38cd6e7d1995d680fd995648fb7e86e47b929c9b025bdba426eb1ae0859ad32d6db3772cb1ac8cd13a0a7e2eefa00f7a77873e7fae96d8a235fdc47729c68c54d1e18abe4d898a6100f097c5feee1c911552dc03d4664007b2a0b020e8565e6 +Qx = 0555d4e7eb25e6889443cd65f0c1e7242cb57c731b061d7c6c925d9d62d +Qy = 1439dd73d2ac5e6248f937f8dbbdea02840ea5be2d86bc9302bcc265f4c +R = 0221ece1642687516d9b20723e321492a760b11a45c7d5cad70f799cd50 +S = 0522a2efd7c5b653f92e09f5542d8c203737acde74420c354d962aa58e1 +Result = P (0 ) + +Msg = 69ae177179b01ab547801f301f80ad2f4ff4c61e26fde8b765cf32a556a8ba2f40c0dde9d5b67b71b29def8c373cd5ada775053b518c260d99524d8ba09c422a97947732487a4d3a6d607acfd4374516a4fe4ba1bf97dd415f39f3b776ad1fa046dbf0d7f3c403e366cd997352ba84928c849649c49f6b9420c73d2215eba08f +Qx = 0928a50e066c9d1aeeda3c26df31850ce02c2a58672c0fc2ac5d79e64bc +Qy = 0d6e6ebea59a1780071b569cdee762a4dc877e6078b2f2c165da21d8041 +R = 0d1f8a4240498fc3eefd558e1170fc7a6f0c54632d4d01ea02445c389d9 +S = 05cdde853dd35929179d9542da109ed91e466f1ab04f30e1d670358631d +Result = F (1 - Message changed) + +[B-283,SHA-1] + +Msg = 2330e0f276b091ea164ae54b123a0a0d48736980a149e713d768f11b5b444678d9303cf2d0dca570e22be1cc2ffd3dec6fc8faee763a88106ba5ae296bf27999202ad03e4dcaa3b0d5a592a7905f587e3c0469b4c14e55d3d4aa9d1e5f959c7df8def820adb91481bd31e8e0719267b9621513c177db0b5e2ca51dfafd43a149 +Qx = 20c60866cedae33974c82359f07a475b307f0a2f203d335dfe97abc2bbfa569e5489d1f +Qy = 055e921849703534ef06939e4b3a6959e94cc212e447e3f9606142c92d46257b9439da8 +R = 0780e5b0f35188c0b4c260255fb80df72911e7b166bc77ff219520ffebe0ca09e47f411 +S = 30a60b0fc3354023350613f0f840fb094ab110bf759b39cca618c1d70e7b347715676ac +Result = F (3 - S changed) + +Msg = 85718480653f26ac9f6359ee8bf37a55b879802007d8227e67a856ee2a86073d3a13fb987ab8162e6e3be87bffb09a40bbd08639f776f2805cf23f3022c14581d45bf27b035bb2d8c15d8d9702f29875cdf90755e209a1f850748207b0efc90dfcd41b083dad9ed4cd50ded8f818e41d3f3c73afcfd8845f84b8f68971054979 +Qx = 1103f59ec68b62590780386465b8abeb607deb6b9279632cf9c4e5eb4a410ba39e3ffd5 +Qy = 0066772c290f700b1392675c2ab453d5f804e3fb76f2a535bf10a0a456019f9dda991a6 +R = 3abcbc2b80d69f7006d9d0ea6062916a34a666ced800431b19e0972e784d3f9fd5bbc6f +S = 18b24afa7b04e70becd57a453d20a9ed5d23914eec86c5a3b780b2be1b842bcf4367bdb +Result = P (0 ) + +Msg = 8f7c80abe5bc058724d343fd9e09e3836a5815cb629bc8ab5723b0d9b52eb36df8f2b1c8b0da9fdb37e6a392098b1164a1c0dfc51c10c73ffc3e418283b0c2489c5422559235b444faa58b797eeb860a8d1f0432561e8265839b2d32e18fc5f2eddac3d8baba579b20bee10dfe2b75ab2169222acb5e10a40465ad5bcc104f04 +Qx = 6841707ae4aaf6db09b7b9824c29ac5ed340d173fcb7625abd679a9acedf9f59cd69303 +Qy = 2283fe0aa2335e7ef8affd942c370cb03b06cb0399af28c91a4e47e048611755425cd91 +R = 1e188367a3dcf45c479b776e050d1f17814bb15dcae5325c881a94bae441dde843a6c9e +S = 11cd337c977239f267c3d78f951bef500df2fda97e500b9038ab7512e83428d98fbf477 +Result = F (2 - R changed) + +Msg = 7a4f90e390a3382ee7d56cb38e29e640f0b0303b68c7d182b9aeb4c15e5326d84f9023cf2013efcf3838e7f0217bcf8bb8960b866ac1f565a705ac005b7dc143582cfee1cb3637c8ce46b9b2a2331502a8fdd2bce8b010894c863c51d1c06f46108f24064fdefb19f2b4e14bf1cc11d93ce8eaa8311dc81002b8f21c2694ac9c +Qx = 395f672634890336aa0849423870a6ac7871d9d504ac8c7642b055291e6aea10d9ebbca +Qy = 48703b08219de8ee8a6c3653ed581f04b8e3b58b7f90bf956c501c6238bf14c5b3490f6 +R = 0aba0068fe09e71a2551eaec72e9101e72b1f7697fa1c9432d72eb23fe5f8bbffb5eb8b +S = 1c77c6d588d04b9288f7f7e37dda2844d17ad2484c1208b8e31cff420b07fd91cc29367 +Result = F (1 - Message changed) + +Msg = 64faf311a3846a6e2b8ff9015d689b7e03e836dc708e970b17a5ee4d90462ce96765c5b1c1eb2e7976b4245580f5b1c12686f52fd3776d43f6af43d532a39f83bfcc8887b2c45732486d8ad7575197caae5a82026ad94124453fafbf9a5fad003faea6fa5a8b07d000fa6768532db32c2645cb611fb8ff39473eba909f7f5918 +Qx = 646618df90878e0cc097a7ca28757dfada00dedd06b1e3a9c9bbd21025fb2294ac26f63 +Qy = 48d293a93ff6abe371e131720c971fe4c0c42c1e1a0e4c23d31878b24db8d28aa0f031b +R = 21b2008d39f99e62011e3007ba70120d72399f7cd918c2befec73edaa996eda888fce8b +S = 07df09f95a14f3a7c0860f89da4ffda811b7e0ea0ce8ea55a67d75de31f4851c71526ce +Result = F (2 - R changed) + +Msg = 768a7fc33e4fa682bb97109232f651a03f8a718dab361f8c1c0bd65d3a575e98c0aca9288c151457b819a3573dfeb16ca4f2aa861c230a82d1525285b8e75d8a36dbce1750c07b1e4d964b19640c7164599855e5d1d7b5faf9dea1987eb54e3532151f84f79a2a4afe62bb55ab6c0a21f01cc9fe98deb5bb092c89b8ee8b40ae +Qx = 551e3fca50df3f00706d0048c0c784554039532bc63d70f38d7db969490fd238beab288 +Qy = 6c50ea43a35e9066e3494d5ad20e3b3b661273b38d336e3a710b4c763c7565b78a97d92 +R = 2111ff79df1defba76c7d472e31268a45edeb2d7d0f3960705f4ca18bd83b0a587f2a12 +S = 3bd16c5c7749f9dbb9cb132d813f37faf73356b52b4626756a717cff2e01ff98bc48bf6 +Result = F (3 - S changed) + +Msg = 19fceb719b751917201926f2775a8afbac4a867ebf5b3ea1c8a1e4f83e99294ab1c2e4fa9f929eaf2252949461903e3360e43a2dc49658c39be93aa707ea96ea7895f4353289f166f2a3dc8c3e85ae67f15d67078a1def4eb5e303bf23d5863b9d4496044de77c1354578694e39baf478479d136b2d6cd9755cf12fb2a5c03b5 +Qx = 336a65c8a332790bedb9d333e8a0b5eee95ff46665a846a9799042c9fccbd6b19cecf7e +Qy = 7eb05b7fef53359e2b21698dc648ec31852e36f6308809ac815047538d31e1d86f935e6 +R = 0424e4d33600b9c83b0699d3bd59b8e05f10f39d167452f90f8169761dfec334ab8d667 +S = 05b3b73b169741390fc68483ae1b487ad649b6008e43291afe5bb5a592323d9b61c2e5b +Result = F (1 - Message changed) + +Msg = 2dd1a4becdbf5b68e479dac00fe535ab79c815ca66f4b8e9d91ac929e5332110c363441a928506735e7c5717592f2d2efaf4cbfd0ac680b89fc74e8e8d7520a93645b68904f2d83abcb7050abf1f4a8d45b1952df109201cd1e8189e724e690ea3a5930727821e8d561a13831545732a1e3029c029aca243095936bdeb6bad63 +Qx = 11ca81662707f50ab806396b9c717df96f4b0b0281efbae6a8d4b8cff06d776c5a2e054 +Qy = 3537944a57684c6873731cd45a30a0478e1a170c30bd2784d44b1f56fcd3b7c5678e4b1 +R = 02ac18f8f4c965f3c5dd4dc90e3fe9344c4bf718fb32e0697d144684fa96f01506d48ae +S = 2fb7e3e878c0a014f308ed9ebd0466630fca2b1dda0a1fcfd6ae5f98b1b8f1a8babd448 +Result = F (4 - Q changed) + +Msg = 3f08ce153dae9c60b59e5193ea364e41ed2c9005bbb06ab6138a06f0488d836014cd975f6e6485d2c7a6cef54db2d51f49a363b72ae457d94bb15b2ce433e03f6f73ca27f0e74ed224fcb6bdf645364e3370999bc7cde1936cc47646465f185560be0f69bfa3668b2a348c2e7f4aec3093c0d1bee3bed5d1daf34b15ab3e2d6d +Qx = 14e9629a13844aca76c014bfce8c19359b5b9bb388a908c0cb205c5c950c0793877ae24 +Qy = 45a9008a97fbac2eab827cd790d92d6b6e24559e8eb92ea1cb57f840452a1d82b1a93e1 +R = 006f8ef4d6116f32f146ba02c1038a83ad074f386198e1d111105e9194d82b0635a9869 +S = 385e188a7771b4616ba999f938a6a03281caceaa39ad7870837d2aa5c37c7468f19f2c1 +Result = F (3 - S changed) + +Msg = 871fe523dc901a07310363931d3f5c64bee41634481a19c050954a95f446b9d467858dec40fcbf2c3701fae8e9720f769f8cdef37a65e361e6e2f8820e7049829e64ad03ddd793d59456d085b4554da2f1e5e5a1e30efbf221c0ce597d88d82ecea89328404af444f9c230e7c29889f864beb1fb0170d103d4e31db9e1d66e30 +Qx = 5cf8a5153fa4101ebc09669856973ff594fa3be22d95dd063496bcb3b05c37132e564fa +Qy = 3bd26a828c21b6b328466ac5a8db9338896131c0224f3c378e30978577f76b2e0c6b509 +R = 06558b3cf21fffcb5bbdcc487f8a386bc8bb909c137fab7421ddf86d003868536bfcc46 +S = 09d2b9c997357ba8d100fb430904efab999c8baf6a04c566db9f69a079d7153f231c6bc +Result = F (2 - R changed) + +Msg = dac254b0856e692ce2e5c0f931897166659cd5917ad1371b16e0403753cc880a8cdf65e4242738cd9da438affbff30f48e394b1fc2e02d841e1c2ddb56f5d9adcfff8071203de63fa1d94859c65ba99d5be5e861682210a699b348ecb06447e31f20af6679f344117be2fc674ececd29c9aa96ab5cea35a67ca32304101810f4 +Qx = 0116fb5959ca1f0b9efb63d291ea7736307e540fee06967a540c9c5e7a43019929da139 +Qy = 3f5d570bf385d1e2757c631b4cb1579cf0bbb3b031a8aec53ddb53ce73747447c7db390 +R = 3e208a35d93b4cc52b816fd4b68e6baa66b9e797adf810c43a7932fcc65bbebcb791e35 +S = 30a414b6b68d393f7656d1cd34903fe528b64b380bce4e95f850c48722c5a10333dda82 +Result = P (0 ) + +Msg = 54f8b4c90fb85ed335ceda974a02d541e4cde64ae5af46e4bf307b0571b547ee2ce49a54e31d3266371835c0111d866e81025f8e6246cf0db6e5230228a819c55095340d9a9e2e14d3eb945af8a11e7861d4f17c34389cc11b66ac026f9c530a50ac2333b2638b65d6609b11e69a0fd0f50df0bfbe84bb06e79e93ef8a496e68 +Qx = 38db616ea5069c75b2f62c5cebfde053ff8f00ebcb00b3e4c543b7ad60f63dee1c15e48 +Qy = 3aa742a74756b2b6632d820b9ef3715557df11f1366b6b32e2c1dd32f92c0392b61d762 +R = 0fc15abfc4876ae096c8c724b2055403d334b974cf179c86b9ec39bf87ff4d8a1005572 +S = 26a9076aa3366d7695ac680a7b5581b0f5e37d2bbfac4e68d5e9c671ba929cd41b53675 +Result = F (1 - Message changed) + +Msg = e17e33e5e2f9956202441ed1160a63d69bd596c085ba35678bfb70b35388108f05cca1feb862263df84deb470543af75f715877f1ef3b844e1e5e19c255235c47f7db2328ad7fcfc5f7b040f1a80efc0846770b4b786c8f433515180e9bbfe967e9efd6d04b7c68eee3c31b63d9b2bd983c4d301c89f7e9cb87edfe165e5798d +Qx = 68a92fb43abd0c82c0f448527d6afd3a930ce4d35a53d772ab18051e50d812c058824ac +Qy = 5345c824421867ffe87d7ba2370d39ed3aedb3a92753339befc1f6b61777b8714e822dd +R = 197ae1f39684651cf53aeb8f2b1ded319706e66ebb98eae15fc75b5a292094877537920 +S = 1c3882136b244d7208a4c35c459c098ba619ed3cc3edf2a7c35cb4e0513ae3ca304e075 +Result = F (4 - Q changed) + +Msg = ec53cfefae2ff9ae6bac370ba08fad0ca1fe145b8a1d5400787b5dd9443c429419ce0f8ba81b8c96239f1bdc1e9162a60c66289773afb16d1630be295ca829f3930a1ead10a0f85de3aca614996508b9d37cdf594a20ebbc983e6f8a6061f30fcfcc8694650fb320a41b7e264f680c3af6f7f7f835ea74af4a3d58b02dbc5cb1 +Qx = 6581e62861a6b6eff0cd4c3b2bc93326ee31e204009c67f4fb714c4d27c3a17c2693191 +Qy = 245ff59a6b538048f0b08b99a68699f0fb80ba3a51b6dba74cbe90ef7bf565c07301b4e +R = 0f38e318ebc4161afa5567d972de1575daa9c65dda27e8192aac3f25e06bcf64b421a68 +S = 0619df346b6b350805b71551a854722c80ac3b6056232240df50ba2477ce95e4476581f +Result = P (0 ) + +Msg = aceea63941c68f1317d24516aefd7214ffd301602284a9e45cc30a8f9b90b2280ba507a6f9f9e8072ecfd0dc2519d6a4ea905f5e067eaa30b485c7195a55a44938a22de127947d65c0b1d3b18a118db9162dcf85e8067d01d45145d7567918bf7e475ad213ecfc47f95c77ee3d7e86985076e2e3b788fde6dd7beffefd06d239 +Qx = 229102f7ba7fc7942958eeaee3fb9d1bbf998bff021aa9528e9b4f63829d23380d021a1 +Qy = 27a182456befcb5860ec9d7fe3b39e2ddf7f6c505934a5a6f5d312d8da55665cbdd2509 +R = 22e291d5e1289a1fa33ebe153e3feae9439fcd12ffd01f2e0366ee8944e4f6925da4eb9 +S = 32892cc530dae376c4a4fe56c26b71432d965199d13ad9b963087094b172155ae8fe876 +Result = F (4 - Q changed) + +[B-283,SHA-224] + +Msg = 0dd767308ccf801ec2f47369a947061b557a016a71d31cb2a38a00b4d1e82f920b25df8418c8c4aa3667d4fc4d70aa9433bc63536e500a9ab191a286b05fec722f453fa23d132509f13e357a46c80de324b8e3161f770e4919752f5fc9cbb717412124841248652fcbfc3abe27383cd6bca9817e0088ca6f15bfb5b9b9dc9a98 +Qx = 4fe80ad2063d61e1f0e160bc47b1587239c7e752728b053c0c5e266593adbf9d9dfe3ce +Qy = 1a487045a1d08f9590f8e427bd12237dc7d0599e15cc18a6e2aa8ee7e28120b2f5d9d2e +R = 13d187b0d12b1e72c55f556d1d4900cd44c4c09d3c5a0b89c9699a39b39032988a03a95 +S = 070e1f7e661ca6b255f9ccc148fdf815ed475eb70a8ee8c45ebbbb562db89a89cc55e55 +Result = P (0 ) + +Msg = 232eae9c4ef6a876ac648cad3057a7479a8ba34910e6b0a1d8a3bbcb5228179c73f31bab5705a4d73e9efebd83b58a14168b511ccd28c452fbacc41b9bd9c00132e7b67920a0be000c95ac4f5737be55f3f1f5eca44866b00b76afe8f7726fde6fd24e877ddee1aaa038c5d84ea105579e8a360affb25d70a7f684f95cd9c690 +Qx = 7d37991831e6a498c903678765fd3c3f5aedcff2515aa1e640b566218c1d36fe55608c1 +Qy = 1a8c8962aa50146d6af01746c08392e3cb1abf6324b32a66fd4a0d571860ce52bb7ad61 +R = 07903ce0d8b33d6bdb3a1cad5d0b8fff9d71d2e21e05897a33a62cc004c6c27afdfc6aa +S = 17bd7587de265fbb65415a5cdc5084c275cd51048b98269c8ac5aa5d642a2c37971cbf3 +Result = F (2 - R changed) + +Msg = 8b461bb79ea2157425e73e02e27de331fac2a6bdaa4cb27cae8715b0986ff95f3ea1d3b3619db835774f21cbc3a2448fcf18188fac10af29c18ae91567e0848c9307d7f982325de8c9f62181058d762d2e3284b603d6d786a2664cd54c742de4d07debbe8d9d61def6ce58747f4e17b8a2163bc0c3738c769f02e8be4a420bf8 +Qx = 1953a05c75e5abd743f3072436aff1c9ba5afcbd2130a37c2cf7b8dd79bb84034d4cf41 +Qy = 253ce1bb02d7b3cc000915ba029d9087b5498194153abbe855a669466f20934da55f0ba +R = 3932916b41ece83900d95f153ecf1ff1d314199ed854e34b7b77118bbf46d03d7cf5c45 +S = 372cc3cb9d47890b60603aaad010ddf85fe0ad885fbf19b3e22a9843bab30456e58c590 +Result = F (2 - R changed) + +Msg = e5935c2389dc8eb6dd66956f9748f94355062543c0f590e4504dd896dc3dc1220624a1af8cf3f54ab0532600f7a110d1f89b9be155557837bf792360df0dbdef16b0f70ddbd2c64cc0f492dd83634ddbaafbe435e61647fc334875e87653de2c5cfe9b8a3a7fea4c336507eb0086d8c6386217bbbf322c6973f7d956fce7bef9 +Qx = 25c245c06fe462fd06705cb42fbb5f027ae9ff79d86669cf125376f4f38fafd939ceedd +Qy = 632adf476bd68cfc6ce28927da3062ea95032bae9cbae501b078e5b11c6a86d052828c0 +R = 3e43f501039c20d78d0cb014eeb403a37d7560565a9d560dd1bec74142c712ae8d41348 +S = 29fdbb659ae300b76cdf7777410d49e8f260bfe3fbff8567cb95545bd467fb289c4427f +Result = F (1 - Message changed) + +Msg = 62239b7ce4c645682d65d7a830509aac5d841283ecad956d183d92683f4ec5a90afad5ea48a8787f52653c270e83c0771d7347b8c84d179dcd3ce87d8d7dc72394b5d54c9dfd6a39f172c8e99fe8e769cb0844e67ed300e810ac045e74aebb5fe8da6a57e6a3e5b91e487507c4458bd4c7f69e931d397c95ee5cfd065907f9d3 +Qx = 6f53635ea33bc3b19b130b33e0cae43cc23f62bcd02f6d6bad942d4ae907072acfdefd7 +Qy = 1bed7e1f61ec1ae56227f2888fa3c74ccdf057b09a010091640f3d3a8ee686d986640f4 +R = 36c6b2439d46b9807a43fbdf40efce6237c03acacbe3646fae34a552a07565dd0b3e349 +S = 3a59e45c32cd73d988a9f79a10d8fee69d4adbdf36c4b69c322764c4428be54d612eb19 +Result = F (1 - Message changed) + +Msg = e47b3132da51b40f6289525159777d35dc46aacedb1266ac2c631cf6997fc4bd5642500e6b8256d8f2cf90da39f199e5d6ffbce97d29ff87e494107331ebfb8f2574ebe7b01fe802d939d7ae0613685f4084c8e3cecd7453fe8d75dec5933f1151ba3eca6e9d7757df11241578d31120d71b7c46ec74cd04a1a3710280cb91ad +Qx = 5beb2de53def238ad495c84a72166107914606bc508d5c81d4e50aadbb7da7c76f3f9b8 +Qy = 00973f417f672e0a8305665f1aa727f5a90de4e77e62fc18aa80b988f148874cb954e53 +R = 399fc0d8030205035262ccad9f40badff7cef5c368202a3b463c4773d1c056083cb890b +S = 25ab4e66374358b38f48b470530114255ba1e5da7b3c320c2b8d9c147c04049c77dc471 +Result = F (3 - S changed) + +Msg = dc880def1ca8069faf68bda88287d7e174d2b9633519185e6395c83d22c512009c2a42f8951d1ba98295ace53ea0c865e1d3fe39b65ff76b459020ce88b807aa3de486e42cee59d25e9f1fe4af7b70d87238b1b092fae69d92213b6c7439fab292a835d3d769fff611872873bc844198a8e82674b7f99b1dc49f32eeeda140a3 +Qx = 0952a8991a782a1bee4ee03e068985cf98345ab4cf1733f294698f9001be85447161f5f +Qy = 6fb7d4f06dc9c9a2a6f130c0917c61e30b24eaac3e9b5a40b4145f8ea202bcdff912094 +R = 32d3b0e4270098d167c387e9f85a48ff86f28295794664b7738242e6c07369fbecb5f79 +S = 1c1505e4911e0cb36fd473b4938d32c26413426265a4742e00b3585d61b63a643320e24 +Result = F (4 - Q changed) + +Msg = d87a4b312a6b3c02e84ec59a1b146d28f58fc914af07b631a55d01e22d29c4039f4c27a88c8cd416820d5b43b64340fdc4d5f8cf33179f52514f5c99300e26dba2ef62d1ffb9b6b055facd3f8812e2138612d5ed6d327a47098be37100d553b79f75e0077c27bb94a0274265c3e62090eb7fb2396145c117500ae4f9fd05cb55 +Qx = 6b3b7b8555bd3fa0ac4b11793b2c89b6e4b34abcf7541cf48d85377dd854e5b77448018 +Qy = 16e3854caa9e11d8907f92c1c4a36df08eb642693cedbe34a8d9c544b6ef65b22cc0f71 +R = 30cf4c508940cef07bfeba616f3e752c93ff7754a3e2f288f2e7379258ba402ea78b3c3 +S = 3b0d752ea3f703ab2046166d3519dc05fa1fc01d061711a06de759968f21dea563dc5ca +Result = P (0 ) + +Msg = 1a0cbe202d1694284c33217eec24fbe8d9c528ee346f3c4cc04f7c632bba1212dacabf5fcb665b49f255d8a300c31f501b1e19dad437d19d7be28e6df961b8eb905ea3e6f17d05094ea32b081c4327e0ccc5b76ab8112ad723c1e125391efd72571447af4e9a5b5ec92febc4918532d05b39d8f15813d2ea00ae179845082a81 +Qx = 2cf1b71ff037631e77ee4a6348d53cf7cf7defe9d92070d68257d80c0121eac4cb9b011 +Qy = 00fe74925b64f64f47ff7f56f17d494804619ca46bf47200a548dc112659973ca448b60 +R = 361765d8f61a47d8e00159a18431f9b29d9ec5424027b64d1fbd0e6d9efaf25d8dba9a9 +S = 37d7e179908192644b801c1c639cb2abe5484d7553585b71cc22eb5be1c004d6d13b1e5 +Result = F (3 - S changed) + +Msg = e549a4c90ddd2c4484d5a5d7ef014de108f9d5bad038c866f759442426b08ef1c4b52e3a2331362a4b7a65b5664eb2b2fe376be3935f19b2c799338577e9e80030f5bc5087156fc0242bacd2edaa2b5db58c23a096b1eba29ccfe0e36e97f19d647a5748134d00b485f0d62b902da9f1d3eb532ec77351316bb2dd3a2d1caca6 +Qx = 2cbf311d011dd20c7619c61bdbca06ab6490a567d455db264c4f1e29005d31bceebe3a8 +Qy = 54093852a1b57df1d690a66c1c7a9f7624e908fced1991626ea2a665dd56b83d5e64cbf +R = 2905007ce59f216fd06d89cbb50efa3c44d3753cd5f5d73696bd1e4558da213e811829d +S = 1b5fe4b24bef35d0ad982ff434cf1510ac11ed14f0f52e488f69443c4a84c9cd51b317a +Result = F (3 - S changed) + +Msg = d3b98a8375042487ee8a34a84c011f4afe2345c7b6d45fac22932bf42831d16f6afa72d433b6b0857d0015a2988635f86cf90119240537053cb893ef200ed8a5ae457ff47d97d3ec97d0beea2c9e14a2b79ac38f87dc1383ecae740423340ef48886ac453e9e9004d233d20472cbd3075db85d27447bc69a7bd1af1bfe476a9a +Qx = 522af09657ab212c6e5fb54dd0c78bcaaeac381762ccb163100b1c1397daa47c7544d9a +Qy = 1f212d2b88e08535d89d75e16c1c966ef66b13675cc47d7d44306f362456fa19ad9ed30 +R = 3c868b0de0cd5273bcec0e9c2389466ce5d64b5e9f680a0d88b9d3e2adfd70463ddf8a4 +S = 2572c096e42b73dbc43490ee340192b999212abc506e51c398b0401fc902743710acf3d +Result = F (4 - Q changed) + +Msg = 6e89559a324d357ca94b9f5c6aeb19242f8f9bd4b685769da58da2aa3365fb4ba8ac7fd38a44fdaeca1cf91bd2ec391d2ae9101c13c324a889528cb4de1a4a5c0fa13b617c43d2bb107dad6b7ee9eb74ce8baa85e9915531a9b5d021ff88a781256bc15bb2e13071d52f909b6310329b75cee8f3866f8721cc0d5c671c30852e +Qx = 15acd6b7d702e30525eff0019a7dd914addb5b587f92148ffd5c093a09c7f5858d1b5a6 +Qy = 486b3c4be893b13ec566ccaf0e47ac6c9ffdd22136607f86efc1b52f8b2d2fd0723b16c +R = 3adeb83126621f06453b2a3db66177a2d4ee2551c0b4868b1e16b0f9a4fccb2ffc3064b +S = 3eb959c16bed98a025323a24110e8ce92f8d9e7402333c845d3dcc108fe521f6fae48ef +Result = F (4 - Q changed) + +Msg = ad524aacf0c5ffb941c9e95c43664f557ee85471766ad07c8a211c8555715edfe57491b83b0176d7943da8b1f01a4ffbd2561875798c1275d72a0c669bbff61d740782bb7c4aab4468d8c4d5f481e43b201bc6e4dc4f13228e9d46044061c2609e4ff38086598b7dba6db32e1b05d9f5aea1453a234758c9e06a97abdad64878 +Qx = 5d65c31aaccdaa1c59e11e9f8220efac7ec63cfcf9deef939b380bc23d8d05a79a556af +Qy = 6be9b5f0c642b518f2c6108073d2acbef804e96752b6cca453514b8610ce09d2822e4ce +R = 38e9e684ff5d36ad0d728f047c3f15bb54ffa0ef278e480a666f1b1dd13e5e4dd67b911 +S = 342101bf540cb8594ab0f09c2a036a12cb8faf1ec866bbbdcd9231fd5875693b2174e42 +Result = P (0 ) + +Msg = 86c5a7d5bbafb154ebcdb2cb1f273de430255bb33df5d8dade71f891d8980ead16a54e934317c1ff59979147e6f24dc97206bf8dde85b87afead663f98f5f41800e0ce7b57301117657fc7602fdbcf9eb20f0067e70f953b0f87d7736f1fc2ab4a3fde9829e46d48930510ecd28a3c0ad69afc4963d4bc8449661549414f9763 +Qx = 71f6c5d7a1e58a377dacafe30637583e7e4e0dde7a4e105836bbd8f8db92bc00f4e8a17 +Qy = 7c9fe390e370560aac86a4fe663904e3f9b20e85980dfd0ac226ecd076ecf4e15f4e593 +R = 124d0db4c170e12900fb63d9155993cc89d82af3157683a0fc6838408104d1b34070215 +S = 1e396b6854c5dc16d914caafe5e4f5191f1c0e478cc9fde2712314c5b36b5350d2a9bfd +Result = F (2 - R changed) + +Msg = 16e74feb56a3604b61dc56036df5a4cc82ec6a9d75084eda881e0c163fb463fc2614f8d412644f25ca818a016e5d18c6edea0cc4a97af9ab9d6b9dd23cfe95fea09fd0989cf4919650c706faad0f4c998627b793a59e704b1b419074331e572cbde2429a40cce3200b77717fc5d8fc1f135691fd43688ec9318ee43ccbaf22ce +Qx = 524e7aa93df1ae5f6471789da5d7484dc7033289e26468d9ff33be38d13e469ec4d7a60 +Qy = 07e4622fb725d388600f5baef2dd3262f731b8b83a9155909a8e7a9f6e8e65f8e59c092 +R = 14f64f7ce645b5829615dce94b3de9efeb04d0a6a69af6bc17f5708d2664b4ac1544c7b +S = 334e6c6f3d8bc3b1bcf6897406be2d4212567915aa6708b25e0d75b1a9de56d6a8f1f29 +Result = F (1 - Message changed) + +[B-283,SHA-256] + +Msg = d2b50c380d65ae3a7d51dce08879158893e211fd1dfff9257e0fc665510e97a665233889f052d2951545f26540884bbcfb9604c677c2ec19db0695911859ed96479605ba51f7354018f2e4a75dddaada8bbc24bf0fa992532f2a369a1b8c63b13dc696a5c1fe656786a06554d4a5e0901d0f2c4ead6a692c162578257d62919b +Qx = 1fe136787469bfbed60b0939a49ccc1846e767671708686ef45604ed2d077b38ae53867 +Qy = 416aa765dc5cc2f32539f77c3d7d2715c6a20753cb6411c96347c0d451bb1af33057f10 +R = 2f90683f7f41b871bad9a0b5fe58c40f1cbe391134b5bde2658dc4eb766051da8b63735 +S = 1dd10fde799b187827d86a750ed64f991520efd137181f95234fd15734d41e8499ef7ab +Result = F (1 - Message changed) + +Msg = ee0cb76f8107836222bf2cab38f9e63189a76737f1a3c0714cabf18115f7548dc8db5e3029e321495774d472403c94584bd11a8036a4287e8096f3871b5c0b37426acd5cba6c65ce40e1e71d6c700acbf4d59e01af59f48f465cc7df46740131ce9b541e2576d08e29ce7e757a6c5b4844ababc46b0d48a1a3d4c618aadbebbf +Qx = 6f2d1642bf9e9819f1a35960787d1bc3d83ecd7fff2123139fd03d8110a086c7878d444 +Qy = 578414d960307b719a76841147b645b4aac29bedc3702995084b6314fb80b9324f19bd4 +R = 33299bc17a7855f2fe909304b5bf6424e66699f360ef823c3d9de213635e3e929fb5e65 +S = 379040cb6191352cf75006ccc87aaaa6f0ade2aa8d7bdbecd03f65832f8942f48b33a23 +Result = P (0 ) + +Msg = 5f663647eba953d2c9b740684770117ad174ff2fae6b76c84b4d8a3c6c709b678548f82a42141b598bdad06946537336532d36e8130a503295ef94619398865566f93895d1f3391148e711799190acde9c6e34355dcd1dcee7fd0612a3fde42a8270fa4f09be83d06b8ddbb62f21fcbc8a43f388edc8e801d770c34cfd4fd3be +Qx = 704854a3f8ebc1f83d13f1be9e5db37ebb53b090d5e36b1f54ac23fa45f68d5a4688c80 +Qy = 0270e6166ad949697be018dc985368014d3bb73f3e67a614c7155c74e52aa07d208f750 +R = 056042dd4b68831521cfd60760a7315cf13829a0945fd8fa427b5839ba8107489e60252 +S = 0e00e434c83dc8e0187d85a9f9cd03b47c53006d523c581578caa498fc7d60577e69eee +Result = F (2 - R changed) + +Msg = 3c66481ad9df0159110f5eafb2b9e481eae134e184f16b9b331bac6ebf36181408e262ab2f91490c7cb5afaa1c9aa169dfbdbdee7857d013d27273118684e84b83e0ee3896a6615770984e76f9e8b8b115ae64c92fb246de13ffb776fd093b28289149fc2fae5c1252814b6c4e6ec3dd5f4a69d14d9ced4f95610f8834409b69 +Qx = 3a79e8b9ae4c9a9746849c57f35dd50154173844e358028ae8e0fc19001deca29abe98a +Qy = 7f7ef402276cfba1b8e1305884d06ac3faa756deccfe3556e10e724768386e236a02009 +R = 39d910eb526eb0abf5322a8351f195ffd0a8e0e09c53e006a0bf991ba15a039c396fe4a +S = 2f087af0e5d5b99fed98e7bed7a95a53ccf1a5f11ff082c53f60502d35defd339164d71 +Result = F (2 - R changed) + +Msg = ecb2be93e566a69a3586c546fac0e8b378e706222855a1b25d52797e7d3784ada91acd9b6f0497d0c4e1013f04c97aa100ea6c3f461d3233ac7de528fce4a3cb5577a021ccc90c1d51a8aa77fa230f19ea6dfdfa42e9462a5f8c05803ba9b5e15b875619b8fb8621198c6db08fdb608d9b6c7175cad71c4b63544bc249584a99 +Qx = 79ff0caa4a418e4cc35f9f1707809fd2f5d1d551f7b1279aaabb0361ef546baa8ca5a72 +Qy = 5c66f8fbbd649d205a5b50a9e28302628d08698166c9f038270431e624360652112a1b3 +R = 34e9bde1315fca64324e1f574f278450238924b19413346d4b7505c24b4eb7d6a287f12 +S = 1c4ed810637d8745ef742231bc96bff95c06df31b7cd2032bae55750668b9309cf41d65 +Result = F (3 - S changed) + +Msg = b92e4dc45e0186df192238dad90ec5631d0d84d7cdc200c6377e6cbfee40bf4d338c978217574df4f8f5c531546b8d06f82e1e2c1c936b225c3c62fbee89e5d9b1e70976ca1253f38d64fbe6388c9309b9436c49dcaf6969996317a058d99a4b87b0d4be6754342cbf6dc37cd1b8c81035ec1b38090fc2e40b77ed15556101c3 +Qx = 6d3fa2726532e66844cdd1fd502a240d1d5f76a50001a9f5a4c4b3efab5af72994e3576 +Qy = 4832b71ce0199c4432c6dd5cdaa405e8e4731e0c7056c4df7da14d00ba494451dbe6c61 +R = 0d0305cc32fda18c8c06404468c5cd95fb6aebfa72baec9c60ed91ef8764ebe93a250c7 +S = 2b382de9d7dce6fa940a57d67a3e4b40da067677c2d248b0a8367eabf350cf3612d85b0 +Result = F (4 - Q changed) + +Msg = e0b912c9b927053929d90d8bb234c7c0d3bf30d1b3912d98e6a530a1aa072412c90522bc4d34bf3134637e8dd365672a2b95f754a07a9adeb69f49da381e6b8f73892696b51b97a0dbebb529a24c479adc748c25b81535505761c47bb5ec1e9f44ac5300cb9d3223c795cfaa0a4ce7ba4f251beb87b9bb4130090d5308cfa9f1 +Qx = 6e7dbd16d4dece0019a2b0385842f2fddf714a3a2a239bc542c01e1f09609d4c843b874 +Qy = 797805be9a986bfba846d04ecd9bd19da4d5b68cdd9ab8850f4b7d0158de49da6cb961f +R = 3078b8926b89d197ea0d70317e06772c3c1f0c306900de3c2f0e3880f2ef8dbad04bbbc +S = 0a8eaa21596fa3b23e6ec3829227a8934158f6df5a3664bd2c642c1445bf833626c6676 +Result = F (4 - Q changed) + +Msg = f13a89d933693e27b5a5e237ae54f6ac961de123b3df658948dcde807057b16f1aa20a84dfaa4548f3432d46a1baa2e594485695ffe1200c902f95e766d5cbd8cf23bbaa60db471e6648674e81d300f55a5d25ce5557ed31f81275033b8da45f65639fd45f11ea26a9a2525f760db9d36e674c1e5362b34909e6f1ec78805517 +Qx = 38403d4e2bb36546a6f520312ecacfcd1670c3ef105d90e6883c460476b4ec778ed9dad +Qy = 5f3ca4294b3ee148fd02e99325e6cff56fe1d98ebc1fabb1001c553a739770eb48768ba +R = 1e6b75e5759f50a6646848b64257d0c16e1ec05741384f7291b7baed8c3e9f6d13ba749 +S = 0f1030cf9d7628eec62fdc61013dfb18f95e3bffab5ee4aff22c0971cb026cc3dd940c0 +Result = F (3 - S changed) + +Msg = 035025e1374d69a0a66dda34253221c75b2374405643949a12055c0d43a97b843107354d305715e011712c92bdf4c256b6e2ee49f5094b6334ab972d04745955cffbeb6ca2b026b7c55ac80f492b38dff524e6c718144c74adb2ceae525a7265642422707c5f83a25060692c33a7ce0d6d3101b98ad6eda51580e544fa834aa0 +Qx = 0f9b7ba81ab38341d49231dfa90ee7eebb6c588dc559d4cfda9c6f16fd26d87ddffd5f6 +Qy = 52a6579c505271bdba277fce49662d26774818881207f526d94293286e95e515b608f51 +R = 23afa97f50d157c69f1e88dfc8e08118177025205b813ff656c3120b2a624d64ee6f829 +S = 18c66f46dac530916c4de364120f00ccbe070ae29fd7422f7b53c3bd8d85b2fbc5b9df4 +Result = P (0 ) + +Msg = 4cb62cb8fd3ccee39b10e1880548bd0fd1a01d67909b7874f0542701b85359518a75a7d8a2509ea0af604c36bb3bd97243dd57c0f33c39bd499b20e4b4bc74d1915fbfea26058d483c04056003ecb0cb87b3ee737e496dea9a474518a87b735374fef05a98fa05a5308ff80705e871160f3c94b4b612c1139f310d2b0352fe26 +Qx = 055513c60f9e4877d2c7c35de03f273ea7185da3748a5136ac11c1cc13527f263b3498d +Qy = 47b6536839c065b958ec7ad6fe93473d768206804beff1d9d76a4f2d1be3d2327281aa3 +R = 1e0d32582fde6c833182bf575b27689537bd7153055a3362976abc673ecb93d6bcbf97d +S = 33b44fdbdccd0875f632692fb87bc9992d532f41c0589355b670dfaf9be148418c327c8 +Result = F (4 - Q changed) + +Msg = 03078fcf021ef121fb16f9ff3a70fb8d2b7b331a9936cd79f8a19918d61760eba2145f6b74baababeb59032dccf7efdd81a0e5de15901469e261f4383edb9fa75116c052453d049650573856caf6df9a4948eab4ba40cb0fc6c146eb70b42a517ced40da34825e91b0f1e4f1b827f801eff645768f29d8da6ce843131d6cce1c +Qx = 15718dc8d8b9d0228b4b30bf957954c521cfefe91b5921d2e8b17becddffc16e8433f43 +Qy = 0150e6d0daee8386f33dbab649843b387865d4dee102ecb1e8a36b574b42a9048841d0d +R = 13f33bb7b6a9658947f9adfa79a0f05940029a9a82a027341776d7fd8767f3eb104d796 +S = 356f1d70ce4c739eb1853f90a5c5d105c7f18685297440f8e3443ab72cd1da9e8e52817 +Result = F (2 - R changed) + +Msg = 13058472dc6e8172734ba4e6bdb0c43057ee304c07117cb5349c88f56cc32ce115b7a681b0fb952da8fdb0f6a999dc50812371131e3e88dfedd1e1f8d5cf50b3bfa11ac5d7af094d5600bdc21c603bef59962c07fe1be6b88c0a9948f9ca1b63c8ffe6da43692bf07b82d11ccfb24bc6feedf968b7d3fe9953a2fcedc6b6fe1a +Qx = 765699660705b006ed80e855c011a43a53f30bbd2df9cb7d83dd4db16fb7f54ecac5c43 +Qy = 7e88a7b166e127961f53de1006f10a7bd20bef7bf6c0224c8ed782a6759c5b3d0ee927a +R = 1594d6a69144bc3eeeb1f2d82b3e4c3ca61cd6f66213492fedbbfe873bd22570d2bafff +S = 1bae72d58bc3616db21600b3045eb89912211805a1209e4d7e5f29662dcedb5febb87ff +Result = F (1 - Message changed) + +Msg = d65ad6512bb347a12ed5308a20dc2eef3f96b5c258acef8dc2ce3898ab7c57d666aae10aff4d28db8d35d9e220b9bf62dd346b37b9aff5370001a923914ce34b55c86ed970aa73cedc66a5c53b56ba3543fdbc39d0b6830f15db9e5b3946f87b10f305d3e3b11d819ffbe228cb938c8ea443ee0767ae1f8d9f5adb438824afa8 +Qx = 29ff10503c81945b2dccd48568d99a39cf7d78a54a216f77cc9da0aa2a49bf2b7de66d8 +Qy = 56cccc401c239176b70a9fbe137903d47f2382c440adda27293921c7dbe4b2342a17a68 +R = 1dc6705360e3e406716e7450731e776e9bdf073e526b036850437a22b7cc76261f47154 +S = 2a28ceda25288ecdd8d9d5248004c5270cdcd6b8a10389eeb29483e360cbf5810da974d +Result = P (0 ) + +Msg = 7c90c2d6df7a5faa10a1fd37d49539f75f8186d654f61755026623daae9aff1685ed4fba398098f14fcaba96ea38f1a4fe9cdd568b1dd0b9233acba7c21617c4dd05ceef6a7c12dfb18c73ff57eb0415bb87b15cbd0d842c4cf091e50906b3c16abfc09798b4a3ecbc0f0279744cf52b4eef4a555f794613ba8cf1238cd11316 +Qx = 56aedccfc260bb2bf4c30654d7639f495035d59835c5063451b8b313523ea579204291e +Qy = 2d8744cac3461a0aacf04d7d4ea7c84277de0aaa7ca926da282dcdeb2c9b8b939fa11ee +R = 37842f1c9c14cd89842cf35423f14dc1ced260f92340206c97a74ca051a90b44aef0635 +S = 1e22101b8adf5b35ed8cdce05552dc136c1a5d478967e04d7f00b163ad0281ad24b2015 +Result = F (3 - S changed) + +Msg = c2aaa9afcb27edc33302600b1aae24d9200d38d45e7956267bd9cc8159ee4b4e3dc4cf857752465d0d40449d843e0a509947ef69b2d5313547e0fa619ec34c699cec0fe28dee3a7fd7865bb0aaafad73a008ea8e96c2dd1f41bd989a2ad8e82adac98d5bcb606540a9b82e55130fc8a623372e5b77522f91c5d72c1d03d7b2ee +Qx = 4f967db127dab2c25c67987559682ba970b9cb6d8d6d4d41111af55623bbcb1f0bc2a8f +Qy = 7e4347e25ee884c2dd4846c8ec3bea50a0fda880502adf9abeef173178076047a2ee585 +R = 21cbe19e0d15fa88e4a280044d33b8d57fa855e0a91ba61741d194fcaa94d31be4e5a72 +S = 1a1734259af5dd4a74337c41f559a702b951628e080c33565cda65d73b70f06015090cf +Result = F (1 - Message changed) + +[B-283,SHA-384] + +Msg = 0cad10ce8aedccbd65c5ad1f91eba1914f3f527fc7cc142d7d82ea460df87bf274135d84cdb139838d010d51519a42808f8bbef6eda9187753d6f935860d25cc627435bfa14a928fe1a439a379c079c6887ba3b884044308b3e11831011f6194e83d7d7b1e8e94403090ef42dcaa002aa335cc4363f65af7992e9082f5711c14 +Qx = 01c1035bdab52d8e73c00778e20e4c010d9d6aca680256608bae0ef2fc59cc444a2902b +Qy = 5f50d87cffe65e11e340c6b3a7a1d36dcd78ec00acc697116413fbb35e3d23d3ebed1f3 +R = 3e3c1a2b40487faa8e07a020920e703df486ebd1a5b5efeb4c7b697ff2deeff5fd5628c +S = 055dc20bf694448c1045bfe423da1ad0bbff7dabe3afc7117eccc7028e1799c0204f81c +Result = F (1 - Message changed) + +Msg = e6ff1637c6bfe72475a086fe48ba77b970b566c4cdbeb74284018d00f28003191cb6a8c49b7fa12c945e3e00d5b858ffcae96f8ebfe057a5e0587cdd1b623420554fec383b654e5b41b5ea9f1573949bfb0c0f436aa3352de4653ec71614f78fc5bcc6430c4bb732bbf11e44be86fdb4c45bc562a5045e26cf13fb381540f4e0 +Qx = 7d4f2e5b2bed6336654d02a219bd0c7a34a3990f490d8dddfdcc20fe27e55ecf296aa20 +Qy = 20aed46e1650f52b18784bf847af5ba180ff6b83f9048e11f8b18bb59bdf0882158fa22 +R = 0bac571e4de7481df0236aaaa6b83d5590497436a691eafa7d59ecc687d1dfb14c7bf50 +S = 17255b13f74db2cb67dbc5617d8cfd9b877afa6d8bcfc675cabf097f928a7bd96740200 +Result = F (2 - R changed) + +Msg = 09cba889bf8594fcd57b4e10a8be0ba2628a9b904bfdc38d41617e30298ad447e4b20a14b37334ec791ce251300edda4b4d73a22d74f2634f2989385755468685ff1ecde957ca804ade3598eced217cba28e978399c2cc34462cbce78c7f53ffaea3bd4f30b592c06f658f9a587a701851328858403c9e817922425f411bf870 +Qx = 58549012fb02ceacef63c75a4f23e6d2de749d83ed936da49a8c455478c5062bdb800f9 +Qy = 3385ca738df7e56ba2e35167aa0bdaddcb7221370a6eaa1196885e11f7b4626b970eb4a +R = 0db0d340b59af49ff78d09088148055f15df0e4aec1b23409b97c3870dd9276894ca9a6 +S = 022b746ee1c71ffe777853500041ab5534bd230ebdee9b2a370b55a44efb57c9b916ae2 +Result = P (0 ) + +Msg = 72512cfa1e26e37118dc83a1606be07cd3804856d12ca14eec454ed6511028ef2631c3808cac017fc71eab5e4c3da60aafaddcb93b9103f802b269df9fdc3fc5f8e99c7ae49ed592297a885c65f8bb8e7dfcf3040f6f7b2d3416eed5639c4d3c3e2960f20e9d9561e9a6dd015304555d6515d29ef744c24a69bafc5356a5fb9b +Qx = 3612a196a33c8ed12cf980b840951582b3a86f552ab54559eeb122f588706a16070b95f +Qy = 3487533a8d9c60cd10fda8d141e43fb58c7b57288c5ccd38a1e6c012c5aae9694005a38 +R = 36c1558ed5be4f7a9eb964722f8ea9cd4b18ccd62eecbf88e76d5a54124a18241f3c273 +S = 2b7e1c813d53f3c575f6c298e7370f03aed5f53a0890d7f3b4a6664540ad2c5fb6a3a38 +Result = P (0 ) + +Msg = a5d0b829f01d1fceaffce094db5ba515976b08212d5921b87385856ab993702d4440eb54b441fa8e4d1528d8c2cece3ff0cace5c17c1c8e30287801f64b8b593eb4598a5325540c3328249f74b594ffc879b9f07ffc57fb78de19f8f813fbf5dfd1ca80bc8d67072fb8d8e76c4d986a91ede3496e8b98872511032d2af2f0bd9 +Qx = 7c25d45d83b336b4d6b36369daafa6c3cef09f0870caf30ec8f6f8514b85de2276346e3 +Qy = 5f48b89e1120c649ddcc7f1a5533d0b9df16bc8c8c1364c2d512dc4e258cfcfd3296e12 +R = 0f26061bf7d6f5a7ca3e5762a04cc8e2cf4b435f43fe995e0a331dc69dcbd2896110a87 +S = 29c809462df986c68835db5b30c804f5e8a04371467fc2330f8f30d85b5fbab51b268ea +Result = F (2 - R changed) + +Msg = bfc3f7bb6c58122f3d5ca2ddedc12933c2953f97024213eea1d1251a58220d8345b86c9793d62997a2d8b8b43c10aafff78af5e769d9e05a9155a84d90bccc00174af89bc9c93cd54b9994ed7c59e43c62bd581b097550c2f67300e45ff39a680e9eb0d76ed0c5e2b177fdb587f4770bc6f33b3d6b618b99672b8939dbeeb1cb +Qx = 3c74781d9c78f1229e5e1501f2ed9ad8658241f63fbf2b7dfac0999a370a5dbb704eb3d +Qy = 5bfc96ba37e54773a12099e5ed633015d3a5723c44159870fee6befb4fc8f8f513a5e9c +R = 35b51f0b2da1a9e143ce4f1d4441e43743fb2fa6b77c00a77415a54951c6cbe4da01871 +S = 15fb4871ed50614b24975fc1fc815f8d8a271161b8696544a58d0a3f39f157e7945aca5 +Result = F (4 - Q changed) + +Msg = 99be17572e057fd4d59612f45aaaf598e5c96fad870220a374904679892094a692c6a968c8ed4c483052bd3e687111ee87b477dc80fd4aad5dc59cf9ebae96a5d2863fa4e4f7e9d45e441a7fa9cf6fd0692a52b0468c2510471f6d5d1d85c2b40dbdbc85ae51c2e958bde6994e99bff0541a7387917b4c34ac84a44c3cba3ccb +Qx = 2377427fb3b8767d900ca949d319531ffa6638e1d5ffb13d79c88116a926e1a62413983 +Qy = 0fce70520014c3cd70b40fc0e96859715d1fb3252897b0927b92fd5f0e7bf480330c6eb +R = 3cd69c409b8b813cf8646d93ee9aef6fdeb58cf80f2bd1bcdc17a98937e98be7b46d960 +S = 28c4918ec3b7175c9a444209b33d4f28df4a1022a2a15357d0cd57c4187671c880f4235 +Result = P (0 ) + +Msg = 3f9700ba932f4dd0dfdf6abfd99181a5d233197e66d9edd6bfb0785acfba3f988f53134d6b62454ed1ed53caf3c58d4f58029b6bdcc72f1977038a460acae58c504249492633af48297c1a751e8258aa6daf0a5ba3e75d5d14a8ffae87103d9f68e588496c736e1a872a3f01330b7e09a4c477f05a629e67ce50ab52a4d66755 +Qx = 731eeb3655827f1bc537c4999a1a689fa04670700cfd462b87bd183e04cb55886884dc8 +Qy = 40d79178089c998eab14dea5f3b32a60e5b049236a28b5b77803b8fe05b05edcf436428 +R = 0e226078cdb21b77472be6f63afd255e3135bf1438489dc92f3dd4c8c6e12bbdc4c6d39 +S = 0d9ea4df4ce27e55d85b2aa2c7ae5a6b9812bbb62f5afcc13bbb76a912b54255a519d1d +Result = F (3 - S changed) + +Msg = c95558c9deb339a2a6fef48a03168484c167ff539c89391ace6a1ee821ef4f2ea1e7eefd05b94ff9c84b8aacf86310ebbe90354f7faadff81bf4ff95c5bc89dc82c074cd41d0ea6562652cf1846ca471f2ee03ca38686c1f91025435a4d6fcd29d3c0050dc27abfb652ebb0315c13e295b2da79827b596dd1522c9b87bed20ca +Qx = 556d793d06a883f152755f2b9a856eff7dcafc5637637d1ee4853199a1440528a37ecc8 +Qy = 396fc96c9b3886d6f7f6dcc23a43d3b2023646166d5673c3e52abda67a841f3940146c4 +R = 0bf19e8e440074b33a0825d64165ed9d913a42893af24c92a856a4601aafd78be10b22d +S = 35bcf5c1abbcb5883e58eb6ae39d5598810fe2f5709843a358a422f2b25a6ce165486db +Result = F (1 - Message changed) + +Msg = a31560ac1fde2a35fefcd4a145c66ad7e5aaf0f6b8f7b964bc0686cdc229a675475081642ce33c2aa5f4d2daa786a7c6e81877c2ad0e7cd8c5d6e421f78aff45f2d652db4630c65b7c8531ca8f6b87ee9282754cb03a7268276aac44f1c01139d4e26b2a46e372868814572759f64ca504d6067bb5e513390e74d27850e1fcb3 +Qx = 4c8ddd08fabb91a746012d92b5e1b08a1660f6fad7077852040ee3249a3406b60104864 +Qy = 556d785a2be3fbf7fcafc6dbc0b33131b8a852867c2385e49d59cc819a8e05f5b5a0671 +R = 24d170a91fe2a91e57ef38722166ef8d61114a3b06c315fd7cacb7fe8b2e78c250017bd +S = 3fa47973b5ace7b730313dc3ecce99978c14388335fccca585ab1bae3d9b8c54c6dae1f +Result = F (4 - Q changed) + +Msg = 8ff26db215e4378632aab34f2d6c5caa6b3ce3d5ec33e34b37d55f80e5baf64917c62979f6279dc77049e8c0e94a42295d12a77b380a759cd7d05bae9275be803fb8de350f9690c2907d2edea4182c9ae85a5924fab5bafd3ea297d089d76dd2889f467633ab40c6e28ca62909e48d021218bf6c7c8c566a03d1198e1b29f226 +Qx = 1f8801bcb86ab56ed53de11e43cf7887ca314aaa995127e0aee12cee016208e34d96892 +Qy = 178921d659aa51ed0ade89ac6f8ca158a5be308b3cc2877d4971766f41d76ec912465d7 +R = 23908ad5ef1529277d5265880a7072531b4642f391059cbfc694d25b44ea214c9455d80 +S = 0673118217e439041b2d2c57f13bc1e6be0a9d1333fbad3b9797467dbdfd620f22a234a +Result = F (1 - Message changed) + +Msg = 0ae95eb1ca6696fa0031a127e6bc985307f35a621bc4640fdaeb0b0baea671be5df1d241c43c1411c64d55b19bf3fdf35e69250732afc329b448013ff9588eaa6a57643e68ae520195aad965d08bcbfb8a8834cb335396fcd01fa2e0683edb0d686f34e4316fbb992ec5b66ec8aa82ef89d239a85384eadb37e78b90dcfbc593 +Qx = 407a331ee9f2798100d303a71460318a9d5f5796c8df58da34143d6e96b9961aacad42c +Qy = 0fd8676116e1ac5e2cd852b768854277cf48b214f13cb471f8f74376df4a31cb4e35f58 +R = 2d41986184a5623768eb3da2332f50dc56c44982c919f0c6bac35c48921823e2caade39 +S = 05b70a188133d739ad521d4e34eaf938e8e367cfad441f6787234099f59aa3358a8e716 +Result = F (4 - Q changed) + +Msg = 03f62cb19615cc10b61823ad98bb5619f96fbb4a9f694b4cbfa15f631dab810e4c4b1a3f78b36387d6e1d4fe6dc06783c44d8cad2e8f5083074f669e49829c328f0cc999a434250c9ed23ef20e30384a69d5b76a451e84b6c6f2e6d8d1c3dbb7dd5a0efc2fb16b72037639d8b2ef96f242991dcee1355fc9eea75da6f0e53408 +Qx = 07ca25f183792c94b6000d84231605e25ed0832b062d9050e62dee4baf7da8f6cbaff10 +Qy = 70e9d3581aebc58484583e46958f7798255175900ceee19aa18de2266213027c2740ca0 +R = 1b6b49ae00af7448a04cea7dfb3fbbeaed31c80b2aa58301319163111a099a9d0db3518 +S = 2ce7b39de55929ba974bc1f2f93509505bfb2e81ceb2ac079173819385849201dfde5c6 +Result = F (3 - S changed) + +Msg = b8eb25e82008ebf3d4fd85f70ecf2fae30fb5025b70a9193597f5f83eac978e102fcaf53694be6f581c46b8950352b6909c4563c853da2468af9ec98cf07610e95cc63eab28859385ae66bd47937ec7fc84e9efde89a7d107dd5f9606207faa1ffe8aa8279a2e59dae17ed6e00517bfda06b0c44002e249145986edf1665a9dc +Qx = 5c9f1161606bae20e82e1646a15c1b44d5bc3119ed074a0fa38510d63b320e56d55967a +Qy = 039c50fd857f0afcd2dbd0a82143c779c63e1f6b190073781ee99362b4c12bd3e265469 +R = 02a0e383a8f259a4a121a482fdeed8ff6aa48027071413ec41844ee077aeac27fc1a8a9 +S = 157df8af5c7084d1f8d3cdde76b640b409252b8fee11e21561d6c8bb512f35fec9906a2 +Result = F (3 - S changed) + +Msg = 45d46fc532bc816500719a9ac911f74e2dd4dc60674ec22237c4dd289489d93f586c7ca767502cb789641889031b9325e5e4b497729ce5434ef2c51086e48ab346ce8b34e7c05c2aadc3625e7a75b301ba22aa4ee9a2982f80bdd30577c1ccd1e031bdfeebc4e3c0c3886c8c4a3aca182d0f6927e124ee9e53b681eb0f3cadf7 +Qx = 6bf2cc13a20edfb4f17a3bcb485465d2077d98024c0ca654d1797448d3f443aa203a92f +Qy = 15548d03a4a264bc99deba123bcda0662de1f9641772fbf2df54b2199a499a1d3973225 +R = 2263aa31f15607fb37373460962e627c32cdf7adf2a18ace9bb41ea72efe9e311c75577 +S = 0b6b80e258d140267de0459d17e51351d05618f9192430b4d39ef5e67c962555aa62f31 +Result = F (2 - R changed) + +[B-283,SHA-512] + +Msg = 301c21f2737adb58cfb5e47d423edd8fc0be72428031eb4295e6e12cb536ab550d43e79e56c5eb0602345b3771b9fe18e1a84cc234028cde7359f31f836d5a01214b4eca69a3e1c85907486b6561c38244ebaf1bea59cd10537fd6c82913dc54e4cef96298dc3f28f7ba31fdd13cd840db273a31811dfe5948a1d520239a249c +Qx = 6f0fa13a66fa086cc39d7a2a80ba0c98eae4d7de02981ff3752061cf87c1ba7767d9706 +Qy = 0f821f65be3f2252045aa549009da7348e3ff121a3b88a56c58f045e635a8665a7781f6 +R = 2f2d858958d168ef9af3e991a526a70610970f3744290379d1cea53e163b93bdf297083 +S = 1f6a2b6d709e06b4bda3ffebd2049ef7d84201e1c705cd194ba13691c19e53a8544e2c3 +Result = F (4 - Q changed) + +Msg = ebcc0dc1d270538fe5a24b51de5d898a4bf57f185e293b6e69ade6559e56fadfee3a56ceab98dabc54d709fac57c4bb394e4b278881755b42a85a7e3c4621df48e99836e55fce882476bb9ccc5c5584f984d0be383a4574d82cd9244b1692574804062d23df336af1deee086b4f23048dbb1137409384a6df0b8662d4c1fefc2 +Qx = 074ac8714589827a008e20c3bd7dac91bab22089b499cd599dace37ead6ec15d087ac5e +Qy = 2bc1317b9daa523126abbd7e2d854fcdf629796367a17c8301a8478944fc742fab57375 +R = 19652040ad9a1669c26547685fe4b2b3a956594cdc32301ab5049d1de8bccd4c5f8b8e9 +S = 0c31ed316e8a5f93417514070563beedd53274283d61c029edaf6b086e39af66bea105b +Result = F (2 - R changed) + +Msg = ef89a38e38336aee87450426299ce683220716ae8f38fe495ea99849bd45c42c389a834d44361f481dc9e8eacd5bd5d60cd6b9174e5ad547d5da898f090064e7f9627adc115297ed88085d1e638c7c9474d8ed6fcc44cff60b79be819ef842aebd6d7faaa299d74640130170b25c3e0f20284ef3542c1d07ad4e09b2e64bfa9c +Qx = 73e695da5d4497455caa6a1d3965196f542ac6038d7eb2ba08cc5d754e7bb6692054219 +Qy = 7d3ef6e55d1ca1e26db5e522e500c08649c57a0c85cf41de54e018ad01fda972f56369c +R = 3fce80cfbe80a820a76e775c7d67d86e8299061aef296aa297c37a217b4e1ad07f1662b +S = 1e82a1e29cd9ccce472df6b5d4874ca79f162eca320ec090c8cab7182522978462c6226 +Result = P (0 ) + +Msg = 570ec8b0418bf99366ad2d0bba9262d4bc8271ad46123ba2d280e253fca622c304bd8472486e8fe0e86da89bf472b1de90d7fd64bc5e9087f828ff14bc3cb10cb9a5ab069dc11866860b916fcb1dc27fa699046989299078e4e50cb403140ec7391e6e4a067bd3f88c69f01db9a2b55edb43bc6ecfa1fdfd6d9e61b0958a3db6 +Qx = 1854b9c970a57e5f6b1efdbe43ed306ea59dbf65e72c814cf4f151a32bdd9fe7c24376f +Qy = 6a3d0507cb7625e07977970d1e5ad43ce7988a398f418f4e03afe5958cad3dc11b30132 +R = 1f62c8e75df7e54a48482947cddf76e6644d95d1c668c7cb76714644367c8aa3a72081f +S = 046f066970d78fd2b40fb19d517b576aefb693f2d7352619a5bf99ce3348d6bcf35ab86 +Result = P (0 ) + +Msg = f467a1260526e4aae76bb95a5361e9c2c1b568da8a4d47de09d84d018b3fd030fe0f4ac26765246bf0f48e6853bc5586e43f53d044bf6d3489d487a1a526e6d5fa54b3cdfcbdb6c3709cbcbdcca6018db539efaff28245357755e01c22ce0f1b5411930ed53b7b2b13a784214e6559afb16e3639c4f5259c026859166f0fd37f +Qx = 17df7dfa196bd8550af0852273e0cfd599b49a91af23384df4c823046445aea7cb57cbc +Qy = 23361df2f18c4cf3dbe7307470dab5433711b40713f5bf9bcdf1a43494bed46f7caf2ce +R = 0e7e9bd468e66f88be704dfba59348c320ec15faa346f23ddbce5393d962e85910938d4 +S = 3f5d7622a20a96b48bf8cc1a59a3ee90565fcc6f47dd1dac1cd41603ef858a9c70eaa98 +Result = F (2 - R changed) + +Msg = 4cfa1837209d2ebcb9ec326a75b26b60595627271150be1bd45e7ee8eea9f3ce7adfe9adbce67ad86f29ba6d314429b561cf11714ef7427458403975e1c3fa358a10458265066e6aadcf0f4ec3361f1b92f45f779ac1cd376efd74019c79a7c530f14873760624c1b05cf66fc7af109808a9312a2c90ef52d403b4ae15ff56ba +Qx = 3110356e7c27d4bb7a009d8d8e18165fa51a6e620afef4d3963db930d6630ee5030166f +Qy = 371dafe018591eb3675012611149ae849c78ad2b15c71776383feeda66ad32aa2e0f3be +R = 320931fa29c34fa6813e6994e3f4aab6abb526dcfe2e3cf74440230a1cd91caa6f02b64 +S = 28881ad71ebb9478d86fce0991b7d3c9cf974dabbca47fab20b5f52c87a44a233840a7a +Result = F (4 - Q changed) + +Msg = 24474dcd8054f618a1c9bf0a3fbd9de075954aaa077e793914929fd04cf9dc7fe883aebadbd0734b97d0016fd0bc3e489919f871058d6d49c75ed8fb1004f59b7cd5e5e415497d6d56a76d0c186597157d4b140a2b6974d13770429b9d45ee14727b01c52c9b38a1385265cde6436073d8c781f8ff4a0242f93828efc537cfe6 +Qx = 6a0c350bca44b1431e5eb35194dda9c96e8853e21c6877f6319c49d5ba2393b107bbee2 +Qy = 56ed5704f59bc3f4201bc80e110f50eab0bb1394cfb849b5a45e962a459d9bb1b9a381e +R = 225a83f91fddc2a05bd95969b8ec6b21ea6371b55038fe4e563927fb80f21dcdfb78f2c +S = 3773d2d5b1ac44b8f4532a2d1d36875cc523a964eb918054500830a2adb0905fcece8ce +Result = P (0 ) + +Msg = 5f0355a0467c2606d3e83697076a6169c902b0b59de1991661ab9a330a79d3be14434522d3160484a6bf3b3668595ac7023681ccc64e51e125762ea7b887b6fc83c608de7f0f6da9407a2831d3c6a277b3a009cfaffebedb31715e797ca388c47880c5d7a32afb51cd7f3ad75d60f88b797f3dbb501582cb2e9d1a99306b58b5 +Qx = 5144a0ee024309021982a2d412e9ccf4476600b440aad908222f44520f22cc6d6ec9417 +Qy = 2837d483d06b1af12e89b2544c37d54697b44fb3f20fc5724c7bc98c1c450fe1cfbaed3 +R = 079615a9947b3ac5ddd09369ddc91bc97d5403af6eedc447cf91536d9be802739ef5bc7 +S = 31ccb39e79010fdf0d6574a291b66c756aeea9c4d7d3e23247c94b711aad4108ee9d0cb +Result = F (1 - Message changed) + +Msg = aab11b5ce38f8adc44802162737bfb959a602c2a0042b6b2655ccf796edc864efef20f337b33325ea38ff5d7d384b2e1b8183e3ea9f99bebbefe2e08537245dc6d8a263f34dcfc7ba87bdd9e5bb090ea2794b26592577af55add124f146118390b627e4cdb52fcfd52c5df09b01bea6e09bf2beceea4ef6ffa8a9d6455894499 +Qx = 1c95f45121c91098ace51d3237a3dcf821067860fea39b84a2dbb83d95ad47808c1fa79 +Qy = 2cd3850183caefd44dc35685e75590d2cc1bd3387e2ec00d19dcead96392109b6a4e1b4 +R = 3e7add0e76689091f9a308b3f0f4a9b99b60ba3244550d68177617b44c7bfa2138bf622 +S = 0ba0e0bcda9acd97e462b8785389367c66b990cbee3180892b9c311983383d9c9df52c5 +Result = F (4 - Q changed) + +Msg = 80adfb2790300182db403c81cc49a505fbb0263dbb277a10e0d2dcaba8f2afda668c11c1067686a54e2812f9c4b6535a768518dba9739940c1c24e0532ae983e9693b6455064a58ab7886a08d82eb163b3c3c560877aa7da6c2f4eecba6c3f132ea4b94806de2457eecc8a5486af0cc0d0ed08b11f4a0c4e08ba64571b8d9dcc +Qx = 71c9e9753721e89e06016e37a5436af2d78a3fd4a37e14e1920db15bd2690707f00a7da +Qy = 3c43700ed8451ab90a641641cdb60181aa2ba67d451249b10669c9fc4d51984c4857501 +R = 1b012becff7fbccd45bfaf3ca533e7d1b81cc6ccf32b16888080e6694525d91cfdbaa3d +S = 1e9929bbd3f10879081d589ad037cfe89ba7eca063a883d77531ce8b6e42eb983704535 +Result = F (2 - R changed) + +Msg = d23b4aa9e2ffe02945948a303a7ae9f7dbc8d8c72a059f7a6c77316a0013056ba356b33731f4a303765a0396245e60442d1577e272e9d1990587618accaa0c2f193d78f59253c65b008b8b6ef08e47eefddf60ffcdae6fdce5fdc4e071f2e055e136063445b130054204869e5b6afd2bb4df32e486f6002a1af7499fd7b4d9cf +Qx = 3c65372677abf7e1559168e163cd34d44bd24b3c7d519fe4f97776ea875411dd1502df5 +Qy = 5c254d97c7e1f3acd8fa61a5e7ffc56e87ba878749faa993baee3cf01ed829bccaeec83 +R = 06f9092a2cbf847ecc2b3ec162fd6baf0b263503a4abdbd9967b8482bd83d2a220c7939 +S = 05a3f7396d0118fd64a20aec5fb47f6ba2c477fb2f27e26fe4d1716999ebafb811c20c0 +Result = F (3 - S changed) + +Msg = c3399fda43bc148d8680393fd34645946fcb7f1a06afd976c424ecbfe4e970b462645de1f7a2883851b454cf405198af088226a952494561793da1f993f9fc6d11b03fa8467ee17c237e4aa8fd56e3ce19a0dafa784bc4b5ff6c97a73fc3827c6468955dfc2de3792e4fe1d9aef00be2a619f19ec5c2c94a5a1636b45d04984e +Qx = 3203fe3a09afde5491916ba3ac47c6509a404c94b3be342b2c107873c7bb384c407fd67 +Qy = 13a509bb559548f28e2066f04996478bf78d6729e261f6de792f659308307f7b016326c +R = 0aed76324472c8207572be5928872b8d5057b2443abc7f0e1f5192dcbd7a41c95959c93 +S = 34c4d7ef9866c2f94e07074a90ab67a59740a8f2999e38472a95764a93594aa53ab8ca7 +Result = F (3 - S changed) + +Msg = 806379144a16b7698b2b78d896e1766d4eed79bcb1bc92aa93a458b840d49df4367d5e551f122b5dd59636fecdb5832580dae062d903bb6fd4666b9afa787bbf943139a76a214d218f4d771901bf5a2628e9b2b91e26bd683b3b529c0b7ec345cbdf86b60e56f0ec8f5d0d7649660b2a239db2b757e18833cb17f2ae38dbcfd0 +Qx = 5f25074b3b930c8be4b1a2b6019d79e505b69e9e0e8d9a19167eb0779a236214cbeae05 +Qy = 0f4a8c8309f2d22b7a43376a89ebaf88d4613829717e65935064ac19e6b9957f178b953 +R = 1460bcb5730261acc8987c39e85f215a61d8a2ca87effe7c57f7041245c4b083085c63f +S = 1e765593d3556aabb3c2af4549432883cd8d5ccdfaf19ad619a04f5d3409fbe8bf9437e +Result = F (1 - Message changed) + +Msg = c97257db3a9f6b7427df85f4d5fff3117135fa647ca3234498209245a9cecd1040774de4fbb2bc1765c64428e79896da3be74267a9136f10aa8b8427bba623058b930ae0a7e9106e6fbe30e31db93e18a16669a6190e9027051a43c26a68078c9692b495396b4a5d9a8965dd3e7a3a06a1df3fd0c12fae4f71591e9f448673a5 +Qx = 034d94608329dd4bef38dae91499805f0d25456a4e880dad385a0cf04107fd4fb75af5c +Qy = 65538785cae65a3565a622502ab55867c187591f2e84319b09bcda678afb6ea0bd07f46 +R = 1ef7e81ea4ce18956ae9f9da3e1b7a6d31a34b9211bbaeeaf5137e3e7376ed5bce0e3be +S = 38ae4a0f9014938bbe690c2b6f7916ae0f5f65f8946d088ac53d68db86d4af7d75778f1 +Result = F (3 - S changed) + +Msg = 68c7d3d67efb0bf0e1c8ee27b1ab265e92fe24278f040b369349cf364be586c7a631ac64521fb2e14a1fe74dec8e42d84b1790d23bd2f7a44a575fc15eb5d56dfa4e0f08b7213e935229205865ad043cefcafa372b12433deb4b53ab5d31d1048adcd7acb99b940361e9312a747c6231cf5f9809d1e5d4199d318df97e304e58 +Qx = 57473de6d4715463fb17fcf04e82ae6cba0330ead7868beb21608526dac8d1cd0a51903 +Qy = 43255f75d7a274f0af1fe5ae926d7327c660d7b8fcfba7d68a72a462b03b3827cf99c7b +R = 2e3c4e813d1a332d57096955f3c84353d337c815cb6cd84053407ddb22a61a5e2cf898e +S = 045ae8b38d261750dc91f2f8821c41e4134a56cc50ffedf8417d18c4fe05437a8d16f2b +Result = F (1 - Message changed) + +[B-409,SHA-1] + +Msg = b1de8a40517e6df3366c6db5e4bd01492985604f45d465e5e7eabed7c1ad41a124bc7b43f90e7260f73b4d013e48a3b508ade286a4d77fa92e8587862f5b8b4fe5ffe9e2037a00b32323ad0fab531e32293ccbbc0f94f7f28860d56133a646a13d4559e062cd8a40ce69a1fe57513c48e16c6b8a291e2d791a405b15f1de29f3 +Qx = 1fc197d5eda713412bdd07be3fc5fb0da925da4263f6144bd5634841e5ec8eb95592cc5e2003dbe0a4c73de833a3b233874b031 +Qy = 0d004fa7f31f7e4f34e791ec5c8d6024298372939cd16a3cdb6609f898765ca8264dc581fc5be3fcdfe71d2c81d0d3d93f17044 +R = 0b65821ac987721e483e2a3403b9fec391ab8768080b53bd13678d3611f5ec7d79771ca75125008b816029ecf713979302a46ea +S = 04d1a793e5b81c26b18f93e76902abe54cba2efeaf378f41a7d626d4370c72d1b23eb8dc5467ea8714cbe6b38fd42a704d3b454 +Result = F (2 - R changed) + +Msg = bfc95ff16b708e0cc192341d435f0bc05988819cf28bb7071c75054d939d55654a4241bd5448146cdb2a22f0de928241d8f54b3e253dcca0055ab6b1f3157a93d3b8f5e71d040a82e5166f015641da8a5748c104a79afafbccae73638c6814b34ee5a3a1b08ba842466f6d8d6637d64993d7bc9a14e70863e1e7c3c84aa049de +Qx = 01303aaa17025a03ab2d3cf9edea9150552dab7698157267be3c0967e416b1bd7160a6c2cf58d9e5c6bad8bc9818ce5dc7013db +Qy = 0849c3f3f23b97390021a0206c45d0ecac9cf1a442d1a07f6596a50c996eb92ab7148a068814cf776e27f8114524d113aaf4c2c +R = 0fb27f96f79ffb416066dc79bb16dcccb350765993724f15a85f8481c1356f04e3265e762cd185f1ec2924422879bd16491e878 +S = 06202774ec35ce2eb5241fbdc7fcbf40eebcb602a9514efc84b7166e0cddcab9af9a89fee6d2a213572bffdd797509157e44551 +Result = F (1 - Message changed) + +Msg = 3e791f391354c896c29320f7f9098c2b227b931d9948d521a8534b00f68a1b0e9d04940f94ead0e48933082bc8dfe6fc1177d7f5c0df160414230e799e8e2cdb7c3d4a1fdaa80d1c5014ee83dcf195c24609dc48a4ff8e987e60cad2b17c9e1a66d31d1d0e10f8ae384f964daf1da408582aca392b41046984d7e70dc74b56bf +Qx = 04b724d23de2a52f7019a4cfc9495ba49a82c86bd27b85da03d6242ab159047ec028536eddcfb8147e890f238276ae982c92edf +Qy = 0b2207ec251e7c784d3ed5918ebb3d123f00b5f11ce9dbd580334ef35b0e278832136dd4e60b997848b57b8f57a8514a46fcfb4 +R = 02dc92487529cb525edffaaf08b8139db0e3cfa0a979bed486f9352a86b345d2dc3064170b59d44b8b02bebec94ebbc022c7ad7 +S = 0308b6f2918148cd5962a92cf50e9dffffe16a89da89e72c133818c2b055da6bf5bf11419b503431947bbe1651cb3f09a1fe793 +Result = F (4 - Q changed) + +Msg = b4626b2954716ad518154f02a83163669f0f616ac9977ac7deffc504221abc8416b06c46c3bf1ad84d150661203a6d8416480b14b10893dc3858513746cb2ba28b96b4bcdcdc30c75cfbac3a9cf0c4f98f55e6cbc2d430ca64d68882b86adfa88d081533a1eb1fabfaae763bf81ac74f2ef1930c137c54521c083dc96b72b1ae +Qx = 02c3bdc458ef796b9755fa3393f4502b4fa95a8542699128ee76617248fa33acd2b86d4a777056537385e9f8dfde007ab6f7f8f +Qy = 007d1062be51d255717d1142c5cbce59cf72f1c456515d666a1f3594f5d2454f908ba9b82354497368cbd4a6c95b6703e7cd0e3 +R = 029b4d7a0e95456c21c6f6b59de9adb415e725114c6dd981d8473fe69852922e1a15909b4fad11b23257d1f4ca4fb32065100ab +S = 019497b34be56fd4c240e3f4a8a602566d294a5ebdabd1db46fbf49c2ddc8a4dd6211f63538bf4b4caf29f1ac5320e792b591b9 +Result = F (3 - S changed) + +Msg = 48902465b97151112b8026661c7eaccb9ae29e5378a6769191801745afac77121dfc512891b22e09bcdb2014029ea2f5b2606c9b637534a6efe0c771ead4ca4803f73f155100110c078bfb523e517428108b5f1e2428e1e662fc7e8a0cc5777cb775ff6c2159d3fe4fd36ef856bb1a4668d3a40643c603d758ca4a62815ad127 +Qx = 10a37faaac718d658685781808f4fdd2759032f3769fd5a07cf132860cafde05e5725abdeea848a6d774c77d669e273a88c5ff1 +Qy = 06dc33ded545509febcefaca40648a9f778d2ca6d4a1a7c1e4fad85acdf79c6bf785dfc83da3cc8bbd66e28dd92a35272e445a3 +R = 07326634f6920c59a804bb8a85b24a3d20a16051f3da8387fe65078417b16ee28894f8439e94c4bd69eb6233c7d583700f8565d +S = 09fc9a53fc15d7f0c9032464de8d930faf598ae0d0b2a52d982bab17d2b77bf8bb3e1869466a1a68aef875413f53aabae7cf966 +Result = F (4 - Q changed) + +Msg = 8465266b8ae5e1e7b142c6df980dc8bd8fde556e3d1ff2ad527d57f0cddae03573ea775a0101fad03e44abafa7f2bca86e2599ee5cd33066fc619f0e1d58434343968125369a56bcaf3a3eff9afbca7d18946a821c8852f16aa35ff9ed3a968a37bee7e885b0480f48edefd96c9107ddef63b5b123d4cba959d338b544fb9160 +Qx = 0192bbe71de0fca0ef92fedf231775ede19e67d3334c19bca02c2e55ef113d8e9441f6bb8a33ecbb523acaf5f1d5e520ae43171 +Qy = 1fcbfc31c175d2580e2bf0b63629b79e323d78f86f21effcbe38a68aca3fccd785c439aa588f57f26e71dd27b07fb4f67551812 +R = 0ef76c7cf85998f8c1badc12ecf3f6161856174a194dce64a763fe9e920d30cefd4255c5f209abdc4d9baccd41af6962ff5b2fb +S = 0d027e1e9db5f2deb98614b9f7ab0953e01b4c43011727a9104594efdbc0a451d41ff8b6500951ae0bd1d60e6df962cd0f9067d +Result = F (1 - Message changed) + +Msg = 3036da2fa56650429ee90c189888c37c5ae10ff42087e26454ef436a8717522980313db5c49d26ef9a18bca19c35f04b22e67f4d3c5d4a94a4846377f2e9e52ddc8659b03de9716366d36dd9107b607360a9a7bb3645b76bbecef229241828c254f855f19e4c47834caa54eb64db07717d80422ab050352dfbc0d8f9c1b2b0d2 +Qx = 0e0e4fa090ab0cddaf24f6cc519b6d4dbfea0dbb697fa9b16bfbe2e3e3f160ac37ebc4fd886ecb0a0671f885227a796cb7fa00f +Qy = 15e44beb435ed5b625df0fc0a74376b185cad91ccf8d9c92981f7b0fde6e2a7f4fadf301f1ad3a5df62dd477e2871c4a9ea74f1 +R = 01a1ef5fff035efad063640c75eefc985cd29d2d42dcfb387ab461f70108d9b367091097dd6a36983abbbe39ffb11ab12c9c108 +S = 095fa5a326613fcdaf44555c62d1a08c5b937ac1c774f05992da7d10f254d00df109ef194b72b250ebc04c6819220411d9be44f +Result = P (0 ) + +Msg = 00261f8edbd62dd42f6f78e184b9f41488bc363ab133cc87bfb77e18bae739fe67ad4f6693e30b68c02c9fdac16d4b6599b47e0ae0e6226210651be62b8f13802e904ba9ac670b45bb2b315eeee888eabff4703010058750760b430441ade63dd41874a3ae04a8369a414930ce447275887b70b6e8e41476f9f9b15364897dce +Qx = 0738f21bee2f5be4aee94126cf87f9f92a35966c417f15c72181c003caa5d9642ed343f16f7e722f2766c86491d87f9853625c5 +Qy = 192e1bab9ca8514fa31b38e500553c406be903fc56afbaf5420163112c09b3f46fbad969949271f542331124b043502835bd08f +R = 07d2f77e4c5a650693c41cffcffb6b57c893794569911a4a08c889a3ee8e2f8e809e7fba19e1fe52bd07817362d301b153c4338 +S = 0ce23ba26dbf3357a0440e455f5c8f67880947e39ff80f0421a6c66f499b42b1b74918bf630105cf0b3075c06dc32df0b7f75dd +Result = F (1 - Message changed) + +Msg = f3ee6b05633e608cfc9c9b11e379fa3a90c74fdbbd103cea20e6f50345aad47c8e44e0155627c8d7799cc9edd2ad164074da9c1c124b266df3c8e6b5fb01775c92178a7c0413fdd1d39dae5f17a2fe19d8ae020ee868c5988adb625c77fe5a8b8e3529b5434bc8285eed8fcbbf6d0e0c8320161110be8b66ebeb9aa579ad1564 +Qx = 16ba00f76f40502052be0b46653a3668d16e67aff83137a322b5faf716fa30f2b5edf7b90657a3c6d9ab5bc1ab0d5a3d6558d2b +Qy = 0cb6ca740379e9ee0e8b44beba3b521d84d42c6f363ef5f9c4a46bb7961d5ed1192f2928a9f2d9322f1b9bc14b9af5b531bc596 +R = 081cee9521b7e6cf0232490c4a758626c71cbcfc7e1e6fcbbfa0970c15ccb3adcd8b407d165823d77c65da205a167f7bf9a4f61 +S = 0090eb653f659bf3637593034a5fc419807cf86be34ee62c25459e4f77ec966a712ec42d287f16b7db28b78f80629062e3bacd9 +Result = P (0 ) + +Msg = d9323db65bda5e62cd833d67492f9c1e36923f9e634b57c180b8d9443a02dc41c49b5539552ceffed38ce75e87dfe2b75f3fe850487c62069765523a411ecdbff58af3e395659f4be77f7e1e4c7afa732122856042a3081e7c27664cf1a0ce23c1e8d521f3176b6e932a1f35c35d3972c1db4eaaebdd3b0bdea9f69b216122f6 +Qx = 1f6b96eca9ee55eb5e2743e3053c6e2d4fc98844f0c23f5a4f3b780500592d870f55343c8692171110834cadb9a1ceda956a933 +Qy = 109759dd8a3b0c17b2e376cd3277c70ed71d4a610913ad881b5552330a68cccba436021f300383d74c1098217efb868bf8f08b5 +R = 0d412080d88e2529f96f9ead30c4e4412c29afcf9dd8e7cf11eabf1d78c3009c2d2d766a928c4fdb02daa8d558fbb42d6002e4c +S = 0f050ea34b7dfbd7dc7021f0ec1a08c8bcff0ebbafecb1df7e880e9ae0ed43d1e8c67abe4a1353ff5bbd2f6608ce9684b7f941e +Result = F (2 - R changed) + +Msg = b1f57b35991413dce15648a4814c15a5dcb4dc21866cca2ee6e3379bc94f0d6a02c30ee9d99fa7ec06e97365c461ee1c87c2787b717ed8c04afbaa638442a2c735b42e0abc41bbed178a452a41dff163a878fb79d382459adcb93773b7d024528dec9c067df7f030dedd452a255285173a5acb148383076d06fc4280d6c0f875 +Qx = 0ebbce40a2dd95f6402b332dbfacb697c31c532e3fa4439d98c7b400dad95679e41424989e146761b6f8a51356037cdda083647 +Qy = 0ded3f9de7f2cc133837a593d6e212c4ea3714aead97bb11a6d5f5a217a5eade1a8e29b3d6a5b0116628276754ca426c79bc3a6 +R = 053a70de21f3a34f3ee8ee30813dd86018dcce9ea6619949fa9bd52bc8c4b0a63667da43586ccfdfa1ca26192541a0e6725c935 +S = 0fbf656502e51262c74d03e2f7621500673ff85df44555e3cf779886735e539231581cc61bd9d42e3a0be15282dc1bd464b256c +Result = F (3 - S changed) + +Msg = 86161f332437ce69a746a623b6585a285cefe2c811bad409c3ff54ff5c15379ec33ed84cd68ccf290b2b1b2f6612c7e00763cefc615a4309c3a72f25bb69ce1ec3c8e2df509341b1e0aba5ea95eb2561808620975254d47ce5f61040fa47f5b43a7b791f046e02fa2deb4cbb85cf8ab3c50478d179353ddadcb079b418dac4a6 +Qx = 16a18b9df30445be21eb939a2657a65c3fb693c40bde976a20af30242ae6717d2125200f2227fbddb3cddc65189978bae58e061 +Qy = 1685551ce2acf1a4c16b93c05e1298eb3da7ca0629386c3a72f5fbd7f7fc84c9577b83b419d1be8d6a5121feede6d1ef95a1777 +R = 04647ef942fc7c99034f1a6743325bf8e1196355a7baea23a58c00a20f424731ea4c37e055873bc21e96fefac5235a8f20313cd +S = 006ea2cb72d198eb427a3d90bc24b46fe01807272ff7b38801d8ec89a5b372f76a3421b4faa7f3e8efb176d5aa5b217f3e7b519 +Result = P (0 ) + +Msg = 891b3d806ea07653dd8453eca63c45774129391e2156b28c9f09c646844ce753268214bf24333913a6143b38eb714543886f5fd1005d3817761a8789eb39805e059f6233992ecda283d316bb23d23ccf4db0cfd3523a0e3089a79785254737e61e165c594b7e284d859430b76c237ccc74a4e729454e89d0721fa042143130d7 +Qx = 096ce499a6d45410ec284f7a3951dc5894da59efb40410ae980d68cf72119a8b96e4d2a17bf82668640220a8355c4a6f6679a6b +Qy = 034dab336f363d2869f101339d93342590e211acc04c1f6a5608ba3198357e6921cf6ba7e49334316f929cab847fb04ebac4e94 +R = 00e893179c72998d28b508fd4d5d05bf2e002493e4e30813fb0c1e901683afd1742e6712b758ef9e1772505a3a929fc1c28e5aa +S = 0139ab1beccd0ef5f6b6ed48e582dca880cebebfc6a03a6b7f17ad5c5b53dbca539456eed1a6ff3a623f6790a861b887f2775fa +Result = F (4 - Q changed) + +Msg = 4aa4d84076807f83f283bd1d8a53d91fb6d95f320be0574cb9bb9f023fd51391b87024e6496cfff73703f2db62b9a643ba742b78ab0996179799d6b5ce127c87c86f09546335b3e58b86fc83233b3d7531a6cabb86efbe0b53c02621a7bf478edf41d83073df094808fd711f0e4d4b1a114cd7c6db2a63d7ba7c14ae25989c1e +Qx = 0e3a34cdcdf8008a8676fc9b1a15cb5c58432777f31cf7a6ac57550a3844de084f839509b08ba526e8d3898e58f213f26c953f3 +Qy = 12a84ddc4de7513f4e77e2cb6260f145e48ccfaebf2ecbcb3852a5d5e7c9b595973aecdf5d3d9a4c9a8110a5842fb30ee1ba9f9 +R = 01ce6287196b725f2bb7fd062d02a3e0141d19a2b05198f42e419e3085d66d582dda78b2c5bb72b1281238803ffe0fb0d644352 +S = 0df2c2e0a9a528440ccc8c2bea8251bbad0b48bf9eea454a64e29d64a07034ee2c5d015e1bcd483000c6c2d11ee36009361bda8 +Result = F (2 - R changed) + +Msg = 8cfb0ca32d4cbf4b26617becb51c3286b7e1b729090cbcbdda75141ca65576f05f22a33749a6e6799634eac3283dffe1d27aabd3edc93741af0b3c70f3f7fb3ffdf9af412f2e15b307be4287b6477fb8658ec6bfcf990f91f1fb0b2f8217b15bd13f1a6d676c34c4edabf1522cf988d1b72d9dab432fa33e4b3887c5bc0c8041 +Qx = 130cdb3308450019284f5abcdf5dd15eaa036ce078fb43c00649cdc24958b698329961036b012e4a8237e1ea06210178deb2ec3 +Qy = 1c05d08274e2e97f7b03922b33fb4a4a88ce2a844d9f84709548fb95f8f3e30068c0646b565a4ac3eb6a6176cca1f49c079bb2f +R = 095f6dfbdcd6d0599847e53674f8a5650797ce5b8a5b674892b475cbdbdbd000cf6ecc3891953a6b6353d9b6551de638778039e +S = 03e27955ce75491d9ca7bdbada03b45e68ce445e53a35becef6169307a6de75dcc3389d16ef7487c509e7f9c22d3726cf9044a5 +Result = F (3 - S changed) + +[B-409,SHA-224] + +Msg = 595693d25e9e77001b2026fe8ef2789c69345327fab72c73fb03ca75a75e4ddd3aeafc5b96d58e306fe90005887ab802cd71f47784932f58b5be24d237377634103c9b8bb5e166f47a562f5a38c385186e6a8e6c39b3aa06b1edaee2a20878942695a714b2e5a1e45733e0819df524daca346125ea69ecd78c47281ebf7a9c8e +Qx = 01643484c60a1010eb431cf6850ad2c2e49da641b52b4bbfb16df9ec8c7d8a8efb074b33a666df1d73d3a7ccb899b06596c15ed +Qy = 15e910e03c94a32986b721b3646a5443d839fb95b6adc783bc1a2a91103edad863aa268d3f61ce9298ae2bd27fe67669cff7798 +R = 0f3a26b58061cd32406eca24b34e5e1006edecffc718c93ee13f22d6e4c51cd15f3ea66dadebe68c9ef08e2e39cc10057ce26d5 +S = 090e98961f7821a93f2a5133403b795def86531fa89bf3d4fbcc2b1a9d4279c81c729332cf64d450f2cd10021cf506de63230a0 +Result = F (3 - S changed) + +Msg = 182015c7ef4b7a553f1f6cf095a7bca48f172ee36d50b6347b691c83731046e480c751fe3ce95a7bead6d95b3c67b6764481cdc9bd247dd08e66f150257944cc0c70b46be7b0f6898553b56323f0ed6c8f58621a60f2ba82bb04baef092a42c018fad188fd925a070a06362646118170c73667991afc13b2996f3a6383d97221 +Qx = 1b1f842007291c2c4bc7f42739c24a0462f9bc495cc352fd89936617f73de7c1a95e5f75ef1dcd48c93b2dd775d393835b890f3 +Qy = 1aecc1ea8ed94565350f28f4d667bcf37be72d7dafb31a644bd7020d9d53c0c2c2c334ecc778325fffe94632366f114c0e4ed8f +R = 05e1d127b5793e8416b62b3c5d8f633cf8ee61805491a26cd17ed464e340698d8b502605bd2cc821fc070152a28eac3b9733473 +S = 04d7cf31e36e9e1d1e0ce91aeb8781e5d04766e530abf4d63cc2b329d53f8278fa4fd2bedb3856d72eb6fb9521af584fcf91483 +Result = F (1 - Message changed) + +Msg = 55d68960ba62bdb7e7444e068631464eb76c74b769841c27b972619882a9c07d540e052037f47bc10fad0f6524d11507c17d4f959e5a1523ec3832d525c6fe35260ef5347d06c52efa6a642cb38bc616badf78a58a630f357249037e97beb23b8f23e9e3037ed2e4d9b6f4d127179a94c8af906af70d8ce516c805637b9e0244 +Qx = 12a5d407385ef20c96dbd7dd217b47a67ad416afeb6d6d1fa2a6b28444fbb35efb3ec9dd901ba5b4137abeed08429fb2aaeef93 +Qy = 1b06352e179ec2bb57c95d8f42d4614ff1097a402f5a50650196f3fd3760b2afa7eaa664b310b41dca8d47911b7bc194f92a989 +R = 04e03f8ffab0c15e3081868f3cf455a5033af42119cea892cd573400f276e210ef84bc01fcb78ef3ec3e1c0d3295b99d604ca69 +S = 04a48cb89c924f0253878e8a78eabc047372ac0a2a506a5b2bd37375d84304a221d82a3498fbebc74e8215ce417c50898707253 +Result = F (2 - R changed) + +Msg = d91cbd159f89562bd2edab1cea12a55993c643da6b7d46ef5a8a059906f4d0e709cc1a56ea53a860ce666ce85ec16c34d3563cb9c766fa99abdd5bc77099508fe28b0b7a81f37abde433b95a2cb363cfc615e845db9361c0f03f07839c40cc0149420bf173cfe9bda5299fd922ade6a97af1aef8778767021513cac6a2686655 +Qx = 0c4e272973a4a6e2ef1985f4c1e8af375e492aa9fd8bd9e590411d910c69151a059ef5ee41845be90725b596531de620c410a95 +Qy = 1ffb23e0b8c251b9a6f524b98c5790ed7217bc13b0909660647ed0b4808768c31f1bfe6b62ab7cbfa55fcaa497084b618756eed +R = 0c998f3a9704571a6aa21ec2d0b049f6b413944753e032025a1db75f8d25e2923df69a83940cf91062e2265c736d10981dcfd37 +S = 0c3886b9277fd1f806117550b8b5186d27a260496c84a8318d2f9a95991cbbee8234a391afce37564d0300cfc72714c09d11117 +Result = F (1 - Message changed) + +Msg = 77f0add350c113c444f71c7a20522b47f2c46ab3a98c5cbadf85f8479b991b91d3108aee49c82290196ab9f8690e0c8f48bb27e7c342e1c1a73aaff8cff14f47bc2a9105b8c47b2e6e856a1539daa613c09bc03210b3ad4a50c04683a1f02a8c5120e7cd54bdeeb27ed745eef55c1a3556e19a8057192521a3914e36717954ff +Qx = 01e431e558774630cee0f9d3514543980354d53dcb3df864ae786307e0e05928c8d4259f87097e4bb2b2ddc7b16adadcf9eb4b5 +Qy = 10049ca445d5d29faef788d1a3809e1bba96f0717891f90daf0597d5798502e0cf425e1a74172955bd27cd8c9132f77ab3e7a76 +R = 04fdfeadaa6b98230c025390daf30c168726240bb0df3709be75ca91ea3a2c801b9b69be2345d65a92cc08d78688871acc065f0 +S = 0959b3255b52a3b3ad7e77b3dfaa28b512b1f2de351ec3d2dae839140c6778e3721377c3a0af419ea3f5fc321870922a6bde022 +Result = F (4 - Q changed) + +Msg = 32c26f7a53cbf8eeca77d9b043bc0e2dfef3134eab243dba0468718cf5b021618b59e477d1cad68e531732321d2ccd3392558531ce639c9318ca42c6999d57399bd1452e5c38d31ebf69b4f13d9d953262fccdd2d32753910540bd19551795ae8b6e8b96a0f62b23eed1f9c5fab937b6bbef79dd2b1020b9cc90cb2acb287cbe +Qx = 0c720b7b09620987b13715efee33eab00ff3a8e5fe93b6d58de928bfa3c95714a7905d24cde7e06481c54c8d7908e9b5cfa9bd7 +Qy = 01be58f3c2da4534d6ce49f429138ac5ae66604fe33ccf8f457d8a7c51826932e37df08bc954a0af443807f6d4ca57f5e1d9f0a +R = 02a5ffe77509be45b000ec7f92222617b919d56dde834b767765c9ebe3de644ee010f8eca83b3fc2d5bf937e4fbebaf3b8947aa +S = 0c594c2960a198e1af01a4ae0d6625c59995a0f6edc29f8e581e2dd953782455a93136aabcb3caeed26684ea89cd70757c978a0 +Result = F (4 - Q changed) + +Msg = 7de1e93479e743b2ee11232717e898a60e02502edbf4546808c01b0ca7dc0d33b990558e57aca3bb82df86fe2925e78de081e0a4152fba1e3c52073c30aa907fc7524186cc154e557399dabc1bd27e502a71fbb9ca516094232a0efabf8a159725bd4a9344c35c07740f493c0059be438a797ea07835089445546210f4d0002f +Qx = 1d5cce20358216d8f70646d315033641ebe5cb4abeb764e1246e7887a5ceaaf6833256658643d2a2831bd51b7ec3d3628cf98b7 +Qy = 12257415c6e9e2768cbef78ba6ba3f4597534865cd3821435495cd0ebd9ddf79c05f1efb6d35c2afd0bbd27bafe896a239c8557 +R = 0fea23f7dcc03129f263847cc68fa0fdf692d60166dec57935a0764d3e82a8c67eda5614cd5dbd667e13db31aec6fc1e79512cb +S = 0594b3b072de183963f26b9467a3a7dc3a9d44bb2b6174f1a40e9684e5afb701c13e97f16d1565b1602b1ee0b048bf89b8fc7db +Result = F (1 - Message changed) + +Msg = 0612da735d109d3c46f661e3ab4439ffd80b7c4af895f0a0d6d18b3d764e67da9be365bfe7cc6af2fa2062365d0661112c55ed752f186d42f7851f209eca176d579e66653a1cdfe2fa8a04b99d488a377b8500e990cd423db766d361ca131c5d001a4bf8e4ea050c5cfac2b7babb782ca13d9071c8f3a231ad2bbcff3aa25dfd +Qx = 1d598c6870e382fec832bf870b2065ddf9f00b95fb8f637e87fcd96c21b3e8bc62d757cce7129fe6620977277135b29b16b91f7 +Qy = 1f941bedbc6974276b48c7a47ac6304bddf4cf5fe444c8d137e8c0b1b30b2c43879454bcaaae00a4af6843fd64c36f7a65da5cc +R = 02b500ad7f4c4b9b9e7f4b2be61a6738d3586f691332cbd3231d9befa26b63c0d297ed17fbc0debb11e446b8a1e24773b252ab2 +S = 06166a03a156876c2f8f0060644992096b206f40d7880195e6fa3e7442de0d773f61c1fdd7d0343b1fc521a2a5adcd6191cf1c6 +Result = F (2 - R changed) + +Msg = 47efb937a7d0edb83b454e21b5e383f6c8499b3fe8c490c4c7f8453db55aeb54d7d6295edd70a89f1fe095fb4120ded48d1e9c8c99abaf6e49e9bb1035d7af7f185509aae6d64e456c9f16a9ec40662afd9fcf1c497e3377429524beea9498bdadf945cfeb8192db5bb9d3e96baf4a3d283cb8014e873b7550c0c2fbc752e9cc +Qx = 173b7e070d672cce754e1273c62dfcbf3e9a16f2350cf34fd80510c9dfb083495453cb155a80064b8342e00218f07402abb4e3d +Qy = 0a1a772d95f44731103c5eecd684180339264b18b77c5f1e4c7827e5d29da2d22c6a9178f06384a72a9d9b1bf51773feaf7830f +R = 025d7e29795016221b35d22253ae6adea1f20c6cbd564ab3569fd928548d7a1a249d8ec7bf3abdbd5ae3578f8073ccd322fc337 +S = 07afffa89511ca49caca3e3493821f30edd5b55c1e7fd900ea99924b3e7e76144096f8d0ad1cc9f5a8e9f248c36c1963e799b21 +Result = F (4 - Q changed) + +Msg = 48ca0a18d8f9dd57bf7896b91f25164f2b659904fb4a32a0bbb0403cb5953d1acb64d4a500d93d0d33b847a3788e6a320e7b24fd551111defeae976db8431d48fa91e87162fa0eb5e8981df6a8df5964fc06005a44a2e7789b94b5fe2ea4a46cb4002e962ab1043ecb2fbdb7d1e8afeab1ebb6b3382ade59f5192ed104fe621b +Qx = 13af00045e1dabc22437998f3d65d20c7e22ef0fe927c16f6a153f76ff43662236bcfd7f0d35fee24ab999d17d84ffcf21d2e85 +Qy = 17f9b31c143ebf40b44aa1391beb2f9986f86cf082ab0c3564da653111953adc8259387c4efdbd1b792027b1843ad85415ae146 +R = 029d28100b7ff49e69e65f28606f8520ee82bfa44a044152fa1ac54af4b77c954c7333680a83b6b1a90a1ded9e53048176bd997 +S = 07e22bfeb468098420b6515fad41479819af90dc60b172b956693479690ec253b8db5953fa7ea512bdd142d696ccfb40d2923de +Result = P (0 ) + +Msg = 94f772b3a081df4f4e72cc53f5c8582b8ae54e33a9ff31531dc5720f9126fe0c346bfa25335c9bc515b53d903f3c48a56d193040676009b10f35f559e3eb0d52d36ba358430302a7668e71cdb3477e995556478c6623c1f9e64a31703c9a93715cf55364499a673a77e8153e052a8c89304a89e401f096586d1e4feea6448e27 +Qx = 0f1d45531d92516dd10afe8f90b4adeda7f40ae391690d3cf3fb76170f102e3c292f1381b00caec6d055a0d5fdffd3568ad4ffb +Qy = 11bb4d71767958e5d4ae5c7a976e35d2be2e98df48bf0d0677d6e8a376b88ff1445c0ab7a6ea2ab1fdce0f6d867d6d851b35839 +R = 017a5aa04a5f916f83e9f3c52d0ff5a07ee93bd4fd7795cccf9068abb42960fa23833724d0ad63358383f86a2fb2c793a0102f6 +S = 0ad562a59d5e90cc3eff572cdcd72fa520d0b4756c160b9ac4482306a564605ff031c6875af028acd2562f7c5b66c0355239d47 +Result = P (0 ) + +Msg = 6215eca1cc58c8421c92f7c54d2d21d4a5ae4c82074780ff75eaca40f07798dbfeaab28d5c3d91d9578501da3594fc11a57ff8d10bdfe25d1d44c28f1309a0b7919abdfe54d4aa5fa1615e6792f52479d7b83aaa0069b98e5debd2cac82a47370effcc8e56bcba0bc810a2aa9dc9dff51ba9979bac77c5c938cedabfc90d5113 +Qx = 0a69b652da68d88cf909971a5a1e426912637826e03057c23d0cffb3d50b6741fb2d04a4bf109cd97836587278d44bda7b91d85 +Qy = 1bd37bb38ef9b29815afda2b6f2de40ed9155c4bffdb893509f7c834625fd8d232ef514837fffbeb1c9cf0cb78facd8451a54db +R = 058a21de76d438063cbe0b63f4ffe27f08fe68b6d874c226de33b3a99972b75b0ea2305b831a58cfcffbdcfe105a677a9409a7d +S = 045517c76d3845d86b3580f026068bcbba02fcc269420aecfd5b59f270dffcad3ea67745e271b7505a448266f8ea2141efad7b7 +Result = F (3 - S changed) + +Msg = 6081864123200c15f6acdeb078d5044cbf08e95f2dc26c4d7ccbf860561e6dcfeac1c2aa55857c3a4c5c1b1585e90763b4a279086e4b377d68f2680d56de6281cd5f6f173a5a818033e73dffb2fb46fb903da567a7b24848e3ec93c7d175dad8473107808ff9ebabd6148f82f6730ca02160e17409f5876353c0739e35130948 +Qx = 0db899a2cb5c20eb3bbe4d4c96c946f37bfe1a34d7baeb0d671586a10be6a3921bbdbbdeb57e5651a24f6624d355c9e4dda2949 +Qy = 0009947cf5b846124cb90101a484b8946158b4f1e4ce6a1ffd17348ecc416b8923ef3308deee292ac61697fbc2e7901967594c6 +R = 0569162ad4da27e874cf8b074593f0d3c9b29bef9259f8cbb61462b623e2f721e98a06e08fe4e2b14c4fdd1523f660ff388284b +S = 0bf600af66dc69e7cdfb6dc829196ab14c893dad7c2657c5e03595a41bec441f2ee69460a3229386bc6275a69b882ed4662a815 +Result = F (3 - S changed) + +Msg = 062d4809cab209ff46c54f8a7853366470854464b89432b1c0d93af838f45393893b6f94f29a2dc9a8b502da03982eee80e3deb17dfbdc90da50c669d3fb571b29965eaea994072890cf55e28cc084be9cce4c2c15cbc460ec77ed44f62d16b9fa45d4dad70409e184fb47687f7feb07072b37180c01a65da6d46b84c429c69c +Qx = 08865cdff5cb9213a702ce0cd055a88b88d705d6c40322c305872f835facf2169914b26e513fb34003c7d1eb1e457ae35b565a9 +Qy = 0128e4f815edb39359c8c2bde514fb260ad44f245fc2c9a87a456e5dbd91c54cc0ef977b909a8b6fb537acc7788bbe050bb9764 +R = 0f71a253fe3040042390e24a82c3838ef079aa2ad377921aa389dbcade8109484b74bb470c56415ee12236c1928022bbded3722 +S = 024d4e0380015eddf01ccfd36bd0567c7d74a9fffd3629e2f5a99f5f8f16a39606619e267552f91e8d000a239b7e7d2ca187df6 +Result = F (2 - R changed) + +Msg = a1c4715f758d6213729329ae48f793be7253d21c12af81f74c28113eed169dcf3ab877555bae72e395cb11057d5d985e0ea5fc036df9095f20d337fc97cf931d1896d3425438a80c67da03c74c1040128ece6276edb0d138c940d1db6bc8fe169fc2179a318eb857435d24ce45d9488bd720588d74e48ad12d79687afa05d2d0 +Qx = 0c467a14e35730d9684a8837c63953c3bb4b5b34e105cb97beab025395481a931f86987e6d56045ee5f79ef24fa4f1c6c7cd623 +Qy = 1584c2a605a22c96c2184f055ed49a9a98c0a7af3921e8dbaada6e3e4dbe11bb15aadfc04607c940e871f2d8d363cc81018e79f +R = 0c0b29a4a10f05b56bc572298a8004d82c2d277a4a028897eb759eb6fcf9dc8ea759c8c0f5b8188d19b21230626d7021cf11156 +S = 00f52457dfac8b9a4a12b673efe5de438eab969904e6b104ed4c98ab7bc50c6fee94c545ace72b8b08881cb8d42ea464f32b972 +Result = P (0 ) + +[B-409,SHA-256] + +Msg = 856a44a335591da41c75015379f48254adb57c8989512a1d9babd7135adc43b4b3ca8e27c0dc98724f371352cbd5be0e34110c17df8f3f630045f504fb421bae8e4b914e03b8b85958209ab8cff9884f52514ec582532c39c54bb8cd0a50afe2be57f12d0dd5346ef5ec4fee88aecaef723808896d4777e540386d94dcf00cdf +Qx = 06ba2b539430896d341eaa2f0655b3a13f0563baceed76d4d4f98b93c83ec071ec697061370f6fd8fe998cb194207172ea113af +Qy = 036f4b8332f972348a7540d3b87ef02d57a74be8b02e47ed3becb59d56061ba64eb349578ba70e4ac08a9e3fb4cbbbf7c9dcce4 +R = 0a419619b91bdc0405e58fcc5899ab7d1384878e73714afaa1b186f5cf8ddce14e50e98fe1fc88ffba0c8380025b0793f898c8b +S = 0bffcb0aa5fe71b8338ea7d05f881b131556c467b092f616edd3a2a8fb6939184d4730a99b8921bba295f4965280a2decfb1226 +Result = F (3 - S changed) + +Msg = 0414e7b17f19486f404e0efee3295aa5e2c2defc6481eea2950ae52fc34a355aa4c365c36ec3d4cd6cd90c7214c8f82ee9b465fb43c311b9c0dcdd7a6c76bac318fcd3d0ada26fed8b2ade4379481566262cc1bd51d2eaf8af7057b39cfad98756e971afde585216ec84940e5e5f51f120ef20d6f6c7b4910bd87878112df256 +Qx = 04363c9c1a9a00f7f583bbc3d1ff1bf554a7c58c02f6f8143726dd10c57b558054efb098d322ed2ee1322eb9e22e8dd0f76dbff +Qy = 0dc4eb0b7ba0141f680f34e3430a263a26aaa22288b3b91faf327176460b49babd5cfb73eb800f7024949ccdfbfb749f147a40b +R = 032f257b7aeaef8fe6da86b39e309918e33045063c2562056ed4382abc820b0b6b5c1d49554dd6dd881fcbfb7fb3e3bed5832ae +S = 098579ad00f7f23d46873edadd5daf8d354ca7b9fb31c050b12a153cf9d964e6adc3acc4d1f320b42f27a5c926db05fb134fa1a +Result = F (1 - Message changed) + +Msg = 7ee18af2b9966016bab65d9951889d6313e89318a969d6e805c9ca6d2f242fe5affb71bb6ac2c4290adeae714e6bd9fd37fa7b9fc3fa1faf8d81cf222fd14d0c82dc573a6760e46a2221992db55c1ac2043c34c1fc7e665ff677ded061a6da123e276c4c7cb02beb0bc1c7836348dd8e9dc0ff6b3a95d83d6b774475bb24412a +Qx = 14f2feb4dcef360defa578cfa692a15dc97bfb98d2488f1a0fae06b0e99120cfcf9234b2572b4f5413c3c131a8855f2b01a8f81 +Qy = 1669c2e7cf3d4e56acddbafbb7c40ef9c16abdfb7c3ebf7fdecc17537ad3b0c59c65509a1c6cba1ccd21de9e1f3e9abb11d6988 +R = 0ca0d58e05d0f1bda37493bf710f46db297a7fb1df07596d20333b4d46623ba5930fddb939667fe193ffc421f1d0c49b52ac2f6 +S = 01df926b6c413edb545cdb37b202a0fd68ef6f4498cd4c936081bc1db2df1c75d7adff2172e480d210b89493c1ababfcea37a1d +Result = P (0 ) + +Msg = 874387cf1e20749493defcfcae95c49435546426df34a8ba66c305085d684a137a1d481ad210f14973c91cead8f585f2d83d48a2314e58a8723c82120f28d95707920db4e01f6606a38a34bb9c6c36e5df675b3368a0f0337b6268f2cdfffc07eff230bcbc1107dfa34e2093e12911e69596792f63d641de57f9bbd6a592d420 +Qx = 1fb40a0cd4e1b5d535477675ebd5304d3f5020982ff2d80eb1ff5e2cfdc92d688b61e09e304b32af8a3467f34e9dd4fa2f71369 +Qy = 12e6603819844ab9ba35b29a3eec9f4198bda5fe0b9dd9a89a8519d01cf639dfff88bc75c914227e721069d8f27381b4d173c61 +R = 0d799c39b309c589d4cdd8fdf469e0067989e2b7c077a021603098da1ea3d31e5f8b4a783016a1bb2fb52bc74dd5a4883e5451e +S = 054693269da88b3186a0c87dc2469bba646294f8f277a4e5accb7a0b2cd39c3412b272db99fd35a65082504faad15a3f2eb93c8 +Result = F (1 - Message changed) + +Msg = b04122e3c94348c755ea17ac6cdfe2ccb549d9ec92304341d4d5fd0978df102ec0ab3508cc2d92e1de167542e597a7d80bfb31fcb97ad184c83f24e5dd1f15ae853f493a9af1e0722439fe2e4eca0c1ae31ad662446377c5ab4e8abd027e139654fe94c3c60f5d6448c6ae98378700df1396bbd7fe8081c09e644e938aef9b32 +Qx = 06decc245e7dfbde1d27d3ea74e5a4cbafcbafc32b38ea014a60dafc8ef45f4b00692e605ed5fe8c9640675f98b39f2fe08207b +Qy = 006192402290accc3a831ee61e5891384320631545c71e2dd09bfb89877bc27d5e38d1449f313e9939a2ca1602f7c739276f702 +R = 06a2ee6257ac7b00ac6b980845437a69d91ba21f35295601e84f46a03225ce053ed454a593ca13ac30e7fadd73e47d6d1c19f2f +S = 080b9a2e207a49bb328f5842eaf1e9bc4d01d22bb8b26df92a930f1c2857b2ea0a8a51b43ef887caf5f14ed413d4b1f1d8db991 +Result = F (4 - Q changed) + +Msg = e375c09fc60bfd51f5ac9e9cfcd44cfafe3fbf79f071d3ad8a2ef456886ef7eea099a9c405de1b8711db47f20ff9c2a47b8f9f0b0eba707c39b0eeb25b1e3172d8fd025dc1dbd626d4357c2391a7c05868169e428e0a5ccacd2b73161a2a964bf7f5be7e743788c45568a031fe6238a8b0f816b17f61e4cffdb52be4e6417799 +Qx = 1227a7be491fb697af4d8e29366e6d4e9fc4510d3808c82c6c07b87ca11e18b4d92b01d7b61711f59a2f6957555b694a342a9e5 +Qy = 062cc77b66ec97e8d1c4a8d2aca038b3a05d49dc5612a04e64385e378c4c43554a96e91ac760a82b1e91234bcc9edef43968a90 +R = 07aeb214f26622badc3afbeaf5573429cd263c225c1bc44acfac46b70d527489efa5cf2a6caa9df21538a8e027410fe68f064a6 +S = 01ca4c317fc098956c8190536d07835b992f1d3a996f6854838ac45a75a67ed6c075b30e6dded7c555b3b2b5477f175eaa1f146 +Result = F (1 - Message changed) + +Msg = 2fe892c28e6f5d807c9cfaa23a8f7f316b2ba6e8d91790796290a77a70e0d2eea60ea53d9e91107b0da7567090efa6320e80277f2336e6f946a1ac4a53193d441c2434737e82bd03adce9b3ba51d649cab1a202d13997bbe4ba6a50bfde654829c64efca21445faf0f0296befad3f628d74cd4a60a5d22ce25d4233221af8eed +Qx = 018295bc581d38a8c3f0eeca4fa7e4d289e84a09f6b510ad626f7ad7acaf028f0b589239e459b530e1fa509b4c37b0fd553d0bf +Qy = 1ae9c3d6afc599634ed55d5d9c383ba6e5ce55f9b869b1a1d46521bdfc84f5ec77ba2fc1287aa4441d75d6f870a7cbfaba16a6d +R = 0de09aff902097c0a24c06e64cb8dcc77daa596efc666c60503e90f0a6d6b6f844b993c60f624489f14fff5a6e5b0b0887046bf +S = 09b0b479a19cc4e716c98cd01ffd9e20b40ba1edb5e203f3d40c0e3c5e5da0bed256f24e0f718dbac464ea2fd79d1eaa8ce3d91 +Result = F (3 - S changed) + +Msg = 9b71ac6d8f7eec02a5fc51711f444ed42462c3b7908b808c95c5e59fbbb1b8c63d0b1b3c27e2a518e536a07e895fde8bd214d5bcf38fb72b821c82653298e75123222c095b2094c1eb2487a855d7f9829f522c1f4d6b75e34e33ec1988a8a03328dcd6d7d6011ee84034899c39f7d15237725eb7a491de71caff917d8da80027 +Qx = 122c438a9c28eb032790c8b7955f55009aa766acc1e7db1f42258492049fb4e428655969c55b01c44c85153dead638ad402dc15 +Qy = 0b05ed292bf07f6712abfb3f97b46b470e8627a3c7497f2b067c2a68cb07dd6152b73c5a60975ae759b861cc2e1079a8fc0af0e +R = 0ba329a18fc2fbef8706beb1067f3e55eb5362b8748d7c12c578d922f9c8aa8845717c4b357feb7446863369ef27e8936fbde56 +S = 0587ca1f4829b646c4b1befb2912d5e6c270f8b18f85ffcaca04eab6a3ea0562b901f54bb92c3039fd60663327a0dbf8c0e6765 +Result = F (4 - Q changed) + +Msg = 76dffd7ce42005c06feb20fddbc8718f18cabe5eaecd03321748f17e4b0bb8802bb2743e51260585b679bb7c694e0e3c53adce69270a590609ebb24304166a26d6bec5bb09a376e232931440b4fe44ffc48c972e839027c3ed483c44868a4729e3d50bc1441beaa41ba2da3da1311f32fc73ec4dd65b6f2aeabf1854b43e04c1 +Qx = 1361960653e6247c68774fb2014de501c155e5c856a5d4dc1432d87e3ba01bab9aad677b8e1b98c42e2003e7e3423005c78d343 +Qy = 1824158302531d41039ba3ee420fb436f3552aab746d13e12e41fc5712fad0520fe38eee83481da6de845b66f6a0d06d1c92ca1 +R = 05bb839f94dde778cb06b951e871fd53b8029afd21d7afd35ab887f6d5413e80e7ed7fbc0ba1978e842d4d3925c193724d95177 +S = 0a7c23cdd0d0d5ed10da75af7821c39baab38b83d86dd72113faa2d36e947050d2f238d8a0cab77c46e1fff64a602d3f9048952 +Result = F (4 - Q changed) + +Msg = e7fe36f14fec6675334ce5789acf11f913a3125a9d8fd7dd17d2407272709e82d20cd56bd057bec503c648bec860361c032f7aff66f2f92599104e458f0be199b87703716987970659fbe038b50bffc6a5cad7c75a6ef02bf3f4d56466e8b4f41d10427ee4e4351384987d1ad4ad3486b46dde2135d3619f66d9fe14ba67c038 +Qx = 0374339e807a5039f40e5cce1431e647acab612d800b751fc3520563b75e3aff321a8998d3aea7c7d5536bb742986da8774edc9 +Qy = 13a4c6f2fb8c57596241e9cb9c24d9409ba07ee4096248e43ebf9925978fd6584543387714b4db4a991ad665401996e2b71e1ab +R = 00c2d122419c3e4b16adea83f58af7d590788b647260d84ae8f5fca2644d2b20ea6869a783f769bd5fd09f9577c511a7a0f321b +S = 06db6d383832c45a5b73b367d34dacebc55a96d226ba17a12f1ba27f2d7b6c0c9d4a7210fcf87689d46e86c8b851fb2fce757b2 +Result = P (0 ) + +Msg = 29cda4b1f10dce64a886a94a50a1de6765ec9ad865bb1a02d671e0e7d0a7e332ef0600df9dddfc0b35ffc82aa0d214997edb70a36a64c1bf667646b8fb177700d7a7aa0a3010609e89a49fef28d475e514a44d5c6f0e7418b6e0b4fd4965ced5ab546b35a2a9dcb5964bef9d860adbe29361ff01a6c39d8b65df2d9a25260eef +Qx = 0d769528fbfef25f18263fdce446dbfdbb384cfefefba9708f9cc8de21660fb7ee0ec4ee8b9e0ebb4cd98837258bec22a9da1e7 +Qy = 0cd1c24efab336f2182b9aa4409c8bbaecd6cf683c6cd9d3d73938477dbd7632db330fecc22c1a7a3cb7a0e7e7bfa6b1a152964 +R = 04604044a42b8d9a13dc475ec22fbd9b1d728f969193fbf42328573ab541a7146c91ab59adf2ab0745083e8a0790784ca3d31ff +S = 05a54f4a2624cbc887683c85ffb143381734b834ad69e6db44b0267614f05d8218df038d5312be4637820454fdb48e27176a2e1 +Result = P (0 ) + +Msg = 95c0dd2aed9986f4a254cb14c6afa856e3b652513df80909e86d310d57e58387b30935228f5a9de864eda199ea5e0a10f4b8cd23aea31a8fde7b538af3649a1ec71481b420e8e0f990eea951f6dc81679a8e07a9f0de7405ead09d35f8d0e4f38aeecc0b5aa047a457f7c46aeaf6e3bb36df632c213398d883c1f8e2ba57a964 +Qx = 12e33e8695e51f3c6e1bcd41fce47fbf1c47539b58b4041ff3222e0f3d04de3caf8e0030f01b22782980cc691821dcf86d88187 +Qy = 156a14691effdf1998c877998204acc8da6f703bf23ca0bd58af25b0ce2d94a366088644107fb043650d62d8b90844d1fdd302a +R = 031b5044ace69b5cda8af25c584f2d0c0404e99f15a7374b5bc5e6d0e98928283375654b53af92485c9b0a263c55572101f0f2e +S = 0463ec16792aaae5cd2b678d65c5a1b1a657695d4b7451cf3f919d9f1cd1dae614d09abdd57667f48d85a239eecd0bf12b86c7d +Result = F (2 - R changed) + +Msg = 1d35a9e7efc7d6706528ac6ebf2cb8e4723d8dcd091edb5fccde4827d09353f1a1c69e2d03606d473e5eb3add7029555426d33d49428705395f64f6b5f9efc70725a0348a0e2ae52cdbf1b52d96b89e4cf7451b800352bb42cdf98bd20d6a29f84f7b09af21ee8b2f86d3b160fc02def7eeaa60d73d15bb5e38a38de44595a59 +Qx = 0b6885f5d2935a9c24cd052288e8162e0039d6800479b93fe24125769d709ee4211fab2c141d147b6a6c23c7bc9f863b5a61625 +Qy = 04291e2af5193b82d9415535455149223b985d9b06d664bcb9eeed273c24d9ae9ff906ddfdc0c51e91cddedc047749e74a3bb2c +R = 06b1f5090f7300c8fd4de8ccd62fecd5f345bd4138d17f706ce369a122c5f1ec9d179bfc9e9c8a70b0089d952b96a52a1b019a3 +S = 0b6edba8616b6cea15ffb5c1c74d8eee07570c8616b1e73f7ed14ee6692b9f793826895a04611721348eb64c479e95e9e583346 +Result = F (2 - R changed) + +Msg = 99deaca1359dc8e21074245602e1024771339063e3cc1edc81ee40b91aeba2f5d242cd0272299d531839747988a0e3f93191459fdccd78e3e8e6893d4ba6594400fc551789772ec809d9dbe45fa5bdb4d30925bc376cac1556e14181fdb784ef3febbd88b6e2b2a08f6059c4cc15176ad5d4e72baa10fb19cba56c87fecd4afe +Qx = 057e3ffc517e96b4b71b774a5743ec05147fe9aa9642ba32eeeec363a29a357e4c296b2f8e6ced2102d4ee29599be8d475e7597 +Qy = 0d7ef64925c9f7ef35c88cc8d4984741cf37b63bb7a1d4f5ac8acbd34e28b6da96492552b6063dd628846cc3f8d97b1fff643cc +R = 0f9688e2cb0f4401a5a07465afed8e98aa891ead540a5e6f7aed62df3de86654e1b765c22af694112e08e62c44c620ca83609da +S = 0b04b5b9590c7bb01be7541f535836ec24d09c9ede7a66f225003e8719674ec82a162664bf13f70c3e685b5120d0c3ec45d7b78 +Result = F (2 - R changed) + +Msg = e770bb7857eb3ec881ae602f74073be0e3779e258753ba1201a90c8bc54fb3f2f6e37f9edc109c86b00523f56aecc27e3c5cc2a1d471244c84155390cf0586503936b113ad2fbb42952a56b1cd82dbe937ef62970fbfeb7da8e110d41ee878b5e40f7f6bc10baf96b3fd54ef4e6e176f6c0deaa4c1ad6015ea93e8a2743213bd +Qx = 151f2a3374e05d9845f5ece2e68827dc9ff3c4063b7cc2c1e99dcdabf58145fba6a40d3e91efba7ab8c7455972ccea5a5dcfec1 +Qy = 1048bb2fc1d3625f6b63a2d5139cf734f350901ed95aee261c949eee191eba4f1892da3d6a0f1598c1ad5bb958308f158fda621 +R = 0cb12ec484e104074ccd6e1e595a84b193dcbd7af03c8d6102ed0f20e97afc8836cce6e73dc1ebc183fbf526688401646dfcfb6 +S = 0da19fd55bd21715660fed94ea7b32e9704229c47d12b46fb10760b3324502bc0016095d6b8eb45f5fc5a7e00aebac4c4db6ce2 +Result = F (3 - S changed) + +[B-409,SHA-384] + +Msg = e9dd7258da72c0014698e74230950cea7f25d6d135e643546cb32205f465c3faa99e676476170c3c67cbbb54ba2f77da0fede73ff7933433fae7d9ae87062c44d761723a9214c40e527456cede952c0666a157a9a6e54e7c6aa30b3f4205130a8bb195bbe12eb9344bba3df57f7a111381a1a2349e569d11c46deb04b0e59e37 +Qx = 13d42243184f51f02c717b89ce7567069aac19e13d8b6308a4a1e1a6acafa2709ac4f7799ebbbf791db0cdfd72c5f9dab3e032f +Qy = 1ca1058823ec4c85c22621c33fa5d954cb0094ba7e6d6df120613134e5b56d81cddac5632a2b271a8722b4a1a5e28b1efcf6105 +R = 0b1cdd1aed728b9b74f03d25554d3beb9b60863fd938259fff107790113288201158a5bdfc4fa40f27786c84bab02bc9e233074 +S = 0ee14df6268acd71a53a307f6999ddd77c13930733100b12d33f03c790cd4b62ce65de353f42e9ba324f88340d08bd5caf4d04f +Result = P (0 ) + +Msg = 514564888c729a0e35b811666c177a418f2a904107b28cd5ff1a835be696cf8e6fa6e239ec3a059ce9519c998774cece8c08242cfe49f0e680b108b9eda4110e62f10a285e26402aeeb04472794c717f47a0946444f8b3e8b981a6fb7e322cf3dc9a3f45593b15d9676ac130769a46768da78dca67c6faa28ee6da22641ed931 +Qx = 023391dd6ab6542fcd676366f33a65773bf1f1d8db7ba6bb20ac40aabcef63ff907a3bdb5481f41102511495a96f131e1a3901f +Qy = 1c8f6ebcb061dcc2af123f5a5df9e72877ef793c7e4e4b19ad7498dfa8c20307af5d0185fecdf83efc7eaacf871aa47d7d13c40 +R = 07d9d0d09a6b5c1390ef904956276725519eb2f9ee86dbf97a0a47c0d033b9a55b0610230422cf3e908074cf9c2956ef7398804 +S = 0751b7ea944c31ba082f2435671357f406149f0ab2b815c2cd4d8c2344e0e17bcba111d734a2a90975caab0f482f0bea6288c44 +Result = F (4 - Q changed) + +Msg = 102cbd6ad4084084876fbf72e368c5d148bd65dfa8326ab3bdbf3cf2410813e9abecc2c6a94991bac75244192d6a40248f5f6c89038371d26bd9f5a34f228da990f711dc4c7fc9f3a96ee94a393b356f69c98597755d2cdd0fa0f6897c34f4983700297ce6f53b8bdcef61573d430fb297671aaacdabac738b8dd879e51d647f +Qx = 03007a79d4eca0884831db7f7e0dcdcff8c918bd244b3bf357b855d47d6e6673cb66e1fec8127e1fc5dbb3d9cd3b1baa34284bd +Qy = 121b2475bd414d2875e8146e2f8513af2ea95b99b4ad8d7b7f4cb753dea01716ffe83c44ee98cc0199b82aee356ef97da76e102 +R = 08d7f5b5c3851b601d2123ed0d3331f9380024f9a988faaf64761387207188b6ed1bc783ba405711b4f301101023fad9892c0a7 +S = 0efaf9fb4cb186d7e23134841bff25c499e2cc0d3a8a9b773581e346df5488394830e63a3c3d1d3a8f6f16596a1d8a63d15ba7a +Result = P (0 ) + +Msg = 43d1c8b133d6647c70c9db96e7a69e060b0fa6cacc98bbb55fa2414539b847934a88c704cc526e47a68a24f5a9016e88ab89414b4add38bb84c8b9574c1f38a39b6a11675e3d75902818269113f57b821ebed8ee01b3e27ff63700f8c9048ec2ad414d2ca160682576260cb85c396f16061ccb71f3809ba0d5629dc7fd21b910 +Qx = 07f714d34149128fd0f2a98bfd431198d14389df968bf48d70ad85832bd8ca8cdb496da393f42a89bdbf9af4370ff97091b9751 +Qy = 1db75b3f2a7de7fdbd4422d988c9b0f4ea613cfb297539c0b183a78780cbf240d63e4c3523e20deb1b13e515c6fee51c37e7b7e +R = 038149ca31fb992fef053c5b83f3ecde95f15bbbaffe5c3eb5b965977d5296f13c6b5668961e365a327f702de920fc7dc11295a +S = 0b8d785c88d06e0e71e00bb14a7f4d8e026be90387b3c2186fe1b80b38185748d40172cd021d4ecc58258f9e820cf52b15b45da +Result = F (1 - Message changed) + +Msg = aa0d0e12545384648d600a9970f2f27e88fde43a13d0e31a500c6ff99f5939d521ef06e2d63c768b42272d98e0047927573328674793ce9a723fa143376d318e7225e1f75d83006a9a1c7217748018cf13f8ea705c730ac7c9caf7daf62319c94539e9355fa8c6dda28a7ffc38f1a8e15471e4556b6a0b3020f23b1f5d9ecd7e +Qx = 1a85bc3384757d1ba78a42dfa96135d2b47e730c184950aff1b656bc1b147372d659ecb706d39da1e65e44a45db26110009eb75 +Qy = 19be085a4d697663b6bf7ab6aeacbb26e3f1a09a715992e243d3d24ee0ebb330240fc1ada98a0504dab9b1b12038827c30c77c3 +R = 09d1c80e79bcac38c1a3b4842e86d78af39001011f2cb8f3d3140f72a506f1cd5ef6d385b0aa54ce08477f6a91e0fd67b080cfc +S = 073cd3c8fd4e1d224c05cd8ba6b9fd1ab5460233b77a23adadb7d0a7c48364466c0d9e6b4c035312ca4e91b726e963b99243118 +Result = F (2 - R changed) + +Msg = c91a2002607c890929acbdb2785bc36c3916b74c85e0e666c64c9719a8b1ba92ba1295e1c6f4dbe4992b4e2eee0d9689de9a5ffda2ad98ed4b3dbdcdcfe4df83a61759de3970428aa8a539f3c0dd60f3d3e96a136145a9d08c7798370711f81f7d773b589d9002ab412e5b05cfdf234dd5c6fbb22150abcb1b3c4d46a8faa7a2 +Qx = 14bf026a050b320036d21df25c1c5b6d585166d4a55801f94e158ab3713d94802db5221f44ed87d0b3fe94682ed0ea03f163415 +Qy = 00e3c494ba69d6ef0c46c0db5d5e9db1b2d102839e30d60deea241fd7dd7f03180367afe1dcbb9c9bea8a5c3ddd22085404a781 +R = 059659a8c1ccd32e459e6fabaaf243a440dae46f686a013591757efd1a69301cc2622bfd2b53d58eb32946ea74047f12a990f4a +S = 09fcca1163152979531dfa403cea0ae6fd9bd074df532a9f1858ca0e3653c0cca4e6c17952032b23b4c6e21223a5e6cdab58e1b +Result = F (1 - Message changed) + +Msg = de7a4fc916dddf4b204a1ed5f7b183b8525874e74bf46ee0c1a33da1965f58f8d91883f217715ef282136c0a63954f0bb994c7e05a949dd87a34f096bfc1ffe6e4a9578072f6990f4a74b666a7468adaf7d8221202928a2f563977d04514d41bdc30fb105b414b26f18819e98ab3423565fc81ad360f798c3d35225d72c0f4d3 +Qx = 103d2d95a007dcd13a7dceb5b670e24ef0cfe134ef99f317002b81f06fe3dd97577ceae917847633538012c57a02b538bd3edf7 +Qy = 11000b9a3ebf81609370a1833b98d9962b06abfc32eb6b8e43abec86d68bb0f16222e928b72e7defc4e7a62cdb2cd37d46bdb7b +R = 076c8dc25697c2ed358486c741023cf9ac723de3b1b1108754b09912cf33403ff512494484092e53f07fa5ecb4d65731f3fec08 +S = 00da28b0183b3ddedc71ef36d439b12bd32d5e6ace91dde6222965d41820eb04835a2448c5e9e3a5c9a4d0eeff2616d57f3a459 +Result = F (2 - R changed) + +Msg = ef199dcbd584d547a897f41b1a722cbeaabb54d71a5e59e8c443df35247f1018c3e6236ab99e95c54a29bd28482056126673047af0641a94920fa38edff111061379f719392df12bdc4462671e3585e63d12b81246d2cd86bb907b0faeee1d21dcc67fba621e62d8ccffc571df65bab95b4a55fcfd9d7278cd33270b9579d099 +Qx = 187b5e8f39b9c9306e8ae26d212c1161a47ba6ca9a68641fabfd4a88d31cbf279d42f5b727e5fac2555e3c93b72c6947204cd71 +Qy = 103cfd0e4d124aa55abdf98bca1dd5e35400da18496f46163291e1495f73aede6961333063c2b8f435f62ff5e0aaca4f576acc8 +R = 0a872468e5230b7896871b53ae62162fd8dc0a0848577522967c071a7b0a9bdf7061b21b6e40b743f94d94d520d046a1b5d9b59 +S = 0b652b24f054019e7651e9f1dc33ecb968d07bbc470bffff3ad49b0f19e423412a69bdd6c0ab150bba9b42a2cd3e27a8b60f556 +Result = F (4 - Q changed) + +Msg = 5e365db1e4e04561a15090fd5344df0d50cf10f556f13bc9b9912d38ff04371ff56f1664b7f9937270a96745b7bfc81f6f146b3181d6f0edc5ad4c3c459f580b92a0cf176d2eb56c256acf4d24a93a7672eb7a2fb6774d7cd3111fc62822b9d0d3794e105541680b640b60749e59d1bde5c4b743c84abd4c5f159da8b94bbbc3 +Qx = 1ca7cf38c57dd400c8dee34fa01f45f551dc0aac005aee207d03f7b3a93fcf58416bfffec5bde70cbfef5c264886b424cd64d1f +Qy = 0681d31127e95dbc983100b92cfe964e2b0dc86684f6c7bcf72a47b45e1a81dab3e5a087036528aa335b83f3baa3571a09f7ba0 +R = 09293eed260d99553dd6edc28cfcd26173ff272d54cdd13b999a136eed383c670f70fa9117d06479059bb21e7bc3aac4ec473df +S = 0254e2664e30f29d5f52960240a01d0df61a750695c9301a7f5dc07ad037b9a3f0ae46ab0047cfa0f2b6a2d60966b3b2bc6c534 +Result = F (1 - Message changed) + +Msg = ea5450a2a85783574ed981a77cc9c1766389ae02295e922802de1c71f17455f205eecfac4226d4f11b36881a312fa753aed2c957bb0c04dab82cb2ccf3da71947310e61036179bbaa852306f9f26beca9cfa9162ebd2f1914ecd09ed014a0ea5cfde91a61ab85022a31e9f22ddc8584b5d57457a04f4a46d2cfd5b44bb26eea9 +Qx = 12bb4e6c73844e7d61c63ba67422da6f40519dcbeb7c22ecd373d69a9d5b266d63e0599659be8b51de71ca4a4e31d807105bde9 +Qy = 19a06edbc425be2dd12b8745099250fd7f752423fff5168fbcb5464ffb0a2e26a1d9aeecdcde7242d9dcf3a5ba31129db0e78dd +R = 034c62e2d2817cddea615376d072891dfb8c4c57e30738d7cc83f7de1903ecdd7f5ce6812d2ba0d4c31f4c27586ba2dc899e097 +S = 0062aaadaa76eb9b61191796558846371a44f6b5a6075f9840cba6205bfbe6532b20885967ddf77a65c6e35a962bc3284fcf88d +Result = F (4 - Q changed) + +Msg = 1228a46dbe852e9380c381146d92554db17063cb82fbb7573fcb9ed054870391b41e098bb21e8c0c5346c7680aea52777713e1457ba5aed6bcaab0d0c11c2fb1be55b2891d9bb611d3a20b64fcb0b1f283d0604af61944efec441055653efd04856677404bc92b7333f15f4d886d58636ad7e246078d74c62e72badef8115b78 +Qx = 07121984a9628d85606f16abf8fdbb8a7415fc9584a9fee2cc0d7e4065462891827e8ff23b5546ace3d42e62e28c9499d9200af +Qy = 18be3aafff3f63916a0e8cd15c25a6ad0c8c16be5008f34265e606f660dec4eee0afb856f96bc2e4b20670907bbe90fe76d6da7 +R = 0c28aa00212c00864fa4a50d2a04f93a1685a4b3adc85f94eb0d9b4b91232ac809c3f9a770a120924ff2049f86b679b449c9334 +S = 09fec5f7dadbb27e6883eaa57ee90b5fc7ac63fcc5bec97cfac91c119b48cbaa3f37aa6857a09cc7b6d956a07ad525e9373c5f4 +Result = F (2 - R changed) + +Msg = 19aa9ec4896232032a32dd589e2fa51b9534107003f4d24d9fd8c30da5d85e92d3c6f53982bf3df942c849ff01dd987a953bcad8e6e8a26ac268ba04d00f7846f9ee64a3351bf2a58bf48a4a0eb36005a9c2496faa2ca3a4d3b2e7dddf2158767a0d2d8405e00adeb1ff7709a5ae9d7a038af2a7bc09bc8d68a00b50e96ecb85 +Qx = 19e1338dffa5ce79671fea187e127a33e1ab8b03008f2e07f832700061832c99027ae67f328fa1d5ee78a74d4cd049face90607 +Qy = 1ed0543c04004a0a2ed28c752cca68bde6ddc1cefba90172411c1b12bbf6106cdbf8efec7c2bd9c5a385fbc2fae01962efee041 +R = 01196365b0cca203dd3d57360b8c77ae3adae52e5c5118c28f91f9fbb0cb06fee223c8e6a60fdff51ddc5f0cab635e192ab89c3 +S = 0206f85cff82ea056085b58e8907a3d8e373d64d78712426eaed4211f70b4f9ad335740040a849c461918d54380ca353bdac9f1 +Result = F (3 - S changed) + +Msg = b82d16e9329ec90e4fcd1feb717f3e11ecbf40aa7948687332954901bde091a87d6b7d9c56c0f958996b7b221ea17398e0b0dbb007ac5cda110e4b0ba42f1ec01e377a81bffc0004a23180bfabc402fe744980d5ec12be7621375d28f61729807714f5aa025614efaf662f833bf999eb82c956bf02e6a1bbe74f13e25ba4a300 +Qx = 0de747b42622af0f0b30a9a8d36ef6c9772c1ad1cce3325bcdebfdc61ec1a4f3f23ce1a9b9887f0cd2402e647c7bc12339fec53 +Qy = 169dbe1859e722c9f6640dd45a8f4a75a5225c6f03441bfa4aba07ae55a704e07471f8434c8063e090de4c567135a8ed2366454 +R = 00f171313204b5911e25a74b75b04536b9ebd03633ab20e1fee0df79ff294beb06d3223524402f5f8aa2b5b9726fcf9a79be9d1 +S = 06536cc247325bd139c9bdfd9b30de2656b982116895f883d86e6abb6a0d2c3d2ad0af8e86edee52aaea58bbe00a1153db0bce1 +Result = F (3 - S changed) + +Msg = 36d0277976a6f3f61d54b39c04579d6cfcaca6b0cc60c71cadc2234c5cb941bd93b5f7f01d77fbb8eff8fa731e8ab183945b08ad52b4216216e89d950786ddc90abc2890e696c8d12ea388b875eb76d190d8534bf1fe02a17f287b75f5e840e372adf507676edd55374e4776cbf0a860f27414526bef8cf797b7cfb2864f48ec +Qx = 09595b07ab2a9628065f49c468672a1ad509438fbf318300ec024fcc3857e69103f7a893ef60224e60f05a4b7ef6dafca56f161 +Qy = 09b7b9936172729a5ec2b5daec296c3c7f5ecd150ab2ef1db2a73ca7821f5081809d775e2288ac0eb7847a67a348e97ea830c74 +R = 0a701e37e60ef38d024e6869d48b58eba301c7b9bedf478b743c9adf9b9bd8978a2c96275d469749720be57da541f3d012a9e0d +S = 03980cb763f543b44443ab4f30eb39792e7726e94935fdf25c225a16f04687003eb6b55c77c0e0e957f303d1a65a04d12c1ff2c +Result = P (0 ) + +Msg = 103193a7da38896a53389a0d522268d62c602fa00716355f6f986ad560bf6a45ec5afe45db96bec1b6c61e128e5edf5821c7f985d1497ca5670e62e3ac60d02ff62ec3d5565e0bbd382d931c50898d90b5e991c170224c2ebc2a33445a7bd067afa03a5d2550fe340e653aadde62a5f8469fdada8f08be6c3e84ba842a90a461 +Qx = 1e25ade0039bb05d30e017789d68aaece02d504975e5a380dca85ab178a6d54a08532c3e21d5593f2734fe60fc707912781f9d7 +Qy = 04068e4b7d87011b8a85eee780a6c88cd0407cf3b956eb1c394c28e1f3cba5b707ce3cbae17f1e7fc3414f8f05d834197ecc863 +R = 0fedf12a9fc6f9d9b665be6f399ab50e17fb744d1cce2a69a99cbea5b0c81ab9c526b928d57d5142fd2b950b73ef3ed774bacee +S = 0554a70d6770fcc41a328dfd55adec6b7a0acb246425daead32f32ff7290e70ce7b0ae87d91aa5380e7369d35090c353d487242 +Result = F (3 - S changed) + +[B-409,SHA-512] + +Msg = 8dbe5bda443eb307b101696b465d668ba148a7425995567ac6b54a66502aa7d0241eba723f9a5626b8f20b928e45b681fbf27da13c1bbf8564876c207a0cf1a99a4602574d14cb5b1df1813876f385515c9d653952e1c97aaa1bf684d984f45f0adb797b89e8ca7f67daeaad77830d4a3127f1ad810faf3419c7e21c2f072a9a +Qx = 1c9c142354fb25ff79e609840b872224f0536e215243f652b69681eb33fcffe55fbff093c67e146fd50566b0cfbec338b51f827 +Qy = 156fd088e5032478b5f7f72ef3320d004574eb3817db8cef6a62ac226d0e3bb9419536f85550c8f9112a674a53188a6dd0a531e +R = 0f209b2032ab3081912e8156de54e6aeae44aa1528a3457365b1e2f6019acfe2ebb4ff4dcd4edbfbe45ad749691a0b8964d3a1e +S = 07923da133846ecae257f7acfeaedddb59776ae4f79e633572a6a3b82b5d4550d10c41dd67d3f94e33e17b1c13ceb25fe3a7e47 +Result = F (2 - R changed) + +Msg = 8b2bdfc1b7ee9315372721254382204010e8d130613e082614c379f0773d190ce5476aba704f0c114b769e41ac00445756f566c1f8870ad8ff2a4b5a554ca3e4964eb963b5fc74290a51232003c25392c53aab2b1410760686124a9ef7b66e1c602cce2a7ab1cb54d7fec2ec3cd806c33654d398bb87e89f8c31454add624384 +Qx = 1bcfda449a8bdc030a2f650b8c7641590396ca06b26a489bbc3727016678ab8888c6aef361cc80e3aba5ebd49516c35cf736331 +Qy = 1ed418524d8eaffe2a746383defbe1511c77d13221f4c23cc927e45e3eb7887fbd343806557827a774a9f484549f19072c74259 +R = 07ec071d00fbad729610d557009c6b7335f217c13bb94545e0ff4b12ee43c5531c058a1c546a95ac98c1f35aef9b174dfc30aa1 +S = 031d589fab4524d0fef66c9f93341a855706ecce54781c2f7b3335ce512c7138483826cd666f997e76d64c7de4165a301d77583 +Result = F (4 - Q changed) + +Msg = 205b2710b2a9691050cfc1a48187bbc16e9c878d4639f1b6514c0ddd55e1acf457f19682a6fa8682d9a4cec87e8090bad87c1b58a96bb5529c71cffa7fd9c2b689f1508e20522e325ec077e1ee2f0c70095090b06b04ad3e14bd98584860a030e835def2e0410c591422f75841f92cf48e66beb19d4fa82e1ffad6546882eace +Qx = 13d96e91911e2b48d0b848181b64bc3530bc17ab993ee3f5a0a23481ca2c7b9f696f353ccae4064e07bad6692e8facb97f085b5 +Qy = 1af27231206d896f68df288fc31ea600f3e8c33f222250d2c9150286f8b4bea8f0f320e34e82a0b33dd78628ae80d41f28c80ce +R = 0791e6b13f267d10c832c72082db5c1aa72d913107cf24e85fe06c17afe5eb2172d551313e36095dc51cb661ec85d811dd77eb3 +S = 0814a827d34d77a8417bb556dce63d864f1fc7bc1f8026a545da747bdc62192ed2ea75b7784849e32f17011eb3ad840c1963bff +Result = F (3 - S changed) + +Msg = 03777daeb5fcc8d148c17d844098e8ce89611fa8fe9f21234a84c6b8bd52530f86223260be2ff3b94d9dd89b15494d64d827f14e4bd7798bdc21de1ad4a9a9d4a2b74f7a8c7c078689fbb170d6b69fe1d70ce8f72651657a4b03945f99d5997863004d06d4c3833b5167f5f81d4f74d0b22f4bfe259e7bc73db83c5ed834ac68 +Qx = 10a62f1cce8276bc0264b1dd421b0754f3346e40c158471056ee453e0528810dd232881059d360b291c6ee5a97c5f8d040bd1c1 +Qy = 18db2f51b68bb5196b535e81506cbcdf345cad7ca37d66473e897236875198aeca0389504d3282848a7f48f3cd71c8f26f5d325 +R = 04d878c47f23b80ba3f0ca031ba0917d89c0003ed02cfb17866ac6865a39705331b07eb95718125649df9d98233564b9a0f2d7f +S = 0b37a550a20399d7e1ad8d9a803a6f5f41fcc7f9e5d291f93c13b35d27d1f5a2d251560979a01f102e218f20e5f4ac2aafccdfc +Result = F (3 - S changed) + +Msg = 31aac653d0b46687b011943e081deaf3b180e448d6909316a165580bd854a9188d1b8a0bd977dd17f49a87f7427aa7ea04384dad8a788ecfe602b483fbb68fcb68997fd00964458d447babf565906687f21efa5018ca63d18c58271cd8194ab9aeb28d5e2406bb3f9899e2b930c17bd4b2a2b3a0f0cf87777f502e923044746c +Qx = 1c63be557162ab06718dddac59d307a5e89f115f80b8d0ece41ec3b9cceb9cb6ed74d1b0b37f4fc3692edba0c8fbd442ffd7fe3 +Qy = 13d1a9e8bf9857a6c0e9c93d37a49f65e464edf6ff38e1223cc116aae08018b65b5441367bc84aadb08df83a4e8a4ebe57cacfa +R = 0f2355c6d8361114b48cc3d299f5b4cf632e4c6f32b799595d4ea9cd2fd87ba5c9ddeb60511ca2b4af0b1d85ad8f755a6e29c27 +S = 07f870ec88109c0c47aa0614d5a26b7686328b4f2f9e52d90bc70c2ac84223898f22d0688708dd8870d4ec07dcaf8d47a531a71 +Result = P (0 ) + +Msg = 2af042fabef92f5a9435f9ec93d302ca7f50614224689d706eeff6602826d1a3edd2d744349951fedd7f033525785ee4be5d32b34114bf215a81c2079c0e7fe6b9f4e9baa5dff19c4cc6990bcfe8902b8d5458ad25a103c5f28219a1ddb424781084053d775c9f9737c9bc3c3e091e3c168e9d743f10453ae29aa4d85e84df02 +Qx = 16937b1b2eb6cd174516da3203c7a9de3e7817632416f84aa511cf2d600ffccb98fb22caae1c815d33dfa621af7f2bae27dd125 +Qy = 0c8b08ecce11fc16b6e23206d8a697702a80613ebb03e0a9d26f1cb9edb79923c1ccdcb80faaf9292cbef158fb7462474fb1ac3 +R = 0bdd2aa555af41a9a7e2ecac053a481db363bc1385b7ec96ee342b878f49ed4b5e9958ca371324a8985404b8e6bb82ef1980d02 +S = 0be1296d108fbdfbbd4dc2c4e5cc267d65d8316e1eba597341e773a6fecbe707215035f98f581ba592df2cc96da7b5c2cd73b37 +Result = F (4 - Q changed) + +Msg = 791c060363eda07eb1fe12582cb09338ca11415e041ddaf8f9ff7b6340da53e237623da4dfb8797440cb3fac8eab38df814f48aeabd70863565add309e35133930bcef88fe04b0db5cfcc3fbfd755a18a88eee2075fc2e7c8324b73696c46bae5f80be21d4bb2a1e4a17e916f1f05dc93853f4342a1c6c145acbeb8e4a6a4393 +Qx = 0dd9be522a18b03943ed9240750bfc997a87a795ed7160e6bbeb661e7a8f31997595b1b26465cb37135b62f96efc725041fde13 +Qy = 0a43231bf9a51bb63316bb58147a194eb489712013db8a70bcc66ea04f9720c5e138234c221c82853d98f4fd66a799e46a18877 +R = 031de4bdbb20d9cc0c65d16b90faf777003bce7a28470563382516a6dc42f5ec9040403a48557eea8263df1435e689809ebba3a +S = 044c786cfd5db6505424b9723a73bef773a8cf91f2e3ac1d1b4bd722111698ac17a2b660d7aa7337b1c1d2ed4708cd708e3cad2 +Result = F (2 - R changed) + +Msg = fc06a4d4c22a25d936f3b5fecea43ed7beb14791b6800e9c644a85b27e17f01627e000f5c61cae81d1c4d06caa671b1e7960da01a6fe1abdbd50dc09f7628028453640e1e17e35dfecd28d588fdb42b5f22fe6077259e2ea242ee1eff3161219b20774c0fff1462e92853ef6794182072f8767a73b71cdbe63197c8f2013a3ba +Qx = 15776ca485b0d035632424fbe35a3e6ea6be3a105cbbae74516dd45ebf9e09a662b977f3dd55f70b9e5728523426c954fb1db01 +Qy = 19394d6fcac721bbc47746fba248f6dbe99dbc5f17515cd22cbb07add0b875e3360336a41db7981479a83f289bde30de4a87ef9 +R = 0544ee05ec1b4da941f65859f53c0a623dfaa69b4ac4d9f3c3ce26fe0265ba7b16aadf602636497c3ddcf46914f5030f269fde7 +S = 0219376f5f5f88f8184270352c3f976ca9fc29ad2bd2eecabdaa7d34a7c04eb84b746d2c0ff2f608a86503e91fe0798cad0bdf1 +Result = F (1 - Message changed) + +Msg = 1b815dd41b50eeba8cc8eb9b726ce17425933777897b6630cbae2e143bdc555791d8e1665d83607c256e197f0992deab3830c04c8a66640bd67ddd1a81c705c7741bf5e0464c84e6efa78a9785023df3f63d5483e6d0e31f4a69ac87e5ed569052d57b31ac894b07247be2d346ec2041966242f9c5dd85e3786dd366bdbdd02b +Qx = 149a32d46b2fcca40df5abbb582d079e07c7515f564ba6eec041941b72e5b24e7735a99a2ab3dc45e504997f61463e96b3f0cb7 +Qy = 112a19dcb1091e1daf033b60d0ac14f839ee68cb617f832778ab1e52c2ea59167a860550458505d7842a7730df84b1f92e371a9 +R = 0b348abfd6268d38d782c1c7c04bcb80ea1a8d37cac4769d962875830cc3cb714f887b5a001277514706e396b8c013d2177e278 +S = 0fdece10f6cfe9949d70171fcebf5df0ee585bb275812916fc6082cdec7cfeb8fe8032f4ed80cc94dcbec2a018e7720710ff9b7 +Result = F (1 - Message changed) + +Msg = 35ef47033a54c3c510951190afc173b24d0b4d3aa93ebe3dac82d9ce89573b0c765293b902087db72ce045a81002fbc0b41f318ee191e10c07ffc4681c7e098e0b8623bbbd4723ddc4727849682517c7027802968092454118cfc3cf8360696faadf431ce3d889587b3605af8525378e1e7ae4ceb2eb9d40305e2cacb972a9e3 +Qx = 03e324fbbf815ee1bf9296ebc02751c96f5d537b259d18d1c121ca807beb57a88a0c5e0a086aaa5f64f2ec063c5b67fff996553 +Qy = 1678d838a38c4769c97bf67114ab6b235ff5954aa57b9bf6c7f9a3a063ea2b3ff40ef932aff22b6a2cee0166be2e524c39ecf99 +R = 0f366821be6d1df277ff5e9cbc1a8491363cad8122b3451cfa391c366e0ddfee51909f392c16aeded9530f32bf02fd7007b5a02 +S = 0c0c408b74fc9b49ac4608838403ac216291768311f4130ac012c62ecf14f3e1e5432c09fbacc312c26243356df97a08b534845 +Result = F (2 - R changed) + +Msg = 8bb3c769634e699550add23e1d8850a6ea2c5a9b8fec4275d148524b8c19f0838925f67b4b76cb800a2661268e2ede5ddeca286f957b5e1a81631d78f7a2153ed904de28825f44d84aa71ffc5b6eb28988d4d1fd99ff56a24544f9f31bea77c100e380698b83f746be0188bd2960e4d35f3616dd486ddb6e80870926be29a54a +Qx = 0bd20348adc5b626a8e212759a0e503c206de889cd92d9c7b33b38748550b5f190f35c28f7cc1ccd3398241d5ecf1090e728025 +Qy = 1d761e046b8c3f5b7a2880711da94aaaff3151c992373e6bac6ec6e5f3e874b02b02e587199d4d2eba6050ddb2157644dff3199 +R = 0314e1453db186f61458efce1ef14b538e32f458c8b7dae2ff25a6fe49fb35b13b26ff2499de9783f9adf20c9dd0fe268f2d6ae +S = 07714e2aec75953dafaf3cec8b4fcfec6a5350729c4d1f4b812b6ee7c410d8537989364d1573af43cf07171bd12dbd06906d836 +Result = F (3 - S changed) + +Msg = 32ff61427868c3848d66635e44a7e6581f6eda146fe82c2460bd3ef771beb78ee9770946e5bba8d1162ef0d45f25efc444b1cb6999afb35b6fbf38d6ea1f6313e8cd33833cf457b34d88859102237ade789ea6b7f41193f42ef82ecd2ff82269c956d974613d35b3a6c5420227c2a19b67558f5d807e21a27725729d75b46f62 +Qx = 1fdc1b64473508de89e5948022c499f8f6d3a0f371f3b78919dd45def13a0f966e00bd9656313928edf71cda76a08a3682dfe53 +Qy = 03b934660bffb9e64e64f5678bf23c4a06baca85aca7fab1c3ce2f671781950b9e1df85bd6674e1a38b82c98f425a10efa06f04 +R = 01e4c89b2ca3a6c1e7f6c246d38d6b387db37fa91bec6741250ae39ec5d531424c8e7b75640b6c2598edf142dfa9f3691a1cf48 +S = 0a88f367f68949fa6571e6ac23587be60140e42232a0d333e3f6b68753a3cc74fbdf4f90d726a97acea5b2a26849b83b5aed757 +Result = P (0 ) + +Msg = 97e0563d9f5340aa2e8f230ef7d98d15903abb869fecb89b64b3eec1cb300da881547e59e4ef360aed67bc96d3aff52aa2f5e1e1daa7bc88b9adbaa561bb2d53aeba3ad7904a379e1115d7ee9287006dfafe4d6a79a878c2582be12bcde24dd49e566d0dc5795deea022baa5b60e10749483312587e56e768d159b3b12103eb3 +Qx = 0cf4a0e5e3822f24105485dfbc23ca206870d695bc78556a49d9a18ad1dea1adc69d57252a0aad6fc77bcb49a5680f2b3b2bad3 +Qy = 04ca079d5387c63760e262c4f0f401f36362f8718f98bb6a1b9cc185500762e33497e273d57223463588c627373f4001c5a1623 +R = 0b5b13bfbda55732f81be488bc9c3aa3328dbe34fc1f1ae733367cfa7db439578acafc4f7af4e416b3210beda14dafaf9776788 +S = 03217f1fbee53bab7e637ca2181a97a2877a0f499d42bebffa743928cf1e1cbf14168d3189cc264b52980e6487160e91f50bf18 +Result = F (1 - Message changed) + +Msg = d956253939e9f3db446963e3848a477e1ec01bce0aa7ec9c6d31eda45be04e2cd615603bcb3ac0942aea2525a1abf74be762ef06715ed21dbc57a667d873ed9bd8dda381a073cc0f3776db5421492ce26f89554f63be78c26d73eba5ea8cc62dcb011deee92f2c50d4814d3c820b597c86b473a95158c80dff352cf76618010d +Qx = 1d1a10e2a378861e1c45d91a347c74dd532d7b1c81372e9f285ba2337b1afd6e7076f4407a73e56bba07b7434c720a42c9acbfd +Qy = 12c0e8ced4b59bf57802f8e3e61ce6aba91d07b3bc18f43781470c5cd1375bd844c42abcc4370b46d921139e4373b6c824e982a +R = 0ae655264ba3b633daae1e94da41712af387969f2f0cab1d09be0addea950356b3d20d46a0dc46a037a5c0cf695ad1f07a313b3 +S = 011ba2a4afb714ab84fca4e04cf076afd7588c2a4ba853df635822e2d147aca5a38392e11d0f217a6a88bd55758bb6dbc456d92 +Result = P (0 ) + +Msg = edb511d810d9aafdfb8bdd03821f2bbcc441243d77db33b5845fd9d2291cc82eac2b24bbe4b5463c499349d14c9dfa994bbfc278b2fa3c959b366ca59c0f414c58d9491722debade1f3aa31b81245c065c3af2fca49d94ef2877f730f37ac8968d1057d1db52ae456023ead22e66da4c2703e2dd947dfa00096248fc27cc11d2 +Qx = 0a7db1a8c72c56adeb2967a46aa81e97e85ccde8ea092280c9f653e4d8b8819117ba6cc5cc949abde4976ed19a853ffd1af4e17 +Qy = 05b5eb048e1acaba6524e9ae1a2fbff2641c013d9260c13bb1882c6fc336b54c18602812e0741958c9cf46d05e995f6c4152459 +R = 021a256bc0a6def21ede7d5891a94c530801b6bcf795dd38266019fa7af7d8a9fe0e8ec1d8c6bf12f7f32e3ba2f7dfa2befb99a +S = 0c16d634e14187b70e08dc4079fa68d0d1659b1f08978ba8f519789fa5b79cd040e38031aa3d8024c29ee50cf66dbf3fe6a1ba4 +Result = F (4 - Q changed) + +[B-571,SHA-1] + +Msg = e7822cdd238ccf58ff343fbf61895fa50dcc6fe3170094368bbf7b1552a7c406ea54fed69a1b84ff582a78409f665da1560a79d9925d98dc16cda10083b6f707ab05bdad47aab84790f88550a02a56f07c2dc4d3884df8cfc4c019252c6122fb30f539268742b77e2b9d50575441834542727f2e983f7cdfb7327a0b0c3c7c73 +Qx = 2d7bb1f66eaec470fe4c68a867e2d315328182d22230154b2d77226bd820b4a23e9d7b9c2df04cde63ea4d64fa9ac63d1af17bf4cc5f529a7ead164304bbb46d36ef4142bafcf29 +Qy = 65039196f74ffbe3908377263cd0c6656080eb640013039b8f2b5c9ee7a5c3155518d1c5ce32c11e05a3b6b7b489997add843e81cbb9e8411e2fba372c160359cd9113709c6d235 +R = 21920d9ce54bbe8fd6f4c6edf79cbd6f6eaed206f63ae63ba4eeb801052fa82dc0d12ccb0d47e5abbb02580c50969e7efcccf70d7f2875f9e5d9cac0dcc44f41e7ee0542d6c1b66 +S = 10fac7c8bbcc4aeccf17e3365c53836d379f8d7bd21520f093c8bc79ae363803b9237b70430e644f8ee4f3f7f964fca5c3229a5f87f7d0942ce3cd8673d3f0c92360fd2fd84a0b2 +Result = F (3 - S changed) + +Msg = 025455c120c093d80e2becf10f3fbbb7284e996fcedb0e146cc4491f4bdb1256bbeabc0ce9fa4f031c1de0bf0515d5e84ce6eb40a2b7c60d21a9792c7c4a1ad1c1a0b6c2557001f2f1054ee2e171772441854a4edb4889b45e1ce4f95bec2a67c8dce4a4cf1243e0548649a9137827d162b670fd9719c8c956d5b45a4513a790 +Qx = 14e5a36bf938bd95d001cc52ad0cad4000a7b36430970978072a2eeacf5f48dd54da4b78e1e5cb59c38eb50a1ac38877add8a7185bc471f04d429d68d5f7e143aa5e5fec6d18780 +Qy = 452720342c4e1881e3e19cbc1a4ebb0d87d2f179ef25d08da5909f24da20103428c5ce964deece702811bd4e46d6fdfc0e4691c70eb16ddd1143a746462a4a94a5f9993a4494991 +R = 1033b5c5aec97d01cde7513cb16e105bd899cfcf0f6f5779219887340b1baa3e5acb7228460cae35249b47968c34fd45e775f9e2aec57d4f3ed8ca0641bb4c6c489fa9423cd3f9a +S = 31f4460f12175155169c6d9d34cfa3966c5904dd15fb90ef70175de20a82b25cec27032267e94dc847e5630639067674dee6689caaf5eb622eb42cd666975b27688a33338c8ee70 +Result = F (4 - Q changed) + +Msg = 1f36d45de7f7d187e308e804d5111ffb9edfc46c9f2e3f17a9067f9e793fc889d43ed355c09945d82be9696c1a00c12d8c3d7e40f7f35ba0c214ac4baf23775191f0b1833e20f56d0fa458a9e0e0e50c9f3229f1ea999fa5e1453f78c6a47f1f7b678e8d4f0d42526eee61eb5dab778d7d49d9938b92a8b3b6a9a3651805b01e +Qx = 3b72a8dd6a7d9094c04ee2f737cae267766aa9421df62365f5b5fbdfb50ce3bd51439ad83ca00d9e954eaa2209b98e0e79679db8e0f9290a609f33be9b4a7344834494a5f794729 +Qy = 141f52ccb96268a8c7baa65ddbabfcfdb4eb986a518bad223992506bf6865146db509be585773694c291558cdbae9bd482e95f9f010dadd0e9243f8d7fd5eea3c2b9da78bcb774f +R = 1fb54228acf86f107d9855211a5f252cc6307bbf5a74e00291e7dc8b8a8cfd59da9794ac3f72599cabda81eba872fb0fe0eb0cd5b145d12b7eb6663ea6ba87111a7ee824d837f27 +S = 080497aa22fc272078a9b2ad5099ba40063d13790ffc4197829449457a4078e443831db0147f9861df49fc52de7794a4f937a793c619db69755838c464861fda206b6f60a2720f9 +Result = F (2 - R changed) + +Msg = aeb6c05628a113cdd7f65773e6e40f8479d6c6790e55871d5942ca19e1725f2504d4240b9d57593ce31cdb42a0f30246655fb654060c072240eee3f0fdf13a9181b4d45f861448ee5b1ff1b63a2c119ef2d7832b232b2835cc792d19c1138287e83a7925f7fda9f66ccfeb1b3ad25384513fa6d5038c713aaf13b0a4b1ca05c3 +Qx = 4b8b3e3171cccfee69f16e3be9e60c0622a1e43b80f6d891c84771972496b1816cae0c658c90433ad11e524ff3166a999da98c0dbcd768a8971bf0c4d818b48841c82387325474b +Qy = 7902fc24e053ee5bfb23773a4a630f9b41126e445dd41424d2a38bac68dc8ae9003dabd7d4a98e2b79417e749114206bae46eef24cddf629e994be1475d7495e61e095981c64029 +R = 0888cc77f6fdd07442a1fe9d7a5dfefb0c46ec20129452631b3a70c8067769ca396d6cb6f1f8752dd38ebaf4e7b904c1441cb116f40035bd4a891855c6447b4943e61c14531e036 +S = 12380bbfee04830195c45135309867289d91d709cff1fe3f2407085d3dd82eb10b6ae0a8fe63a1311a32f59ddd79a1f90f8e8498b67edaccde1306e63a65f01941e879c1a8a6bc1 +Result = F (3 - S changed) + +Msg = 188fab6788a134eae93b62c3e3556d6047123b7b273907512af4d61777f408dc50585a9eeb41c310f4e8d7f26a3c562cf65250c42bfb4c4e5c28170ee79566924f9af46936c635fbc5128c1d3cb46b3f2ee2f6c967a081e345f561bc9c534c77901ad238cc60355e1e04691bf0a66dc71a51dea507af6775408a30dcd1c7fff6 +Qx = 796e57aa6bca619785b91240aa10ff57ae0c73f807f156546639e045e4b6f54a293b133d8f3955e1e380cf60cfa622f897b74e8a06baa03fa54857f8bc4a4f50b5f1fa74ac6b64b +Qy = 78f9d3f66eb67579b6ad73fcb0f34402e462e05275fe584e709f1a2fb6f9c9f590adeb72dc9bcef306150d207c7344788312e73647491b3ec4d35334130c7fc42e01548e2eb654c +R = 2691c347cc3efabb7216fb96375f1b3130bde054089b3891a52393307acb5e9f405bea8ecf3a4edae775511e72075c65fb04a47b9f6518c2541fa6902a513ac69184f8297c9a72a +S = 0133375d15a1017a62b6912470c88bf74c4ebab65d4754bd1bf419e58e5f8610a92349c82d8a5811243081d4ae1762206096619f50327f608910d40f0868726eb3f9369bfd1d37c +Result = P (0 ) + +Msg = 18b88f5ba72273193c70aa0aa89a4e6487d5d8d729c62acf76778c77a96689f28ceb5014df1aa4bce77c7c715ac2325e1f0be0c2982f70c1107f9a7566bfd49b72e32326c6f2759d2116d64b36972cd4f94e271b568f4a5539640c00b8358962526a97a6f29ff8bc875ac0227c15120628f0324bc5468a4b9d57e2c1741dda40 +Qx = 4ce9312fa7ad4a36789fb66c8bc54bd599473d1c0eccfaeca2be7361f1c1b8afe77941a0b3eed19c91ae143175a28a3952fd99fcbca7333cdb7d143c32085af94504c8cd8919ba4 +Qy = 7e2627effaae2367f1415be9820243099cc2c69e2bf4241214a207574ed9fb10d6ca694d401e8a7f977e60eb68100c2f638f969b1926099c8134b093563f3d81f91a25145934d89 +R = 178c9ee452693294fc637a3fc7cc847249b48aed982d7d7496db9a7269a02850b6900e1df789ade36574b298912ad8922ea99dd96dd8e540416a8075784633e5ff617ef9fa26041 +S = 13ad81cc6498269304d9daae781439faee62bcae8e05961e88e1b122c37c5daa1fa25ea91e0d2eacf693c690dbad0625f29fdb9cfe10205640a080b932b91c9ce424d0cc860575c +Result = F (4 - Q changed) + +Msg = 634f856e9420349ac81a2cfa327b7436a1333c71f9450177cea60dd4ca3f55f72a51e3cafd357a9c46e5f9937bb87a2f02135dea1321bb99917d22164a90f88aabe19525fc13310bb16192712a9e350be4fad1ad447b210d91b13ed4d08c4d0ba8564d43dca6e8ba0fc595c67a12dc4460334585e61b08816dd16919d1a137d1 +Qx = 1c760b596514c9fa342ce767ac725e823161924ed393bfb6ff19a6797725a4b54252906af0e823e726b3c51a0b4507d68888e730f865c1edbe960d84918919272b1e370c97e83c2 +Qy = 4b1a6589ee0f976b1a35987d19f62235986228f198d3e831b7a06fd5fb1545af4bba2c330d8387002a64aefd84c69db5d158b8b4419282df475ca8fcb9584da7eb4370ef459cdaf +R = 395e43f880734b7486e2e1eac1a66b091333e3ac40388e5dab5c6b7e30ce2576214890c55fd69f2dcfaff3dd6521dd158467c32c5a5bdcc4052c5abaf9b1da9d7240931fcb8ece3 +S = 2d85018b3ac46c4fc87f7f78e47b574a46136b82ca2e69c91705b5467649e0e501fe189b5de61671a72828393d2e66f4b21b108030edddd0b62868c24906dcb1942859073a4a3f8 +Result = F (2 - R changed) + +Msg = 25767f36a6452b3fa66ecb1000b5de6a09aade6a4a30fa8252c4faa0a43274fcd3eab1a0d3e2f082d72e2b610d25a87fdaf38f8bef6ae7cc5a80144e35b6cf6b47f0aafadf9574e806bc412b9484b9a1cb2ff78f78bc1e08f6f46532fac2b62c380c10f1e65b0f73b0f80d0a9f200d3674699b368f52d5c4a1a57eb8b280fa53 +Qx = 6f47c77627a3b70cc5f875430a9d3a5a1e8517388b65bee673e18c7cbd65a467bde28ec5c25baa6b0d5fb58e466fe90516cc5c9e5ad59aa6ff66ef4853cb3000f89e7969a0f048a +Qy = 092f7ee61f0706c2f0296602171b6f23ecaddf8e0c0910bedfbd558c5d63b5d36c0a23ba8773efe14a1c77b66931581f916ca13155fb501841ced30bee84080c390ce7f701199ff +R = 3dde6221857d6d7d7ea3d12988f2ca7cc47d7f86faf8e97fd375458e6573ef4e9fa460e6ff742f8772ff7b66d8f40f537684998cd4c43d77907cce70e9a62657ffe2e9651aa2da9 +S = 141866b5310571e54f26791fdafff128d747dc7cd6008f963d14e4687ffa66a12e62745d7c8d3007870298b701e23390d34a7cfc33b9b7ee0ef2305b93eb577364081fc5f1f66b9 +Result = F (1 - Message changed) + +Msg = 26f23fb2be95ca177a6e3505cd3939335eec89387ce4f3178f0e814317f670865b63f5192a4cf81cc3f748e5d94e09aa9ab0802e6768230f0d0e0256bf3342f9697a869ae90044e0359db633713d8a6bb8806f3e244b804bccf884426e8b5d457d1195ad5f897ef40654d786ea23b200040839a95e4cc567f9580a0301d024b4 +Qx = 0df11559b96c8267afb10e7e0aefcf5a3596865f265af38b0c2b874f605cb9f71e7e03cd997d05e907cd67efe7fda2f1a9791436f913d20ebfc6cbc6b1a455f8b497a919b57a7da +Qy = 1f35895a6dd337e0e8ac051f0d6d1a6c356e1241f0931593989e8c8de038419161c00f39bd7284ff8f704589c3b0dac8348db6e6f29eea7ff998077c4294187f332fc1282834be0 +R = 15af9b8901e8d63fd577e55061c5c339391e527956b5abf9668580647e6ffaf07bdb9a1d85c67575f41f6545e60e3b28d71671aabe8b40c55d3a08e970d5b0a5938373f2dad13de +S = 291bfbfb0c552b2037efe0f16544d61501688574a1f1065a42d33917e058181f9e46e2f5e961723f22fca2e24b7c717ea2a5bce9d4f8ff7f73be1da3bc824d1c49e7d5899add1f1 +Result = P (0 ) + +Msg = f222f4724f628ddf6351b377b626a7a632fc031b3fd3231a31b96f755f8a543f0740e05bf4a3aeed709e7e6be0ce14ead13b9e59268bdc073af2ef231966083422f6431178597eb9ffcfc6aba3f3ec8b1ef2b692d0c98652be3d9e3e8854541fbd167032f08302eed9579295eca89a7f07c86fc5f071d95c6d0dfe31448a827b +Qx = 44ae9435c8844607e1faa008120d77392ab83cd3011629d34e4d7a7584f1744b4c7906b8939878635f273eb0a4ed014cde364fdef66b7395ff33a38b0e2eaf880915bee5513fd08 +Qy = 672149f76cb211da993592e69f271dfe269747e1135170f12929062185170ab76bd1f600d348b094047031f81b0a0ea4618b171c73a58dcb339c24fbda893e0cab2034180a21a6c +R = 040185daa887814b0715d5c4796a7c35e494e0258fc006f8d4a93115e291489e8cc4a3df83377a578d8e731e46dafeb706373d14e0b456731d67bdef6e0c25aa56621c592a79985 +S = 3d9ca3887767125459bb18463b64e11a971d9bed160f1644f346c19484f350d2ec784bf49cebfc480a1ab3bd4edd97d144762c7a22dc5ab80101d7796c6fd91dfa35d0204b197eb +Result = F (1 - Message changed) + +Msg = 781b1d369000561db71995496db6fd6d7b6dea1fa7f20496586698b86b5a946e0b592d28ed3fd6d1f537658dbc0c7a40ed4ffc2133b45590553d869ea5bf7b4f8636bf5919e0ccaf3fa9ff1a963247dd26f8002b85e692cb450aff9d44ceb75f2dd54c5b49eb9f2a00818e947b87628a9061d39de93545762086cccdcd891d18 +Qx = 1ec37bf3f724179244db9de4009bca27d3e765262f673202201abe5e1d4d4dbe71209c44b12afe30fdc452522ef544fa0e18ad6d6e9d4d807bfe3a44271d9b83a47ffb17dcb4397 +Qy = 37140c9caaa13a266dbb698b6f7e21e7a77015c68fa02aa3a701fa7f69e1e94b069f48c709d76d2c4bbff5bd8eac62279671d77c6a36cd7b3170e7421d695adf1f1956fa15ed96f +R = 04014da4ef9de6bb5beb63c4cb5b884ab0998ada7bac1922cef96db571599c79a6b5aa6a7a2917d9a2d97af6c190465701127bf8d241eb44bb6fd894758888a84605950c6c0e210 +S = 06c5118f62e54041e608b2d39d63ed5ec259dbb122162f20302701d48ac950760586bbcf454f01b07b54e7385e8f638a3603a7aeec3029de2b313c2f7f8e744a82ed17c91b09cab +Result = P (0 ) + +Msg = 125480e5cd9710465f10ae5110fc62c44ff8db4caa407a03ae0d51205893f84f7ca94005b57534a7df0b5f44a5cd042ba8a65eb5be3c29a10062aeac91f15837d67e344e74a72c718030fde1f5cea68e0d04c46fd4c33a98f146ba92f3312a43fee26062513c664f53a01cfa0f5c21f46fd8a503da1e2e8298447e5b205e8930 +Qx = 31ab4282205fb7439d4560f9a7d48e1ef853ce6456e810e9b1285f0d267b8ebc0cdbc0fafa406b6d89313a2877dc23dff3fae48d550deb894b1d6bfdb7f268b7c90d4a8bfffed17 +Qy = 5537053e494be03bfb90f446817ea825e46559b252bf8a2da0043159fc25207561d9b2ca5391915a19b194fd85ae3986edab1e6d2bb21a8b7bda91f2fea2c8e89cfec255f1b084f +R = 15bbc15ab779f82876b749444e13da34cede3f93ca0c8f4d273bb1ad31fcc46274b7a206d553826d95ac1dbf09dbf94f96f13d6f2b8105dc1eaf4a8e584ce6b707959e67d9b7a7b +S = 272560b9e75a7c589bf02a00bf4efd987e7915d06f1ef579f2bafe00424459bac4dba3a2674c62c1225ba7171ea3458c119407788833dbe92ce96e0576476e50d64c9c40495e770 +Result = F (2 - R changed) + +Msg = 6ef0e2bee7d3dee85357744ae27709e2e88f002eb779949ab01dd185db57e39fa1899a2221fafca73ea7c2bdd3527475810de1b69af6736f1b4410277e4fe1c1b95d67c1429eb7aa5bb5a9214f0ae13595aa6cc60f6bbd767a7c8ef29748d8c7a3d325759d52270f8e692be15c4d2e3599d89c10784a86841f9c5ab20f0e41a2 +Qx = 0e53851541b4c1f124abcec77d60ae14dad1a86a0dc1b4e8dc53a7ba792cf72c403c4e1575844af0d69232ed065b572e7fc84d06213682f55f7ee80d209893a1dc39c76ef36efc9 +Qy = 17bf15bc668972ca91ee863265fde2c70e58ee81397d481a7b0f0c87707565351217d3092c57906e3a74b33be8e7b76356804a1bc153839a76160a18266088fd95cb5807c112a0d +R = 03b39852b23986dc67b189bd18066f06588575bb6af2a3776d1597812a2715e14ba765c45bbe886a8c1f67fcad3943af9ec21746df2126959233bc7405a65e4d2dfb26c0f369a81 +S = 2c12880cf225eb56c550ce63c32609f94c988acee3985d937e4f4871891160fb2d968072461da2d4532b8370a1e7573b417641b03be502b1ef0187d1b7870956d1c8859b1d31efe +Result = F (4 - Q changed) + +Msg = a68044446fb04a46775f87aec63f9aac030cb65a57c9497a0edb8a941594357285896c5c6b10a14afcb3bc8b40cd51bfc91fd0d210ffc25d1f430a7dd94efeff98d4a07a8f7293f899708790db95e4fea0e69fcaea08eae2ebc6c1abd541c372ae8a1d5ad6280fbe83d479b14989c99cef0f08067a71061cb1cedfc64af17bbb +Qx = 51803c71a0b4578efb27abc7b969c22a594ce5e55207c8bcd00129c63e6963ad2b827f5e0fdbc0ddefdd91a5bcdf0f5e9c85a27da38911124c27c2665bdcb1fc42d7911614c7e7d +Qy = 4d5ec5c995795475ad8478847cda8385c7f4bfd8d230e174cd25fa436034824a2790346e538bd7706c360b949199551a7820b28cf7b58e3aade15c290e173185eb73a0a84bff24f +R = 0dbaa0689325e5455bd775815e28d1b7ca4f9d86261d9544380b3d0454e7513c5d1ac261def3cc5c4c49b38f8bda54060de322c359596aed5d3c24efe2840caf099ec8f955bee84 +S = 163a05d70e8dfdae82fc1da90eb6c0d2aea34e2f3926a724ec723172da77d09ae348b5bc1d45a14abf71b16a0bd602d96c8cd9f7226249c85350d2603d484ea3eabc467ce3034b3 +Result = F (1 - Message changed) + +Msg = 1a4711d85dfd2f02db6fb40216d31b91a5d0f2aeb26c0b4d74fd7715d10e1bdb4f1abf72b1c900708be072f23c0a3c33de4c807bac038ae548c83edc9308595544ee87cdf6b9e3bdf71350c5f16f0cb43d6e185fd11635f2b5631645a942fe6fa8f324f51d0d9a467eae52ee612bc895ed36d8307f780f5c1237936e6241f898 +Qx = 0cb2e78395bec956c1f938b9eb182ac68d75b34e2a1fd20e46d459c038859a382958eb937aa8c739010ffeed895174656cf1a45980a005eca9b254d97ce0a5d3923ebb8f9756e26 +Qy = 662b54acd62210b94dbb7a873bcf8c5651327ce9609655c2276bc42f7165c4147096f2e02f5f2753b7019f6aaf6ad3ae0aa22b5d5514b96548b2e2b235135a413e860fa270e913b +R = 15e604eb8f4be78388da4c5c85b2b041f28197db1f2329f5c5519f384acdaa3f4a9991a52f206f365daecdcea508355844b8bfdeed83e3acc4a1f5dc317d93994614cd1e9e63697 +S = 0517936d60a9b546e9cdfc02a7bef51bbcecd462108ef4ae2d8068988c787596e390e7fc9393e8546e65a58eae5d8e23a076ad71ba4df5f2518e32bc93788a3f96ce76728ea690f +Result = F (3 - S changed) + +[B-571,SHA-224] + +Msg = 5dbce8583895e376426b4cb552bf2ecfc3040d543c2f1a60063be4afcc2690c49b7546c4903d1f6938245af6688117ae004dd63b30acb177dad96a5a51b1fc34fae3839f93afb1f95b546133788151d2a78792b18606e21ffad2b55dab805b6a367891a6fe1816c74fe9dd6cc84df7d78378739514ec456df472bf6745c09043 +Qx = 2bf67a590c6501776fea359c41f14d8821279f84bd3c41a518fecd433dd4ec31d98f91f59c49d0e3f4840fd45272e8fe9610c317f26e10b3d39937bccaf23c5ec5d83e5361b26b3 +Qy = 1b538cd862be62c1dc72614a946b810ff101cd26c02e6fd6738a57f6633a2ba861700d3a2b837aa08d13295989bfa69bae51179186bba4e9443b1436f6ad49f27c262fa026f02e8 +R = 05ba1223b75887e36369c6d7e37390afefb3721bbc6e2c4d7998ee5bca2c3661947a9742cba2aa8a8b0820f0a2867a5344a814dea5d0b781138ce687e4ca9481e090f8e490c555c +S = 0fa850d7057b4c8dffa6c0089eb81aa072c0a09176e4f0a8c83ee1a66af820125b71f72ed4028bade65e8e90d9963012000f7c1fac911c80ed71aa91f323f4b529c0152d704fa2c +Result = F (2 - R changed) + +Msg = 05de98a5bb3d99162d7825beabc130c350da76cfa243d43cb5d4688a4ff064c9709f47beb57fca261314de50914f97d61e8474a95f291232e6cf170edf6e63fdbc0b81d77745bc3e3a5a135f503314aae7e88c619d8b1d36a13fe0fd97229c3c12e0309c29855557317f65a1b5a23fb87df44bf60623e1d3a0ea89789beb8de3 +Qx = 1e17037b2202424cd15e0d7ff26498b5d80085bf27f5a8cbbc2f71e4b6c558caa697a248192bae182dbdda8cc79bc22e1b52e043e66b5ba06d98db17f8c372a09aa1cf75e8c3367 +Qy = 6f100338d90aa83e8c644ccdaf04b34418f99cd4a3f2c8a853938d755efc020bf6c0ce92127e766578b802518fab556d62ed1520ae434e9619ec83927c570d79e144be2897f1156 +R = 0ff67db9a902859b8aed900df1c36c37ed3038b1c00a2ba7baf83755e21b0a361bf42fef2cbd8c102cd208f3dbc3d0386960031cb95908cf3224ee84f0700cdf5d3d76ab21ef640 +S = 2c675bd9d2ee8132cb42b20efd4a20423f6baf01778c0718ad1a60191c1cdf0d600d98ecd5f4aa0d4cf9e8d840270fcb9d5feb34c46a84cba759ff62c1b0234b878466428ae455b +Result = F (2 - R changed) + +Msg = 04c0be3d6ec57b45b84f67affa4a3e944f4e0ffce61e07b038053a171459fc986093effa0e95855a3ad656d91ea23a0208e4fc42121d91bb2805f3cd1edbbfd215c0619b3bb21e1b1b374cad2fb3443d19ab2f92353484313ea7627ba45a1887b3992a58484013feafe6afe7fb69fa39cafb4733503903c800aa07e5f74bea9b +Qx = 1c67f95236a2e5cbc2295877b3260a4e54529a9fd29e7a5aef1fc6b6ad1e34598710317c1d3bf9a7ab4511bf7ab19a5e58989e00b9cf4f59848c452823577e3492ff4b88eb014f4 +Qy = 08090427f3a462edc627001e280e7812c424546799c1415a9f8f09d3a169f5fe4d61154af533c5d106b63d83f215c53bc029643425e590060e97651f230b39ad31f06153603e4b6 +R = 39904e43bc08f19173bd7975ec44c72200762fe6da72eeefbb463814b072daf3f8192a3fbae641afe929082e6c8754eb0a57e3d45427b5870b5342cd66ccb542afbbff33ca0e417 +S = 09a4e60bb17a409172845207e3c8e15c430f240bf0599d82bffd7ca54ae0007de187bc86cd8d0b09c865e9e848a883c15713b0e9f94ef474fadf145227a38c7a2d8b452ac8d2ef3 +Result = F (1 - Message changed) + +Msg = 7b7241a48eb15c29a352db321c020280c51eb4534d1e107b7b529d09a9213d6a6d0657ade6dff70746ec9dfe1ebdc0efe45f1ac5516bf865f2fbd3a01852e63c5d7e4d6207951d11b0a4ed480b7edd40f602ad6df2b98521ce526b9c3006b24ec78b7f74bdea70943f360668f97553c75c28a0662891d2208259b49a7b6ceb6d +Qx = 1cde73e1c96bfc39a857162c4e54186a870591b7189fcfa66f7e1b9830791ce25594fc9ff5fdf4d3c6adb6bd7b09622fbe4921d54e4b358263f45c9f0165d0b1f5a98eb13fc575b +Qy = 5256c6652917810613cd54ec39710a6197323165f2c8373371ef581249245b9ea5479a202cdd7070f32147fb85755cb284a1c85a52add765f0a9e54bbd41d35702f4b785f7edaef +R = 1f72174824f585080c2c954b67c6d6ed5c715e9139a0267ff8d1c9e5ea6d6a8ea021456dfeaefc35cc4d48d83c60d0f61baabbf4ccbfba2aa40ca8a40d64b7adb266628cd39123f +S = 13e0aca1b3105f3819c6eec970e186f1f27af64acfbd3fc2ef3b2428b4fab842454e9a85dca650fddc654d1aa76c612a255754248f93d49525c6f4f566736257bb06c63dae11adf +Result = F (4 - Q changed) + +Msg = 4b0b800e104c66699101b128b7a6ca49b2cc0506ca674f7aa2c5aa7a757e17736dd8fb604922ec0dae816304ef8d71a0bd33fc29f6cc52bf8ecf533b0a40d5bdfb5a40a7af33b23c3e4537807e5f90ce89efde1874a080c35e001bdc081c7e6126039e0200f805596d29d2642fa973c02384f69ea60792a519929aa23ee561a9 +Qx = 73152c86fa55e93184371300b9fb1afcf3b5a1aed2027a250fcc5f161e235e4322f759f5ff38afd2bf52c3b59af1660fac9d81bd910e2bed5f8abf594b4861dacef34e38aa142b2 +Qy = 22466d4d583859ace2689df92cbc410ce1ae0e30262d6649a874a1c05c60a4e2cffd4867af6692b31e7efdef6228700dd8ba94dffde2e5e9f6692a9a378317f8e30dfae7dfcab3c +R = 282d939f2bcd6881a3ba5e89d703073b05937b8c69205fa92991234e71d60c55673065a19d8680669b3f6a0ede7bde6a165a8e479d4064f0c7c231f9468c61be7eaac31c91a91e7 +S = 0e009ed4d81908abc39d6fe4f7bc5a8ae59d6267bdf3ef66b9b26555e342462f32ca809904841b4f0a88e3be355e3671debd43385ced034f0c8435a7a68fb5053d4ebd988ca7fc5 +Result = F (1 - Message changed) + +Msg = 7e9dbd2d6e82351bcf6923e3567b81f3a22d35537abe4b0231a5cd512c0131a61ede2c8b784ced443de7560bfe6914cb610b2547a001c9ac036e66088d7a141d8d4ba33305fb78a109956a70fde098ce8c3dae91b7c5be713b6d440ad98cb6e0d213421a585bd6336d88c499ed30deda44f03e5cb3a05f73a7dac4537a2b94ec +Qx = 0b49bd7b939931ea9796eb3e768b5011f25fca1a6b6f8bc3708f2c70f620265e5b8f0b205ab4bd3421e68fcad951ba704bca36c201f25286ab97d17f6eed6e543c04870373967d5 +Qy = 690c9324024c2a88b2a315e4714716bebd5cf454816664663adb0d350ccf5d71533f5bbbbbb533575bd0533a0f945f2144e73d22ee9a0edd25b32ec0852402733500cc55aa8920e +R = 117ef5046a7a0936e2f1fd3dd4c464b8378f0b30ce4fe96e75f4430cf7c15236986abe419eeb23116dd0288303f9fe7adc554d8b734aaf9d6082db3a397f5566ae881f28021f3d6 +S = 157007d99eead376ef4cef001813548481ae185eb575d933404f8af961c788dc6ec61121357e19957dc4006b523efc1db59b241b8df75b47ea5cd6232c245184c318d0004c5d376 +Result = F (4 - Q changed) + +Msg = 335e59e1269f80a4fbfcae5454c66da8b8a88106d06dbc8e9bd77b576adc9cff2f33aa6fa8768d08e140a79b56e2516d6c49626d0552429fe028cc371b21d18687c07e94f39efb044ec61a7c512557afadfd29b0f92e3b766d3fbc7045903bc2d69b28f5f1761b59e1eaf1dfd086431343574c43040766b77beeadaafb60a395 +Qx = 6df6c514e81a2b812169db7bee394dd25d89d70871ba40d308da48e583a5a62392bdb09486a4a82ec73552564766303ad4ff65aca128469234cb70424722f42321b2eb3cecd0501 +Qy = 7a821f82f8cd39c1d5e25e4564cad6f84bb5d2714aa14e0bdb3c37dc9e00ff9ea0273097d8bd3e687fde2bf77d4d80c5a22ae92f97d675458a84538398bad6475f1d1b15c6fbdb9 +R = 2ec913369393007e5efda02b5d42efc510075ecbf8058c2f45ce295cbc2b72fc4d8b5daeaff3313d34f27ff3e40979c87d63619f5743ff1ce21a43428820a8238ed3c96acafffbf +S = 274e198fd241fe299fb72971451ec941e59a6d1308323cd993a651440c1cd44f0c475d7bc5b488f5ba74b4944b4be0f1717b6ab509ef55e3feacf19347139f5b775f98886849330 +Result = F (2 - R changed) + +Msg = 00660c40471a20a17b5648774f5353f1dcca6e13e924e1fdb74a1ca9caf99a66f2f0c48248be4411fe6a166c23c719409202c0a08dc5c071f33850aca42f8d246358129137516b8685d799555623e6cd08858b2dbd1b7d5729ef728fbea8f94811d0777d9fa0c95183b49ff7d1553e122d5ca0ee60d003c1bb6b7e04f800813e +Qx = 0124cae29e608fbd8fd4e64ac9a5c08ead16d317cc7317021d0c5cea6fdc653bedd5f6acd73520e1fb85c2987c247110e4e0ae9498b9082355e9e01e1ec03802f79762c168f6034 +Qy = 4eb5174f8b9de11542903df647d37705995ca858f736abf2fdc50460d57e2216c9ef0db429c23366f7ad4da32a5cb4d2f683c7a409c73554f7e86fd67c6a28d1f0e589e40f26c91 +R = 2a10def3d5b378dd153c04173a7d901674c8e16714d0b481d34bc22fdf9f8f5eaaba06ec58bb09c0a751ac0e1bcc7f222742b0bb7e758bbe4fabfa3a97aa96d82ce504a35fccbea +S = 07bbdd436be4a60eea1674c7e4096742e35116ffcd906bbf1b6e4d608d2f1c20cf68948955366c8a1d73ff5733440dc11046d38c744d496cea93d89dafd8162689766aaa352ab03 +Result = F (4 - Q changed) + +Msg = 73392d5479234b31df45b30ed6413fae33bcca1ae583f6c336550a45bff77da242c34fd888ff99804b629c8498e0037a46831dcda24f4885bedd63523ab19dc2796076b4cd17384a189ba796e00f67d5e0fd38625e28e75afe628a86df3bbb532a492c4dcac1b9c18d70249116462d05902521cb64f7b2c80da60652ca6215f1 +Qx = 2c2743db8f77de364fc6d7ced83da0e0082f632f8bd4907ab8c7af421d3ea99a560866dd949ea3c656f47428c4a2b7e1ca580d1aa636e29b7699b9bd38e6a78e885f57da66af80b +Qy = 1a391879351e2adc6a2325f8ac5b9f52fffc15d7a52a41f1ea4b9edb4acdcae78503f7241216cdb8d31fc2fdd8e931693859a342b4512c4ea2824a9886bb0fb190a6ce73d06ac7a +R = 1f50f96d55413778f3a209d33e3315fdb8dcd29944b9c9166dc14eaa0ac92457a210f826b78334941de673bb4d8349cddfa42589445dccd8717e192598adcc4f3cc26ba9f4f9c32 +S = 0ecbf74a25c4d5b891f10031d5ce27afc0348556bc4ebd0ec5cbd40b75ad51b6d6cce879a5ef3cfeb74ac6eb6429cffa2def715a7d4da5f6b6a69ccb01a47ebb247f882a9841764 +Result = P (0 ) + +Msg = 846bd204c05ab107951eab15801f06a72ba6345474aee8fab20b5c21d178469e731a3c043a15edcf3990c59fdb44ac049440ee120dae28e26275c0699c7b901e04c3ce869b33349a337cafb85ce83cd415ca3ffd0ea5eb6b6dbeb1581ec0ee1cb8b826ac67f8e699b60dc8e3bcb6e967efaa1230fed72e59af4e94e2b8290aef +Qx = 1c6ad5effd1375c9b458e3a712945a34030b45cd669ea044d4332d517bdb8351c8df3775ab988430ee9a48d84e99765bcfea3fd65ed966bb2989e174c77cb30637a0b00a3ddb634 +Qy = 0cf7fa8baffa6f3f0eaed6cb2adafa7ea826cf3fb1e0d469473197437fe9192ae6163c205d440f51479c1364b26303a790af783b70e39be93bf47374d39eff395eb5eeb10b9632e +R = 0cc9778e556c97803dfd17d271a012247d6d190f6e6eefd349f1138239adb5bd53a4cae5fceb8e3dc13adfd6b7e0dfe735f031558166fe74b7e02c80c6ffc09dee1475550cab39f +S = 0d1db9f117e49a324a202db07dbf91424c19ef5755fe61419fc72528988a56f1ce3415bb5a246f308312c1883f7094f366759e500e613368f49f3516cf110e9361f2b5a8ff47532 +Result = F (3 - S changed) + +Msg = 3d7220873a9457653e143def23df3cbf12c1bebd0cb9da6ffb4f7938ef9a78fb83a1757a4d42d621f8230b427453fec21e71830deaf8e80492a478a2690c2b8eaa5730e2b5898ed675e72440c0c67b6e28bc066c9fadc7111a045247ba3bcdfebc5527eab7e4b4909bbb5fa0272c4c5d21655217d9324e2942cc081c0bd03aec +Qx = 3f2fda60951f267611d17cfee3769b32cee066e77f256fe1745d45e11acb283063ef85b2787cc31ca1c6e34ba414df78bc57f107eaf183c5233afbc67870981451821fff181c1fb +Qy = 4bd566edff441b295bab62614b2a1fcd7f0bc7514d682d8f3f6b2493ac5de3c6af3d087af57fb6bff59b77d279ba131dd52718da131daca479947d24bbde250037a4e1dee3a93dd +R = 1b7fe79616f2a69b2cf1a4841569c257d8bde44815d29576b022fbc8293ab99ebd1bd3b9e3baa7bdaf168c5f4b06ef206216e3150aca3d12b6c029bf4d5c449055204bfd9b83a40 +S = 270783eeef933569b884838c0e9d081b82295585dfcb9ed0bef507aa0cf34addccb14bbe1152d561ab3ebf807c06e9b2838db45db25d1f0af54d24b8a0b7a334f0fecfa58dfc6ec +Result = P (0 ) + +Msg = 0f2f1b0056d5d5359d8be12acc1dd9897df21f9906eb03fc28ef96ab6574a7cd9a177ac117376f825581b2dc94e4de08c2bb185111a03d848ff3a21ad5e43337f8059d44a508db58d478cfcd2c98248381dd9cd1f9fb7b45bf93a3f6afc2c1957419911bb810dfc2fc2576e85caa9849ce6c4d49703e97a8a4b7ee4fe5b26a11 +Qx = 3f26ceaff107fa0e522ca78981372ea7bc57db8e4e7d9ed6f6f590a262b3bd4bacd57a52cde8bfe6a3ffde022a5996902cbee9b708e1c9156adc04693f73060e65de55cc4aea705 +Qy = 7122f81437f185b6768006087ca1fbc9ee4f588e4e2c729eb38954e347895a76d9d99a995ba271688d538adec1aa00ad297e23433b5bb7ccdad5aaa652b4badf1880fc2c19ed542 +R = 27da582d9432b44ecec02dec266d3d3eae2f3836fa66b093b3b1ef18072c851a24a3788d554ff8fc5a04fe712f86a3500adcb339a3cddc7ebb75ac808e97eeaa0af3e4facaf3b8c +S = 372c6363aebc311e9ae98c43a56e4a750190813020a606826a6bf86b08f4eb47c8760b14581c3788435291e2bb3e325fe961f1dab012dc475edcf31cbc34f8225b52a52ad1acde5 +Result = F (3 - S changed) + +Msg = 2d1f76089b83a5bcf356ab4eb301e24ce212b81b8624881731717daf63c115bae14f0422dafc5bd6760088b5230e36f4c60000e07202e620426cb62e5865e9603563a84f47129826681510f678ada2e473ef71d081f88b02f449d57b8b4b629ff7b45cca19b986baa4596bb60af82d09e26f1d519b7f0d9eef0ad1f34986fb49 +Qx = 43f2677c3b3dd035233097f2bb64200730e1aeed81469f4037790d3ecaa67345ce43eae1245304eec793e13ce1847af2c5a0d3f423663a23d0e248bc1933be2d7a622dc73366566 +Qy = 6ddaf10c4f9fb5a45d5edc5fc82404af8fd4c9a6d6fb91c8b194e089573b94cab94e49b259301bc85ab3e7b7e77c3dc49e0c1057410545f391d1e8f3eca1b4f724c4e053d15c958 +R = 321cbddde213e77d9b864a5368772cd80e1ef11c5a8e774007d5096d5ac2e043072ea93dc9d247fdd1716ed6e4c2a2e90150b2021119eb5cbfb0ab3b14198f309e888689c853fa5 +S = 3ccbeaab20dc91bce38175c8dd859a5a04f7172ee2a25af76031506ae9791b30e23b9c52059e9fc5a022ac3841ce32beaf0178e9bc1a45364ba56df6cbe352d8fbadc381ec8eaf2 +Result = P (0 ) + +Msg = 3762b3117047303ab1d3e298bdf57ead1ed5d5cb631867c7953bbc3bc8805f27e7179cb8088ed6e1c71959ecbae30e6c1882b0561c6995039f6da7c6a93036471bbfa8208179916b9e37e47443673231455dcd4779ba5b458dde58114ee37b0050da851ca79d23465bdeb49a0ae5b27d63a1b3f97a7d76783dfd04ffe42f4e76 +Qx = 49e469f6a32587ee53a8853fff1c3bd3f98b77519408f8f8568eef9277b81f5224f0cc028444d30abbc4b0407209e75f9b1e5d7885a48168a7b760bc699cb99c5b1a5bbb485da24 +Qy = 47faa0aaf3d0f160f1aa1e523aa59304e492dd15ce7027ae3f6d72f8a91a669dc772f2d1d0cd8fc34e8e9701cf801d3de0fefabb217b5dc915b8cc82a89909561faf1bf3606b78b +R = 1840ef3c4bfc721f004a295ea053d4a41f8a1fc8e04a99fe83cacf799ec2c84f4b4ea7b916f4fb19ee58852b3444d001557875be5b9a808cd9f02b65455a4e769553246a914bc56 +S = 2486c4a783c730bfafbbc16e4a5951d4cb6af1b78b3992139daf049103ad53d6376e4c880ef86fb9d854afa9c9cad9cd25081b087d84f6e0f752b89d7fa174f95ec64b584f78e37 +Result = F (1 - Message changed) + +Msg = d32cb4303cfa1921cbd07aa5f63968e8e0cd4e370d350887b954b628915fb9163fa1d51d7cb3d8a1d8c69be616c9695167ea9ff4761c5c29565747f47b46b86aabd6ee1b23ce750c0f056a728a4e67ed80faadcad910eefd337675a65e1731324e6fc259c72214ad6970409fa0d16c97c304037f9204fb9563223376e257b728 +Qx = 4f8a33df2754034de7b3dd6d82098296e796c47af6d56c21edd5e55fb404902b12ba6154193be1d637fb7da2aad50e93878669ca5cb80962bc1247aa074e6831704358798f426ff +Qy = 456d845de5765964f9e94e4633ef961a345050d03b47c65aa6bab0272f9a59e55ba271f7eabffbb07b74690b0204b8ddff34878d7ee21b66e7bbb438e6722d0cd293db83afbc4f4 +R = 2d1b8426f71b9405e466b1bd1e93eb36c0b1f2bc3422566224c5799ac843cd0b6401e6c75a0075cbce36b63333efb2517e595c9648a74cd75c25f41d4d88628caeb2f77ad208e63 +S = 1c9063a462088fe41f0ea295bc345ca708f1c733abe0fd37db5699d4c12e1eb1b996636ee090d24bd948228a161e083236951aaeb89812ced300e3a9a1a0f8f2a502c272c221643 +Result = F (3 - S changed) + +[B-571,SHA-256] + +Msg = bf07dcb385ae20da3f1a8a0adf74869c24d82914d2e4fe74e7fcd7f4cbb472b423ed666a92198854cd4ebef1d9196109d5d2fc1192ed944aabc3ccb9047c825a6883715af5c1b743e35914d7602bebd14d660ffd8b831d19920a5ca52aeab5dbda4c91de111751c98e8a9d56d2183788d9339c560a433b97ac74d69542bf0126 +Qx = 5bb2e10f9cd9af96e9b5bd88d566a113545e36f889753057c512c5153278f510531edc7d55b6965e453c5060d9163144c293fd7e227d8a66c955213d0502fdc94ad704bd26289a0 +Qy = 41bceab518fcb510e9793ab6299fe7983080de839a008e14cd6469863cd553791abff495abf1fe13c030a1e01c5d6e3415030335f3a1529f63d82358a00c48592475cffa15aa69a +R = 1b99d25a65dfc89e213caae622fb295d39e8a24c6a16c1dbe8676e3330a2bad24b85513602878d583723ed3c75abc9050312c3ea17b4bb066994f1242326a49a0c0d19c2d0087c8 +S = 1093f0ace74d0a5b90d2ab1810306f0745c460a655cf8794a4b50d8e1bc9a4aae8a48e234b95b24af81eaddd5cccccf65dff2313bf99e2ee8917eb754902d00f78de84f68ad5f21 +Result = F (1 - Message changed) + +Msg = 302c512ed65659d1232ad7e261a12420127a38a363bd99b44b3d536e7b6cd203b5e958eff82a6bd6c316c5fa8708a849a6d1af537c744b13ee916d8659d722b8a3d63d7aaffb40e4523c20855810352292739b2bf98282920ea85c820abe2fcaccbc6af79e22ee6ead8aad2660017cddbe66b512c602976ce6deb62c87291428 +Qx = 75f97be8421f9a07cb1d2f97e43b968d848c4a7544bb0ff92a27848d8be7892678a30c3655d454b7900b0ab636bdee87e1ba639d6ff7b84da5d457174ba2aecfd8d8a9d5ce27bbf +Qy = 27305372b7a8da8559eff0ab02ba8411d64771805428408faed5782f11d85fc5a09a6dafcc37469661d44aab5fd108b64d41173a2672219bb98383005d9446071f7e3fcdd554b11 +R = 1826fd21024ba03f2b11d4403c4728235275a4294639b0c7315ea244a337f8941987ef3d132835bed67348f495f0acf319015dedcbc7500e6cb5076663c6383e995f00987c69e55 +S = 1fa7c1d7c0f3585e906580fabc2fd5ca6feca5f542b87d6b1726648e0895374814789686da78bb9081a12c8c6ec5eba8f565f0af52a4cb31df63c9f46f323ffcbbabf913735d314 +Result = F (4 - Q changed) + +Msg = 1d574de360a603b7f47f47bc7938ba2c3eb7707d01cc81e2b60a18634c8fe2a7cfeedc527b188e443e678aa1b8a0968411ac014db4cb6401bfabe99a0b0a5d5a6ba352d0ee5f3bb72b8be9ca47adc0723abdde47de0f6c837cf5738a7041ce53ce14f435975ff512815bc0eb299c9129164a58b5a04c80cf62ef008658caa7b5 +Qx = 59d2861601b3774375d10bd2ce9b88800038bb2b88dc0c04ec36301314187c7ecfd9bc9e1c9d4fc61e2ca13bb4faa973941b5b29a2d286d4b48bdc15487f66fa8f9c7d3d3e0f4d3 +Qy = 51e84f6ab89adda71f0240e24d4c3fced67a26fa2adc50f8628a2ab86cdfe2e442b12016ab731a632e2cf2588c0952d99f61f11ff28449c806e260ddd1cf960b92421e13cbcd8c2 +R = 058ac43efa7d70152e68735833db235ef7108e8bbb703610a53a54f27a1703396f44df6b0e12fb6a99d92dfe29be62bde72b150bf6ffddb379bd581b9a21a07801629042e213637 +S = 142cf20025cfb10e3a4b8b77c1ec8469778f8d91416d659f2bc63ad53885a0775b78b71f00436f40a28c03c37fa5d97b4288ac08de7430bc2fddec2abd74bcd3fac3c88eb8e9114 +Result = P (0 ) + +Msg = 619a570eb2f07d928821a6b6df49278b923d2cbf3edfbb06aa3c64bd3c2e8103c10650641d7f065b8ff45181e8a898f65c304be3ff0ec93c30725a1567800e5b1b10a55864c9b20061fe31592e5381887f5023469eaeb6c8b2ebaf516fd4b692ce7ccfb1d90cd0624559676a53be266528facbb9c6533daf8055f108cf88ac26 +Qx = 08e4d35e2f574bd907f7b84c0943bdbe671341421489966bf110f966184ce917a7a56cb0512a77446bce2898e7d6f79fd19d97dde7f9c0e3908eb5b5afa60e68dd4716f2e9f1652 +Qy = 4f86e765f1dd149a989d37751dd64ae1617c59eabe6c2b3e87d424bb8359f914254c63bf06bfcaf8a712ef1fe72fdfd2badf079daf2b17edb752d26f1dbd44b9018124a55dfc7cd +R = 3c4c59e8d2c22e0aba396a19418b57a67c35a069064f48b88d4d87e61e52369aec680137235fbace6699033d98cca192e9be7c1b2e4153ecb50ed8c02814c7bc779eff8a2793c20 +S = 19a9444c1a80cccc78d85b6c0c174f88ded43a7ffbce9f32185a8f2d3b7dc783cc72e08edf04095c105ffe396b3b162a44e031158b53a067caca00976d689e256b4090653a801e8 +Result = F (4 - Q changed) + +Msg = ddf075d4c26e5f7b0134efff74eba5a68af0321d4e435273949bcf5c8b4b75cb0a70ceb755aab3290c21b98eb7a2b94c6bb0fca5a479e9738502a3ae4a0cd790cd70ca16beacfb26f62c4779b8c57c5db41a0f0157a870914feb00237f6b30d96bf5f0d15607835dd47b30acdca54aad5a851da67c41d5efdd87506666f83be4 +Qx = 1d7abed352456ddef59c9b431dce332b60f52523082510c76ed13967bbb5e58f969217800bd218355f15feb699b7dba57ef36e967d355cf0940e94a5209b2921b48b1c7941897e4 +Qy = 3f114f0d19e03d97df177205e022034c733b09072eeda272a577d6edbf2a049f7d1cd041dbc891d28bfa99eacb026634d5866787ff7092a0149eaa1a3e41113cbb425ad364d24de +R = 10f4883368ba79be39d4ee91bda61f4db7625271516ad570b4eb4a753264645b6726e480cb8c5d60de803ee942acae56181c947167b62558f83be24526185f64d26f2d13bde6b7e +S = 129dfe3ae1d447f46b50bcced2bf91f936df7f35abc5438c1a0de7efb97ea81ba0ef5590b578338c82221a4ff2a73fac5e6a0a0e90b6ee6e0c43de787d66509441be8eeec1cfa9b +Result = P (0 ) + +Msg = 924df92fce4407ab2434cf263ed0a2a4284d0439eca784384d0b7238a544bd6f2af9befaaa23dc26a128361ba346fd944ddf90efb7af1d2d8b20e096e1bbeee683862f2c3f116e17070c94082413cfc583e0da75f5fabf23730ca4b74c5420a113ee500acdeaf2717362918fd2df601d0d8fa0dd4d9fa7f94c4878ccd5c388b3 +Qx = 21d6c9f1d70d8063045c90bca07f751d8de6713181661312ddeba02068ce9e4228c5ae7fdd32422c4c6f66b455b949bd6aef8e02822c3eafb32c0498d15d0c6e25c86f6345177aa +Qy = 23f8b84aa275d1d7f3d764da09d6d08139d2e16c71c7da257ac6118d6409296dd251ed49dd6cdcf2b9dabcf46d99f9b02dbc7ea3d87bd92954ab3d09882c736c6c7012746be830b +R = 3da75247665c96a7eec3fc60328864cc4dd6c7c378320bd4da11d3974325b08bb601eee449386d4df3e4b90d4c5904227d381b445b35894b54202400b6e05764a90c415d78fe748 +S = 132c4cf4b3f8be9fbdc6deeef0dad5bbe168ce88ca17ebe0ea711d0f8fadc7c35334c8a9cdd91f80eec7bdfa720884796f20b6bedabbe46283f2c37f370bb10882891ad5ed65a03 +Result = F (1 - Message changed) + +Msg = a716c4c4c0b61387d02a88924d28bdfe0c3ef962747ae062ab861f00098a9668dbc9d6fec2ef16286ee5023cf2ea080427599a93349a1c3e736868145177790e44817730696b445e3fe1b149651aa7fd87328ccf5399038878607c69fb2d664b96a40061043b464e2f8b573e12f67392e5177e4001211a11f565930370023629 +Qx = 2b533ae737b3a8718f1764cb091ec23aac438c0c79ec7445b67cf1154f3e05d5062f978e72b0029d16df63432072f0440a3cb3c2d92c4ce4441382ccd04005ea7a2b8607dc6bf58 +Qy = 2aef71dd46a6ffad75b435c406dd8470c6c88b5184efdb9e76e19469a73651ac596b34afcf0ca51f4d2d564055b247326ee7fb0ce2292f0608fa91be3de6f6391726a5670643b4a +R = 3dbc775cdeea6428afe0f1476c9100021784a21cd4df1360a9768d2e1ad548dd1f34337ac3e68a85a32131f66946cd58a4b5cd6aa59ce6f159053b3ca3c54c42b694f777ea101a6 +S = 3d85b3064f7fe05b59adfbdeba1a66b3ad3a81b623d451622b114b22af3e5f443a86b287be0738cc881e88b7913afaa261c7617e238354463909afb9697dea978bb49c275fceaa2 +Result = F (4 - Q changed) + +Msg = de896ca0aa03bd540259ef75e7551a8e6080890153d63d19ae14ec67af43b17923836839115fed04a4a3c6f4336c5561ae31f1fc691eeec4070a790a00796c194d26540be9fcf639bdb8ecec875181d14b77be708afdf0291b60ac10f0ea688a8023f44bb18aad601a9decc30dec51168cc60548beef5220750a7db4675efcbd +Qx = 6d14a7c559f35f2fbfac6c9abf07df9e11700b42e0d6a9632f0bf7a45163322bcc3abcc90a3cc1877e64aa601d5ad692c1a9e7ef24421d49b09d48fb77fd046b35e0a9e29970a88 +Qy = 2e327635069999a834b62cfb2abacea947891dcdb7cf10fa5ae402ae50fcde7da0a9b1fdd0efa5a965a24c6516e3207a0558e1e063915cd247f648fb21036f4bc342abdcdc9e2bd +R = 29f3ecc8586955e27092c20809154efd00891f417a800b0de978c643b2472a26ba2d1b9aca3001b2429d981c15b7bd20369848f35e76a800ca9d4d307a1cdaf63d4d0075c598b39 +S = 27a4650f39a0020c0c17126efeef5f72d2800bb59db5f674d627d688c090c840487d7f18a3e5ca7ba084359a55e592f55ed4c6865f73cf433f9dfa080682ea7866b84744fdbc6aa +Result = F (1 - Message changed) + +Msg = 7b5f961721ffc8fc968e682f15b37d30887bd754cdc4ec3c8447a71eebcb68166d0669e702e28c2c6e9a43bb2746c9d0bc1f7b0b965f70e0c3a1e789fab91fb458b7e22817290acd7f2b09569093723622c0e937fe390aebc84137c531e09ad23312ba5e66ef701b5cab1c509be8485a08c5222f4aa420214d37e48ce9aa127f +Qx = 336bb3db0b386bd2e2c5c71da79168997bf1cb655df8bac601c51ff52b7107062d80c728e07c3c995a94bdeda8d2175cf043552a36fe515bd3b6e19e26a6823c33697000a942bf7 +Qy = 662db8734ea015b52febc4679d3caff646f4cf765c9dc82824a937e36d73e5e66ece9062ef0c686695562ec50334c57a3fd741d3f2de17bea56b6a491b6002463e66d24eb26254f +R = 3d31b548fd07e0d620a81c12427faa705b120592be17c56e2b9e2dab6e49dec65ec39f4cb3fb075a95526c82ef02a58aa0e61f8db7dfa545cbe346140215d0f4279ee64a9f1bea8 +S = 2ca15fb9cfa34c33e77fab033f2c1d6b79611d3e2da271fe7bc8f0e8439c3a3d1ec99b5553b141b03d6d42a5c341180e590176a74f16e0d998aad53c9d7db92ba9f0d1ad7d80f25 +Result = F (2 - R changed) + +Msg = f5c1d140826322df9821f4dd996e7fceaf4ef8d85e4a897b8792c9fab5662326f82cef6346241d943cd3c5893da559eb72d1d51fcbd15fa1770ba6f4717809d2e5e55c57010bcdb01b86a1be3a6499a5518577de5232230f41ccbf8cd86cde46a1c2be2be74f664156e3e14ddb1533180ae91ee65191bb655491810979c4b064 +Qx = 1ababc406eb7f29e7a7c5ba7cd80fd732c5ef713417b78aa648086a99dc7f750e164f8f4fc4516fce57e9806c2b4e5dad31e0af59da0b89a02fe28c20a195be7504ceeac1284700 +Qy = 5498a58f8aad8362f469c58b55e2dd4350bd410b9561e35329180bebb8304679304cd60e33ba8271024a6b9487e3158b1c7646e42cd4529d8714f5c01d4add701c7e89133b61eff +R = 2d80593e25f4729e2530c122ae7a7c58f68811e2f607812c471120e0eb81d1f592dbc3db8c28a26913ea948740b846d15f8286d598d7a5f2be43f16de1af06653a0012775773ba1 +S = 0f477e08b174cb3f9241d9ea704f00dbe2a3f7eaab4d6665c65d871526bfb658e757f0663218b9416549f925afefb334d019a5b241d0f0ff26f283465392c3776690c794927285b +Result = F (2 - R changed) + +Msg = 98d8e8d1af0dc83a84b421dc248bf90f40f36d3cd2510148a1219f85d0de4a04f3a3cf7a0b941ca09569d71e2cf402eee7a267444287fd4075e219278600c44ad6e4e52ca76f8e179977805c1ad5711c06db6b5012392404add4f7702ea030b2bdf20e7aa31b3d39a9a9d73ca0ab0eb2ee3bc7dc6146467aad5194c2239491a8 +Qx = 2c91fcc5a4cf545b6788f9d8463c6f85f647d6b768d7a7783186b96e5c1055ac0ffaceba66b6c0cb456840ae214511a17ae3f0fd4cffe8cbaf3fb8903635966782ff8fa1950e8ac +Qy = 244156657709cd518e8773d92a57d1c7068215adc96ddbb00c9060aa77c459fa6f1b11bff2f444f790cd8a567caa981d492a3d18d0382dc7d60d5433fc4c119d3562656f0b61cb3 +R = 18c15a8ad00277de3589bb9a062771de32d8527997f3610a63bee85c771d8dbfba4f54177b38953c7ccb0d031ef16aebd56720a456106e567fe32d5885c8598c80967dc4d6fc7a9 +S = 06a7bdc846f198a3d74db31efd5369e0b7d13dd9e664ce53371641a9cadc357133b1aae7d1473be29c69dde50e0c182f05486c63a573d05878a6edf4b046cfbf7fd5c033ea939fb +Result = F (3 - S changed) + +Msg = 05a8f8cea281f62a00a718724b77826965f19550526930cfd6575ee0612fa8b8f2f5cc776392415751e63114346344bcf4bb6aa6d065b9e1d067d7df5bc444dc1041dcd5489d78dfae5971c7fc7c11e5e54bfd1cd24bb365b8758c3a38854fe3778e0c2f5fb9f4bcc8007a9112717eb9dcf773ca31e0ef6f29ad1e57cb52d5f2 +Qx = 41578252421247e4fa6134dda6829b8e0a5e86e2a72d926bdc7ebd7717d6c7d5dc1406c40b987564ded43144b9cad26b2d2e955e3982db4083d8540def43c01eaccfc07f3a4d16f +Qy = 195fdfe5c0aa57ecc1214b91561321870aa05fe55902159ce73f2aa635940e6bbf53d0f017cd9fc2d0a8036f6d9ec417f077d2c80a31c1221137e1387245a281a7580a63dd00fc3 +R = 35dd38a257fdc160a8e86813b263fbc85a20ad8ba14505990c1b50f4f57b3062636cac8bfec72b622f85f87592742e1d9063b4ee7bf3a47fbb63b1044d337ec0fa54b1af82363e0 +S = 116c6e802ee39f7d2d2a31fa3278548387e0531139db4c2478d834f05cf7c77e4295d1ece85af2a159d7116e537e83a1fd57616427c447ee5b13587211c3a9b5781fe5ebc759b1b +Result = F (3 - S changed) + +Msg = daa8fd2e440ba44ffa80d166fa6370087d71e6dbe48bff352b41bfd2d96d2f6e43b0e25fc55ef7c39865ef0786924a835073444bdebc71a1710008759762d3dc6fff8df370369011fa135f1dd078e963c85eeddfd9cefc33fe31d863ade8b68633e6a2553a8759e83101e8757c7a17e21756fac876a3a9d6fab52e704e406d29 +Qx = 15fba931e52b25edb0c6660fb464ed4221099289e3f4781900ddb655b8ed05831930f039af4dab646a1276c2e70b06ebbcc9ced1928e762eefac4b32dc6e460d396364dbd0a1296 +Qy = 2007dc4b11a12101c03f7d77eb4bb2aa20f83254617ed8adc5276d173ac3f410977822b370ee188b403e72bf9b26633d7e83ce9230b88d0fd95f0f0b37f1a5b56e22370cd1be29c +R = 0796cace36d5079d4c3013fd6c7c47fc8cc1d356acbc1e8316e708bc33e12ab70aebe25761242557b22dccddc241c06b2774e184cdaa730f7b727265917692f0a04503290ef20a8 +S = 390d149e7f276697f61953309606501f68b117dbc4617aae83009b722c632446965d9ff77db647494ca871f8aab1d69230bd137b4ce38f24935635caef197275343801f57c6d837 +Result = F (2 - R changed) + +Msg = 4f3ff8f77f0d09d4ce5ab11a96400a4624d213efd6a1ac2d4c548dee1ca446421e06f8ae5dc9abb4bb975cd0189ad8d3430ac3fb4c4b1f25f492c3cd5c65ca61c3e889dcd2d144812c18e25ab5cc9d294c2f19f3b98d07167c9af29c15800fa4b4a6047ab8471a22971cbeff2458006644362f06bbdd114b4ed0988eb96f8d79 +Qx = 56c2926e133253f36f47a134aabf7ba03a44f279603ec9189cb481d0f463f04e50dfaebee7e47fcf6943855f451b2faa56cdb6d8a8ffd89965a358f01bf74daf5f76c8c7e22742d +Qy = 69a86837f2150956a4a0ec8eaf15962cbb79a4e95e5528a15307c8a0d670a714fb22dbf708c7515f2c8b2ad512a8559f1dbfc8aa470811533848d7b99fe2473ea824c1e11af3a24 +R = 3f098d1fcf5eb129e2eec142733510ebc35536f93aaa2a08c1945ff701751661edbc4f96243b6126f263ea762de985b9b056cc41160f372162130dfa3c0b95c8e384baf7419247e +S = 2dc5d8b9a9ea96c66805ed24e4b5d9ff5c4dad5922bb5ac1793cd6ebabca1d2d722e01ad60b4a19fb8f7700e178799ec6ca86c5c6fb9a07d7bcbe3a6ce4f6cce72834ea6a9f35a8 +Result = P (0 ) + +Msg = 15a87fd98795b558c4c83cf095b448dcaed11c3c404f6e13eef8ff7a8323f9d94685081a184c4a59e707b7722f05706d4cfc31639e3df7af298d25f24c48e0bf1f1a639742ed89aa107a9b3287a711220740cbc46a74b72031e4d0c56e017c06a9f714db98d88a4633e543160de2b57dddca0004d61f097d5bc6610fc9beccec +Qx = 56185fcbfd8787bdb12d0e484b01742b2a7877b9c5b349543a0dea74a18f138e7b68b5ba2aab4578c48b66a79d1056414ed5609b2f1f7f31fb1728c637f89d33bdcc74969828c61 +Qy = 327f4c6a7c08095de1265aa927f2546358507b540ab4ccb3fe4c5a2f00a33f199de1f8ef9c37b4dc6a72860cb2d47db9162e29ad76036148645f9e3b0da6e2b2bf6eab26af908e3 +R = 1ff21288d1894721011d08dd3527184dc9c8ae717fc1a870a0e83b1ab0b4fdb24a8db0d9244bfd5f69f7889329c9f3483744f5e4109d3b6e763c7f65480389a5e65382c6a9ab246 +S = 151b84af762c39d8510c98d976d032bd3eeeb9e70e733d2f130197a2aeaa2827f23fb5bbf3041c9ffd84f53c0627756aa883b0f6d684b6bd7c03ed1d48feb5e821b110fbdf9f60e +Result = F (3 - S changed) + +[B-571,SHA-384] + +Msg = 4d9e5842e43e22ee96fc6c2be361d9a75d81eeba8ec139dbef72335d3b6056e643e282c64d5f0e06cee964914629b8f634fb5c7ecd30deb5704d565bfbadfba012f1ab3139a591c8f140e649a5bbadeafe5db18135cfd6ce65aa8fff0fec4d8154502cda52e5c5ed1c2d3db334707f5d1142f231bfd41b21181ab61fedad2a11 +Qx = 4657b98e6622a97808eb6d45485e9d3670390d944711b732d48bb10bbd28c05f4c2a3fb736256466abb269ca3eb4f8693781ae4c9ef7995cbe35ae898ea9c519cff86a04df99b13 +Qy = 3b24adfaa5781380d5f241374b427d485f4838d5b3e755d6587c28690c3e0e459394694fbd6d4ecf92bfc89fe60b02127ec7c9003b28c865ca7da255a7290072327ea5fedb1b5ee +R = 2094965269d21d4d0ab9072e2df9b1ad556272f06d8469fc49b256c30c26f8d9b971dd8407a82108aaa14f3efc269b6ae13c63bf8037ca413e121fda6199e580514c3709831a58b +S = 2ee07ab49d7814f67774821584bd28b1135d73d9e35fc7c2b2b39adaf5951b9f465c69bed18d2512af15fc3401d6e42a3a406896cdb07cf7ad02dedf64b54b9f1db52d5f2f32653 +Result = F (4 - Q changed) + +Msg = 9c090bd9cbf2dcb27e6ef7502cc7152b1bdb771b3ec0c34eedb2a6794085b1dca97ee504376ec07a6100f113c345b3f8d22c96fa0b3664cabb307d81264789efc66f5df7705d84cf25b84eb9c9106f92f114aa131d866bf7434a8776c72b72898bb52a34cb449c7ace287e91e0547c6e52c39ecc4e3aa531d338c154f40ed37d +Qx = 1ee34816f502fda732b2fe4f35aaa060890f2d51b1449f7f2d3e7918680eb9c510cae00ac0095e25a67baee8bd841eab79b11bb923b32389bb2c8b91c778d0df497304f47de42e0 +Qy = 0f7c89f970aa7c89d0019831fb39738d30b037ad1adb78a19d0ebd098dbe071ff1ddb477050fc0da6f5cecf3a0061de794dfa8b3726f4b6e303a378b7baea2599e6711fc19d9f6d +R = 2ff332ecfeb1ae2c4c0688ca2e936bbc869dc0acf3439e511990064209a2774086c701dca52bba445614693f9305b7fb114f6493769cb330915c37511aafdcd297b58ce4d5d17f2 +S = 23d36cbbbf089d0d395e3807f40ed90696d6f1de577c31eddc01a229a4f34650fcafec259b0dc2bceb07e7e2287f4babb430f4eedbba18a9efd94e76b49010d9e1daa9a351f7060 +Result = F (4 - Q changed) + +Msg = 529a6e7f5987e551134f7ab6c84ab258e9e5cc6ab51226a99287a1f730d25f9fe835b732243897d3ed00ca5e8fbd5755adfa6bac9a4be217176e9b56cfffbfd73891401256d39b47364b64a6e80db1654934dcd6332902c392911d4804f583fb52e51a353acd2b547640af5be0b4e597d805a03253facdbc99897c89108b206b +Qx = 73d0115eeab88d747e89afbf49b42c173d6073066290ee0b94b479cf77ca69f6f67c5ae2583805d083195d9d7aa83b2a08fd578fe1291f7a5c743a016232728f4aabb388da2c72e +Qy = 277907a9476a80a4d337c3c322f21c5f1160f83c4015f0775aed4d95750fef764ad88df31c1d7edcd92b80395c911928b9325f16b011e0c2e0364d3b8ab42a4aa57b9719f050e3a +R = 3f01d4596ebe6e72945cb99a115869edc860247fabd46cf46272b26bc7871546ce553208ffa1332904412515a4f9108c915a1a58bddf33c3d8c9fa642c635fe0d2bd38e6a0750c2 +S = 090ecd521b6db5ef5de4d81d3b53ada5ba8641b22577dc92a76dbf79bec0da99f407655ddf4e96faa004d0af2dbcdfdc5fc96e4c0c35f4bf553b1401fcc71347df23ee9b6d13f49 +Result = P (0 ) + +Msg = 798a5c97e56270af1f37d6192a1fc2e76989201f03de7fd1274079c3238fbb21d09df02999282dc2b4766dc708e0dd1493da87fe79e4b8747f94b61716bec352a81b4c438e334b10a00c31b8f197c158781675d881aef170eb290ba2f163881083447b70a0b4bbd713b19f78ecd9a20c4cfb80def30e181ce7398460dde86c2f +Qx = 6e548c1e3290dfe27cf2c30bcfc65a245cc0495052cbf289b285126b9ec60a853924d290c68bb64780a31ffcf3084e0d3958ef724f7acdc0a726e906148df7372036c9eebb82ad0 +Qy = 08e5b78610025a49ba9345f1c7a9d32e59ae68cb9575770ffc12890d6383eee29cc95781b66ff5779a3eb1d63c7f28542d77f048a9c82eebddb1e94e16d0268303f7454997ed8ea +R = 037ff4dbee6639d1b2f637e181112d35f8cd38844480327eab7d6eb8bab53c5e6df9efd4b05351c5d3478431aa5d209a2aaa67bca2e1a25cef86d33289fe109d7a358fa9c4736cd +S = 250d774d2971c9174ed11efba9f1a26c798a1b64edeb2c199ea2aeeaf00c4af1d559ad0e595891ccd6502d677acac0e918934147d18ddb34214fa585472bef6ce59e1e1b853fce9 +Result = F (4 - Q changed) + +Msg = 753020fcb72f7ae59f15bde04a7dd96a86d46e2c9e5f9d7ad0e20128026c148fd3061757eb146d3be35f9f2dc49be553769790072c7ef7d0a1f8beed39d19fba2c8f3debed4d87722f22714a7a4520fdd8762a35a0aa5bdecdd8134ffb11c5198a7999a7017e9877ac9351e8d435f02add3e6125c7a49b3d43bffb564a61df0f +Qx = 22bdff789ebe8ee74bae9c3eb08f4c0ed4479d4771718b5e2ad1b4aaf27dbf6193a86dddf3d2d1ec24c5c1964a8c4af530f20950aa28d083278abd8478a499a5f88698b34bc7109 +Qy = 3382bd071611f53c9ba2cb8000e05f4c83d860aa0decd7225fd734504ab2a93eb2160e5d329e764d476ddc7fbb5b3e1a6265667fb6ddd51108c2c8513e984845665a995c9f2e33f +R = 0ec4634dbc6f3d7cca89f824845767d550821e3a9e4d5b4dd5300a08d2ecd2fda608ccf3aad23a7f33637f01ec5f6f7a4e6c91ab4a70235d7a5fe45155ab0a7ea44961f31cd910f +S = 3df9218e85de6aca5e6a8a1254748ccd4fb77f364a41be2be42fb20e0ac6eb811c3c5b01b5ccdc29ca36f88313dfb3e9a923129f5b93fc3949ce7e3cce9ddacf28a5cde4a6f15f8 +Result = F (2 - R changed) + +Msg = 7566f8106c6c0995f0388e9273df46d59d252d962896d63b049ac662619e16e50cc6ffa1e5ff31cc967fb18c6c91523f40f93f15d0fe3d543d16cd6ba6c58119130082d89b9d09db200c215f1d92a38fb76a631e53950d71d8593c5328007b0710cb00f96fdecbefe11d56acb677bc0d9989a2f12369c5f550207b2b9dbc9288 +Qx = 5fa5bdfdcfea1cb4b1be1cc0840dd374dca181e2d89cbd51a2d8d30ba53febe7d850d505973a47dfbf1f001154b7dbffaf4a0e242ca5849326ec691e671fdd41e84af93df79dc90 +Qy = 0a33bb3e48240cfa7ee44c15f93df48bfd9b298587d1de0f778ebcb8bc48d75264dd0ea686a4711ae3c20795b127ec8bada382cbba47ad9c6516de58dd670d77e8ce8c2c4b110b5 +R = 0ab47b7bd6eefdb37ae2ef2b90eda7e84e1321d157656670d62b052bcf4555df4c8a1cf3364928843cfcf79507d253f7332f9e452c4d968d0ce76743f9ef012c62343b0985312cc +S = 2564f32e696bc799fccaee721806f94e6bb063fcf7ad2c0f53c7c8b50ba3f65548670a30744c74187341351ed2264395620dec50fca8592eaa8df1addaabc908670bd530295c19d +Result = F (1 - Message changed) + +Msg = df7e807e9f523870bf16b16b58d12e2cf91372d1fa92e245160033f553a2996a8c7ac23ba6a64fd0bfe4b3b7fd569c5f5fcba0a193fd47b04ee29ca8edb8b53f00e7dfc07bebdfd92f576b06a37d6abce3f452a437d764f2f53a06bd2490d049bc4d28a0025c65b1194e865e2ef537f73d76dfe702e87591cefb4493514e96cd +Qx = 7b187e2fee5e316c8cbfb88ec17ba5b4b4ed4c6599634c9f9234a1586dc736ff7ef803b77f6d214e5040a8a68acb3920bf7ec4a900471b3be074e200acd45bf521281cc6cda36f8 +Qy = 56630cdfec8f5cc22b8b7eef6ab02b261a3ebacc57b072d60a4588f846050f35ad40733dae9fffbc81f9d1ccfa165bd711c7bdd4ba100adcedfd7db8e0ce8c0ac8320c453ef740e +R = 2e39680bed616bddd60d5dee1794a3b4673cdf6d08589b7911b38566ccacff8769d3bd677b6aadddedbc7896e2a6fc32dc0a5bdf854d15132dcf8cfacfcd19e4fe8349be419d57f +S = 331d599823e82c08347bb7c458115c68f4aeed19fee208a9d2a54f6a7cf88494d30523b726af6be5f0dc4a7f79e4437f7225431e98c995fdb17d44089aaac20e87a84c638c81718 +Result = F (3 - S changed) + +Msg = 1842397df04b5243b41096454bad6923e5726fda83ea070b11ec5fae740f7acd14006a6516ae88c164f0d8b5aae1257023211e7a08b1dbe3373428ee02e202728aeb768a634e5aaa8f7cc882a5c4354b38a97e5967a3a17f9c8ec456642e18e1e1a9584d13325ef40245cf38883ce788a21320013c40f450a77fea5d96753535 +Qx = 22f77c57442e718ab3b1f86572bf77ac369c21d3798b32cc5a14b627c8a548a2253b871b4f17b2ebe79dbaca762d1022d22556e4235bf313d535f92d825eeb5a06fa6ce99b43fff +Qy = 3ee721142cf05abb3a2b7ee890c6b0bab7cb71b6850e68c3e63c24c4a133d195546a50bf3bf887136da690cc1b5106545c72a62b5ba30f255d8d9ba85443264632f56ed55fef7a5 +R = 20599422e0317985b1117c2d58b3f944975d22b08698faa0ed781b11118494ccd6f3daed898255d0da6f9c361780ec667bd8b56dc19c49c74d0a14a5423aa4f73108d856231d2be +S = 38228cf0c20455e5fb1cec717cec13438aad9e07725c94b0f46a9bb04ded32bd39319c7a76c90d190c1b27c45c75cb66b09dd2563f63ad0e97dd8f228dffd6132ef143fea97a6fa +Result = F (1 - Message changed) + +Msg = 52b4b3538c636e8bf607b426eeac86683736d4c7b5b26c9082de01242878aa392b28efa904b65b37727998dc2f183bddad4a52b51f788132f2a61692a64167fb384782de20dd3da71f9d4e391e44926ab756979deff217e05626a32651ea9e6f989d39acb67e5064bf9beca71aa0f1de13cf73994d5d57d003b2153ab86ead30 +Qx = 06a79790325d5b95634a2a9f11fa604501fbb0ef4b08c5f48322f0a481560f9a627a9679d088e7ed5b11724c6ddc9d21a04f8efcb481182b8e6f35e3ff796ab99f17ad2e06e6d5a +Qy = 3ba5e83b02e36ccdb935b88f4a25518698d92bdf3cebc42e911e6c70c17b889e659fdb5a27218e8d9781844314d94e08773e71a1a98c68f51ffa849305b864ea61f4839a7124e86 +R = 098535be18b216f85a3cf367f42b9ebb295023bd584c1d5c26d5683fddd7a6dc2338b496838397cc0a549d89cb4873e3aa663deec1d4d2177d073c200f8e9b157eb06dbc44c7a0f +S = 3b48ce1d61c3e8cfaad8b821a39c548666c00269708223934f9b8aef9ddb985fe6a3b3d81d4b3b6c8aae9e49598ddccc95e38658457499cbffc29d9947f1fa7e42981a3bbfebe08 +Result = F (3 - S changed) + +Msg = e906b4cef7f5fba32cc0a5498ad1281f8f19c809a88728c9240ad2131f05fd59b7c97ced31a55eee25918ed8720142eb56ce8db7d9abcb6d65e61e4b5391be2644211cd7606d0658680b0a7c3ce4ec018141918f9fbd6f973786dc1d6faabe059a756bab5ccd255f7c70c4b0ca256cfe7c1364813a8c4dbe55ce313a4948e00f +Qx = 34eb4bcd8cbb48a2abb42503119d23f33df9ff15cc6e542504d715fc8a8cb77dc79f332c423e9bc3f3f44c247ebeed8278593e6fd6b88ee16a24d72a420081a0dabbd35ccbc3983 +Qy = 21f99319326e668473bb7501f478be2e143f1d16572d5845b4e67f48c7f2e1617f92989d6bca07170e5e4424a993265dd4deee91ebfdb0cf6e98b2398e6cb3187a97a0a34a961b2 +R = 02e8bddbc17209604d948455bc92c8affc8d87d914c53a471f69418c173245dac633d874fdeb448f95baf9d349772a89117e36efd5da64a52db21943fbb4453e44c9d49d418d39b +S = 05c64a8f9cfdd10cc095c1d6415c1371ed1a7a760561ec884bca5861f4f3ea4fbab05c12191c93aec2502c7f849ec2fa85bb01ac9bc64cb3edc2c149dad0bd9624ce6dd4ff6b9a4 +Result = F (2 - R changed) + +Msg = 0d51a83bdfeef48937a92b60a8e2c14832fb732623c36379cdbf108837b39a2496751c19342b94adc2cb343ef35263fcb7da9a96a91282b97f45550c2f204cd1dca1dd367c86e81744e8942b383e1caaa93ed94c1c31d08d950dfe2fc7cf5475ccfabd8e6668a8842dd3ba2c7f3951334ca63f6e56133e80d1e42f3ccc6a8865 +Qx = 7e8590ca0d5638d623d3e68726755ef5c4c1bae54e246ae29fdb1a6015fb22cc49911630e43f040d5933d6bd1057543c208ffb009c1850604acc3d6ee433fe7dabe6d2b1a2e9b0c +Qy = 1e651a240c390ab42484825a7d2eb7811d171cae1af9ceea00f9798721c1b623d7813854e6885fe560e6775f2ca42826c1821c172714fec02ad210ee68674dc7b305a6a63548bc3 +R = 306769ef019857d26f423a3d211bc1929501c62fb9d3055d50c003e6008595572894350dcfce930601bfa26cc027d074fce875d7cb7ee2f70c5e279f03e11c414897438f1c9dd1a +S = 21a3a417665a5970e68af6ddbee6723a4bc3a4ff457c5b734126cef0018eaf6a1e6492418a645d5edf4181add6cf1f8195dca15b881d2763f6fe553ad0b595b763bb3838f0a2415 +Result = P (0 ) + +Msg = 736a7acbe46da40e5d9ca1c7fb787c4a9c1dfdbe87ed64704c9b78baa3edbfee0f12fcf77920afa6451d47357a22f365841403b2c4b1439b92056f70da18720941aa8bc7e4111dfb4885a43e61549e9ad7f856c427bc318f0de2cf5bc842d33fd5d737c53171b81c86ce7e7aad01b25ac3d2ddcfbee448bd6cf787e02140083b +Qx = 3c8859ee7d923bd7f90f9ce33934f5751e846e7049f86ab9600db7a74d06dc5c50a0a1b3ead67874e064ec87aade3b8041994225884871d0c5010ba11d5d83de87201262b3ff43c +Qy = 3ad0a37a72d80d9a5dac591a55850faeaf316162a651453b3202aeaed29f3ce2a48c51c59cd8bfe013a47d731d751cddbbd9c5a4d89b6f0e5929dc683f6c439754ec4c9e1e7bace +R = 2d9b45dbb5c483f831df1478a7010cafce1ad8306746a797c27c35f669db400a61e02aa70d4f435c73fe8acd09e2060167811267fab870425f8dce4608f47aadc6aec467ed68cb9 +S = 108e6466141eb0208cd77f358ebc81404ebc703c5ff24f03cb2cce17dd0cc53a1189b0d55e0283f62eea87a62989fe71125988b895a98604852622d2ccd545da25e80e2b509cdbf +Result = F (3 - S changed) + +Msg = c7db000395834b8a7dbaa07e6b9f15232a5018c0457ad25aecded9254ef50647b1d3f72b463850a9fdfb360cdd557688a42e7cd6f19bbdba73917d063b4cd79cd790432084151be6fb5694e79150b2c4f81d05e49bd4a8de4446f686e2b5f08ff70cccf696595f79f3b790d0b0bc791ff66da8289279c421c7123381b5416d36 +Qx = 42df3a6b89d0f5511ee97e6ae2a9e09e1c9c4801e52b099d838c0905780551df9263c9a83e49027a6250825722913bd961e90ce696b62b58e1f626386e31bba3fe9aa0f443e4051 +Qy = 7d8d9b75027c57161dac9c67722e2620ea1e52815728d8aa4c1c374476f8cea506c9d7d1260a5ab6a8caf4bf81ecda932fc2adc9a8524f22ae0afcf092da736007d9698af9bb0b8 +R = 352e8634862aa62439eab3b8dfb26ba8a17a0736463e603dd8bf6b00f718676e6cc498d07bd5f240b5ccb0791be0d153cdfa3fcfb197d1dea0438f871644f719ef76644e1c1f104 +S = 03716777f6827c99d2566033648c5910c9c5780ff07f2da0682bc0ec30eb1adff0912fb0a836b2239165e715d8a608363cde44c58bdce5133ab6e906d33326f94209e5343e97f6e +Result = F (2 - R changed) + +Msg = 053e1beeb3b077403012f706abe55cc6b05bc0e424f74941fd6db5f42c2d31215cfb837184b9c21d7366c2b2c4001cec3dad6ad2f3c0487e72ccc0774938c3a9f371414e70bef2fd29982fdf152978da4c836beb2dc9f9fb4a28571a134337f753fae129563baad7d0b5dca838e85c79d4b5c1f4b94d24732a2762c79781c90f +Qx = 72c0fd8768937d28f5b031ca7a27a78506658b4a837f5db8008514e70ba342e5e7462796e5b507d8554fb14009e74858ca60354b7974b3d3b668e6578bf91e1f60351a76145c6a2 +Qy = 2f4c138f4d1d9cd6a811edac98cbef3a98129472811dc3c560b7c646096886b2b83fc7e7c3d6b0b5145d7e26e00c0efdcce833accb92c6fdda23d3d19feabac261301031c20b565 +R = 111dd7c5207ba78c154d8b122bbabffbcaa6b1a9b67cb02e13c6e94abe5b6da7398f1c8bc0cc483bfdd696a31e362255d0aa4e86c819ad9fee27c190d93677076626b2529e2137f +S = 03c1fd5997b32ede7e73a67068a6a225b01bcc0521eaa4db3536daa769e548c6ac307ef01d153e30e0c5e1e76280e05a72af5e72ba631a1089cf74d78020ce5efecdcfa846384a7 +Result = P (0 ) + +Msg = 3873460ff20522ac13be0c18d49b4158d5ec13736906bc66f80eb6c7a6c86f2f1f85a1178ded104ce1a1c7fee2c243668a513d07bbd6c68458156eb6b56048b98a6a9ecc174119eefb1e7a7d3038461f198a49b926fc842eb68615e84a36d377316c4ff2fe0d1ed8c4538d003c6017bb3f694b074c32b0b2c40cf7201dacea00 +Qx = 6af8ebd00e40343ebbe9aa47a8683147aed952f4f1e5bfb722c4023d979e780df96cfabaa2db73a064d14b6309e762a56091ba6b47a68c85e919b58f7a8a56a0a1f1fdd392d5987 +Qy = 58322d667ba3577a74c8a8460d6edfd7d65aaf3260665ebeabce3a194bee9c8678633e1ffbc7d7aaa94a021b4ecce55246e373aac068435cb8b4a8f0b1eaaf9675022b708bfd8ea +R = 285639d14198fb8838b3ad37da446d6afd372fb064d4fafcf35035669453371fa48068b28ed6fb8d6d136cd8b801db33db384dfa7a52c96afd08410e07ab5a75db01a7cf80da100 +S = 12b0f3711d2fcbe50b282918df5c43b2647d87c597af4f870d379a22403bb6d3c1c3863e1b9ab8a32144180cc5b7c938b712485eb4f6694bbc3969e96a8f5c2d8999f6bff615f90 +Result = F (1 - Message changed) + +[B-571,SHA-512] + +Msg = 1e10f08ae677e1263855345ec635fd19cc134da08bbf9e95ef459ff3e35c556d83d3fe943bdd9ce474bb93199743b6ea45766f7190994aa4554690ec084ff54c83bbe5c09a609043308b06af172c7225f833c52330da850ba1932a0b8ff9c0e558b0e89fcae5465bda2ae9cf59bb366c4e90ff7e23d76b01e5f82415e5de673f +Qx = 44ea73e0d3ac889be474770207ea6b9a0e056c991be02aa9ca6e00c16ef8a472533ec0d2539faf1753f4d69cc18fbec171ef7b3fcf81ac20e28a180f564d4149cb650b085efe2dc +Qy = 79f5f20f4c7b2c8467dddb21032f473eaeed3338e5d0eebf13704487f3e2d9de81e575103256f3e7813bb2d7c5c98524c534fb0a4fee962e5ee7f141b54831ef7af80eee664319b +R = 05318a21a178a46be52f3a3f0888458a11798c4f26c632ffbfe68596a434f438df74d3461fdff32f4c797c5bdc84768b772545a57b89283fb2a51e97406e4113a4e7bee32fcf1d5 +S = 2f0423e77ceab4d524ac9e3b83e27e3dfecab9382512b3d543aff00582ba0ff871e7e82c23a90bf672c7ff1c4e9fc84450e8cac5eced46a9b3ba4b65cbd37ce0fd2fcc8d9eb3fff +Result = F (3 - S changed) + +Msg = 83b7cc897eb53d55a27c89740f7ce966cb93bea8cbe502b6ef12b2fa8c2f566d6ae980c4350bc9c5bc9041d638e58fc267f7a6a2f4cb398dac22fd04b065d5e9b08b0d4b9befe951f0ddb424d74788b46f3dd57bce999a2cb7e27fc2828e9482c9220d942512dfc5c0b92b35c49c00b2255e55bfe99c3563ea800cf8e5d71dc3 +Qx = 08817901a73539e642fd0f53b7a91646f041f78a3734cec37d7b64daf64924afea8bb876939deab9224d4e8c1b730e645758bd0b9cb18410514b6089b881eabf664b05b01f9b81f +Qy = 77c3db446be59f90aeba82322a5bada5d88bdcbe998a6c06c74ad18565b480d0d17aa367e6edac3788422b2e87a661e0ff3bea3af981a2f33c576da135136654ca7cb63ed996416 +R = 31494dee5039dce288f7d723efd7bf6bdb942b733b79b7998cae52675382a0e021995d70d023a2fc6e7f076c0aafb411183b1718e684e76dd995c092d90064bd6b97a043312bd1d +S = 1b9ae7731a1a3eca578c90c259f84435028e2940b797e899d2929d708b6f6d8ce2c582ccc9d4dcbd5955a88e82302e911560ec5317bafbe11acc87e97e316b83ba350e9bbbd44bf +Result = F (1 - Message changed) + +Msg = a1667155af0721443cf5b6ffc356e14bd40a0e8ac23df4f18070fcc0ad21a81f874b91d4a34b6f6102bf2a287a04f1c5bc0e53932e7ce0a142b4630d13cbfbaa03f986e6563c6a8d4366a7e3d0261abe396631187411e2c435ccea390ae480d3fa1ccc9a4224c7670da2a7b7d0476486b018e915cd8e22fb6133b04c4d7a929d +Qx = 1d304181297022a6e8948dbcf207c06c2133e58baa407ce5b4e74f1eb8bd57a8eea907c859038b2ee42447e111d13d2e3e2e366c1d2a3d3d34ef92eea40d017fe2175e7c7b70462 +Qy = 758b210531716fd3f0451057f7813bf5d08d34012d6fcee34ed246462e8835dc5c3c8ca0bea3711bd9d93864b723be8b9cc2335b62994b6ee24c091e4f231e0738336cc30907d65 +R = 23c44d462453f832b5b80e32be216cc07b2c3ecef0d756af89a5015edebb7632e55e34f46172495592b2b1b22bc22e349e1123eaec2a8916d58f2b6c8ec7d4507b720c208570a09 +S = 1d7ab9f2a33fd1c0bdaccc9f39ea08efcdbcdbb649d2550a5df321a98cfad0c4fc1614eb4b834b386fce2030cf3d648b351a7ad1a630895460d3b4b9c7b973b64e0abcf9064a502 +Result = F (4 - Q changed) + +Msg = 75818da1e359eefe60e5d8c065d6735527b3dc07264b134d19a905d003ad438544bc24e5d662b6176b1ac50b8f0520459e091312fce69ef9b622948142faed67aa6d5b345e8da6712e223fdcefdec22b784e2858282cbf6e30997971d121f9e5363f7620a518e490a0e916d9da70e61836b0c8c5b0d86c0a80ab6b4fad30a8f7 +Qx = 35b8b217a4615a03ad0cc6e4ea1c05be493c2775084ee0bccd494e32d6c353b47c1557e027f14b2ca83580d0afdfc352c4b7b614264063e7655587c0e26d3b7bead526647d682ef +Qy = 35cf96abc4b3eadf43a3cce37da07b23769139bff7f6ab71afcbe326b51f474bb6fcfa616be3f588111864aba8626e80e6ade7011ada38b1ad78548773ccca1a58f435354ca4222 +R = 1db0c7749d8ed8aef22b58329ecab603e279654596d8b448a120f4077a125cc029cdfcb986a60af73b166e9c8bcabceefbfaf23540d877e2890bc4a1df067784d0228988348e012 +S = 16a283b2ea23532ae5b08b2fbff44fd0cfeb4f34624d089832ac9c9f02fd1a440f5323d3ec01ac37b61a8a1b3ceb9bc299eab4d7076a7ac5540a1dacc0c5405043ab45319fb5483 +Result = P (0 ) + +Msg = 83975ac6be5bb03ad248d2852030887863a631b3fccf978fd28ef5068dc997de8fc6f0a8cbd001ce94788d12f04488b8e31073fd6b267b196a4e3cdc9464368962490e0f204ec968cddadfdcd0590fb04b7b5d6eee81d73ee1ed2476a4d88a6cea747134856cbc21e642fec611ba3005d1765f5d7a91ecfb9a6882d084d923a3 +Qx = 1c6005ef2047af0484dd0845ae2af9500e6084f139d76626ae3205d624a5982311949206bb02d603c78802c64d1438cddeea7e00003c13cc44622a83a15b07e51d9c6b28baf21e2 +Qy = 3d6ce796517b30e31cd40094f3d3e6ce3a2701c917c146ccb465168fe3a9f71b0529873da057a52ff0b4e70642900b9bc4fa9af56be2ab6abb509338b418230eeded3fb058c4ddf +R = 3f494cf16101f10b75634f7e7f72b6888d910cd5dbd666acd12c8997a581470b4fcfa4d4c5e2950d43a7b772016f94ff28413775d75fea001f25c585d73e8db123025155453531e +S = 10b17a614498de6a9f7e17954dd3ed78d4b0ba43f32fe2a30a5d01df480fabdd56b99f28fc20e62932583422a81226399973f63bdc960f50895d1313e2653484068a80a626ccc8f +Result = F (4 - Q changed) + +Msg = ed359734d2fff0591629c83d595d5eded07321075a9a28d072306532ff714e92107c7ec6971435a5faabe16e2928e638d1ff89ad990c33e436f9c6b8a211173a094599ddbab0fd1b66f4a46660a570e9d5564ef8d8a382006368cf960cde9ab9d999f84a0eb82df204c976d960ca0c21db4c1568b2077421d4b7f200d5c7c38f +Qx = 65d40a3d9cbb58fe8461f97024fa1517ecc2fa899236eb88209659e6a64722093f98a138255957adb74c9625c3f8b438aba7e796f1c51c72429885c6491d667e0f0d5d17698def4 +Qy = 2ef7d9fa84404282fc358091b1ee52bb0c3197d00fd80850585e58cd553292753139a364c12616bd73bbd54099ba1959eb13f17abd45d467524860ffec4c7cf2e69243fe564885f +R = 3e631f431da5905ba5147a12d869b706e76bb189df183f1e1c3d7379e305718a0ab339234c801a9d2ce7c87e7ee5f99e05dda79632278e8d0814ab337f32efc1b1533691dbd47b7 +S = 1753b6bb862953f2b5dee484d986e7cf6017dbdb906d688ac87db5b33d5f0dd3369e443d26e0d029ff295f05b459bdb4b1489c2aa3e5c8c3adaa7013a1a782c2599eb12c621bc84 +Result = F (3 - S changed) + +Msg = 471ef630ef02f809ba5abb0778cb6c3901a15693562d283548714ea5b5ec7b34623c751938fa7438488e148f8a8a58b5393c271c7035fb2dbfafe15fa5f96576e3d7f07d46e0e553bd534d3f587e288ba27df64513cec351ea10446bd207152189d2a559728c578cb81035a5543899a7d5b8744ed203f01c7c12ddfbbe99a5f6 +Qx = 5adb9ff3cd0b9021aed2ec7f4810a3b1b2e9db1ad487d8796c629aaa96452a10b27370ea755ea3b20c0475e70b48d04c2e455ddaea4ad52c1078cea3d569f11edc2fff252c4a8cd +Qy = 496bca62178550e66d623b05c10d866f76937aa6fb68bfe44baf0dae9bf58b2f81d680f0c735be3e85419e23c62d828d183522d7ca1f641503ba4d580f33fb8771ceaf3013a2e11 +R = 22358cdfd48834b39ab82ee562f316d016a1618c68b347207eb8952479680062ed4a0a695caaf43fb3d45a9d7e25a5ca9e61a76e9b099187847a00e0b85ab926082d4d78e252fa6 +S = 0161f6e566241d2c516111ac5b44100100edfbd977bd506ea116c3bfd364acb36a33e7c7b406ddfe04b20db57d933957dfae0c193e13a783e4e00fe89a09fc156a73d17a143e3d8 +Result = F (2 - R changed) + +Msg = cbc795079985aa7eba9bafc59b60e0e3e3167d23f373096af25d5be2a476211f073d5badf4d3dce63732681c5b5b59f789e050bb73d4118d3fe10579cddf406ae00c8e3c67ad2416e2304a3a07087a0c137fd5470316cd5f0ca98269ad5a6c0dc40c71dfa8e1b3e6e7c272fe71f4e10b7f31e5a8e548692aae603147c862e173 +Qx = 658c28e26bcbd462993cb62ce77b89ddbad3ef2295b3b75ae48de3130c86945177e71a71914bb05de5498223cf349a826897db1c161990e1501086c0a2a216d783ba980e4c1a8ba +Qy = 55d7f2e720a1ef8b92aec86d4c2d94245ed2ba4bcff561c6571c9902e7b34dc341842651c9927f434e17fa4f4c658934c7d1595fddf4a3f1d2b2a5dfc923979bd46f031b27417e6 +R = 27be1f06bb5dbb81b5dfd610bb4ed3a99c8b3f2df78afe90f734883952088e8be98da1a961edf2c8c6656f71a32014dfd1ec75b47363cd314492f524e7c7a7503521047aa1d26bd +S = 149f42edf8cc9ab2081b1456fa2ffc1332769efd83ffb3ac1ff978ba3d4f3bcb362582f101ad3e648081b76d3ff7cd5fa99d6b85d7f4cfa0b0abbcd2d50de61f7c40d9a5f496e2c +Result = F (1 - Message changed) + +Msg = 607e5118f7e390c713d3c2e6ff39a6b6f728c56c1540a59b9751d7aed6e13f2081ff496dfc375a41bc1819824d34a01ca8afa33be7862f1e987aedaa8fca8a1fd8810ebda4f1b7e46c936505e16d3e2dc995f83fa49eeed7dddb77f0f100b36e4cf58cad60025c15775d3d06b00adbed7b232c3fa298664bafb35542bf6bfcaa +Qx = 158e5c22c7442b795569d02a0b25a675622744f861573525240aeb5c432cf25e50670eec0ec631415789d90631c9689ccf4254b198ff99fc60860315eb953e1d36fa3368c8283d3 +Qy = 193e22d0188b22b7102a139dc5866883748a4bb04db6adb6b7b1cbf43acc0ed8c9537c1dc4b909b70fdbc8a5f4fd85be6b77eb981d76c183c32e242de7373eed17ed113655660e9 +R = 00966f3e2cd03073cdff88735750c15d0c6ec23719450ecba2d46d97208d9a220fc4746ca8e251e9b96107196ba9e6e906d0dabe86f76e3a77b1949474fdb014c106737ecce8b3b +S = 172549514a48ed6cb0d9da5c8482d0fa56e8a05fd23245385b13fca8e1e265bac3b2d6feed85d26b90d5e885fc7acca1664c4b680f139b8e215a2ec01130fd94c5944b1326f97b7 +Result = F (3 - S changed) + +Msg = 73c052e4b71c2596407f83e74854d1115b57d1d19808618028b3abd88e6b6982b2f5192359bd85810fad30e9a3edeaf3ce0c8a6a87522059d633a66556bacd2b4bbd577b8b1a5c94aecb1ebb36d171a4bfd0f0e9b32c7fa25f724803561427eaca89bfb7774e3757dc2b4cd2c7b531abd7fbc054a871a92e1a9bd9e06349c8ee +Qx = 2bcdf60627ff923af68817c31b52a39ae7d744bb32e604a2211d9673633eb359300050fb05e89c3dca5ca8f561869c176e6905bdb278863b4a4c58561d4e175e4c05f73e92e0808 +Qy = 54f84e724e16b07acce042d02aec2fdaba599c69088085eec87b7c8e23a9297cf41f4217265109227aa055ba2986b8db520ed0fa8aa70233818a550b8acf3d956c7781a97f41d53 +R = 19c4e2f7b57ce8ed897023547c11c34f65fbd23ee7d38d6a0e79f0d3c6ddfb4cc8ab26a39a500f417b777a2a14668da0c132b85bab46ac26c8dec479285eb7d2a4baeeb898502e8 +S = 08d7cb2142ffe0e827eb8e47b1f11e126826fdc45b5b4ff9c85ca762e201804bffed3378697b38403d5afaa8cd6737e6e0c3d423e3a8b07a0619a123177958561c5c43b8a79d76d +Result = F (2 - R changed) + +Msg = 66b79c6d8f58fc3ebf41aa6fca31334f66bd3c4ac2e8525310192aa38371ff26f272d29cc31cead37c5d6570a0236270510d4c699e0baabea0c0ae96d55ff0748805f2c18a23e8ccb84aab4da7934c13437a82c33baa5ba58dc6ac25df39784e1ead849064a445502c07072c1b5a5557e26d00ddd8114a642e2a76a069be9919 +Qx = 72aeee7afdb0599c587b027644d940f7753360527d6cfa8b9f960eae246070d7ceb4c320aad4f663d174090f5ca26b9fe98a03438a73b84adf1bc161d1968d758d198f87c02d6e5 +Qy = 663f0cb8afa910cdc37728d768368d8a9080c33b82754f7e7110a4cec4961b0674d47f800ff62dc89da3f98dc776b5d786c3d6e7dd1b59b9221fb5c3e805d4fef0afa0b72b48fdb +R = 1b3fb5ba9d7ff1c29746249c32f9a43ec34c1fda14783e22b1babf1f58c568a8b40d1ee7cb15ef8f70fcf61b181240fe4d7cf41609b524a98eec8b59ee868ef3417353038f5c2aa +S = 13b18837a254834b1ed722a5fca5806648717a056dd5220589d77098c4e40069160e4581c664323e1a8e29c6a8cd2d3add4d80613de5a414246fb0a8b8db35a8f71e72202bb9735 +Result = F (4 - Q changed) + +Msg = 632d4fe28e7842a0429fe994b7aaa32e107817179b999bd722d008e0862527791a929edfe5265b1520219cf3fa447fb602265bc02e2e03e496bb9af4e058b1a5568992deb1a5932a9639f4f8c5ed6d43c7d47d9fde8e5565ff61e9af60317fa836071d0d51f9a4130eb2af03f7f30dd8907ac1fa3c6833b36e3c54ace9498cd2 +Qx = 0fac94e2eadb629087a5a8d9e05cbdb9d198ed4fd986d2d5353fe1ee953c3ba2bec2f57d8f10217b3a0b5fcc3ead5811d966ac3cba6f5621a5ff4d278a0d881ba6defc889e42156 +Qy = 7933356bfda3f30277ebbba8c73c00f0f5f02dbfe56dfa4d95f6e8412c2ea0496e62fb80d0b74ad913b035b8c4cea637822ad6105448e804e38c2f8de4331d4abf8544235545052 +R = 06f9fafdf5c48d64413ddcc709fe1617f5f8f8f7c9bf34b8699ca36560c360fd0ac696ff631f2d6fff3956d6af81c28b835a42211f5b3ebf33ad5c43c69b2d519c0ad7331cb494e +S = 15453e11e5f2574f04173a2b332fb27fc51c390838fda75b59a16bf6ea9c8b019ed94936adf33a864099139b241e993de913b2d43f3816a1d000f9e3a94721ae56e8a53521318ca +Result = F (2 - R changed) + +Msg = 711d0a0fefb1ee93936b0a5b3914e71dccf6650ebdbdd2b225fe2b19ba3bc22dcc781688bcf96f1820b4f7df39dadd0c25dc568a999b2a0d6ef51dba64337060dc2926386d129e53d933b7a768be2945bae94305f02e23461e92a428640bd8dfb7b333b5919b9450a61aad05578ead36bccbdc7442d796722e824fd8de32b7a6 +Qx = 2f0cb609ea855eacef2ecd191811f8b6a988c54de11ded6547d2c1456b45b9aa673b757d89e75c63da113fb761decb9dc11587cc85654553512b83095884fe7624c6118b27866e8 +Qy = 4060024002e9a671cc6048dbabf2c5c3372c672f772e8988c2875c0aa9a2c02ac292f0e283972fc22a36a628b197838faf133218c5c432e0790a6f207cab78745eb36a4e53f52de +R = 353eeea4a09bd3aefa455662197a1886637bf55936592f7c2f62e7c9e756c7424bcd17aec774aea46caf13408dba4b1cb4682dc5a858b68875afff6b060b7a8907316585edd5dce +S = 3ead9fc822afff273185c335b7d2800a4a0c839aca33f76d24fc6e542785f91d3fd905922e7e19b01a01d3b1f36297be25646ff40193ebe8b5d4ff4117fe2827d7292d533c9ea70 +Result = P (0 ) + +Msg = 2b6cfcbdc804c1106a7a0e2a6cf4b18825cd5c93de00b2f5b8b452e81c8611c8c7c8a1dacf78b07572a9162fc922ea02c2524460cb9250982a5b9844771d669a277f557ba640a5482bf40d60fd8cd9bb52445dffe77ebc1bf2c8c17f0dae5e7ab8cb87f9a8a8430dce4f8c3e4f91b77b2d1d8e5555bae6ab84ea22b57f3a1ecb +Qx = 23b179938bff4f6ad62741d27a028c776182e05afaf810610f17b25f11fe80fcab1142e87a7bd21d41b6916e361cd0ecad2a53f84df50c0dc608af2a90501e6d311bc47939ca73f +Qy = 1eeadfd2fa53a1ad51a52b42e03bec28456722a55cf163746e8a884476cfc1f9e04ec4fbda25d69cf7b0d301f1384649a5cfdb2181e6526ede9ef48f09810eeec6f1f3bd65aea10 +R = 20a3377ab20ecd9599fc8a2d8a04721f58ca94267b0802fdb8b86e572a30067a388ed356e2226792d7a2e7e1be9aa9f4f1895bff2d7420f9981bebec6b99ac09e4941dd7233602c +S = 0c20ddcde703dbcd61beaf19f4f46f8cfae7bb5a8c83384e9acded50af50d26d491e3cb8c3722c7181ca11b2d854dbda39be19bf5286f5028173c9d1c0939af38cb17921d7fa8d7 +Result = P (0 ) + +Msg = 0b876efed1df838407653180f79e0b79b1b8ee18fc4cf163c8825e5e4b8924e2c88963e3d3048d11c1eaa6f31d6dec87a98c3f4a3aa6c135b9db8361fb9f795df77be21aeeed1d04dd04625d0cdf0b392702a54556579abc9e6fc65e0d0f466a65e94df4f35c9f0e9a7100fb9009e7357ee9953b26d9e6f5e84c9a16938ce262 +Qx = 3f19be2ae145e72cebddb7bf8ba7bc94bd72c671da1adc7007b5fed078be42206fe5f82ce70d7343f8c4f4251a704d3903d956d8f54623ff3e163d1de4e0090a1adcb095f011582 +Qy = 0a7912b0223ad5eaaf83ed73a9a03ce53ce07e6d889e48d435b41ee7ec2169ac37a81d1ffaa97efd64baa1356e95a1ae9b7918b35caf10e804510bbeadbd012b061f3f186dbbe14 +R = 17d1ca30ee6ef07c7d274e5520a94cbe10d5dd34d3a3e4bbd44ed822db4c2ed4b969595bb35d83ef522cf05eb153974ed501cec11957e42adf6633c13049151435d7b229ed942ff +S = 156835fba7c3c258b671e2f6af557c3f7f971ef932f963751016998919c6a9b3b5f603756651dafc14b81ed954b534bdf68fcbc6d71b5835cc084fbfbdd9e5f804a825dcdb89f87 +Result = F (1 - Message changed) + From 7991a67ec989cf21dc55d2082978dcb771329218 Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Sat, 23 Dec 2023 04:46:50 +0100 Subject: [PATCH 10/18] Add ECDSA public key recovery Added algorithm for recovering public key from ECDSA signature. --- include/ack/ec.hpp | 8 +- include/ack/ecdsa.hpp | 119 +++++++++++- tests/include/ack/tests/ecdsa_misc_test.hpp | 180 +++++++++++++++++++ tests/include/ack/tests/ecdsa_test.hpp | 2 + tests/include/ack/tests/ecdsa_test_utils.hpp | 12 ++ 5 files changed, 309 insertions(+), 12 deletions(-) create mode 100644 tests/include/ack/tests/ecdsa_misc_test.hpp diff --git a/include/ack/ec.hpp b/include/ack/ec.hpp index 00240c4..6568774 100644 --- a/include/ack/ec.hpp +++ b/include/ack/ec.hpp @@ -614,7 +614,7 @@ namespace ack { template struct ec_point_fp_proj : ec_point_base, CurveT> { - static_assert( is_ec_curve_fp ); + static_assert( is_ec_curve_fp> ); using base_type = ec_point_base, CurveT>; using int_type = typename CurveT::int_type; @@ -969,7 +969,7 @@ namespace ack { template struct ec_point_fp_jacobi : ec_point_base, CurveT> { - static_assert( is_ec_curve_fp ); + static_assert( is_ec_curve_fp> ); using base_type = ec_point_base, CurveT>; using int_type = typename CurveT::int_type; @@ -1528,6 +1528,7 @@ namespace ack { // #E(Fp) - number of points on the curve const bool a_is_minus_3; // cached a == p - 3 const bool a_is_zero; // cached a == 0 + const IntT p_minus_n; // cached p - n; used for checking the maximum negative point coordinate /** * Creates a curve from the given parameters. @@ -1546,7 +1547,8 @@ namespace ack { n( std::move(n) ), h( h ), a_is_minus_3( this->a == ( this->p - 3) ), - a_is_zero( this->a.is_zero() ) + a_is_zero( this->a.is_zero() ), + p_minus_n( this->p - this->n ) {} /** diff --git a/include/ack/ecdsa.hpp b/include/ack/ecdsa.hpp index 0708d0d..5f5b291 100644 --- a/include/ack/ecdsa.hpp +++ b/include/ack/ecdsa.hpp @@ -16,10 +16,10 @@ namespace ack{ * @tparam CurveT - elliptic curve type. Required to be a curve over prime field. * @tparam IntT - integer type, default is curve integer type * - * @param q - public key point. Note: point validity should be checked before calling this function. - * @param msg - message to verify. Note: msg is truncated to curve.n byte length. - * @param r - signature r value - * @param s - signature s value + * @param q - public key point. Note: point validity should be checked before calling this function. + * @param msg - message to verify. Note: msg is truncated to curve.n byte length. + * @param r - signature r value + * @param s - signature s value * @return true if signature is valid, false otherwise. */ template @@ -42,18 +42,18 @@ namespace ack{ const IntT w = s.modinv( curve.n ); const auto u1 = ( e * w ) % curve.n; const auto u2 = ( r * w ) % curve.n; - auto rr = ec_mul_add_fast( u1, ec_point_fp_jacobi( curve.g ), u2, ec_point_fp_jacobi( q ) ) + auto R = ec_mul_add_fast( u1, ec_point_fp_jacobi( curve.g ), u2, ec_point_fp_jacobi( q ) ) .to_affine(); - if ( rr.is_identity() ) { + if ( R.is_identity() ) { return false; } - if ( rr.x >= curve.n ) { - rr.x -= curve.n; + if ( R.x >= curve.n ) { + R.x -= curve.n; } - return rr.x == r; + return R.x == r; } /** @@ -116,4 +116,105 @@ namespace ack{ { check( ecdsa_verify( q, digest, r, s ), error ); } + + /** + * Function recovers public key from given message and ECDSA signature. + * Implementation is modified version of SEC 1 v2.0, section 4.1.6 'Public Key Recovery Operation': + * https://www.secg.org/sec1-v2.pdf#page=53 + * + * @note This function currently works only for curve.h == 1. + * + * @tparam CurveT - elliptic curve type. Required to be a curve over prime field. + * @tparam IntT - integer type, default is curve integer type + * + * @param curve - Elliptic curve + * @param msg - message + * @param r - signature r value + * @param s - signature s value + * @param recid - recovery id of the public key Q. (recid <= 3) + * @param verify - Performs additional verifications + * + * @return recovered EC public key point Q, or point at infinity if Q can't be calculated. + */ + template + [[nodiscard]] + static ec_point_fp ecdsa_recover(const CurveT& curve, const bytes_view msg, const IntT& r, const IntT& s, + const std::size_t recid, const bool verify = false) + { + if ( r < 1 || r >= curve.n || s < 1 || s >= curve.n || ( recid & 3 ) != recid ) { + return ec_point_fp(); + } + + const auto yodd = recid & 1; + const auto second_key = recid >> 1; + + // Sanity check, the second key is expected to be negative + if ( second_key && r >= curve.p_minus_n ) { + return ec_point_fp(); + } + + auto e = IntT( msg.subspan( 0, std::min( curve.n.byte_length(), msg.size() ))); + if ( e > curve.n ) { + e -= curve.n; + } + + // Calculate R, 1.1 - 1.3 + // 1.1. Let x = r + jn. + const auto R = (second_key) + ? curve.decompress_point( r + curve.n, yodd ) + : curve.decompress_point( r, yodd ); + + if ( R.is_identity() ) { + return R; + } + + if ( verify ) { + // 1.4 nR == O + if ( !( R * curve.n ).is_identity() ) { + return ec_point_fp(); + } + } + + // 1.6.1 Compute Q = r^-1 (sR - eG) + // Q = r^-1 (sR + -eG) + // + // We precompute w = r^-1, ew = -ew and sw = sw + // so that we can then efficiently compute: Q = ew * G + sw * R + const IntT w = r.modinv( curve.n ); + const auto ew = (( curve.n - e ) * w ) % curve.n; + const auto sw = ( s * w ) % curve.n; + return ec_mul_add_fast( ew, ec_point_fp_jacobi( curve.g ), sw, ec_point_fp_jacobi( R ) ) + .to_affine(); + } + + /** + * Function recovers public key from given message and ECDSA signature. + * Implementation is modified version of SEC 1 v2.0, section 4.1.6 'Public Key Recovery Operation': + * https://www.secg.org/sec1-v2.pdf#page=53 + * + * @note function works currently only for curve.h = 1 + * + * @tparam HLen - digest length + * @tparam CurveT - elliptic curve type. Required to be a curve over prime field. + * @tparam IntT - integer type, default is curve integer type + * + * @param curve - Elliptic curve + * @param digest - message digest. Note: digest is truncated to curve.n byte length. + * @param r - signature r value + * @param s - signature s value + * @param recid - recovery id of the public key Q. (recid <= 3) + * @param verify - Performs additional verifications + * + * @return recovered EC public key point Q, or point at infinity if Q can't be calculated. + */ + template + [[nodiscard]] + static ec_point_fp ecdsa_recover(const CurveT& curve, const hash_t& digest, + const IntT& r, const IntT& s, + const std::size_t recid, const bool verify = false) + { + const auto bd = digest.extract_as_byte_array(); + const auto m = bytes_view( reinterpret_cast( bd.data() ), HLen ); + return ecdsa_recover( curve, m, r, s, recid, verify ); + } } diff --git a/tests/include/ack/tests/ecdsa_misc_test.hpp b/tests/include/ack/tests/ecdsa_misc_test.hpp new file mode 100644 index 0000000..5f2146c --- /dev/null +++ b/tests/include/ack/tests/ecdsa_misc_test.hpp @@ -0,0 +1,180 @@ +// Copyright © 2023 ZeroPass +// Author: Crt Vavros +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +namespace ack::tests { + EOSIO_TEST_BEGIN( ecdsa_misc_test ) + constexpr auto& curve = ack::ec_curve::secp256r1; + using point_type = std::remove_cvref_t::point_type; + using int_type = std::remove_cvref_t::int_type; + + constexpr auto q = curve.make_point( + "e424dc61d4bb3cb7ef4344a7f8957a0c5134e16f7a67c074f82e6e12f49abf3c", + "970eed7aa2bc48651545949de1dddaf0127e5965ac85d1243d6f60e7dfaee927" + ); + + constexpr auto h = from_hex( "d1b8ef21eb4182ee270638061063a3f3c16c114e33937f69fb232cc833965a94" ); + auto md = hash256( h ); + constexpr int_type r = "bf96b99aa49c705c910be33142017c642ff540c76349b9dab72f981fd9347f4f"; + constexpr int_type s = "17c55095819089c2e03b9cd415abdf12444e323075d98f31920b9e0f57ec871c"; + constexpr size_t recid = 1; + + // Misc ECDSA key recovery tests + { + // Test recovery succeeds + REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, r, s, recid, /*verify=*/true ), q ) + + // Test passing too big recid results in point at infinity + REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, r, s, /*recid=*/4, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, r, s, /*recid=*/4, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, r, s, /*recid=*/0xff, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, r, s, /*recid=*/0xff, /*verify=*/true ).is_identity(), true ) + + // Test passing too small and too big r + REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, int_type( 0 ), s, recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, int_type( 0 ), s, recid, /*verify=*/true ).is_identity(), true ) + + REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, curve.n, s, recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, curve.n, s, recid, /*verify=*/true ).is_identity(), true ) + + REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, curve.n + 1, s, recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, curve.n + 1, s, recid, /*verify=*/true ).is_identity(), true ) + + // Test passing too small and too big s + REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, r, int_type( 0 ), recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, r, int_type( 0 ), recid, /*verify=*/true ).is_identity(), true ) + + REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, r, curve.n, recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, r, curve.n, recid, /*verify=*/true ).is_identity(), true ) + + REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, r, curve.n + 1, recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, r, curve.n + 1, recid, /*verify=*/true ).is_identity(), true ) + + // Test passing too big r when recovering second key + REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, curve.p_minus_n, s, 2, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, curve.p_minus_n, s, 2, /*verify=*/true ).is_identity(), true ) + + REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, curve.p_minus_n + 1, s, 2, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, curve.p_minus_n + 1, s, 2, /*verify=*/true ).is_identity(), true ) + } + + // Misc ECDSA sigver tests + { + // Test verification ECDSA signature succeeds + REQUIRE_EQUAL( ecdsa_verify( q, h, r, s ), true ) + REQUIRE_EQUAL( ecdsa_verify( q, md, r, s ), true ) + assert_ecdsa( q, h, r, s, + "ECDSA signature verification failed" + ); + assert_ecdsa( q, md, r, s, + "ECDSA signature verification failed" + ); + + // Test verification fails when passing identity q + REQUIRE_EQUAL( ecdsa_verify( point_type{}, h, r, s ), false ) + REQUIRE_EQUAL( ecdsa_verify( point_type{}, md, r, s ), false ) + REQUIRE_ASSERT( "ECDSA signature verification failed", [&]() { + assert_ecdsa( point_type{}, h, r, s, + "ECDSA signature verification failed" + ); + }) + REQUIRE_ASSERT( "ECDSA signature verification failed", [&]() { + assert_ecdsa( point_type{}, md, r, s, + "ECDSA signature verification failed" + ); + }) + + // Test passing too small and too big r + REQUIRE_EQUAL( ecdsa_verify( q, h, int_type( 0 ), s ), false ) + REQUIRE_EQUAL( ecdsa_verify( q, md, int_type( 0 ), s ), false ) + REQUIRE_ASSERT( "ECDSA signature verification failed", [&]() { + assert_ecdsa( q, h, int_type( 0 ), s, + "ECDSA signature verification failed" + ); + }) + REQUIRE_ASSERT( "ECDSA signature verification failed", [&]() { + assert_ecdsa( q, md, int_type( 0 ), s, + "ECDSA signature verification failed" + ); + }) + + REQUIRE_EQUAL( ecdsa_verify( q, h, curve.n, s ), false ) + REQUIRE_EQUAL( ecdsa_verify( q, md, curve.n, s ), false ) + REQUIRE_ASSERT( "ECDSA signature verification failed", [&]() { + assert_ecdsa( q, h, curve.n, s, + "ECDSA signature verification failed" + ); + }) + REQUIRE_ASSERT( "ECDSA signature verification failed", [&]() { + assert_ecdsa( q, md, curve.n, s, + "ECDSA signature verification failed" + ); + }) + + REQUIRE_EQUAL( ecdsa_verify( q, h, curve.n + 1, s ), false ) + REQUIRE_EQUAL( ecdsa_verify( q, md, curve.n + 1, s ), false ) + REQUIRE_ASSERT( "ECDSA signature verification failed", [&]() { + assert_ecdsa( q, h, curve.n + 1, s, + "ECDSA signature verification failed" + ); + }) + REQUIRE_ASSERT( "ECDSA signature verification failed", [&]() { + assert_ecdsa( q, md, curve.n + 1, s, + "ECDSA signature verification failed" + ); + }) + + // Test passing too small and too big s + REQUIRE_EQUAL( ecdsa_verify( q, h, r, int_type( 0 ) ), false ) + REQUIRE_EQUAL( ecdsa_verify( q, md, r, int_type( 0 ) ), false ) + REQUIRE_ASSERT( "ECDSA signature verification failed", [&]() { + assert_ecdsa( q, h, r, int_type( 0 ), + "ECDSA signature verification failed" + ); + }) + REQUIRE_ASSERT( "ECDSA signature verification failed", [&]() { + assert_ecdsa( q, md, r, int_type( 0 ), + "ECDSA signature verification failed" + ); + }) + + REQUIRE_EQUAL( ecdsa_verify( q, h, r, curve.n ), false ) + REQUIRE_EQUAL( ecdsa_verify( q, md, r, curve.n ), false ) + REQUIRE_ASSERT( "ECDSA signature verification failed", [&]() { + assert_ecdsa( q, h, r, curve.n, + "ECDSA signature verification failed" + ); + }) + REQUIRE_ASSERT( "ECDSA signature verification failed", [&]() { + assert_ecdsa( q, md, r, curve.n, + "ECDSA signature verification failed" + ); + }) + + REQUIRE_EQUAL( ecdsa_verify( q, h, r, curve.n + 1 ), false ) + REQUIRE_EQUAL( ecdsa_verify( q, md, r, curve.n + 1 ), false ) + REQUIRE_ASSERT( "ECDSA signature verification failed", [&]() { + assert_ecdsa( q, h, r, curve.n + 1, + "ECDSA signature verification failed" + ); + }) + REQUIRE_ASSERT( "ECDSA signature verification failed", [&]() { + assert_ecdsa( q, md, r, curve.n + 1, + "ECDSA signature verification failed" + ); + }) + } + EOSIO_TEST_END +} \ No newline at end of file diff --git a/tests/include/ack/tests/ecdsa_test.hpp b/tests/include/ack/tests/ecdsa_test.hpp index dd6d317..5893776 100644 --- a/tests/include/ack/tests/ecdsa_test.hpp +++ b/tests/include/ack/tests/ecdsa_test.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -14,6 +15,7 @@ namespace ack::tests { EOSIO_TEST_BEGIN( ecdsa_test ) + EOSIO_TEST( ecdsa_misc_test ) EOSIO_TEST( ecdsa_brainpoolP256r1_test ) EOSIO_TEST( ecdsa_brainpoolP320r1_test ) EOSIO_TEST( ecdsa_brainpoolP384r1_test ) diff --git a/tests/include/ack/tests/ecdsa_test_utils.hpp b/tests/include/ack/tests/ecdsa_test_utils.hpp index 253128f..595db48 100644 --- a/tests/include/ack/tests/ecdsa_test_utils.hpp +++ b/tests/include/ack/tests/ecdsa_test_utils.hpp @@ -35,6 +35,18 @@ namespace ack::tests { "ECDSA signature verification failed" ); }) + + // test recovery + bool recovered = false; + for (std::size_t i = 0; i < 4; i ++) { + if ( ecdsa_recover( q.curve(), hb, r, s, i, /*verify=*/true ) == q ) { + REQUIRE_EQUAL( ecdsa_recover( q.curve(), digest, r, s, i, /*verify=*/true ), q ) + recovered = true; + break; + } + } + + REQUIRE_EQUAL( recovered, true ) } else { REQUIRE_ASSERT( "ECDSA signature verification failed", [&]() { From 5b4d0d720238945cd4057752770c0a109dbe6b76 Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Sat, 23 Dec 2023 04:49:53 +0100 Subject: [PATCH 11/18] [Example] Add actions for new elliptic curves --- examples/helloack/bin/helloack.abi | 248 ++++++++++++++++++++++--- examples/helloack/bin/helloack.wasm | Bin 278114 -> 329320 bytes examples/helloack/include/bt.hpp | 138 +++++++++++++- examples/helloack/include/helloack.hpp | 110 ++++++++++- examples/helloack/src/helloack.cpp | 120 ++++++++++++ 5 files changed, 584 insertions(+), 32 deletions(-) diff --git a/examples/helloack/bin/helloack.abi b/examples/helloack/bin/helloack.abi index bc60aae..a4dfce5 100644 --- a/examples/helloack/bin/helloack.abi +++ b/examples/helloack/bin/helloack.abi @@ -12,6 +12,26 @@ } ], "structs": [ + { + "name": "bt_ecc_brainpoolP320r1_sha384", + "base": "", + "fields": [] + }, + { + "name": "bt_ecc_brainpoolP256r1_sha256", + "base": "", + "fields": [] + }, + { + "name": "bt_ecc_brainpoolP384r1_sha384", + "base": "", + "fields": [] + }, + { + "name": "bt_ecc_brainpoolP521r1_sha512", + "base": "", + "fields": [] + }, { "name": "bt_ecc_secp256k1_sha256", "base": "", @@ -22,6 +42,16 @@ "base": "", "fields": [] }, + { + "name": "bt_ecc_secp384r1_sha384", + "base": "", + "fields": [] + }, + { + "name": "bt_ecc_secp521r1_sha512", + "base": "", + "fields": [] + }, { "name": "bt_rsa_1024_sha1", "base": "", @@ -67,6 +97,110 @@ "base": "", "fields": [] }, + { + "name": "check_ecdsa_brainpoolP256_sha256", + "base": "", + "fields": [ + { + "name": "qx", + "type": "bytes_view" + }, + { + "name": "qy", + "type": "bytes_view" + }, + { + "name": "msg", + "type": "bytes_view" + }, + { + "name": "r", + "type": "bytes_view" + }, + { + "name": "s", + "type": "bytes_view" + } + ] + }, + { + "name": "check_ecdsa_brainpoolP320_sha384", + "base": "", + "fields": [ + { + "name": "qx", + "type": "bytes_view" + }, + { + "name": "qy", + "type": "bytes_view" + }, + { + "name": "msg", + "type": "bytes_view" + }, + { + "name": "r", + "type": "bytes_view" + }, + { + "name": "s", + "type": "bytes_view" + } + ] + }, + { + "name": "check_ecdsa_brainpoolP384_sha384", + "base": "", + "fields": [ + { + "name": "qx", + "type": "bytes_view" + }, + { + "name": "qy", + "type": "bytes_view" + }, + { + "name": "msg", + "type": "bytes_view" + }, + { + "name": "r", + "type": "bytes_view" + }, + { + "name": "s", + "type": "bytes_view" + } + ] + }, + { + "name": "check_ecdsa_brainpoolP512_sha512", + "base": "", + "fields": [ + { + "name": "qx", + "type": "bytes_view" + }, + { + "name": "qy", + "type": "bytes_view" + }, + { + "name": "msg", + "type": "bytes_view" + }, + { + "name": "r", + "type": "bytes_view" + }, + { + "name": "s", + "type": "bytes_view" + } + ] + }, { "name": "check_ecdsa_secp256k1_sha256", "base": "", @@ -120,43 +254,59 @@ ] }, { - "name": "check_rsa_pss_sha1", + "name": "check_ecdsa_secp384r1_sha384", "base": "", "fields": [ { - "name": "pubkey", - "type": "rsa_pss_public_key_view" + "name": "qx", + "type": "bytes_view" + }, + { + "name": "qy", + "type": "bytes_view" }, { "name": "msg", "type": "bytes_view" }, { - "name": "sig", + "name": "r", + "type": "bytes_view" + }, + { + "name": "s", "type": "bytes_view" } ] }, { - "name": "check_rsa_pss_sha256", + "name": "check_ecdsa_secp521r1_sha512", "base": "", "fields": [ { - "name": "pubkey", - "type": "rsa_pss_public_key_view" + "name": "qx", + "type": "bytes_view" + }, + { + "name": "qy", + "type": "bytes_view" }, { "name": "msg", "type": "bytes_view" }, { - "name": "sig", + "name": "r", + "type": "bytes_view" + }, + { + "name": "s", "type": "bytes_view" } ] }, { - "name": "check_rsa_pss_sha384", + "name": "check_rsa_pss_sha1", "base": "", "fields": [ { @@ -174,7 +324,7 @@ ] }, { - "name": "check_rsa_pss_sha512", + "name": "check_rsa_pss_sha256", "base": "", "fields": [ { @@ -192,12 +342,12 @@ ] }, { - "name": "check_rsa_sha1", + "name": "check_rsa_pss_sha512", "base": "", "fields": [ { "name": "pubkey", - "type": "rsa_public_key_view" + "type": "rsa_pss_public_key_view" }, { "name": "msg", @@ -210,7 +360,7 @@ ] }, { - "name": "check_rsa_sha256", + "name": "check_rsa_sha1", "base": "", "fields": [ { @@ -228,7 +378,7 @@ ] }, { - "name": "check_rsa_sha384", + "name": "check_rsa_sha256", "base": "", "fields": [ { @@ -297,6 +447,26 @@ } ], "actions": [ + { + "name": "bteccbr1", + "type": "bt_ecc_brainpoolP256r1_sha256", + "ricardian_contract": "" + }, + { + "name": "bteccbr13", + "type": "bt_ecc_brainpoolP384r1_sha384", + "ricardian_contract": "" + }, + { + "name": "bteccbr132", + "type": "bt_ecc_brainpoolP320r1_sha384", + "ricardian_contract": "" + }, + { + "name": "bteccbr15", + "type": "bt_ecc_brainpoolP521r1_sha512", + "ricardian_contract": "" + }, { "name": "btecck1", "type": "bt_ecc_secp256k1_sha256", @@ -307,6 +477,16 @@ "type": "bt_ecc_secp256r1_sha256", "ricardian_contract": "" }, + { + "name": "bteccr13", + "type": "bt_ecc_secp384r1_sha384", + "ricardian_contract": "" + }, + { + "name": "bteccr15", + "type": "bt_ecc_secp521r1_sha512", + "ricardian_contract": "" + }, { "name": "btrsa1ksha1", "type": "bt_rsa_1024_sha1", @@ -352,6 +532,26 @@ "type": "bt_rsa_pss_4096_sha256", "ricardian_contract": "" }, + { + "name": "ecdsabr1", + "type": "check_ecdsa_brainpoolP256_sha256", + "ricardian_contract": "" + }, + { + "name": "ecdsabr13", + "type": "check_ecdsa_brainpoolP384_sha384", + "ricardian_contract": "" + }, + { + "name": "ecdsabr132", + "type": "check_ecdsa_brainpoolP320_sha384", + "ricardian_contract": "" + }, + { + "name": "ecdsabr15", + "type": "check_ecdsa_brainpoolP512_sha512", + "ricardian_contract": "" + }, { "name": "ecdsak1", "type": "check_ecdsa_secp256k1_sha256", @@ -362,6 +562,16 @@ "type": "check_ecdsa_secp256r1_sha256", "ricardian_contract": "" }, + { + "name": "ecdsar13", + "type": "check_ecdsa_secp384r1_sha384", + "ricardian_contract": "" + }, + { + "name": "ecdsar15", + "type": "check_ecdsa_secp521r1_sha512", + "ricardian_contract": "" + }, { "name": "rsapsssha1", "type": "check_rsa_pss_sha1", @@ -372,11 +582,6 @@ "type": "check_rsa_pss_sha256", "ricardian_contract": "" }, - { - "name": "rsapsssha34", - "type": "check_rsa_pss_sha384", - "ricardian_contract": "" - }, { "name": "rsapsssha512", "type": "check_rsa_pss_sha512", @@ -392,11 +597,6 @@ "type": "check_rsa_sha256", "ricardian_contract": "" }, - { - "name": "rsasha34", - "type": "check_rsa_sha384", - "ricardian_contract": "" - }, { "name": "rsasha512", "type": "check_rsa_sha512", diff --git a/examples/helloack/bin/helloack.wasm b/examples/helloack/bin/helloack.wasm index deea2a719cdc5081112e4f3abc1580e0b326c5c3..b20566b459e36d5cb3de9da30b76dc8413401dc6 100644 GIT binary patch literal 329320 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�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Μ~1P*RBE#aVkp_&IQy((j8-b5Usk{Uogn7NjKlVVXz@Mb6cjd%Y1proJN12JzX39)e0Tsc>hq-N{D)dN6%f;`0tiR@u z&hm)zxXbpmiBC_&N?Sa^1z%c1aKU%8Zxr|Eq#;

3lO&Wq(;tR@v)BqEx0YV!M!6)ZJ))4O3&4dSt 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 literal 278114 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::point_type; + using int_type = std::remove_cvref_t::int_type; + + static constexpr auto pub_point = curve.make_point( + "019a2d9637743a63ddaefdbca0ee229a163b809b9b145e5313bbeb8defeab9d6", + "548caf89bf5ba49499404145651234336401b9b2843a579ed152e090f11b9e59" + ); + + static constexpr auto h = from_hex( "bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023" ); + static constexpr int_type r = "0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f"; + static constexpr int_type s = "426e857aad3ff7aa96e4d200c03b45f1846a36d089ee3917768ca1a0d6d4da6e"; + static constexpr size_t recid = 0; +}; + +struct brainpoolP320r1_sha384_tv { + // Google's Project Wycheproof + //https://github.com/google/wycheproof/blob/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_brainpoolP320r1_sha384_p1363_test.json + + constexpr static auto& curve = ack::ec_curve::brainpoolP320r1; + using point_type = std::remove_cvref_t::point_type; + using int_type = std::remove_cvref_t::int_type; + + static constexpr auto pub_point = curve.make_point( + "0fcc8860cb26e262ca8b4ecb9c52f78d82a10a1d30dd0c8ecd7584ce80dbb75c488a062b64375500", + "1f27e676c26cd3488c1ef4ec3edd88cf8af78daf9036724b57e66da02cf7c676a53664becdfedc3b" + ); + + static constexpr auto h = from_hex( "f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace" ); + static constexpr int_type r = "85b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e"; + static constexpr int_type s = "833d6661b0576d61a80ffe4d3271c43b2a56c14b3bd90305923ccdcf7b3d988c07ebb1c4cc67381c"; + static constexpr size_t recid = 1; +}; + +struct brainpoolP384r1_sha384_tv { + // Google's Project Wycheproof + //https://github.com/google/wycheproof/blob/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_brainpoolP384r1_sha384_p1363_test.json + + constexpr static auto& curve = ack::ec_curve::brainpoolP384r1; + using point_type = std::remove_cvref_t::point_type; + using int_type = std::remove_cvref_t::int_type; + + static constexpr auto pub_point = curve.make_point( + "192ed5ce547d2336911d3f6cecba227f08df077f6242a9147a914e854e6e32d325fd23ccc42921dc4a7e4c2eb71defd3", + "631e69079ba982e7a1cad0a39eff47fc6d6e3a280d081286b624886ba1f3069671ec1a29986d84fb79736d2799e6fc21" + ); + + static constexpr auto h = from_hex( "f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace" ); + static constexpr int_type r = "0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91"; + static constexpr int_type s = "83aa7ba485dc060df9922f9ccc5da29adb75d44671d18bad0636d2e09c5e2f95e892a79b9fd3b37e1f798b157b567a24"; + static constexpr size_t recid = 0; +}; + +struct brainpoolP512r1_sha512_tv { + // Google's Project Wycheproof + //https://github.com/google/wycheproof/blob/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdsa_brainpoolP512r1_sha512_p1363_test.json + + constexpr static auto& curve = ack::ec_curve::brainpoolP512r1; + using point_type = std::remove_cvref_t::point_type; + using int_type = std::remove_cvref_t::int_type; + + static constexpr auto pub_point = curve.make_point( + "67cea1bedf84cbdcba69a05bb2ce3a2d1c9d911d236c480929a16ad697b45a6ca127079fe8d7868671e28ef33bdf9319e2e51c84b190ac5c91b51baf0a980ba5", + "00a7e79006194b5378f65cbe625ef2c47c64e56040d873b995b5b1ebaa4a6ce971da164391ff619af3bcfc71c5e1ad27ee0e859c2943e2de8ef7c43d3c976e9b" + ); + + static constexpr auto h = from_hex( "43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc" ); + static constexpr int_type r = "0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7"; + static constexpr int_type s = "44b42304e693796618d090dbcb2a2551c3cb78534611e61fd9d1a5c0938b5b8ec6ed53d2d28999eabbd8e7792d167fcf582492403a6a0f7cc94c73a28fb76b71"; + static constexpr size_t recid = 0; +}; + struct secp256k1_sha256_tv { // Test vector from Google's Wycheproof RSA signature verification tests. @@ -619,7 +695,7 @@ struct secp256k1_sha256_tv constexpr static auto& curve = ack::ec_curve::secp256k1; using point_type = std::remove_cvref_t::point_type; - using int_type = std::remove_cvref_t::int_type; + using int_type = std::remove_cvref_t::int_type; static constexpr auto pub_point = curve.make_point( "00b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6f", @@ -627,9 +703,10 @@ struct secp256k1_sha256_tv ); // special case hash - static constexpr auto h = from_hex( "9b6cd3b812610000000026941a0f0bb53255ea4c9fd0cb3426e3a54b9fc6965c" ); - static constexpr int_type r = "2bdea41cda63a2d14bf47353bd20880a690901de7cd6e3cc6d8ed5ba0cdb1091"; - static constexpr int_type s = "c31599433036064073835b1e3eba8335a650c8fd786f94fe235ad7d41dc94c7a"; + static constexpr auto h = from_hex( "9b6cd3b812610000000026941a0f0bb53255ea4c9fd0cb3426e3a54b9fc6965c" ); + static constexpr int_type r = "2bdea41cda63a2d14bf47353bd20880a690901de7cd6e3cc6d8ed5ba0cdb1091"; + static constexpr int_type s = "c31599433036064073835b1e3eba8335a650c8fd786f94fe235ad7d41dc94c7a"; + static constexpr size_t recid = 0; }; struct secp256r1_sha256_tv { @@ -649,7 +726,54 @@ struct secp256r1_sha256_tv { "970eed7aa2bc48651545949de1dddaf0127e5965ac85d1243d6f60e7dfaee927" ); - static constexpr auto h = from_hex( "d1b8ef21eb4182ee270638061063a3f3c16c114e33937f69fb232cc833965a94" ); - static constexpr int_type r = "bf96b99aa49c705c910be33142017c642ff540c76349b9dab72f981fd9347f4f"; - static constexpr int_type s = "17c55095819089c2e03b9cd415abdf12444e323075d98f31920b9e0f57ec871c"; + static constexpr auto h = from_hex( "d1b8ef21eb4182ee270638061063a3f3c16c114e33937f69fb232cc833965a94" ); + static constexpr int_type r = "bf96b99aa49c705c910be33142017c642ff540c76349b9dab72f981fd9347f4f"; + static constexpr int_type s = "17c55095819089c2e03b9cd415abdf12444e323075d98f31920b9e0f57ec871c"; + static constexpr size_t recid = 1; +}; + +struct secp384r1_sha384_tv { + // NIST FIPS 186-4 test vectors + // https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program/digital-signatures + // CAVS 11.0 + // "SigVer" information + // Curves/SHAs selected: P-384,SHA-384 + // Generated on Wed Mar 16 16:16:55 2011 + + constexpr static auto& curve = ack::ec_curve::secp384r1; + using point_type = std::remove_cvref_t::point_type; + using int_type = std::remove_cvref_t::int_type; + + static constexpr auto pub_point = curve.make_point( + "cb908b1fd516a57b8ee1e14383579b33cb154fece20c5035e2b3765195d1951d75bd78fb23e00fef37d7d064fd9af144", + "cd99c46b5857401ddcff2cf7cf822121faf1cbad9a011bed8c551f6f59b2c360f79bfbe32adbcaa09583bdfdf7c374bb" + ); + + static constexpr auto h = from_hex( "965b83f5d34f7443eb88e78fcc23479156c9cb0080dd68334dac0ad33ba8c774100e440063db28b40b51ac37705d4d70" ); + static constexpr int_type r = "33f64fb65cd6a8918523f23aea0bbcf56bba1daca7aff817c8791dc92428d605ac629de2e847d43cee55ba9e4a0e83ba"; + static constexpr int_type s = "4428bb478a43ac73ecd6de51ddf7c28ff3c2441625a081714337dd44fea8011bae71959a10947b6ea33f77e128d3c6ae"; + static constexpr size_t recid = 0; +}; + +struct secp521r1_sha512_tv { + // NIST FIPS 186-4 test vectors + // https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program/digital-signatures + // CAVS 11.0 + // "SigVer" information + // Curves/SHAs selected: P-521,SHA-512 + // Generated on Wed Mar 16 16:16:55 2011 + + constexpr static auto& curve = ack::ec_curve::secp521r1; + using point_type = std::remove_cvref_t::point_type; + using int_type = std::remove_cvref_t::int_type; + + static constexpr auto pub_point = curve.make_point( + "153eb2be05438e5c1effb41b413efc2843b927cbf19f0bc9cc14b693eee26394a0d8880dc946a06656bcd09871544a5f15c7a1fa68e00cdc728c7cfb9c448034867", + "143ae8eecbce8fcf6b16e6159b2970a9ceb32c17c1d878c09317311b7519ed5ece3374e7929f338ddd0ec0522d81f2fa4fa47033ef0c0872dc049bb89233eef9bc1" + ); + + static constexpr auto h = from_hex( "97ff5a81fc88f7ddd3bc58154ffd2695912fe50ce7c63b62bd798fb673c6aa49f54bc7301fb7bddc6edc51b7e0d0b4dec9f80851fff02a33671ad9a406bbabe5" ); + static constexpr int_type r = "0dd633947446d0d51a96a0173c01125858abb2bece670af922a92dedcec067136c1fa92e5fa73d7116ac9c1a42b9cb642e4ac19310b049e48c53011ffc6e7461c36"; + static constexpr int_type s = "0efbdc6a414bb8d663bb5cdb7c586bccfe7589049076f98cee82cdb5d203fddb2e0ffb77954959dfa5ed0de850e42a86f5a63c5a6592e9b9b8bd1b40557b9cd0cc0"; + static constexpr size_t recid = 1; }; diff --git a/examples/helloack/include/helloack.hpp b/examples/helloack/include/helloack.hpp index 2d877a2..49ab684 100644 --- a/examples/helloack/include/helloack.hpp +++ b/examples/helloack/include/helloack.hpp @@ -7,7 +7,55 @@ struct [[eosio::contract]] helloack : public eosio::contract { using eosio::contract::contract; /** - * Action verifies sec256k1 ECDSA-SHA256 signature. + * Action verifies brainpoolP256r1 ECDSA-SHA256 signature. + * Action fails if signature is invalid + * @param qx - public key x coordinate of public key point + * @param qy - public key y coordinate of public key point + * @param msg - signed message + * @param r - signature r value + * @param s - signature s value + */ + [[eosio::action("ecdsabr1"), eosio::read_only]] + void check_ecdsa_brainpoolP256_sha256(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s); + + /** + * Action verifies brainpoolP320r1 ECDSA-SHA384 signature. + * Action fails if signature is invalid + * @param qx - public key x coordinate of public key point + * @param qy - public key y coordinate of public key point + * @param msg - signed message + * @param r - signature r value + * @param s - signature s value + */ + [[eosio::action("ecdsabr132"), eosio::read_only]] + void check_ecdsa_brainpoolP320_sha384(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s); + + /** + * Action verifies brainpoolP384r1 ECDSA-SHA384 signature. + * Action fails if signature is invalid + * @param qx - public key x coordinate of public key point + * @param qy - public key y coordinate of public key point + * @param msg - signed message + * @param r - signature r value + * @param s - signature s value + */ + [[eosio::action("ecdsabr13"), eosio::read_only]] + void check_ecdsa_brainpoolP384_sha384(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s); + + /** + * Action verifies brainpoolP512r1 ECDSA-SHA512 signature. + * Action fails if signature is invalid + * @param qx - public key x coordinate of public key point + * @param qy - public key y coordinate of public key point + * @param msg - signed message + * @param r - signature r value + * @param s - signature s value + */ + [[eosio::action("ecdsabr15"), eosio::read_only]] + void check_ecdsa_brainpoolP512_sha512(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s); + + /** + * Action verifies secp256k1 ECDSA-SHA256 signature. * Action fails if signature is invalid * @param qx - public key x coordinate of public key point * @param qy - public key y coordinate of public key point @@ -30,6 +78,30 @@ struct [[eosio::contract]] helloack : public eosio::contract { [[eosio::action("ecdsar1"), eosio::read_only]] void check_ecdsa_secp256r1_sha256(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s); + /** + * Action verifies secp384r1 ECDSA-SHA384 signature. + * Action fails if signature is invalid + * @param qx - public key x coordinate of public key point + * @param qy - public key y coordinate of public key point + * @param msg - signed message + * @param r - signature r value + * @param s - signature s value + */ + [[eosio::action("ecdsar13"), eosio::read_only]] + void check_ecdsa_secp384r1_sha384(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s); + + /** + * Action verifies secp512r1 ECDSA-SHA512 signature. + * Action fails if signature is invalid + * @param qx - public key x coordinate of public key point + * @param qy - public key y coordinate of public key point + * @param msg - signed message + * @param r - signature r value + * @param s - signature s value + */ + [[eosio::action("ecdsar15"), eosio::read_only]] + void check_ecdsa_secp521r1_sha512(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s); + /** * Action verifies RSA PKCS v1.5 SHA-1 signature. * Action fails if signature is invalid @@ -164,6 +236,30 @@ struct [[eosio::contract]] helloack : public eosio::contract { [[eosio::action("btrsa2ksha512"), eosio::read_only]] void bt_rsa_2048_sha512(); + /** + * Benchmark action for testing verification of 1 brainpoolP256r1 ECDSA signature. + */ + [[eosio::action("bteccbr1"), eosio::read_only]] + void bt_ecc_brainpoolP256r1_sha256(); + + /** + * Benchmark action for testing verification of 1 brainpoolP320r1 ECDSA signature. + */ + [[eosio::action("bteccbr132"), eosio::read_only]] + void bt_ecc_brainpoolP320r1_sha384(); + + /** + * Benchmark action for testing verification of 1 brainpoolP384r1 ECDSA signature. + */ + [[eosio::action("bteccbr13"), eosio::read_only]] + void bt_ecc_brainpoolP384r1_sha384(); + + /** + * Benchmark action for testing verification of 1 brainpoolP512r1 ECDSA signature. + */ + [[eosio::action("bteccbr15"), eosio::read_only]] + void bt_ecc_brainpoolP521r1_sha512(); + /** * Benchmark action for testing verification of 1 secp256k1 ECDSA signature. */ @@ -175,4 +271,16 @@ struct [[eosio::contract]] helloack : public eosio::contract { */ [[eosio::action("bteccr1"), eosio::read_only]] void bt_ecc_secp256r1_sha256(); + + /** + * Benchmark action for testing verification of 1 secp384r1 ECDSA signature. + */ + [[eosio::action("bteccr13"), eosio::read_only]] + void bt_ecc_secp384r1_sha384(); + + /** + * Benchmark action for testing verification of 1 secp384r1 ECDSA signature. + */ + [[eosio::action("bteccr15"), eosio::read_only]] + void bt_ecc_secp521r1_sha512(); }; diff --git a/examples/helloack/src/helloack.cpp b/examples/helloack/src/helloack.cpp index 5bdf146..bafe70a 100644 --- a/examples/helloack/src/helloack.cpp +++ b/examples/helloack/src/helloack.cpp @@ -13,6 +13,50 @@ using namespace ack::ec_curve; +[[eosio::action("ecdsabr1"), eosio::read_only]] +void helloack::check_ecdsa_brainpoolP256_sha256(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s) +{ + using int_type = typename decltype(brainpoolP256r1)::int_type; + const auto pub_point = brainpoolP256r1.make_point( qx, qy ); + const auto h = eosio::sha256( reinterpret_cast( msg.data() ), msg.size() ); + assert_ecdsa( pub_point, h, int_type( r ), int_type( s ), + "ECDSA brainpoolP256r1 signature verification failed!" + ); +} + +[[eosio::action("ecdsabr132"), eosio::read_only]] +void helloack::check_ecdsa_brainpoolP320_sha384(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s) +{ + using int_type = typename decltype(brainpoolP320r1)::int_type; + const auto pub_point = brainpoolP320r1.make_point( qx, qy ); + const auto h = sha384( msg ); + assert_ecdsa( pub_point, h, int_type( r ), int_type( s ), + "ECDSA brainpoolP320r1 signature verification failed!" + ); +} + +[[eosio::action("ecdsabr13"), eosio::read_only]] +void helloack::check_ecdsa_brainpoolP384_sha384(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s) +{ + using int_type = typename decltype(brainpoolP384r1)::int_type; + const auto pub_point = brainpoolP384r1.make_point( qx, qy ); + const auto h = sha384( msg ); + assert_ecdsa( pub_point, h, int_type( r ), int_type( s ), + "ECDSA brainpoolP384r1 signature verification failed!" + ); +} + +[[eosio::action("ecdsabr15"), eosio::read_only]] +void helloack::check_ecdsa_brainpoolP512_sha512(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s) +{ + using int_type = typename decltype(brainpoolP512r1)::int_type; + const auto pub_point = brainpoolP512r1.make_point( qx, qy ); + const auto h = eosio::sha512( reinterpret_cast( msg.data() ), msg.size() ); + assert_ecdsa( pub_point, h, int_type( r ), int_type( s ), + "ECDSA brainpoolP512r1 signature verification failed!" + ); +} + [[eosio::action("ecdsak1"), eosio::read_only]] void helloack::check_ecdsa_secp256k1_sha256(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s) { @@ -35,6 +79,28 @@ void helloack::check_ecdsa_secp256r1_sha256(bytes_view qx, bytes_view qy, bytes_ ); } +[[eosio::action("ecdsar13"), eosio::read_only]] +void helloack::check_ecdsa_secp384r1_sha384(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s) +{ + using int_type = typename decltype(secp384r1)::int_type; + const auto pub_point = secp384r1.make_point( qx, qy ); + const auto h = sha384( msg ); + assert_ecdsa( pub_point, h, int_type( r ), int_type( s ), + "ECDSA secp384r1 signature verification failed!" + ); +} + +[[eosio::action("ecdsar15"), eosio::read_only]] +void helloack::check_ecdsa_secp521r1_sha512(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s) +{ + using int_type = typename decltype(secp521r1)::int_type; + const auto pub_point = secp521r1.make_point( qx, qy ); + const auto h = eosio::sha512( reinterpret_cast( msg.data() ), msg.size() ); + assert_ecdsa( pub_point, h, int_type( r ), int_type( s ), + "ECDSA secp521r1 signature verification failed!" + ); +} + [[eosio::action("rsasha1"), eosio::read_only]] void helloack::check_rsa_sha1(rsa_public_key_view pubkey, bytes_view msg, bytes_view sig) { @@ -188,6 +254,42 @@ void helloack::bt_rsa_2048_sha512() ); } +[[eosio::action("bteccbr1"), eosio::read_only]] +void helloack::bt_ecc_brainpoolP256r1_sha256() +{ + using tv = brainpoolP256r1_sha256_tv; + assert_ecdsa( tv::pub_point, tv::h, tv::r, tv::s, + "ECDSA brainpoolP256r1 signature verification failed!" + ); +} + +[[eosio::action("bteccbr132"), eosio::read_only]] +void helloack::bt_ecc_brainpoolP320r1_sha384() +{ + using tv = brainpoolP320r1_sha384_tv; + assert_ecdsa( tv::pub_point, tv::h, tv::r, tv::s, + "ECDSA brainpoolP320r1 signature verification failed!" + ); +} + +[[eosio::action("bteccbr13"), eosio::read_only]] +void helloack::bt_ecc_brainpoolP384r1_sha384() +{ + using tv = brainpoolP384r1_sha384_tv; + assert_ecdsa( tv::pub_point, tv::h, tv::r, tv::s, + "ECDSA brainpoolP384r1 signature verification failed!" + ); +} + +[[eosio::action("bteccbr15"), eosio::read_only]] +void helloack::bt_ecc_brainpoolP521r1_sha512() +{ + using tv = brainpoolP512r1_sha512_tv; + assert_ecdsa( tv::pub_point, tv::h, tv::r, tv::s, + "ECDSA brainpool512r1 signature verification failed!" + ); +} + [[eosio::action("btecck1"), eosio::read_only]] void helloack::bt_ecc_secp256k1_sha256() { @@ -205,3 +307,21 @@ void helloack::bt_ecc_secp256r1_sha256() "ECDSA secp256r1 signature verification failed!" ); } + +[[eosio::action("bteccr13"), eosio::read_only]] +void helloack::bt_ecc_secp384r1_sha384() +{ + using tv = secp384r1_sha384_tv; + assert_ecdsa( tv::pub_point, tv::h, tv::r, tv::s, + "ECDSA secp384r1 signature verification failed!" + ); +} + +[[eosio::action("bteccr15"), eosio::read_only]] +void helloack::bt_ecc_secp521r1_sha512() +{ + using tv = secp521r1_sha512_tv; + assert_ecdsa( tv::pub_point, tv::h, tv::r, tv::s, + "ECDSA secp384r1 signature verification failed!" + ); +} From 996194a443d7daa34f47b88b722834525fac64d8 Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Thu, 28 Dec 2023 22:20:13 +0100 Subject: [PATCH 12/18] Update GitHub Actions && Increase CTest timeout Changed github action OS to Ubuntu to 22.04. Increased CTest timeout to 50 minutes for the `ack_ecc_tests` test. --- .github/workflows/build.yml | 4 ++-- .github/workflows/tests.yml | 4 ++-- CMakeLists.txt | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 49241bc..0e1805d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,8 +15,8 @@ jobs: # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. # You can convert this to a matrix build if you need cross-platform coverage. # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix - name: 'Ubuntu 20.04 Build' - runs-on: ubuntu-20.04 + name: 'Ubuntu 22.04 Build' + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index be0c109..7065623 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -15,8 +15,8 @@ jobs: # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. # You can convert this to a matrix build if you need cross-platform coverage. # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix - name: 'Ubuntu 20.04 Build' - runs-on: ubuntu-20.04 + name: 'Ubuntu 22.04 Build' + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c3d96e..867da4e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,6 +53,7 @@ if ( ACK_BUILD_TESTS ) add_test( ack_gen_tests ${CMAKE_BINARY_DIR}/tests/ack_gen_tests ) add_test( ack_rsa_tests ${CMAKE_BINARY_DIR}/tests/ack_rsa_tests ) add_test( ack_ecc_tests ${CMAKE_BINARY_DIR}/tests/ack_ecc_tests ) + set_tests_properties( ack_ecc_tests PROPERTIES TIMEOUT 3000 ) # 50 mins endif( ACK_BUILD_TESTS ) message( "No intrinsics................${ACK_NO_INTRINSICS}" ) From 098276ceac4279c88b44a2145c9c8cb8bde8a9e8 Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Fri, 29 Dec 2023 01:06:43 +0100 Subject: [PATCH 13/18] Fix moving y coord && Add tests for curve cached constants --- include/ack/ec.hpp | 24 +++++++++---------- .../ack/tests/ecdsa_brainpoolP256r1_test.hpp | 6 ++++- .../ack/tests/ecdsa_brainpoolP320r1_test.hpp | 6 ++++- .../ack/tests/ecdsa_brainpoolP384r1_test.hpp | 6 ++++- .../ack/tests/ecdsa_brainpoolP512r1_test.hpp | 6 ++++- .../ack/tests/ecdsa_secp256k1_test.hpp | 6 ++++- .../ack/tests/ecdsa_secp256r1_test.hpp | 6 ++++- .../ack/tests/ecdsa_secp384r1_test.hpp | 6 ++++- .../ack/tests/ecdsa_secp521r1_test.hpp | 6 ++++- 9 files changed, 52 insertions(+), 20 deletions(-) diff --git a/include/ack/ec.hpp b/include/ack/ec.hpp index 6568774..46c060f 100644 --- a/include/ack/ec.hpp +++ b/include/ack/ec.hpp @@ -1154,15 +1154,15 @@ namespace ack { // https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-add-1998-cmo-2 // note: faster than https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-add-2007-bl - const bool bZ1IsOne = p.z.is_one(); - const bool bZ2IsOne = q.z.is_one(); - if ( bZ1IsOne && bZ2IsOne ) { + const bool z1_is_one = p.z.is_one(); + const bool z2_is_one = q.z.is_one(); + if ( z1_is_one && z2_is_one ) { return add_z_1( p, q ); } - else if ( bZ1IsOne ) { + else if ( z1_is_one ) { return add_z2_1( q, p ); } - else if ( bZ2IsOne ) { + else if ( z2_is_one ) { return add_z2_1( p, q ); } return add_ne( p, q ); @@ -1189,16 +1189,16 @@ namespace ack { // note: this algo was measured to be the most efficient of them all. const auto M = [](const auto& p) { - const bool bZIsOne = p.z.is_one(); + const bool z_is_one = p.z.is_one(); if ( p.curve().a_is_zero ) { return 3 * p.x.sqr(); } else if ( p.curve().a_is_minus_3 ) { - const auto z2 = bZIsOne ? p.z : p.z.sqr(); + const auto z2 = z_is_one ? p.z : p.z.sqr(); return 3 * ( p.x - z2 ) * ( p.x + z2 ); } else { - const auto z4 = bZIsOne ? p.z : p.z.sqr().sqr(); + const auto z4 = z_is_one ? p.z : p.z.sqr().sqr(); return 3 * p.x.sqr() + p.curve().a * z4; } }( p ); @@ -1526,9 +1526,9 @@ namespace ack { const IntT n; // order of g const uint32_t h; // cofactor, i.e.: h = #E(Fp) / n // #E(Fp) - number of points on the curve - const bool a_is_minus_3; // cached a == p - 3 - const bool a_is_zero; // cached a == 0 - const IntT p_minus_n; // cached p - n; used for checking the maximum negative point coordinate + const bool a_is_minus_3; // cached constant a == p - 3 + const bool a_is_zero; // cached constant a == 0 + const IntT p_minus_n; // cached constant p - n; used for checking the maximum negative point coordinate /** * Creates a curve from the given parameters. @@ -1732,7 +1732,7 @@ namespace ack { if ( y.is_zero() ) { return PointT{}; } - return make_point( std::move( x ), y ); + return make_point( std::move( x ), std::move( y ) ); } /** diff --git a/tests/include/ack/tests/ecdsa_brainpoolP256r1_test.hpp b/tests/include/ack/tests/ecdsa_brainpoolP256r1_test.hpp index e0cf555..60d40df 100644 --- a/tests/include/ack/tests/ecdsa_brainpoolP256r1_test.hpp +++ b/tests/include/ack/tests/ecdsa_brainpoolP256r1_test.hpp @@ -28,7 +28,11 @@ namespace ack::tests { REQUIRE_EQUAL( brainpoolP256r1.g.y, "547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997" ) REQUIRE_EQUAL( brainpoolP256r1.n , "a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7" ) REQUIRE_EQUAL( brainpoolP256r1.h , 1 ) - REQUIRE_EQUAL( brainpoolP256r1.verify(), true ) + + REQUIRE_EQUAL( brainpoolP256r1.a_is_minus_3, false ) + REQUIRE_EQUAL( brainpoolP256r1.a_is_zero , false ) + REQUIRE_EQUAL( brainpoolP256r1.p_minus_n , "e2027b801fc479308ff5399a8825fcd0" ) + REQUIRE_EQUAL( brainpoolP256r1.verify() , true ) // Test vectors from Google's Wycheproof RSA signature verification tests. // Generated from: 'ecdsa_brainpoolP256r1_sha3_256_test.json' diff --git a/tests/include/ack/tests/ecdsa_brainpoolP320r1_test.hpp b/tests/include/ack/tests/ecdsa_brainpoolP320r1_test.hpp index 8fe1767..85ea79d 100644 --- a/tests/include/ack/tests/ecdsa_brainpoolP320r1_test.hpp +++ b/tests/include/ack/tests/ecdsa_brainpoolP320r1_test.hpp @@ -28,7 +28,11 @@ namespace ack::tests { REQUIRE_EQUAL( brainpoolP320r1.g.y, "14fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1" ) REQUIRE_EQUAL( brainpoolP320r1.n , "d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311" ) REQUIRE_EQUAL( brainpoolP320r1.h , 1 ) - REQUIRE_EQUAL( brainpoolP320r1.verify(), true ) + + REQUIRE_EQUAL( brainpoolP320r1.a_is_minus_3, false ) + REQUIRE_EQUAL( brainpoolP320r1.a_is_zero , false ) + REQUIRE_EQUAL( brainpoolP320r1.p_minus_n , "14064fb4c224a8b248a0d933f7642bd56aced9b16" ) + REQUIRE_EQUAL( brainpoolP320r1.verify() , true ) // Test vectors from Google's Wycheproof RSA signature verification tests. // Generated from: 'ecdsa_brainpoolP320r1_sha384_p1363_test.json' diff --git a/tests/include/ack/tests/ecdsa_brainpoolP384r1_test.hpp b/tests/include/ack/tests/ecdsa_brainpoolP384r1_test.hpp index 2e172b1..0feb12b 100644 --- a/tests/include/ack/tests/ecdsa_brainpoolP384r1_test.hpp +++ b/tests/include/ack/tests/ecdsa_brainpoolP384r1_test.hpp @@ -28,7 +28,11 @@ namespace ack::tests { REQUIRE_EQUAL( brainpoolP384r1.g.y, "8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315" ) REQUIRE_EQUAL( brainpoolP384r1.n , "8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565" ) REQUIRE_EQUAL( brainpoolP384r1.h , 1 ) - REQUIRE_EQUAL( brainpoolP384r1.verify(), true ) + + REQUIRE_EQUAL( brainpoolP384r1.a_is_minus_3, false ) + REQUIRE_EQUAL( brainpoolP384r1.a_is_zero , false ) + REQUIRE_EQUAL( brainpoolP384r1.p_minus_n , "f39b6bacd3b2eb7bdd98f07a249d57614bbece10480386ee" ) + REQUIRE_EQUAL( brainpoolP384r1.verify() , true ) // Test vectors from Google's Wycheproof RSA signature verification tests. // Generated from: 'ecdsa_brainpoolP384r1_sha3_384_test.json' diff --git a/tests/include/ack/tests/ecdsa_brainpoolP512r1_test.hpp b/tests/include/ack/tests/ecdsa_brainpoolP512r1_test.hpp index c2301ab..3a8c465 100644 --- a/tests/include/ack/tests/ecdsa_brainpoolP512r1_test.hpp +++ b/tests/include/ack/tests/ecdsa_brainpoolP512r1_test.hpp @@ -28,7 +28,11 @@ namespace ack::tests { REQUIRE_EQUAL( brainpoolP512r1.g.y, "7dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892" ) REQUIRE_EQUAL( brainpoolP512r1.n , "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069" ) REQUIRE_EQUAL( brainpoolP512r1.h , 1 ) - REQUIRE_EQUAL( brainpoolP512r1.verify(), true ) + + REQUIRE_EQUAL( brainpoolP512r1.a_is_minus_3, false ) + REQUIRE_EQUAL( brainpoolP512r1.a_is_zero , false ) + REQUIRE_EQUAL( brainpoolP512r1.p_minus_n , "1280f3ebf4f1d42296d47401166f7709f0ad02bae2524eba77322c9d3bb91488a" ) + REQUIRE_EQUAL( brainpoolP512r1.verify() , true ) // Test vectors from Google's Wycheproof RSA signature verification tests. // Generated from: 'ecdsa_brainpoolP512r1_sha3_512_test.json' diff --git a/tests/include/ack/tests/ecdsa_secp256k1_test.hpp b/tests/include/ack/tests/ecdsa_secp256k1_test.hpp index 997b4d2..26d27bf 100644 --- a/tests/include/ack/tests/ecdsa_secp256k1_test.hpp +++ b/tests/include/ack/tests/ecdsa_secp256k1_test.hpp @@ -26,7 +26,11 @@ namespace ack::tests { REQUIRE_EQUAL( secp256k1.g.y, "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8" ) REQUIRE_EQUAL( secp256k1.n , "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141" ) REQUIRE_EQUAL( secp256k1.h , 1 ) - REQUIRE_EQUAL( secp256k1.verify(), true ) + + REQUIRE_EQUAL( secp256k1.a_is_minus_3, false ) + REQUIRE_EQUAL( secp256k1.a_is_zero , true ) + REQUIRE_EQUAL( secp256k1.p_minus_n , "14551231950b75fc4402da1722fc9baee" ) + REQUIRE_EQUAL( secp256k1.verify() , true ) // Custom test vectors { diff --git a/tests/include/ack/tests/ecdsa_secp256r1_test.hpp b/tests/include/ack/tests/ecdsa_secp256r1_test.hpp index de6d452..0ca0cfa 100644 --- a/tests/include/ack/tests/ecdsa_secp256r1_test.hpp +++ b/tests/include/ack/tests/ecdsa_secp256r1_test.hpp @@ -26,7 +26,11 @@ namespace ack::tests { REQUIRE_EQUAL( secp256r1.g.y, "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5" ) REQUIRE_EQUAL( secp256r1.n , "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551" ) REQUIRE_EQUAL( secp256r1.h , 1 ) - REQUIRE_EQUAL( secp256r1.verify(), true ) + + REQUIRE_EQUAL( secp256r1.a_is_minus_3, true ) + REQUIRE_EQUAL( secp256r1.a_is_zero , false ) + REQUIRE_EQUAL( secp256r1.p_minus_n , "4319055358e8617b0c46353d039cdaae" ) + REQUIRE_EQUAL( secp256r1.verify() , true ) // Custom test vectors { diff --git a/tests/include/ack/tests/ecdsa_secp384r1_test.hpp b/tests/include/ack/tests/ecdsa_secp384r1_test.hpp index 2a4c8a3..051d10b 100644 --- a/tests/include/ack/tests/ecdsa_secp384r1_test.hpp +++ b/tests/include/ack/tests/ecdsa_secp384r1_test.hpp @@ -28,7 +28,11 @@ namespace ack::tests { REQUIRE_EQUAL( secp384r1.g.y, "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f" ) REQUIRE_EQUAL( secp384r1.n , "ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973" ) REQUIRE_EQUAL( secp384r1.h , 1 ) - REQUIRE_EQUAL( secp384r1.verify(), true ) + + REQUIRE_EQUAL( secp384r1.a_is_minus_3, true ) + REQUIRE_EQUAL( secp384r1.a_is_zero , false ) + REQUIRE_EQUAL( secp384r1.p_minus_n , "389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68c" ) + REQUIRE_EQUAL( secp384r1.verify() , true ) // NIST FIPS 186-4 test vectors // https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program/digital-signatures diff --git a/tests/include/ack/tests/ecdsa_secp521r1_test.hpp b/tests/include/ack/tests/ecdsa_secp521r1_test.hpp index 83a3176..75fdb10 100644 --- a/tests/include/ack/tests/ecdsa_secp521r1_test.hpp +++ b/tests/include/ack/tests/ecdsa_secp521r1_test.hpp @@ -28,7 +28,11 @@ namespace ack::tests { REQUIRE_EQUAL( secp521r1.g.y, "011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650" ) REQUIRE_EQUAL( secp521r1.n , "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409" ) REQUIRE_EQUAL( secp521r1.h , 1 ) - REQUIRE_EQUAL( secp521r1.verify(), true ) + + REQUIRE_EQUAL( secp521r1.a_is_minus_3, true ) + REQUIRE_EQUAL( secp521r1.a_is_zero , false ) + REQUIRE_EQUAL( secp521r1.p_minus_n , "5ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf6" ) + REQUIRE_EQUAL( secp521r1.verify() , true ) // NIST FIPS 186-4 test vectors // https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program/digital-signatures From 31d35ae79869a0ae751252a2d77886dfb1e2ec1d Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Fri, 29 Dec 2023 01:14:18 +0100 Subject: [PATCH 14/18] Fix vla size --- include/ack/bigint.hpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/include/ack/bigint.hpp b/include/ack/bigint.hpp index bcbd343..652639a 100644 --- a/include/ack/bigint.hpp +++ b/include/ack/bigint.hpp @@ -509,7 +509,7 @@ namespace ack { } else { //word_t* t = (word_t*)__builtin_alloca(sizeof(word_t) * yn); - word_t t[sizeof(word_t) * yn]; + word_t t[yn]; qv = x[yn - 1] / (yTop + 1); mul_word_n(t, y, qv, yn); sub(x, x, t); @@ -539,7 +539,7 @@ namespace ack { } //word_t* t = (word_t*)__builtin_alloca(sizeof(word_t) * yn); - word_t t[sizeof(word_t) * yn]; + word_t t[yn]; //word_t* t = (word_t*)alloca(sizeof(word_t) * yn); word_t rev = 0; // rev = M/2 M / yTop where M = 1 << word_bit_size @@ -640,11 +640,11 @@ namespace ack { const size_t shift = word_bit_size - 1 - yTopBit; if (shift) { //word_t* yShift = (word_t* )__builtin_alloca(sizeof(word_t) * yn); - word_t yShift[sizeof(word_t) * yn]; + word_t yShift[yn]; //word_t* yShift = (word_t* )alloca(sizeof(word_t) * yn); shl_n(yShift, y, shift, yn); //word_t* xx = (word_t*)__builtin_alloca(sizeof(word_t) * (xn + 1)); - word_t xx[sizeof(word_t) * (xn + 1)]; + word_t xx[xn + 1]; //word_t* xx = (word_t*)alloca(sizeof(word_t) * (xn + 1)); word_t v = shl_n(xx, x, shift, xn); if (v) { @@ -982,7 +982,7 @@ namespace ack { } //word_t* xx = (word_t*)__builtin_alloca(sizeof(word_t) * xn); - word_t xx[sizeof(word_t) * xn]; + word_t xx[xn]; detail::copy_n(xx, &x[0], xn); word_t* qq = q ? &q->buf_[0] : nullptr; @@ -1073,10 +1073,10 @@ namespace ack { constexpr size_t w = 4; // don't change constexpr size_t m = word_bit_size / w; - constexpr size_t tblSize = (1 << w) - 1; - bigint tbl[tblSize]; + constexpr size_t tbl_size = (1 << w) - 1; + bigint tbl[tbl_size]; tbl[0] = x; - for (size_t i = 1; i < tblSize; i++) { + for (size_t i = 1; i < tbl_size; i++) { if (!mul(tbl[i], tbl[i - 1], x)) { return false; } @@ -1100,7 +1100,7 @@ namespace ack { } } - const word_t idx = (v >> ((m - 1 - j) * w)) & tblSize; + const word_t idx = (v >> ((m - 1 - j) * w)) & tbl_size; if (idx) { if (!mul(z, z, tbl[idx - 1])) { return false; From 80ad5cdd5fa2097c08647dec37d31c5c230827a1 Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Fri, 29 Dec 2023 01:23:16 +0100 Subject: [PATCH 15/18] Fix pointer aliasing issue in modmul & modsqr --- include/ack/bigint.hpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/include/ack/bigint.hpp b/include/ack/bigint.hpp index 652639a..112f7e3 100644 --- a/include/ack/bigint.hpp +++ b/include/ack/bigint.hpp @@ -1022,7 +1022,10 @@ namespace ack { constexpr bool operator()(bigint& z, const bigint& x, const bigint& y) const { bool success = bigint::mul(z, x, y); - return success && bigint::mod(z, z, *pm); + bigint u; + success = success && bigint::mod(u, z, *pm); + z = std::move( u ); + return success; } }; @@ -1031,7 +1034,9 @@ namespace ack { constexpr bool operator()(bigint& y, const bigint& x) const { bool success = bigint::sqr(y, x); - success = success && bigint::mod(y, y, *pm); + bigint u; // storing result in temp var avoids pointer aliasing + success = success && bigint::mod(u, y, *pm); + y = std::move( u ); return success; } }; From 4cdabc0535a479e7d28d1d9043a32e31cefd7309 Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Fri, 29 Dec 2023 15:35:59 +0100 Subject: [PATCH 16/18] Fix `flexbuffer` copy/assignment & `clear` method Fixed freeing and deep copying `ddata_` from rhs, and fixed `clear` method to free `ddata_`. --- include/ack/bigint.hpp | 2 +- include/ack/buffer.hpp | 122 ++++++++++++++++++++++++++++++----------- include/ack/ec.hpp | 2 +- 3 files changed, 93 insertions(+), 33 deletions(-) diff --git a/include/ack/bigint.hpp b/include/ack/bigint.hpp index 112f7e3..8f27e9f 100644 --- a/include/ack/bigint.hpp +++ b/include/ack/bigint.hpp @@ -1282,7 +1282,7 @@ namespace ack { { if (&rhs != this) { - buf_ = std::move(rhs.buf_); + buf_ = std::move( rhs.buf_ ); size_ = rhs.size_; is_neg_ = rhs.is_neg_; } diff --git a/include/ack/buffer.hpp b/include/ack/buffer.hpp index 1f31c67..95ad4f6 100644 --- a/include/ack/buffer.hpp +++ b/include/ack/buffer.hpp @@ -70,13 +70,13 @@ namespace ack { public: using value_type = T; - constexpr fixed_buffer() = default; - constexpr fixed_buffer(const fixed_buffer& rhs) = default; - constexpr fixed_buffer(fixed_buffer&& rhs) = default; - constexpr fixed_buffer& operator=(const fixed_buffer& rhs) = default; - constexpr fixed_buffer& operator=(fixed_buffer&& rhs) = default; + constexpr fixed_buffer() noexcept = default; + constexpr fixed_buffer(const fixed_buffer& rhs) noexcept = default; + constexpr fixed_buffer(fixed_buffer&& rhs) noexcept = default; + constexpr fixed_buffer& operator=(const fixed_buffer& rhs) noexcept = default; + constexpr fixed_buffer& operator=(fixed_buffer&& rhs) noexcept = default; - constexpr bool resize(size_t n) + constexpr bool resize(size_t n) noexcept { if ( n > N ) { return false; @@ -85,12 +85,12 @@ namespace ack { return true; } - constexpr void clear() + constexpr void clear() noexcept { size_ = 0; } - constexpr T* data() + constexpr T* data() noexcept { return data_.data(); } @@ -100,17 +100,17 @@ namespace ack { return data_.data(); } - constexpr std::size_t size() const + constexpr std::size_t size() const noexcept { return size_; } - constexpr std::size_t max_size() const + constexpr std::size_t max_size() const noexcept { return N; } - constexpr void swap(fixed_buffer& rhs) + constexpr void swap(fixed_buffer& rhs) noexcept { std::swap( data_, rhs.data_ ); std::swap( size_, rhs.size_ ); @@ -138,6 +138,7 @@ namespace ack { * @warning if buffer is resized over the size of stack allocated memory (N) * data is re-allocated on the heap, and this data is never released * due to constexpr constrains which prohibits defining custom destructor. + * You have to manually call `clear` to free heap allocated memory. * The flexbuffer should be used only in short lived environments like WASM. */ template @@ -145,18 +146,71 @@ namespace ack { public: using value_type = T; - constexpr flexbuffer() = default; - constexpr flexbuffer(const flexbuffer& rhs) = default; - constexpr flexbuffer(flexbuffer&& rhs) = default; - constexpr flexbuffer& operator=(const flexbuffer& rhs) = default; - constexpr flexbuffer& operator=(flexbuffer&& rhs) = default; + constexpr flexbuffer() noexcept = default; + constexpr flexbuffer(const flexbuffer& rhs) + { + sdata_ = rhs.sdata_; + size_ = rhs.size_; + dsize_ = rhs.dsize_; + if ( !std::is_constant_evaluated() ) { + if ( rhs.ddata_ ) { + ddata_ = new T[dsize_]; + memcpy( ddata_, rhs.ddata_ , dsize_ * sizeof( T )); + } + } + } + + constexpr flexbuffer(flexbuffer&& rhs) noexcept + { + sdata_ = std::move( rhs.sdata_ ); + size_ = rhs.size_; + dsize_ = rhs.dsize_; + ddata_ = rhs.ddata_; + + rhs.size_ = 0; + rhs.dsize_ = 0; + rhs.ddata_ = nullptr; + } - // ~flex_buffer() // destructor deleted otherwise flex_buffer can't be constructed at compile time + constexpr flexbuffer& operator=(const flexbuffer& rhs) + { + if ( &rhs != this ) { + this->clear(); + sdata_ = rhs.sdata_; + size_ = rhs.size_; + dsize_ = rhs.dsize_; + if ( !std::is_constant_evaluated() ) { + if ( rhs.ddata_ ) { + ddata_ = new T[dsize_]; + memcpy( ddata_, rhs.ddata_ , dsize_ * sizeof( T )); + } + } + } + return *this; + } + + constexpr flexbuffer& operator=(flexbuffer&& rhs) noexcept + { + if ( &rhs != this ) { + this->clear(); + sdata_ = std::move( rhs.sdata_ ); + size_ = rhs.size_; + dsize_ = rhs.dsize_; + ddata_ = rhs.ddata_; + + rhs.size_ = 0; + rhs.dsize_ = 0; + rhs.ddata_ = nullptr; + } + return *this; + } + + // constexpr ~flex_buffer() // destructor deleted otherwise flex_buffer can't be constructed at compile time // { // if ( std::is_constant_evaluated() ) { - // if ( ddata_ ) { - // delete[] ddata_; - // } + // if ( ddata_ ) { + // delete[] ddata_; + // } // } // } @@ -168,19 +222,18 @@ namespace ack { } } else { - if ( n > N && n > dsize ) { - + if ( n > N && n > dsize_ ) { bool scpy = ( ddata_ == nullptr ); T* pold = ddata_; - dsize += std::max( N, n ); - ddata_ = new T[dsize]; + dsize_ += std::max( N, n ); + ddata_ = new T[dsize_]; if ( scpy ) { memcpy( ddata_, sdata_.data(), N * sizeof( T )); } - else{ - memcpy( ddata_, pold, (dsize - std::max( N, n )) * sizeof( T )); + else { + memcpy( ddata_, pold, (dsize_ - std::max( N, n )) * sizeof( T )); delete[] pold; pold = nullptr; } @@ -193,7 +246,14 @@ namespace ack { constexpr void clear() { - size_ = 0; + if ( !std::is_constant_evaluated() ) { + if ( ddata_ ) { + delete [] ddata_; + ddata_ = nullptr; + } + } + dsize_ = 0; + size_ = 0; } constexpr T* data() @@ -203,7 +263,7 @@ namespace ack { constexpr const T* data() const { - return ddata_? ddata_ : sdata_.data(); + return ddata_ ? ddata_ : sdata_.data(); } constexpr std::size_t size() const @@ -220,7 +280,7 @@ namespace ack { { std::swap( sdata_, rhs.sdata_ ); if ( !std::is_constant_evaluated() ) { - std::swap( dsize, rhs.dsize ); + std::swap( dsize_, rhs.dsize_ ); std::swap( ddata_, rhs.ddata_ ); } std::swap( size_, rhs.size_ ); @@ -251,8 +311,8 @@ namespace ack { private: std::array sdata_ = {}; T* ddata_ = nullptr; // replace with std::vector when C++20 constexpr ctor is supported - std::size_t size_ = 0; - std::size_t dsize = 0; + std::size_t size_ = 0; + std::size_t dsize_ = 0; }; template using fixed_word_buffer = fixed_buffer; diff --git a/include/ack/ec.hpp b/include/ack/ec.hpp index 46c060f..78d50a9 100644 --- a/include/ack/ec.hpp +++ b/include/ack/ec.hpp @@ -1697,7 +1697,7 @@ namespace ack { */ [[nodiscard]] inline field_element_type compute_y(const field_element_type& x, const bool odd) const { - auto y = (( x * x + a ) * x + b ).sqrt(); + auto y = (( x.sqr() + a ) * x + b ).sqrt(); if ( odd != y.value().test_bit( 0 )) { y = -y; } From f93545910f0a98c8682e0fedaa6b05db44cb3d56 Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Fri, 29 Dec 2023 15:46:32 +0100 Subject: [PATCH 17/18] [Example] Add ECDSA key recovery benchmark actions --- examples/helloack/bin/helloack.abi | 112 +++++++++++++++++++++---- examples/helloack/bin/helloack.wasm | Bin 329320 -> 437534 bytes examples/helloack/include/helloack.hpp | 66 +++++++++++++-- examples/helloack/src/helloack.cpp | 107 +++++++++++++---------- 4 files changed, 218 insertions(+), 67 deletions(-) diff --git a/examples/helloack/bin/helloack.abi b/examples/helloack/bin/helloack.abi index a4dfce5..5bc76a1 100644 --- a/examples/helloack/bin/helloack.abi +++ b/examples/helloack/bin/helloack.abi @@ -13,42 +13,82 @@ ], "structs": [ { - "name": "bt_ecc_brainpoolP320r1_sha384", + "name": "bt_ecdsa_brainpoolP256r1_sha256", "base": "", "fields": [] }, { - "name": "bt_ecc_brainpoolP256r1_sha256", + "name": "bt_ecdsa_brainpoolP320r1_sha384", "base": "", "fields": [] }, { - "name": "bt_ecc_brainpoolP384r1_sha384", + "name": "bt_ecdsa_brainpoolP384r1_sha384", "base": "", "fields": [] }, { - "name": "bt_ecc_brainpoolP521r1_sha512", + "name": "bt_ecdsa_brainpoolP521r1_sha512", "base": "", "fields": [] }, { - "name": "bt_ecc_secp256k1_sha256", + "name": "bt_ecdsa_recover_brainpoolP256r1_sha256", "base": "", "fields": [] }, { - "name": "bt_ecc_secp256r1_sha256", + "name": "bt_ecdsa_recover_brainpoolP320r1_sha384", "base": "", "fields": [] }, { - "name": "bt_ecc_secp384r1_sha384", + "name": "bt_ecdsa_recover_brainpoolP384r1_sha384", "base": "", "fields": [] }, { - "name": "bt_ecc_secp521r1_sha512", + "name": "bt_ecdsa_recover_brainpoolP521r1_sha512", + "base": "", + "fields": [] + }, + { + "name": "bt_ecdsa_recover_secp256k1_sha256", + "base": "", + "fields": [] + }, + { + "name": "bt_ecdsa_recover_secp256r1_sha256", + "base": "", + "fields": [] + }, + { + "name": "bt_ecdsa_recover_secp384r1_sha384", + "base": "", + "fields": [] + }, + { + "name": "bt_ecdsa_recover_secp521r1_sha512", + "base": "", + "fields": [] + }, + { + "name": "bt_ecdsa_secp256k1_sha256", + "base": "", + "fields": [] + }, + { + "name": "bt_ecdsa_secp256r1_sha256", + "base": "", + "fields": [] + }, + { + "name": "bt_ecdsa_secp384r1_sha384", + "base": "", + "fields": [] + }, + { + "name": "bt_ecdsa_secp521r1_sha512", "base": "", "fields": [] }, @@ -449,42 +489,82 @@ "actions": [ { "name": "bteccbr1", - "type": "bt_ecc_brainpoolP256r1_sha256", + "type": "bt_ecdsa_brainpoolP256r1_sha256", "ricardian_contract": "" }, { "name": "bteccbr13", - "type": "bt_ecc_brainpoolP384r1_sha384", + "type": "bt_ecdsa_brainpoolP384r1_sha384", "ricardian_contract": "" }, { "name": "bteccbr132", - "type": "bt_ecc_brainpoolP320r1_sha384", + "type": "bt_ecdsa_brainpoolP320r1_sha384", + "ricardian_contract": "" + }, + { + "name": "bteccbr132r", + "type": "bt_ecdsa_recover_brainpoolP320r1_sha384", + "ricardian_contract": "" + }, + { + "name": "bteccbr13r", + "type": "bt_ecdsa_recover_brainpoolP384r1_sha384", "ricardian_contract": "" }, { "name": "bteccbr15", - "type": "bt_ecc_brainpoolP521r1_sha512", + "type": "bt_ecdsa_brainpoolP521r1_sha512", + "ricardian_contract": "" + }, + { + "name": "bteccbr15r", + "type": "bt_ecdsa_recover_brainpoolP521r1_sha512", + "ricardian_contract": "" + }, + { + "name": "bteccbr1r", + "type": "bt_ecdsa_recover_brainpoolP256r1_sha256", "ricardian_contract": "" }, { "name": "btecck1", - "type": "bt_ecc_secp256k1_sha256", + "type": "bt_ecdsa_secp256k1_sha256", + "ricardian_contract": "" + }, + { + "name": "btecck1r", + "type": "bt_ecdsa_recover_secp256k1_sha256", "ricardian_contract": "" }, { "name": "bteccr1", - "type": "bt_ecc_secp256r1_sha256", + "type": "bt_ecdsa_secp256r1_sha256", "ricardian_contract": "" }, { "name": "bteccr13", - "type": "bt_ecc_secp384r1_sha384", + "type": "bt_ecdsa_secp384r1_sha384", + "ricardian_contract": "" + }, + { + "name": "bteccr13r", + "type": "bt_ecdsa_recover_secp384r1_sha384", "ricardian_contract": "" }, { "name": "bteccr15", - "type": "bt_ecc_secp521r1_sha512", + "type": "bt_ecdsa_secp521r1_sha512", + "ricardian_contract": "" + }, + { + "name": "bteccr15r", + "type": "bt_ecdsa_recover_secp521r1_sha512", + "ricardian_contract": "" + }, + { + "name": "bteccr1r", + "type": "bt_ecdsa_recover_secp256r1_sha256", "ricardian_contract": "" }, { diff --git a/examples/helloack/bin/helloack.wasm b/examples/helloack/bin/helloack.wasm index b20566b459e36d5cb3de9da30b76dc8413401dc6..b5bf332b349b8174b677dc69b8877ddc1b8bbbac 100644 GIT binary patch literal 437534 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 ^VQ^y#biorrW^vA`m45;185X0&)w{wX( zoxJK23+I17JJ3k@#BWO%Q%!P0xnU=in+_0n*Wpfq?7GcBSG@9LnuQIEyOdei)ppH% zXep^6{1>s>24A#~!?QMVOJtly+=uJ^M59^}V zVcO;hC+om^hE=kFH^*5nk`anQ+Gtw7XuLnTN!ct;BKC z0nF-$8hiL*HfQ{_9%}4xxwYI!xLq%1bwH_0FNPIQ}O`diqi@HDOQ^LQuba$a~> zgUS-bC)Lp`8(S%{VjCItJkI}X>n)gReAY*h$wq2@l+Y6;MfUuilBueZW2Zzp{M08a32d(~hQ=((4k3|32QmX%cOR4_*Nb%iezJTyvQtocK_gG3d zuf5w+x^L}iQjtUA4t_?svCq1n>nq82A@>@ifEMXE|A!MQ%_j1%Oke+4rwId4-nCf= zZt`bDDbBQp?vv%jL33njWvhuJXn;F-?FP7+>O_O-HOn*_&2CHMX5)fN;CAF~&f%A} zIoHw>By##WHVj`RHplR#aKkKP-5nic-NP3E_a|YFk#}=!jOMf;Hn^oZ8#CUBnJHtc zJw|P&O=nCW=@}Du@!H<5K2C}0KcqQE+LwP5Ij$%MMt5jEty+D&Ub@OS(H!G$g(MqN z!4Qp&+8i4Ta}1%TFLE=-sKe`>u}rvgm8^S%Icbnav#~J8SW`DJ_N|X@$v%_~d~~Y2 z@}UN^Lz8Zj8zeHanr>7}U8%e7m0?(Bwq+eEjVBLw5;xn(X||2K*_Mf_nuN?YBYTpi z+}WpbN^?GQi}e7q4|G@M_f3FamKqo+s~+)$FB?K_U+lopaWnv~pN{w2aFg8oT=$+V zrFu7c#)ijUNJcV!cV#aZqfT_z0CP2?1&q;bbw?nF`5l9x4bIMIYjVezkaz6?{CIH8}e{BAE&Dd|VlxFOcmeP#fNvi#bghtkW5#N{YMf^u(xa64BKeUu)>^oJ#;Qe=&k_7lx zO9|e$SW57aIN9JM(Lc~nfcN*wIC%f9r37!gDj2-KXDPw^W=jd)-?fzBZG(6boV`Z> zf5QXJ$S51(cLgQbZxy=vPgzHMx>lj!6ioFkSSPxd{_ zS3$*mq^GRp03}MPWZFvJM~PA@Ib7JXjU^@SEB81_nXUYJ)~T9I9w!2L!}+vqr5e?&8WkP(!c4>2h*m_V z-rnw*Jx`4vvwNNa3N3^2gV`$N{CJXelfC%_NI7n7C7YoU_<9MV8=a6Kt+$OOx`!TN`>$?A@W$*U_r$eZPdv6s2;VF#4q zrXu4EFBin8&=-lansMZ&UdPNP2J{Tg--w8qmq0L);8*K6lXa{0n=GZd^+rpn>l;*A z;>61fN3O4@)RAk8rSwj2DZK+f*~HfEv6|KH9@Q|v-)d#aV>e zwfb=rd=a`pqfo2A!Ku}n8RH16jNdnlO^ls0xdfPQ>8EVY?L;ztlj)J;6ZxA%x@0V)ZSJlv`LcA$onoGD3 zd0kS&mIQ)Z`Tpj!)^N~w=kqFL_bV-?2!`?~i&5*;LcZ&2-C zAmdcKe_|<#{^wP}R67}q_ZG(Dy|(hoSiEN5;YXPD=^i0aY+~ z&ss{V;(kkMX?n&|f+xAM@)5HT~RWuEjC${tQO#hoIi_&JQY=$bUlKb)v z&v?rIZVlt_w2G8ehTA9k zdq_nj5o=lrZ>r8l*?mr(1xu;3kyB?S!G$;YVj13+Ix7Vh1JbLrLsDmlZbhB_N3V=J zD{@GkopI_cU#3`Aoi*B`sTx6@Iy)QF+p0QyIHa}Ym zo)eVgOcxgVUgcVh%(R&C%C$yvuOwtuMs^Vn8b2iDo?F(p@4(JkYVc@g-yLq| zW`pN-{jAjWH9&=~uTi=sU4O2k>m%)?>t9M*`uJNCG%{WE*_7YU?4vWk2xvTc-PViv zNVDnmAs$E`yT==l$y>0Db9_h?WfPqNbkaeJ+Q8 zqA7f_4^L0A*h*XgqQ$dL3#XP5h=Xv*}9`j@PKF_ zmmPa|LZfNj)tUonb_Ha+T7T1>hV-xhsvQez<_jYE$ZV^$s6^qr8x=2eqr%pqa;L&n zDd#$^n^XkLBeIt9o$l$FN%eG(NreujRdCNTCe?4aKw1`cxcB;76{pO3swx$u>K6|7 zY*u`)_QS`c&n?CqBM>nc8k-iM)ux5=q<>#&I>vP3&s8+j)lT)%yo*vq5>N8gdMJ%W zb5J6C59{f_I~bh%pNvYYY){21dpcNU#+P{ae=e<9WesPQE#WsWI28WA>*2pO4?l)Q z-71?zt&~}|pkG}4T2A~FKP!d!bTfQ2@1yA&Y)Hun4(;DLbvIsO?pjs6gDd+VOx_K;z zV<18ySpiN;F7+6Q3$W67vLriCNo7u3(G?XbsiHGhbX7%4s_3j0T~iTB8HluV3kKra zS~@=ERdP-;I~D7BxeD7Eja zD7DWArFPMWtjvy8l-ib4Y8US+wJ&R{!F1T=_8Lsuf1%=57NV+B`-$jIX|?~JUHJac zmAYDMp(~z6ZzXmG+tOAw+pi_q_N&PwMqOzt-k*f$%?6;DL`AjJ6Eh6-#6A)fR69LE z{c>7~QwM{(#S^CvT0+o*>P3N52Q8r|P7QOR908hB2hq$-d7~;Tk!#1PgKJB5Fz&wA zMKIY)Lmw*YAb3~QL2wQDv0{T?z=<3<1w6>1mWH;;(Y9|-Ed^B(ei%Ybpc;-S1jLj@ z%2v3t`-yldHWXL_d-O$48|zpl4SJ#xm(Z|?|-HAMIRsYayJxyNr%T!4xE~Y+V(O7WX|}7XCXFak(kjts4c={ zF;l4YZWl`j%A&$m`?W!I^w3TU5z{zJ z&)RAISbha9{)EvYPeLl(nk>hED9ege`0h>21Po81pg*@|pcG9@gMvzfoFvidBIOiI zW2Zw6p;1aWx=}#~ogjc@@efHvSV*GXgyd40#ETb77t7=uL#a;!|wm&uc5GTWG383fWKrz5lCwIBF%sIo-4;7pG3 z9J-w0SNR2gwF9&y(a4mrm*LvKX^vud=|U*>gKH-ueLXdm#p?m5hp@@Ft0zl?oP2>9 z+}VvdzsiXqS865s?9asb)9KsKK!nrs%4@$3tQH3N-Nb!CirQacLbmi$D z*$HuefdgjkqN7K{S+iINSpwCT%H-8DIcarmh^EVAaYHG%QCb?Af zXZdzS^8>IR!eS|Ne&N(W2h!qX7+}@WJmHV%TvR;S=7a$iPP8%P^g_GSqz*^o_zU1r zGe5_nG@EE)kTn(@=d!v*tz#TO#pc#n9Vf|LZ?pZjV>2l$Crpp;87VmLL)$zPa1n`i? zhKYGjzi{AL%M&fC-75z{6J1jOT_!R7x2+xfl_+WkmnbS%qNrSnqH-mQ%9SW8*N5UY zF>;U{plGs#d306fdP9Oq3|NS&$I@>nE4D8YRIWr&xe`I;N(7ZF5mc^3P`N$?O(cWh zNwE$Hp3tus$-;shX!4hlODFCpagy6_OVpGrQB$r&O}P>^4*24=p zty~}8HzTR^67VSqdYR*iC1T2zh$&Yhrd)}bawTHQm53?VhuBL9PZ4xpgk-FbdxBo3 zyhc#ob_8?6wvV9m9D(!;tBI266q(G9 zSVRCD6PW&^a`c76MFjTeEa_UysAn%|=zMiJE4S+ExsGtE21kdSEM6XF9=*LYz@dR` zV6S@15!VOotYVaZ^v^8_0JhPo*pUw;adJ?bsch;Qj$iSd_LH}E8zDkL2j6%?mCY5* zT?tt3S0P?lz0_%pss-eKrbmuf-c-`~UN-xJ5J=qj(U1_{Q6+$u`ad@eRI6$kGWEiorAo=g+5`fYI zC_jVA<_5bFLbRO?>SqXc!FYULRR;Al=ntGcHr5!`=}4}e(8)1}smEJqLqLZ!WOkg> z9@2n1mHu&wI6a^%Ld2DFIB@I8AGYHW*?%()A7+EC_(#N#jB|FfMFh!F&cWG@ZHmA- zLWV6yDILxHFqwA9aK}P-C}gI{42R4$wjxJD<~UDAOMRoM@+*o~(ORj99j%r6)mo|Y zCFw_5lkswMg1>wgoY|FrJ7eIUx5Ag1e0BE{q8ERGPVsDI@z-fnNd~LpwJ-X3B2gz* zm7QYi^9rg+I9c^jF)FoTuuEHp&v#O#$i0M{sh8OzaR-DI7JOj3XPmDL^^>K zF)8L|HZvblU^5gz^PD9L!i>?-4yes|B~LL78leIoX50^RY}KBKf$fns%^4etry4ra z^r+_P`e>R9n6^quRy`QT)w9t!k+^!kOVkTMZKiOz)MMO2P&G^#!&W`wPT~TQLVWYH zCeHPogT-!jaK%(eo-UK8 z$|Tn~gbG|D5t0{47HYdqqoXvWX#`)`G*ZKwMsxbLMNvz^R){3&Cw&;wT^6@O&r31= zas7g%ZUX70VzjZhY_#b_IofrCM;Q+VpI$$zUe4I3XMa0pkuk0iNs3d|+%3>gY1RTp zdpxWKhSB0!AiQutV3lbyLEov(O+O%CssJQxrp2(H0j33*%@SG|Bswd>|mHC;t>Yxdg};6o*+M4B3tY>n35E2`5wld zZ$iSR8gA}4^h6=>Sl!g(*wamGp2)-D$`YnQ8P*4imd4mTJPmP+;W0_&Mphx7h-M!%9r zLC1Hw5)(ZuF;T9>M7a_Z%-)Ie6X(eNBDKUmp5T6q(4RCZI#Noojcu77Ao223IdYh2K!j=-F z0m7PJmK2zx!hmkLj9`@8Kx)C!@WD+Q2II#1FgW5$tS(Pbkx)>IA-HT8j+pf0!7>9^ z8G;K9Hw1_-*PmsEK+lRHkc^YZuS*ZveQOj$aKTiMJ2?anM<#(A0yiS|SF8m6DnkJ2 zZ3x`F^g~e293vPVmQ)};)kyccJ7b`7SVS;#7*boCdlnI6P0Cm+5fNeW>06ad53_~I zUZA#2`*PKioZx0Q!gpFDKbXYLgRre%vRIXz&}d$HLFS(jc&_|pp<#q@#`4fG<(=>=VMz2JT~dR^;F#v}Dzgg68Av@P%*l2wJo7ZX_ARP7$n#wpNj)?Vn`cvQo->SEwjm`anRj*hEQ9W=xm1} zG^9HfI83LDnhMt9^%1eAIgGeQg8qZNjVC0lFywG;D2K(6!`5@_F+<5^8vqh}0fZyd zx5Ja_1oUA{#mF{IL_in}P2@TZrdfFF3M6!|jFyew&nX%t z#?Z*G4#vagtsufLp@ac7@dA0Fr}moVOmaKSutS7G;Fh__?J!$eR+QNevz6Hnv!&X_ z(}k#FW7(y`p*8$&LQM_G+v-G|9%Aar`xkIg)@?5v=*hT%?Y5V#bctqcMUHeeQb;bA zN%ojRDZ)J9Faxl{0<^DV2bAQ!^(gV9%h_!k+L1?w#A5x`3ng0T%H)|cxlkrgmdW`t z$u3sFkd-Q6_>z*2N|#HNpwiJ8zG2M8@k%jz-GQ*b3;EJL-VsQZ?x0Da-;>>B?3@)Xpz<`DZ zgC$mP;b%4=M`R_FXB_PDoMdyGm4og#km@Lz<}I`ITIVdYbmn|zmgY#Sd_k7p;5=oP zCW;xUAbw8lu`m<`oE~1G0E-28Q_D$3z?7VEiR~^96gm9V*=MR*hhq$Wm5q?#}37f_cWU6RAK znzkdKyVp%*e+xD)&&%9H8K=LE;FCl2@(8*Xzb}n+2Q)hF)}1W=CcA4ZW-!qA5x_Po zJPzBgI2+|?Rpbz7`|y{xw9U*t5drW85BTCpcTj)_t?q3D7H;ei8;%!8;K^jOL;NM0 zH1zQcfEC{B?w}TNJC}S__^6|1eC;K3mHof}klb%FHyfmPm5M@~&SZm?iUP36?nRRR z4&KfDGTRzWmt1mJu-bK<6sH&T{3=?kujdLT(fzF0y~LJBE9XseEOiK?|)&IJgDf`iRn1f$j3i`2esHP%O$sQr>jWlcLC zEX6`Op*xy}Sv>KE$V8~}7eamz+mk9xej?gJ$NBXW$J+MYms(WCyn>f(?^mzS+V$~6 zh74f3-zwI;_bOt|SXD+smJSQAhC$;|8w}*!?R4wa9t`2%%TE%mw=puWb{7hMYUL~x zw}bhs%~L(hlYFV+-pe>F++Rvvs4xy!@ZJW;zv`=oQ+JoZ18Y>uBf_cB;Rg1a5(#se z$Z{uqu%IkrlUr$3e0hXm3u>4PfUVz+dVRo-vE_F8_{h(;-4|cxnr5{6<;mMWG|RHw zZCJD-#zmh3c0XlbB>I<7c}3MPtbwWxi&Yi6kHHmeM@+F`&O-R@C>l_k7#=ghoHH`c zu{ALTyg7Nv9+}lwYH0&9B17)hv zPcVICAvyyRZ$vO2Wv_U7OaltdP|&p_U??zx3vvA6s(~B9kB-sm5#0KHEIC${ov?D&6OfWhgWC3vs&1){cC!`b-)3>^jFXF8X5`X|VGYgNpmf4YWnR*?|dl(auhU zZD(Z}X`QIRlYo&JAmPUHCZj-|(fn0^iCt9E!8rvl`t55E=V>u1r$cb~ijw-WBZol< zCBc=NU(hLrd8K%NHg%^LX86_Vh54aydV!bm9K6-$d*$?kU^*K3(+gHlP08^-o9ZFd zd`9ih6WA$wp0{(JM3Gv!ph~SIKmK#>^a8(ZXtK#>6C11+HLHhN5A>`0)F8$CfZne` zbLHu?&gpGzxT2uVq>|>CQ@`g|YR=&cqU*j+?hXT7<#dOHjIodnz%>qW}VS+)fcX;3&Ea-6d{a;VNB(FF_Hi($x_tKzAJ`0g7$RavU56kP#Zql$j zJaA~(q~)y1MF1BhU9fm(3xwBMS^}WylN}zQZc&SVhj{vnB;gFAxx=W?!Q$|M-iDpR z;Q?h&lJ$YF%9<0*@tv}Y)Hm^pEFe;R%*F=ST7e0N2N)!c9xaC?O^zq-@BpYO$pWxG zIyT?*}9YRc0z!A|j$ESz&>*jm_G^sLb^ViKvkW0T)40MtcG6e_~ z0Aa>=>LdaxK$xb?7!_O7P~pV@Q;cgU4yVs)6DHOoI>VLy1NAQ62s4RZ;1zh`x9h`e zUILSz$paDaI!2k{#TKODWez{r*M7W++L#}etTGw2AU#BL0|K1>`BHGHh^+%x$;eJY zMUv||tR;~Zo{FQ6o~(mdVB%Ukp%Tm$gt$P!T>*p}6bjSt(lAOET*VD@P9)L%w*c|L z@hT8!Q|TNrm4dD!u|A|Yzrsyd710SEUWE}!G4IOC%g+V9Bc2EH{K~SjCWXz{5;A@B zkVzGg9fyfC#EWhu3L%z$SE_^mLHecdM+LQs!bH;me3n(%B#D;9qr^5?P66T&(FKUR zUidg`x`4JSe#6Ti0>mK#*i^Mv`f~jMabF#-Dg(rK_6CSA53?^od{+n%pT6n?#OKml zfcW-WfcTE(0>rmfFo!k~eW?YA?@;{pO#{TMP@uR%4Q#O$xZ4g8-=3EN;#I(q?B)UD zJ9-1ew@dVoC)<|~5dVMTjM3Z_?N~NIyxKa%!5pcU$aZA9AamIIex6;US0+FlOw|&2 zFB2fX9SvO%Q@+F<5GN4=#I2OrupJ{mHb{Ux0pbdDY_fMl#BX|)XtMF-oe-p%&tV-f z2i$@{ixz}>RZ*nO**SiLxLZ;gwSmxF&*v#jt>mx!PFea4baBsHsI-bf3Dw<8>mz_# zJogS(5CwE;BD?mTcmbs=KA!t(!g_2dDjZC*#H#z1vne&<6n&7eKdE1WiBItBL8^X| z{)Kh&h#;1W!7cR80YSr*u4f`iUw&o2zl<(UqDJ+15yV6d_WS9gA?OL4Q@`jVeY!>s zF{Oq>hT;{R-d=K95Kk>Ydnu{RU_qWkI7xVsyygS63w#KK_)!bc=7|`nSv2hew9i|B z_IAuJP*s%F4k;pjNDW0?Edah^0ovPPe(MtTd~;SCl;7zwZov=L0PWiRiJ)#zfc879 z0owbFnZz%$qNRSaGY|7CK>M(01ArY}EbduFhj?Bon3~#VfKX99y#TI(r)N}V3yM~m z9duBTq~Xw=Sz|^FKS)I1HDOfUrhr~5P(dHHkph8or0T@Nw=dctQgML@LyMsrsRdUf z?hu!TfjL5Gu}UT6C?i$K(L8q9cUFR{9fSlMzW%B!(c0vLt9c3Xx%RMS`J8f*&7a6@ocY2iw)A6(7W zmWF(XU|YMmBGgSEsa6GL%~yk~L#yfXjT!$Oj$A@rifz1EEGdxyWY9!jcBrnVuU+*Nz6#Vd-7@mHf+|qzltc9 zU>o$^ft;Pe1|3jrs=!MnBu+2%>TqI=@47fslbSTO5Sz+kA;RYwG9My*p%x;%3?;0l zVB+xdA;PX#{LNz#oes0`!B)m2^tgymRTXs{nFqLc^MpQQ&JW-8=j%!7NDuL7Is&TwG7t1X#vuw3+ zoWQ)4(Nx6gZnNduo*Ba-#Ou!$$Gad`Wq%wm0?UJ#60qiHpccSmm=FG@x)FWfwimqCu9 z1_2}6ZWzZ~MI#X5^N!=K0?o=e-fA)OZ`n9rV@?b&V@?qI0>trd%WgZ4_jY(voq*qO zH;(r<7>u=u$>CejkL+|eU3#XoX*o<6^UUoSsl@UATGJ_b^UKEZYD>Z5cyX@;;fevu zBIkru>CiG(Rg^8xaleQqnx67$xvdFwFpI0L0FvtM0Tpg7`&@Pv0zKNro3?pDdmyC9 zS=-j|;y#jK4uIG>lT0wtVE4^Nx%Sn+7W;>pqf7WGU8pGq9X`6 z)PTJ)G4nvQ!5ZQ_krGdA5%`BYg@PKZ#=DjA6D&T_$PcY?k)#Xyrl^*qd|Dd^=^si5Wq*EJS`oj8R(#%(q8*ypf zEBVQQ`Rc}Fk8ZP2;4j#a6@DZ1Vu2YM+M8mR8Qj54G;KfH=P7`DyS3wzZ z$?HDia>4d3FAX^JVuoX<924}*lh?p$mSvfUOGSHtP@kfrFvnLwPZ5|~QB%;|WohW1 zmtZd7gP?ze6eLo+<-?Lvj*Wp*?o9}+3m(-x8=Nwy(J z3s^eAZosLRm;=yEhk|J=P|h~DXvadKoWamh(1)`XOa-(^IvNZwnxEFkIAW)0Pa~r1 ziU{yAjwng4#o`sfg&0R|=G*m}k?pGq3wdh@t2AQJg~V*KiaR`!;edymUo#{MQ)5Zy zfmO%%)=cYBF53ID7)5z99ZW|pvs^Cv7)3di@ot)D_A0wsxM0O`bi(7C{%fRN>A++UrW&ehkT6U(mmA}#W`+bh|}+OF^bAu zIvuB*U5w(PKdwAe#yz`EjN(f^9MEDELzv;!;03T4MGHYx7cCmGm_KA0ZiU=jGep&4xxeSU8GG zFR3IywcuhD`6YIC2rEo6xL`FY4-IFruIUm|)u#q2-skSBe`1=um8UP@k>EA4;nXS~ ziWit%HTo~Dng}t9)4opbViaeo2V*%$u?@fxLN)Ul)hcLywS@Z;NnrW{@;`w5;(`k|rgF)g@3<5&@0{xXSfYnE?h z!dLRmK*n^#4QqBy%3l1&02&C=K4Zn~;|tFmU9dRWZ6 z$I|D?YOWM;L^RDNMeqqF&G`Vxu1cmhPu#2oxpXqNAVstGD>DEPbM!_aPGT$v5VMpS zrxrnq7XE5L*+d&L97ogdv8_RiQk>&r4F#rD$aN#!a^x+|mYAIhF`*Rz^I#;*?5cRD zjWmu?W|$2mn~h4mNUiH(rZ~kFqLIm=c~OmNB|1)hQp=kQ{#B78#;uY_uY!s+S60eX zxa*ayxavv|h(#uE4Fn7p1i3)KVF8327z)!5=!PO_fxiXs#geEZAz(hrfS(G)-c*`g z<=9_E;(v%SwaTp(Dxwzv(DWq5708+yHfc-9bk0L2RYEp4I|+A) zv~Da4Nk-q&52`~!2&Pj~C2hjENwM%BS&dDiXlb1PPd=wuMF{C)6lxRotZ|U_9Bi ze5~U4$#aEfxM$f|#cJyihkf;G$sLMS1XHyH-pj-)?$Y)+57X~25vKm%Zch6N=cpK@@x02YO=wtieYA(swV9uD zaVL`@eIB~F=PguQAFF89-AicBLJrsJ9##?y*U~a*?K=qrN+%k^NmW^w4MoK&N}Leg zg^=(Sr7m0~)<$~51^u!bpXXO~eElSywoaZ6v5HQj-$L&k5WeLhozJ9FzTjdNZ@-HR zs8ju21XJr`iJ&KJPW_^f^yw5Nx65Spi(Yu5A-M&i-ONJzR4VBo^RU4Djsd>lGt6CU!ZzSj3k9b^~5h41~z(Zz+64w zCF%vBstw9ddyHEM%WAA*ZT=7-$ds;KCd;>38$88(eK;7O{%E6syQJlx%0h zRf<(S<6{-YD}|QgV-*=s)Pvi$r_-Hm*66WOIhy^d13N3gA3+z{#}^QV_K);wJ-E`klM z(tn0B5QpX}2w3a&SjAmstRiDu2UJwJ- zV8yv+RmAXoAp|QPZK@H83fkls0dB#HHn;qo#q_3K1uN?6Si?-gip)!{#ze%s?z#ER zG_qhtq`R$iC-Cu{M^|Eb2wf5AhD~0({uIeJ82ST2%VTc;Caeb>i@q^DDh zu?p0Z2%wsvpsrOfG+l-iR#Pys41Bbr>lT0WSY&4`So&Zr^+L~zxH?twQk7QE!zdac zgCyBoiB_~_+W15KZ6l9l4P3HQ2SID&sRVv$cn)JeM9^KO$v52bC z%L_M;SY(i6s6oWy&KpK7R?z^lSLWu?D$uNqSgaN!l!s`q@8(fsPK#KCIjQgkh*;ct z`w@$`!;|U+a`1K|7H@;WSdW+-z6Jfrrf}1xuIk{nGX0F_(x{e;SUk6E#G*DB%7{g0 zenncEJY$xwEn`*1B;qRf3z?*tdAA~}0Y^`5o5Ra#HXTs$owSobS-9yHjL|9tdc>W^ zZY#q9QpBQdauk51Q+YsVYY~f=m<;*pqy)&Qh!!kCO0nO>4V~H_AdN>Tec@$9EIMsR z5b&%4dt+iof@p(Hv?+Sp%qUUK9`3V-X{;KtSi-yLFwtQAoIx>WVZC5sSPPA{NgI6nLKDH|QV>E@Dw{1k}*pa3z?)J*!`Up25*h zAY@O(;>_w0v3QIx49DqZZAlWTb1cQ)#3GvqhU1a6 z60vwZ_2@4bv3Qb)xjI@zES^l4jaambLcEAr^c59Uw}9_CN&i@ph?jAMHeGVYq7U`V ziqp^O`AIIE@bz55qD3rH>|U~Wc#|B$7A^`i12xLe#5RSvO@qSpvS+j+7GIGWJq)1F zV@4ZO`7!bli_lj3T1UiHnw`*&A{Lcq?peg5(nZ7~83Hl>1kM&9#s5XgW-+c_sYNUv z!@a%FRhzwslWRr9VwfqsKSv!&0bFHAajHM3R?AP9-L#QIixk)vRcHV?wMIOV$r%sH{m<+lL7PHFC!NF z`|KmkDyV${`|KhX9p=s3!5V5QO6XO>8W|36gppV-VlfN`bN+U^^=c1BQi)g$U62U+ zQsgHtBE~wr4a{F{o)YmS(b@dRKN!a z^(iVv#Ny{?c?is{s3~afvNWpp2R;a<7yHq*h(&A+lyYxEU|pcF_jtUVPe-rv>^fTc ztlb>uom&>TWfp=w*4}o&$H*SOD^qcUPqHd)0f zp2);tYlUAkBnnewz5$uAB6NBk#kU^wq8%`cSd@>=DtUBpUUJrooi+KXnbSHb0ln$I3#9Z!!Arv7szR;EFZtig{3=58 zLi?eHoSOtjS-cgx*w>qgssw5B#1Fa;(sWhrFIQEp&_fvLdu`uPGvW-9M|{i!|N6S* z(w}&`sF1IH;C^41T&x!IIS@V$u`W4ZE#!M4#CEMq&Q=TcK@k<6t`_pe5!|Bdl2g?} zK1o6V=(^-YC?pMIKh!wGhf;ne?hJz^zkJnJ@(=pV^1DT!lbK8&YRptK)2eX+E13Ge zZ&5lOoB3o9(hq9`2oqZINRWO>akoq1ZoV)fR8X?Na^)0IuABzSWyP>6S561z>{C4r zO(NymMa}uKB6*UeCp*VG0*5Hz4gA8JVcO){q9Saar=COkI(B&HLYZ7Flb6dRS3HNh zoU#l_?)41GX}HI?%Fh)M=TKQRS0;ISb__DYAstw!GYn!0|FbFCVT9d>ncU5)`ch2R z(05sk4riELuoho8tQEmneBq&11Y2=bqE-Y`t#luYDPX};srzC~Q3OM+a-WS+k!H@B z0l10Ocyh?@2IcyVL0ec6h14bj+PJ1YQMASbAg}fh(%J*CkhBt?t*t!(<9q#stoDH3 z-RB>S*B(HL*Z2n;Y7d~=TL0kT;sL`%2h@$}LDMK02C;k)4hZ-0NU|aus}(_vv23(f1Q|xNkx*nq$y}LKu=os$ z4+xE9_k_n*1VZ;@t7}Cdv^rZ;D*~Z4*}b(Q5V|+JuT}&?_hqlC6@k!evbCW|2&Kp% z%}EncCQpvz+p})i^gT+>`f0f% z&gf*hm&h3*Eq95WQQC4B$=Og??mRggH|2!yOzR;;2ACm5vM+NuAX~E6k(82og!GWZ z5-}L!&SyyK^I23lOj63N33E21DUwVj&b(n#omTR*cvvLim8OH^sLxWoA(4{e8c3uh z14c;eXlGbWGuKboloY#iRlr9l)+LVQsKV*874$ycOK=CpbKuxeKgcOh2(3kPJ(usc!V!7V_ zK-%e2UAHQ_{?L1fB9gq5s_Y?nsvIfRBf5`z=j)TAz8e-EusHb#q-Ffat`rYQRUZ%;?B5_&eJ~}<#)gYj^}(Uy0jcVP!^Hzq;eqIU zcI=_#X@H?Qibym5HrNv`dw7MY319l=pc;L3+fUaeJ~v80ebys%I~`>z>5lfPB0FCW z#8b+ykB<23W}&KKVI3posOs#rSy(fC+nFeDa^c&~E*HM->~i7T&Mp_e?d)>l+s-b> zx1HT2utfuzgT9hnlh?(Y6}&z?Pd_UzfSXLs}J!4{<{Cf6YWx(d@l&kEPq7+5#cKQ% z8^iAul0f+FOTE3EdV7EB?Nz>8WneXKDgq&BCmudLYwGs<`_oAf*2~Mj7g~g|jN!N3dbt7v@;BiW+2c$9yk;WXOC=*3!QW;UE z6j3KfnR-Ur#!IDTx7e!>Vp-rBwH$*m?HV!rKz9ux%V z*au%Wj}R?;TPALt7pd_tFK4!tTtUx4)XsM8!?#GB*3T@*|JcRjHE>-f%g;0b^wjQ? zn>q`6YHjSyi0vb}=>KgcEHN}988s9hCzsCEklg>fo#g!?hJ>e^M|H+1W!`I3 zuDt~@);P4ILoKSH)&G0iGD(s5hBkO4A7@?Xm0-hTHI% z(VNdk_AJQmRFF*-bWHA1Ra5Y2^REueDK5`8mwcI$aWQ$J5&tLccIO3~6-4CZxDC5! z5;f_JZ4)Ak`OFUWa2&Pc!&8l8KLHCQi*dG&6euqVClH8{bO4Cr6%K3>1r8I%T@`5> zv`F6u4hgxcUJz{}ABYE&P;0ut{I}oIp7%TT%?r#c5EFH)DckWtholMdwa0^Yu}2`$ zMKc*)O#~uEgQHGH*N!Y-yBCAdh zbvaAmL7tF;c#Pak*>U_r4skxF!q1{MWCZ8*I-?VqJoCCGVtHi{vAi;fSY8=KEUyeA zmRAN5%PWJ9me`zG>uAw+ooNcH@R!$y^b0ZerC&B(Ir_nFY>ka#H8zUX*eF(GqgaiN zVl_63jbWn+Uf3K~jbOqNCS!8caa`s2E&+4Eqs53%>*b@VDL%8??k&ZHskPnTV1xch?O9_ppAt~EQ zBd^kss5~!cWwA;_@@hX;3S^argl;E|+-Zy)?g?Q2cCKR%G7Q@iItF}RAD9T+Db@1KrtE^m}>pC%1&kD6$71{S_~C}>&)1qxh!I>7;@gNR z9fCx9i25oWqC|R33spLViS(F4s&t4G=@5wNp-P89kq(iX=@2Q>V;XaQnE43Ei-ivB z7s4G>W7w=>_Uk;YV9Yp&oGiZuk#40O)Hq$d677HrGzw~_GV3JbDSX{W&A1k(&=FSG zbB;+#X!y)h;X`)9?ooJj!1k&I0Yd^jr9Z^q%!)uf+R1z^CAbGeFaUb+3cENx*oaM? z9vn89^*_?#*|=aOc{p8pM*PYKVs#?EJY46kc7L$zqhb;5;Q*QU>QYX2JzByOrfDm zpSC_Dob`MqI)qf4fH|((L|X7qR&63JcrB|okv6W{MB2D&6KTQkF6*%ogQQYzKx+k3 z@(6tp`k))$VqA)A_>;zE+vAda%&lq*EJmAm=G8Al8KK2zCe5H96Q^dto+cLNQ3%Gi zyyn&!r%;+WS)SU)r8jK z*kQ*TvU!6=m(o)WZl@K5by!p%Z_J`6*waJlF=}inR6HuJW0FUeHp!z(o8(cYP4cMH zCV5n8lRT=lklz`t#cqQ~ula!4jd}E1XDyHJLyjgMUDERDwc=5l6wH=*lwnBReR%s~(7^kWlfd zg;dPyu=U{3irMoqfORrc8a9fd8kwb|Ec*qF?))!x+S9Szkw&EDzJ53~)f?T*6XM`0 zi87ojdw-E((qcN$NmC?~rR!iC$S-&?&YvWerYx1nvz^lNTb?4*s!t=~!we^@d#6ye z1i9=z7vid%?mwaxnKQ^&)SwE+Y|JMy8|G!4qG zprS&AD^K7B7B_TlvOaWVeIUu&B75E74ex8qF8U?`ooqF2QVS`iUT|lstmZ!Jx5&QT zFu)X~nE%&v?HQJE!zmd;fQNO0z9Rr*#Y#V@q=|8giLotyVx=!PGnzxL$|T9;R3t4H zCbFHakYFe@e-KAeE0Xr=I0{Ek7hDNssv$?jtMS8lQUM$p$oY{?D6gQPK?`zT=29mC1Ld_~X zN6)J`Md{z7oP&jCL+7U#!8Y|GlL(i( zE0i`Wp=^tvd5=|(CoEp`F;WT8#%iR_QpXFNLq>m?$s={fBb7Yc0Wu4*bZpEcRSZc3 z4YHiiLv%KVC`XTXtatQyYO9c$7;>bzAJjh}S74)qd{Yp&Gnl0-NP-@cQ9A9&ry2cF zx9oG^G*3H$0pFvq=;9bf=&)vQd9W2FAb_n546kMeK_FE}l9Al{DpYt(aSIE;-)J+Q zldKc}=xQBNuuXpCARP-gQbOzi1q)FS{UBCGg(*lL!Jna&tke|+X^dI2>}Cqih=MGl zBn2UHgvxH+m{EJM$zOycz}%#=JD3sImQ#sTQ=*Z0F;NUsQMqn^*`(&ri}A%9W_t^< z=Mv|`It|g49&|~f3vr+hFg0fshVz5z=fw1L@PoP!8~`oxGdC*syjtl6nwvlnQK~w% z-n^aR3F>3RQ>=VvhUWtQFVkBYpYtzniuXEJ);&lqcTohp780Q-%QBin+p17mh3p#& z+qV#?Ip0hbT5VN9ZEIraP)@BAJXZW}j0A{MwGEnQ`F9mq&NwwqKD%@?^R!0G?F!gZ z9Sk>V!@XA5cBKwps)HBmAR14`Aw01SK^v9{$)m~;m|?%pn1LX#I*f3W$(ZSo_mvu* zOLg!<9XwwL&(^`yb#S!~;w+O1d5vH~N0y^RvwaE%W{U)CnjLS$jtuf7Pt&P!y9YC# zp(c)Gw{~tEc#={>UXN%=wV|ybf!J&bMXi*W`=;u-Pg|?RQQ`~FtsSOK;wbPr&fGdx z&#l_VC63~rzhg|9s^?~H2NOqOPv3E#jS!MeTdu? z-Q=z)(%5nCiXtLQYDX7h5NA0P?dpmmjos}o#2{X2D_v2fu}jVpv_X->I;LdQF}tWG zFtnp!rYL*JLn&=Ip0fxDqI7Gb!07&XByuwZ9@WJFN7X(`GiLl5`H3Uv|ro;sB_Bbrmq28WU8sc^GqycX)3aHn=m zo7mII{7~rRML1FW8(Y-jKke9cVslkaZA!-(GX&&7jblvhWR@u2(V2M+<|;G__wzw6 ziBPW4_`^)$j0YUYRIAZfhzZM{d4(v0=PDDkXMOf-Z1l1}xhBVM9#0rC3z={byr{wl z(-P`{QNb@-*QN4(8CP`u?r#rfFn$QRow2sYn-q&BlZ8y6%#(1S@zA)8eI^;rQW|43 zr@@Jl4{pq9WlpOW*s`sqeANQGC$5aLaAqzGXGR+1HPRR)w$U;}KHl0V-3H1oLRfm* z1Xaf`nZ2Ow5_ac8EXy51t@*z{#}?KjhsYo!0S9L z<%~icCBK|*WP~?HXYs2l`d`uY3#;@>H-cQgo4z@@|GWCWqJv?PFA|nn`8(N#2 zuM}`EJQf4Bg~pcVKb={8W9bUQXqkyKMEz)~4ldTg*F#khVs}(MXs8{pMpN+ENvx>b zDA3K#ZDp%}RYNsc@Arxai|zU^a+c|G2IfD?U%+S5mo+dUYFJ`6_-=g>(;5QY7hFZc zU@ERdh;Q9yIuf7(Evy>`C75FX;p}EXuanl)DvmXCuc@`Cx8R%Kyb^0xQLOzs*(iq0 zc&56+jdabKQ+>$C0*U287FL>BZeKSO19W>!iQ523FFfVe=hT7=wZ=Q)+WIDa4Ts8xF87`us&P;*hh{S6xG2 zRp>+`hQd~1rkrj8dfQl{n~M52mS~!w#f>GJcz6|#C7Q}O6y`)V_x+D`R@KJP`h7cD ztOu|a#0@BuOsc?(k$Gp~M zA`d>Obtif%rBymsiylpBl`htz=Tll)>0NM0N~?6c7MzsQDjl!|$ECDNS8R_$@0U+W zQu(=s$X;A(avM1UW8`DyQg_kuP}scVFdIQ>>2uYxUbp-y1N;()pm>}Wl{@&Ms<&kq z&`4|`DCIm78!eIk9*K=6OT~}G25qzoh{OgFwNQw}n%e4&RW_@%yr-k{^#XKs=|>P+ zT0F(Ut(H96@)ZM!l5$hD54!n+0x9=}o{I_{q!=BpgGcM&@j7_24suOHF6JxZ1lsB{ zZ;lsv*An-yLTiu`R8R@|jN>{Heb-y-sDE6$Uq%ZL>|OZZ3%%Qfz}!;eC+bh(4bV=DB2O!Rt%73T@{ zH41OwChx`~gqRke#y8R~IBJ?gM5ST4G-Id{Cs;wsh~;q($V79G3y*W9HCWW+Txktn z_BdBsgXulamDU&?9_LC6`nnE}bEO4sou;u1t*$2vl7=VIYbmNhE&-LCCN-p4oi3&O zArO|zydTI#TH27G$(L&>#2FD9shH(T~3{}c& zxUc$>^-n+0o|Qs&c2o0)i)+7y2H5}JkuSJVD{a&+pq8{ZU(Z;kscWU=QQ zknbotlkT@zZAnTnLgXfuL-mRNZB<%Xg>0#HiTVUT9FRqdK+&n87P&$gAnc5u1jEkQ z)^{D0g85kiW^|UVWf^#^w;WuoQ)9j5)G*CDc&Tm$otK+&kYc(CA)OpS)@G#Wp^Oo7 zxq*>%HIQ1WZva@Xg9q#2kvceWT|pvdiMfKwTI-ilO}dx^mj7F9Q`6G?As-gy~w3L)|=3G(6Qa*RCsARhDLyF9m z@`fbiU?$5QxTC{*J3jlpGqH&{h^oyp=B5Q}zfy!jZW~%5x*{*0EkwInw<5E+Q4*_{ z2(`jGR=>OhhlS5|RWhxrs%nvDmegFNUISxdHNujJnvw!jLRER`X6#I=5#(vmgIFd< z5*JV;`x+xWh<%F~)I}A`9=`D{d-z5yd-z7oyjYdP!#CuYQUq|ndWXU3cgowbZE26>HqqC@NN?s924nVl|42)hH@fqo~*#6t7F$&+-ElEk77Z*Oaaj z5>BG2g_gwCll>18m58YkRIEl&u^K_eY6KOl5mc;3P_Z=#S}cR$39$|c9@lRY%ff;f zXz~|o_V@VdH;$*)sGT5Iqo!DmnqoC-iq)toR->la8q`kC2^Bm|)vcg*-ErQR-Moh69F~w@c6sr+atVT?+HHckKN5_wekP!4}BIqU3#|TR4S0v~$ zUxwjH@~otlBqw^*v42s|tV+_>vondomC#guh$410r{=GcHj500EQ3`-`p6gv1dn(k zmqGGm5W%Jt>i=l<65e^1$ZV^{^x(U%GjJv%i#^NHz(Glpix#m_g_39m03_z~=B6sw zm-PjuzDOVfS;t*-W=TvSUtOpnYY`lf2_fzyGdxAAcv`wfbVW7C(Y8K2W0JxAA#4A~ zWKOg8fgq+6&R<3c_FN-f^2l$cm|ntzkns{;G-TivTH2)5U}4`azk~-JK*&P#_kTub z7S)`MU&2e-8Lst9c)KTG!doBanwRjN$}i#li+tLWi>o+$^>1g=;Uo5U@+)XB;vBNg zhYP#126(#^ig#rt@P4TyJSy!CQ%Cj_NuJEz5mv|HT+B_~(RHl4^ErY+VYpDwH{Q)< zLlM;mSt*wk$x8i7Rx169=0_bX+eycmjkJ2hrrG}>y%XPitWLC8$=Rb2Lyw)JvPV&b zzYgJvF%J$y-Yi8fJ>r?MeMGB7a2^w4RgX z@GETkbxl>9~;sB$_4u<_&yeIaO*-%daU_9A|CkiyVNYy&KyHl^QUGlBwU0;T3*65DTc-iSO zbgB-Xtb@nvAdCDwkX|M@&N=u{co@MK9!9EI!)Qgn!VP}WFv8jpLqepxByNQw7umjt zB5D^TjRB-WRddj|-P<%m<1~7EoZuLWMPDSdoo>3L<&Ff**h_9Zl7BTAcvFHJo0Min zLvJG@FI8XFF@c^@ zONTapVLCk1me=)6ld0hjd!|*r9nNQ-)@UNp$H1&ts!!BuI>~My~ z%t^k(H<-!~7UW&Zc)AX**1;2X5Zxf7#d<0SnL09tmlX^P|D_rw&_CRUZ-XdQ|0J{(^KW>gws>y=!DbL9K`ELaO3pU^mA$@GHu}J zq>0(rNx~(C6*ylT>6i@9wV#uWpEJqdCcK_ztJqb(%~dg3S(Bd=Fkv5tyeyu`P04+X z)$(ytw=VIUpIBMMgN0NqjuipPi7L@j&dd4*)Fp%+#_;63^BZrDp?n21Xb*25UTx4N zO8sAvCdW?yrFkY3elO48w(k!5F1|Y%@c9Jz<@ww8-N9O69C@vNIwmF~oX}s-cjua1 zZ`9Drcjp>w(RF-xoKc8ZzB?(S09;^AQ}nOPC+89xb~l1oSlh-oC-?tE->-4j=l>oPEKmvr6(DEuh?4cMGQS!m|I zK<-N^_eFAFwq{9xGPK0OlQX(H;-mAo-|HecWQq9bj;c| zbHGavA2b^B8n!unr2_NrtzeCb^>xIWzM`jcPptQJOzsTi+^sb0_3n)I_(`Jm>ye-E z&tr%B7BGLkc}m1*MVJH?)8p3}?vsLuiTmrR2^Hb}bj&T#9%=CU$s(-?LfyRr9+*aw z59VcyC{)m~r(@6@YadMZ50ek(rTIx8Oo}HTOzxg%HU2X*?I~^fuWaCh$+V0Qrnk|6 zx<&)Lvkug^rGN>QJF0)N9B8gZSytudv*OCjN7iC_MazopDXdP6cI?SsgN1Q}XEeM* zOJ0{3{i$hA>abiJ^Rr|V6AicFXUX(YjLxGk%atch>3J>b-B}h~tO2!=nHG^gnTWxK z1hlD23$RO%&4kqHUH4c$YO6CX9Ia{FVTcNIL7PC6r<@jd=_MQOXnMEOwgoMr8bu&j zb~B@r{E`g>vtyC$bA^n-u{2iOIaZy3kybjSdk}DAQqU(C+j%YuYJiU>jW-EODZ9_F4uoi z>YI!R8?25^nDEJ>knF_r0ic@#iW5w5Ar2x+$lh2{OuU#BJ8!RGvbvb;D(W4~TbGjK zk4@1mRnym~gv6@2`h(&JQU>)D#Sf<9LY1$&poPr|j<>vmpU`m`aI>F~BG-Po@)KJ8 za^ssK@$Igk&>P54=qq>3PbfNf13w`?HvNReD8b5k3tYRsP8nVKm*FSG?+yHf$iWcO zPJg@qx4p>H2xq|**Y?Er-;6{F)+~IX8(X-wN6=kAAvOe7|4jM`iA}^o@)OEooRg5@ zo?h?z3E@W3@Ow~fjo-t5sj1Apuiz(?XNB=e*WP`sg^kc5*2#9cq3HMD!xenO(@8`)0?b%Y*=rNi+`K0P%vDpoV2Vl^`=Rx_hw zH8Uz!GoxZ_2>Po1geD0ZenOrkn|?y)f2p2Xv!9SNiNSBqPv{6;mnY}!Co~2Ebum^# z0a2@=nEf|b68C7`U&0j6T0gsWQVZZzrpIZ zjH-A2gtDRcX8eS*u>mU^tH`^4Lg`4^#+J~#enKTqH1^)&x{Z9e$y+_~Hj1y=U<2#C z{BpkW{Dc;{N;CNhIXLMj^eKIB`UyFq_7ifU%1>yqbJtI3Y|E-zowei`p7*J+rA~NW zegpameY(Sz3BDYEM*V~sC(Y)6o%jje0@km$PsgqJ3Ee`o-l%>;Uq?;Qj3I|We&r{0 z3z)y&JjDWd+)wE14EOc?guafN&|n7UGo)~}Lg1M|%oCPPCP6ZX(0mCCqR{?RXh{74t zqV}^YP_p@uO}X*f%Wz)CXYEs1)%tPQ1{wCsnT<{3`&9Ts!sDG>#xqCi&;GG|&lCcW zOZUY!JQw)&wL5dwwLAB*U)KMR?fKWdb_bY2gX~VDe5y*PH!t0%k5F^3>c7JE4x;D9 zbnVW;*p(vHDWiku!kva+{MTk#ET?OC7Ik9*2O_TPRtiBO2O-LHnDy^e?lfFp`akR1 z9SVvO_uX4jXJxDhuH0KW+AO6!qqxQ9Ao)1)6)RD9!J$5omX)ib`n4MFWrA`&BM(H} ze=jw2hIOM`Z{&d&SSJebiqvde;&Pp9EaZ~6Z`MAN&?A! z>&?D8=1YuBkn1nDec8)B4H!xQ#0squ zh!gkJAP$mdUY#zs$DJ(q2%Le6ca7sh|5F;J2pBF)TG@=l_jn^;3AYh47l1Wpr@8j4 zYF)zY7#ImN-yxRheS|b)mT!xp;45IJmp<+n9;k6JANw=HO3ar@T zI*#V%+fASY2zk`q%f~M!U6-M26P|^b?seVd z03rH&kv{RghiaqC26FZ&#C;l=wsrdOS)_=rx==s5L=uX+tfC{Flogpw{6mOn?qYzI zoIPjMWbrbWI%v3`*Dp6=Fn?!|%3t*Vi5q!F*PGPh;3irZcyVKvW_)v`JknoX6S)?7 zohE{*n^+^52&ZK+-EVr&g~*`h9dDD#5)UP=G#S}t8W*{ z_;9<(=K;z^Ae})Q6`I>c(p(<5iyZFi){qaNeuL@}9)oyRlTqqYcf*iYsKX*(Y7+S} zP~`^Y4<(Fy@I&)O_-3(Io)Ht!Q&51T9$p?htF&`@!yBXvI;R+%Q^35PkDxn3^Q;3)Gn?XL*xEUlM z6rB0kRy2!7N(+*wn?Wc9`I75Nu5Y5ys7-yO<@!?fRUM$xtfP4|$QQbC#Omz2H-l*9 zfgawHa+Gxu-@Kt2mL90*yOvUPjRzWZ>N020lou-)@78<$lay&+sF49xvmS?anoAg( z^e*0011`Oo0O>9cuYM{(l8gx>-|Vaz$QW_247c2HOee32pfA(b_zfCfHy}a46^-;& z?2LyTfMYb_0{vZu`A5`27(L$lkVjZGyM9> z@S*-~-%Y`q!Z;r4H}0l5+E3`OcQ?feK91DT>TZe?{dMoAa7H0s-A$1)>Y9O7RMMi) z!7cWj(T}<)(`XuThfYzOaqS8<`b!y%6p%CC?|QUERLFuL}KB72n79S)7G%fRqp zC+~s#9&e#98HIpd>JEoS?#26A+{l(j?tS-bC`!6e;}RdvGSUKRjka>^4u^v|K6!_O zn@2O@JMoi&rRLXrvuoR&wgVfey@qX$I~)S@?yX>*_R(G^tdZgLRPKrO?r_MR!I;05 zX1(5>Q8exZ$xV<5`g-IiE(2n3_7*UIy?IK+NAFI8ifQEQ4EMY@n;Azl+1F7MD#H5? zhg(1#X`nkCULRScStIUnI1B$`r%!h{RJzXC9S&$%^&Jk_#nT-QNBWa@I8Z#lqjkTG z8eg1>1;*mk`tN8lEweXkqc9k)(NuJC!W~dl1m{MfKRk6%K zD^Is3u)shiZ!VK>^45fdK8J)_7A%n054P^d;z5S+v~a-UQ)n?tf>u?TYtpR=v1;(9 zNvs%rYeFm*&}j9pAjPRL7qqP=-I^ftP`WiiCc|`V0<}bqRT04DTN7mM^L_We#jCnC zfumL?22EgH&@@=F*3im6A}{rd=%Myz+YWisvz?!-8=d-n?Z5p4td;;>D! zh2qQNUSiV4$o?x*whb1@v*quuU$_5yMc z{Wk|s)WKtQ@JJn8se=~?HhAguJr$Izpa44RGGWu;t4rf$t{a*&?sIVm_t(J#b?{If zJX{Bl*1_X-kjf8<7AM6Ffymi9NXoTMBW^f`?s{}a^v5bZ=R~(;aElj=>(|&-?doAkJ#1_b|Sx-U$ zJmszD)md%9VuYR@Xv+^iJ?Zq*v)ZD4v~^~7FsJWlX9w`@XbD-(l*!OY5JxMX>gp=Q zKV!@hrKQejB8Nz;24~z-=p*@B;!L-wTilF91GdZ?<%7}&7&Ym{6Yamct6$XiI1>Hz8 z%}`K-hGr;8f9UE*?_5i@L7pad(4M*Wb4m1`ebiB5565PToFgcTFsb>y^fu2#PV+n> zf4<89Iv**gziUf>Fy#5_-8^<2=u#2&tM;eK>gN(&7a}wBBQ*ht!B)#vRMtIpdC^eF~ko=)~jCLsS0@SD^2JMCRu1Zsk)yo9!-{EKbN|H@N90=>pp zu^L~+YJ3%|@l~wGSFsvj#m4Zx2rFmY4vU|_x0)4jHS(kYt6UJvtF)#Z^=>r@J<0q- zTr#G{RF#cEP3R+Cz>n$(Kb zq*iQ<)CU@*J}25h>WhsuziI|cER*KRERz~YuT1KTeppDeOfAS`Zd=jPO&{3aJo<8_ zayh9XbCm-I>x>at??hhkD^dYZ1PQ(iFQlO`-e)f}KNDEH|L zA-;@@`IwV#Am*2g5c3z1iXc+dVqO(ANU7-h^OwG?KY{7X`ZJimtUrb6%aQSE>?&I@ zAor@KvCFA_F^yeqwC`F#&C}R*MPbi0jR}o)<}t_}LQP^qDtz#8rIOLd{hwA(X05M( zblk&cI6d0`dn^+@`Cfv#F6EefY~U=pDxjaTu*8**oA*a&uBYoaj`{8Mm7-m|pj~F( z|M3L&@W-`V|J1Pa9$QT8hNHQjELxcI(!v+?z)+;@U|W>6wI28`+ux_pxQVIwpff*u zVbm^p3A_D~Et|3d5)Ocpm^DtKTzQ6Q+7ll z>w~-XkQp|IF6e@zHVE12>;H2j{CMlBXe?Q#${tw=z-&!C6yGuE@d2P?A5ajrmCL^^ zc-Isk8|~$Fg*{YD#vQ{M>Y3S6l7QDEXBJ;6Y@2(Pd0Icy0C<6S8lK$L zS!f~mX3E+3k%g+kKea|1Ga&grkhfGr^pQH$)V{Z^u!7JWzR^H6G*a$$pnhx#R*va{s63LbHk(67n{E zTgE8mPHYS7EswV7*N>E)kJ@2OULdNV)&Iq!*q$T7%TdS@tp5ns8YYn)YMo11Mh@{} zc}H=Pwet?zOYkzmT?*piDr%6IQb++ms&o+oQk>JFEC-%e)r)?b=1 z&Y0@zQO9sJa#g(`+AJ7|lO<}+PuSd_p8mo)t|J52E1|A$JBBg`b`#>Q(N7)^5n~dH zD~G&Ky6#v4wnh`>>7yu5$Ff@83F`Q`=v$x{>n4BWPJhj_PgQ8qYEee=V}de)T}4)$ zga+LO#6klph{xc_l;uN%Kt^uRg)=gK;XJ0|@*V4pPT(MxRjP<(l`3LcrHWWqsUntD zs)%KkDq>ls>UjOnpnf7uEyeYYDZ}5#Tl;wrCa3Sy+c2^wkyo2)4XhNau~MwYO0gO% z#cHe+tFcmS46BQ2@nR{aWjb6|1N}?~e*C44Ffu%}oBr-u&1VkOqn2tIs?pR( z@fj%KGlc9h=p9T=Vv$C>okOhJ`w~@H z&YN3~=og%L%c5hgEqW^B1xUR?zaqp4pDTo!-$o*KMsjUK)L=z`QcxL9kc6AUi*h3D z;8an_iO{h1?!B;4^2^1j4WWf3_Op(SbYgEhoWCMn{LKUg;;~NdE!m2Cyaq$J_IR=# zTUw7t+A*E=M&+Kt96t|)r%FGZRA%r`>CmBNA`erlD$l*V2rgAGUki&ss8DLi)i&ZO z^=1}-$SotJa&FFXYf%G*l&_YQ3a+7vlES+4A;h22xNWZ6ZlVOp3kHQ%gZdxE7WsmNtv zA_=MAr)(4<05=&$I1e={ag<0O9Y8zq=uSK)J~dZ)1SJ_T&K)qjByTpgP{Fmd z(Tt(aX}yw)hK>~KOw#e9KxjMbX*yPMLgB$)>cPHFW=35r>qC)Q)6B9Qsmt#CFLm0} zp~(tGEtd4t-GhX@k2{4x9g(qX$SUG5g1qh?>aplR9vGp)G>~8LQieZC7EDrkF7Bi-CL8z1(4B$Yt-jV1;tJ|A>@rXYhJOp|aPUH6^{gI0MOs5+-QWvIT53 z&w(sUnJt4Es;5!Sj0g*@?WS2RC1TGauVz^u_J3QFjc+}%G1}-JI$42Or1kb_@yRSO zHF}wECwV7HL%WFKj*Ek}j-8N~(5@jnFuTm6E=j-7Kpp<1exGr_lW7O!rNEAIs-6O< z-U0%pVh`s5Izd9RVTbg#o#Xa*irzLyOWj zl6G%QRE!RU)b?>kXfjF=)n>@2AgY$=&0!RjkLiSd*0LhHN}UF6pBv7pO&aCeBjIP> zL&xmR@_jxA4guO&4V+nkY)n9a%+fpZ4EDfLRWvY0%zPd(voT`WZQDt|4;JVr)0Lx) zAO6U5!>PP7YmNXQyC2j)AXi{;fP7OBw=8i^v5qH>vCnX2iAP zZZT;hCKry)t^#+aVbsSYqTXB39>gX!nQ z^mFioy04ZbbE9I`hjyEp$e{B$*vObDjGCf{ z+7)V*Q%q}AImNU_`|1qW>t#wSiz^KBO+47(l>`&sV@@;{XwQ&p z2b#c8Cws2d2wbUym+Bx6P?@^t>)_csh+RBqz)qNhi^UjPyxo%#URE$LM8Rs}4h>JX zVN*tMlCyf_XgC!cV!5jtRY^ z;LFYuiKP9MVaNb1PQ>#rJu?I`*a6e!4IP(ca z9h(w&?oD9m*+CxrM{TB-4gCMKfAuwa6F6Q79<>K*8+w66c=ayu6Ya-3OMH;`SPnpO6*)RZi zD!>O5;6s~k|7_SMx)B@?ZEBtk+mz5>_iPv+-O&1M7=A+Qyjy%i8QDK&x@Vd49FY@| zkvErf*K}|8;#oAvfR17YQqv5u6-_DBjaXFfsUz(HX;0 z?!jrAkgN0?a{?1)Z|M2UUgq_T^M;weJggFz>U126r1^^ttsg>PiAaBc=fPsT{)?Pt z93InRn)34E-199hR(SCMFiTGMO*0sNVa&vVo6t+s@htcmSuXhe@PNUzg zdi0#P@p2}cb;anYPjn!DL%*_y2MlIyJX5W)RsO&;f+UTQ?*O%BkAmTw-G}DR+D&CIX1l-YfKo?ICJ)WZC0HB{tr)}U+L0`2+ z+t69V82V8&!xdi+@)NyI_l5TJvsQ3h9CVY;jm3ZwRBZ3xJCuR9@XR_|>@pW%b9x(l z{(^vbPqwoz$9Pz1_4@ZQi^z;SV5iDszv!qeNfbp(`}8$=GN31R8Amv4eYN!w8jerY zu=vX9z)QdxQ7C}Emiot@x1X!An^N+y-9I(>?wg^Mb zw7^bdol9V`Nxe9nBPoH!qzATabWVVs7T9@%1vp@51MIZG3Lao*F=QsN>}$U`Tp%fd zoi|u^Oeet33hX9>1vp^m1MIB83LaqRIdGrAV$gbVcn?Vl>?VU{mYo1QFR+^p7T|#0 z6kyr&2zY?qRBp~-@uHHI5V5ZvgibjplQc}A6<7&oxgUEaLQn{O=Mg!%9CrbPc;xrrouWAP?p`YvzYgTp*IW`pBeaoOOoY+~Q+*#_5>4UTl#;N;$l4Ne{liGEx%Zu_RproKMK zV7XI#0xTD2X8UHtY^swPfE7Hz;-Q- ziD9;~ZwlLN-<$-yzI{{nQoydYZ+1ADB@P5fY)#D*wqVNovh-$Bas z6Xj>i*_ZYWryuLcXvvRli{!y>Da&PTQIt{;LMA*CcXX zqMUG|KZ8x!o4ctBF%8!hhIzbM;cPiQRv|`S+j;3JesMAy>a8A{O}dT1r1zaZ?{wLV z%i%)wuPp0OQ>G4fT9iLBIfnH(K$YZ%DPkX|oH4^piD9N;n5lru&r;ibqAi=q+v&gG zT=IWpE?Jfb(EM+9I)%9e9_jlkK)En=2lQGzo8$h$8-X+C&Hjl@EO^vEQ>EI-J~!mz zZ3CR#YT3|H|7a`JLSY&foXR7Z)9T)ZEW0lb*;2$0(sh>|Hq42>Rv5^8c!3Q_BLNCy zNFXL)=*`7;Q=sf{ZiB6!&uXj3`E+i)V5>;&*TvnDDq5%s6hr)MW}E3%HO534C#OYi zC1X3|>VwELxC7mn`ni7qQJI!TyagUm#y^eZKfF&BR~I zk{~vu?#>t5ZO8WijXht8VQy}|_^-?*f9Ibkts>@&7aJmE_0Dan-&Hx&miir4Ip5t> zInmd=8~u(ByVlIt(m%D|jc%mFHKEJ{cQVRsG!9iQ$ZU$`k{jErruL1P0ZC&Mflk+eJ_+xS}q-w zR@x1z!%6R~gzlPDLU%Wn9CSo7tfPePx>Y6AD(EgynyF?UtDrYg9Xir3&dh|)+fYF{ zCKXGU2^I8#q=LS)se+FB*1`DZzT(@Y8v0JDp<0%3B2sE7B$iv6@+UP^u`xCDX|mu) zK05tR@V!B(=&-5Q7`2zkq@$sF~il$!*#}3l2@Ww*{5wsed!{asb;#D*4r48O| z^gucH#LQ>qasB68EwtJvzI|yQ&T(CxbwVBD8?LN&9A(Lg<18B4@~WM0IQ}R01e+)e zhq~!ffd++GLe|EiV^;5C07d#m!@iV<*r=SDwj@d z3`Wj+Nta&7Rq2hol>ZMjm>Ns@XBBTQ<)1NYRKnAzmi`+v$4jTvq|0c5ImT79V|SPG z-2}hL%VPdQEkx|=s5>B%gbiQEF20U_ z>`iApldmJrk&kHvV;Vq9iIi}9YscyE0%j`Y?*!P3(JkY)LlWVz(H4T@UcBFhT|xhtO(-wZD- zg=6CT0a;)M+~o6)PG2`OQH>fHl_I{ePrR#mKfj>PU0?JHIiGHhTpc5~qQhVL^~pCS zS>aB6Ar0LN9=cz%PPzU)Ri|7fc#EBK@E32hQ!;?puv1V?)hX0`%bjxY>}%60FaM>g zQ_c~rJLQ?187cdI`8GQx19%NPC5;qnzJ*Q+`@_C}_1bjG>Azfc$|}KI?363Na+{r! z0lbEtl12(O-*Ts1`8Q*o@)LJ=Q_Mx)hLn$y6veOQe1G__R0HM^!CM?KXMXKAdm;mP z4SNC`h^7{59_tCs{HQl^ZOoeaKBU;0FOGG}*LuJl+%q;{mQ$1gvqbO~2F&Vj+-5gr z0Iz*FQS(?gZ8%_7e|xNN#&xm9dKvYq7351HwiZ8J4VY_x?Xk`?m4dweW~TkqEb?wk zLCyeP!=7N;-^o!*Ox-bVc^vbjbi&~->pa=@>+SxZ_oDSzR-+~+u${MA3+vPmlw3MIe+STA{r@y9pUi{&)l>XC3_~ko_@ZS%F zdH;(4KZw0<#N!0l{~?YXoP41>nRbcISDzMtviXTv{b}FWCt~%drLj-M=I8%Hs_W2; zO@If8wYUwb*iQ-9uJ0i7c2?FSvkr0_fsWkE7lLBQ71DkugGDz&QknrE#h=iBh z1Ci+Up<%TC(bgr9A05=i2HHMltE)lC*2aW{e`-Q5`^pfyCez1+q-`c71l?B9R^3zK z?i-Om=hWR`C&^KAfrC0+_u#n01E%;gmEv}?PXFISWNvxyh;ZEeE>ARmmpi&zLDikt z-J;^$eAi0H-23}K<9%A)tI3eyJ|eb)j2;T$b8wI-> zpyDR3^K(!a3Moh2dNO`ROk8r3FM^32y1>r&#n7E`e~CCUUnUcIfE_iYo@ki~c(y6s zzefk_el7Cww}KNxhQEPL?4wjojb^WDqlHa{JfuA1*JJP0eVEwwY6;>CLh^M-&>?&? zOeDz?wF*ph`6UEspt6)DQj2|;`T5@!1>D$p=FgZgdeLKFL zrou^{DZ0bYJ}ajS28AktKBt_fd;RE3wxk$-y0SS36R+T~19wMmZIAEN!wtOWgSh@^ zJeLr0l~W@OsDH6d8wo>-MO6cEy@nR-AaCo@31i+-v14_Rn`A)OsVjBxU>)Qlrkp`n zcBZ_Dj?@V*s@fO@!5UF{#U2rrHP|d-6ipo!s`*5oJ-P-b*T7ReImp{wIe4WGUaEr^ z>frf0h>)Aak+Idpv0|9Ov0@tIcn&fq!62^~xytYuTi3m$okpk7EINk2+d_au>ZFK> z)JZWBspF!8dygYolSWfsMCzo>h|~$W0R-$bam_bw`DUjfw3mmK`H9&;&Q&mv=s%FV zm%`oe8_X8lJ4wRo6o@n#*pA1k#IX6A=Opim&unUQ+dJQ!3Cj3c&;4|=zqCU@6+r-uc>y$8KPS5=5ht9_DCCt zuQk<1Goo5FGv`*ddI~0tY@9M^_rF5)(H2jK0s2Q+zxK#`-9Jqv#=MsHhl?uPgd0x}5cuOuyLiGM}$L zY~Tr+2{ld7=nXMJlQcGY5l^atm`uGl^ms$`?SK+0_c)3u*NQ zrbeVjqDG*uysmgnrMgWD#X>4Lb?#71ox#ZEf>|`NV*7{~$?8a^3a~QY?C3woaMb|M z_g%ru+;toTEcuj)taQr6G{e&X&|lJ_Q2(;F{(rjBpI7Kl*4nq;pO#9gx(9Rpstr+N z{Cp#s<)^zHj}T$hli%u&39ZKkUO~ab+fVpM)2s}ee+aG5KN5DD1#*`~EO%SPa@R#H zcVEPE7e*|1W5k+WX(d1cKz+$FzzV=c$KydI4<;B&9Hg<{z=%kV5Rn=mA~iZhYHWzq z$PihB%R-aV-3`t%{_aXTSX~K~ z8MgFh#awuanz>#s;^D!w_%d+~8zM3HM7L^mw`y^>YHqh`Yqx4>cdV6u(hq!N@Zd$N z!ISR5X1QsG(71swSfaXJ(e45lQ6*~hb8P}{CF04;!{XPo}S*$Taqf! zH!HJpn>j{|LW~Kz_%xBaHzRc)L65V_uy?6po-EtN&FauS%c(Vgqa>V@$MQd+a z=R|_62*BJf?HqZe+1^5(;DY%mx0QjRhzut+k>o>5< zLMB=DFfYlxm%3&~FML#QIrLnll*&l8v@(^YOMQxrxm)jEh%=NSfuLF{EHt}|aO!hC zBdVHV=2ii*!Kc^`Ji4oTS%MhqRow~cjT$x1G~^`}x{Z8ztZi<V119SMKp4)`KYf#M9cq3psf1k~>Qyid|; z=~MAahxa%5CY&cSQ205ywZpUw&OKr>`h@<8f?WC7DM3moO{W)E7*0q*_PMt7Sqjv6TkTteUQoty9)&tjm_O;>D^yTr(k^`MF>~ zgm)!)76}&oF=M9cPzP|DoW-lN4bIZYpx}%+OT$Vf%h|+PD22DeR=?KuE2Hs_k(~Eq zCCo`{^`>5*+avhwR(7^CK2)8oIc_XcAicE2fa5h5zRn2?34<1W!4YuDss3-a^->En z+rx?~>pYMtKm-1}(Ze4dV#!s(QqSvj7@OQPsiVj|kCMD+?-_1pl5&Hm0PeS5?%}3O zpn#`xB2hR)V1Xj<*13;GcTAO=KK^~`jS5i{i)WQV!hLa%b1Tbc_!ha)Z`7-)Q3u({ zEfK&0Hudr5fyJFLMueL9!T?GMgObni1WyrFSa2KXdRRz8=s^P{T-Uk5!ee7I`9(4q ztFM{93koz<=ZY*nq!9GWdmt?)N5-ca0lI*rCJqZwr~vo@Y?kCZo%3;%a5!6T`k09_ zK5838QDdX$>B6~>i#iLOHGvvae#yA*TM*zC1$~*Rz93Zlza@d;X~zLsaf&%p7Kcombb|px z0`=D~1xwT+EQJ^dWOQH@*5~4xcoj-!3-icERgp6xsR`$`Ly~9o;Iu`1vAb*Fe46$| zYp@wM!qpq%_I$Qzx}4S|Fz-oV^CyR!H3?KCgOc;*W=a3ebOr>RgUOK|_lTLN){O3X z7H{rljV=$u|9*JSOM|}a)#NiDolfV>MZNv!%guYoDxFhz%~2`J$>!AcR9d0_s?jbt zaXGOrEv_CCXTa(C@EOqI^|x{+h$4E4d&H9qi8ZBdE|iiBcnYTeL0j zk<=7TwrNwkqZm{6t=1Y!Iv5*HmHzJL3 zRulL=7U^PYNg};dHk{ov=qu`uAz{zpUSl7)5AK7WvwMd3i_6|bK7^2p?HRneBN0Zy z;Ww$Mgu|ZUTf_tps2AGhH<5Gr*5`%~f?oOHdl}fn+3y={0p43xF9PjtB{FQ!;Gy!t zCrdtkGhB2pl)2AL&vfTzO9eKA%?kE(2)&2JVAJKp@8yNtSv3-29kQ>US{MOk+2>0) z-~oNMoYml+^WZH%IV?4JE82S;l^VRIr;wPTXyiB3p0|~6Q~jPO=fqz$OBw^q3B4cp zChEB-dbAXxnooU?{Wq0!(i*Bt5R<$vNSolBxANhe2Au_|hD2I*guWK=h4O)yo*$M^ zJiPSc==qP7<%^?-KmL8ff#=Q!56ts*FmN-wR3EZpie`e7nmKsBEcdS8Mr1{!jer=G zZyp0NMybIkhl9108i-PZno{LkN_9V2mV+1fSc}|38y+ejGU3VxkcK9l*dvkcek$F3 zt7Ho%GX>wIPJdI`*H6E^UqAPkZ`RM7%X{^6ulSq}g4&+NW}CAZXGI}ApIKnPd6(8`jny5Tg;0>#Y!{EL!2rLI+(D&BZU#$ z17I(wD-NY4j@0F&_WTcai>VOGJ)~&K`U5Rde^BI^&9FWAVOK)=O;?!^rnaCew&+Xx zMM_wf#IqbyYYkXtTeC!l?}4y+yA*AO`hi>34^WO4Z}D1gI>X}`#R}f^gI+h3f~jk4 z=Db$76*?(t2_ipQFVQfTwW2(2X_z;pk_S|MqW z3(^`EYRKh+Od2%GdZ<_Z3HLik-7!z1Ep67De zs)qjyZuw&Qm70s4A-NFft=V&J7(9Cr3}+v2o%c2gX8!gb?Ov$#$vVh$8#$GSIC4<0 z_N2UQ_T=Chf>Lg<`T<3$vG<`mfXd=Pm8-+?cMKdcLtv?7^_ek}kriX>d9B^CMV<3{ zjSgRFGei)OYMI-`Xo26V?u|35LA-d8#1Gq~w`pP{O1*AdN9W@fR7g4e#Mo)j6n_fwaKPb5Tc_Er zJjg~FxhbQzOL}@-0b8QwTOm@5&ATtliVv%#4x=~ky3e%I*wG+Y5ZcInCUuhO7qlGm zsHJ#tD7I5i>DShJ+)E~U3Y#$RELA;q)#2!=Yg+rL|LvB-U-j8lP2+1jeBF)?uxDTZ zF@yZ<5)hm%Gh`+5kvA_3Vd}uEM0JI&_CS?w%LMGY92;|8WT-flcJug?+kFuUcgkUQ z+}MFVO<0aN!prUVM6s5b(H=53f%1@*fnKG8!-<&J*m*l5G=ls=Jxb#$Nn(vQy6`r7 zqefi_Na{FKu0=>nncG%e?E39MPt{@6Z%lU#A36#l<~HQQ8jk~NRSz@60pv`_il)yE zQCG@{s0t=CO#zeB4N}4z29y|`uEl<0O9{?u+fjCUf~8JqX<^S-5E)tA?}1xr~kWc5gKtZ z?0N0dU?@G*XLgZvIoI7&X(V;UakQEwg!VyG{P;=*Mfuu%+9P81$f~sGyom`hPR_#M#>+wAS)%4AzV4#}5 znG`aP(Iu3Y9Loe1Gf}UISEDXOLVKc(xfUU*MhWp+je&&n?R_!AtnwSdJA*j$Q7spo(F%W7rw>Snjj4p$S_K z0sI)F#@>CQ)rC5#_wgZGZ!c}-ZY#F?=B<*&w(kAyrN>cCq1YCUTE?9R46PVF%#(H0 zs%>kQn_i7F74{$!N*jwpbGT87oo-ASTEDWQVJ*!H+RMmPP@Ez=Eru6XjiZvsnOQn; zwaiD$j;wax`=n<9z)pSwkJaSk>X;VxliAo@8n3Bg)Ae>8lgwTg1{CwOfRJajLNZk> zFtvJt4D+d_HUZM1OL5|)v33p=E- zs};!2ADU|W$wMul(|Sb$bcZcoZbB%z^kx$s$=Jw(Z!M}?a))8ECc<4i;rM$^>UNG? zA;SBD@#PYcnH<3#d&m=k@dand;arO72cI}^PC@|8Q*7ldE`DM}lb?fTj=X2fKo$eN zz6Y1;`kmd6*;Sl-dgtQpcDVLUd&=1=!u8rSRb(q#Ko$8Gd={(7w;`dc2=^n(D5gqi zJf4H1J7!xCifS~(3Lg0{8e^~7 zYV2yP>(-SYVl|N!tBJ2z-6@K#VS%SaSRaEj2Lwmt%PT0s zl-ce7RS)@}4+C&Vns5U-#cJdftC3TzMozIBImK$^6kCJbO}ICjRN>-S)2l|OMx{oh zMxm~LP1Q9EYGCXTl{DnxyQViI$sq1Uj64?*3^&Vi=n`T%s-X-OG+6G6S?=E!oeqZW zc4G>*e7&)M6pIu_M7TPoX@e-zrOBHyS*u^|4OJE|`Fb?%-(z9({AbI%o#x7^=gaB6 z!)e)<)8yCFEXgHlvM;k!oMv0LO2ZMVwC_`AZ0cf6#bm?iirqx3oGsyM6G}&;ygBua zmru??8dOraH1z=>O??2oMYps4>9pkvJ2LH!Pg{Oeb9QTV5v$HeW1Y5yZWsx8(YNhI z-@k?wQkz>F9k~3!02k5GB~-ua(2PvC482u-fVnQQEs(|CiIh3OL$+sVuU|(VVP(bK z*Z+vRRPY#{kLUA}ibf(ufXjc6ww`{n{}Dvqh=Vxsku|67#@mXMT`1_R!fspf0q9D3 zM!mD=jMCdq(bN*F!m57JGft}M@nE#_clv*LBMP7%!vU{`1g_@M){1oY6JA{``|LYc8xf`C5HlVa^#fh-%C#8;rOIk6Eoo-Z2qg0F)lSq_Xuv)A#8j}9!su^uhMeWRT9A5_;l6HGS$SSF4 zx%Cc0GIqo!9y@jnY^m)Qr1eHibVR%X?^o@s9Afyk*uJuFqal*Q-zpEVqlVN?=?Qr8 zNtNd$Jk!=rMFnToDg2E*Nn6WJ-Jp$@0~PZ00#|F{;M3CLsy6F_Tuc>y;9dh922@Hq zwU|{zrGk6|4CAN)2jnswFmJ&500p(x@+q`lZJ%USv(^8wRbyo6HSuEqPo$Hvu5C&j zrm@FcOH!4<=orSlEO8cNb0~~^1$+wodABE}B=Vv`K_w3af^dY+4g!xoy87%OaY=Y# z;nMv-NRU#UHBzD=GRJ2JtF{Ny6&)iA7X%F=imj|70L1~!vE%qu6V+DzgNWSRJCUKH zY(y*Sc19OFlTZ&ps>HL;0$*L^GkRiL86KU&QUwC=H@GRKPI7PLo#fz19p_?OGF6p? zUAw``k$IAxBXxqMLBePBVsu5f>5Lv%mPNlI#hxJ(og_9y{zv%6XY}F@i!}DpUe-CI z*T^FM=Kb1oZl2L=e7DZc`n8bsB5(7PQkrM^GqFN?SKt;8u+diY$$gOIb*U0f`OVx(0o%w-u+uCi=M!>ZDi)2F)V8#X-B(2Zr z9jlGpy@X1LQ!*|k!;!d=;``G7)3KqL))qF&bZW1kzUT zRm~vt|637fx>oD$ca57gcQ6amvGgZNV{?b5gL;J|!o(RpL<}nvO;t}n-g;Wa)Z$nq zzu)FQ$%lq2RY*FVU~-l$KwHXk?U<50=#Ys2gU-@T7J53$FgfNjm>RhHpgndLP9P9{ z$5U@U)&DrtfdpXVEZoyxS%PTECsUKgzU#tiq9jT!DI>yYd9lZ1+- zZG+^VfDTGl(@z>Fndr+(vk+s~i;nW%%Va@GEXv`)pNm0TjHhgm72AvLBem2cCNb#& zIq0w|i|&fyBQByp5PyyCa&2yw7iLdW3?6?!Tv+v3XSCv5_rKKObb2g!Q!Sm~NVgP@ zG{zvFF@__Zw``leSzwFmDCw&4c)L>i!1jbaN(&8;cClUGkF}ec7YWbEFzT$;sWE2m zo~S_y7lkM;SSyaHBJCge+}OH+r8Kfx!U79~g-dmEEYObzd)W*AT4N;Iiw;S|MT4Sv zEHU2CbRWGG?1%whlakjKjB_n5WRi%%F?QOlDK~-`6Djl@-G;|kecJ5J*mKD4d$i?+6s{FQn$=6*P_A{HO5?|v8p^tD_S zbB&nS!`8Ec#k1#eV;|G*hg$G(XK0v_(sCRjk=N?1yYg~qAos%rH@hFAY})6Sw$U}&h&ai0P-=Ci zQ%emglk1=~?Cd%yRRz%{T42^fC0v{d*TLncDaM>4Q)KwC^(PofT8cz+VB=ll%5oJb z6^#X|O%v2NX4j>8HKh@a8(|)$xfhSrWGrIx+1YFl(eQeItDsu%b4|O1||cX9>AUvPS%P<{l_)Mu*CT4 zIv#&-7&{T@Uy(~Zj@+ocy z8ABYauKX;FGJ*<9BVFqx+Td}7cbQjD_AX;w*}E)xUrb5>p8|>zm3+b^ z0X(8@;e*_H{D{Aj)0qZNayrwfQpHlBm%W(&S5sk(l>``{Ofuuyg-mQ1OqjPOBwD+9 zL`fXNlnl6rk@0o6RYDH;FIy%Ap?)ObwDl?0aM7zhD_f0T9dp`(E!T>FZ3s#H(`}Xb zSDJV@Rg)a9WC`gtw^1U~RNg_zWn7Xuf=9>Ya24Aqe5ALWCG{%Yv9AYDX*$8RMS>1) zsU5D!pL1$jII2|&GsO}8GI`ir%p(AYt513AF~;GoCGKY^W;%gVkS#_?DiB#KN@@%R znyhm3pbDZ_O^ZR5!3tWEZ=tYElHblt;%dXo&GDe}Fgaq6voxp@y3WOzW3eYT1Tcfj z799^N;`N}iwvfQaw7UMF^6-p7CC^E}oou1K{-6pA6;1b`YWOofHJtEgT6c9=Y=<93 z!|cx#iv^Y!4S%NH<%a%D%~gnC0qq;bpGn3Zn)53BnRb`A=FfBsI(YVH5_0nwlU+^v z_^Y(5Axx{CgW_h~Vbc5oYug5h;6iiwF#UZn#DtE#!XQk202;iIBv3xbw%$v6HNpyIDK&$&7vp}u< zXHWyyQ1J#PQNs$e=p_Ahccf?fs=v8{YuqME4yhh=!Wx6<(+$t4ru{mWEkne+Y-hHH ziXqonLnqu+Bw6jIa$~~^!dwQo=0-SC2G6A2EIT6K*UU`?YE2kT@~(q8xbW>rTIC5> zt6$i^nrofaEcpxQQ_|DG|n~B(!hd;AVA7_@7``TuGdO+dp z(=N1)@Sk>+%FDX@_Jx<`4EDd#qNEphn2fIB)QTk#Ur9gqDF0mCLUF{!ftS!(d|TyW zsRu`vpVxzm!tirIoL>3?{(k4@en6kDk*(0jnI}4*<1q0QA7`F;l#j!isC5~Tvj%yd zymIbTxq};nT%^FfKrRU6fNM0~jKOZEAE>d8i0rH*%a%Cfs8=|%XoXv)F2{`=( z=g3BIHpJ%$aJZ)de69fJz69skMsPO7=NNGA2aX6TBAwU>!iJcf0K%JqAo>Zy>P8SY z#9{lM;hO=_N&rr81YkoHcJ3K+*@PW;_u5H!9lqJH_T5^(Z*tw@ly!=3Snty+y4gj= z5$hD)u-0c(^j;Sg6RcBo!&;wJ(feIg{k~4o4Qu_dioVH3J%ZK_uMKPcgo?h|MLkm1 z7F|=TM-HXF$)(i2>)^Vk!WeIh78QDy6<_$XEuG?)FykLKzjt&V7`{b*h&;ABe1P-o z1ZIYB9k9QtO18+>$dmNLw{f)yfp-qSdGN3T+lJ*}pg=hs4jw`JER+u-SU#iQ&q%^- zm9Y8d&nfs;37bcr_}0(y=g*Py$P;hj??ZdbhY7y$1D`1e>n}qpamx}_lb`LezgMs&Hzt0JOu6O+D!Yc z8`6HAuB8IN^EbesuE2kLfQL?7!Jn?poMYOrCC)}&`v~A?U^iobwgSJ}3iw;a_wL&p zPzU%o>Raq@75vi)KGYZQ(787z&y73xLIocWb&W@jThRyBxG{Zh+`E@5_!vD5KhcNo z&AjiSwU+nEv5sJv=-w+8eAW|&Z~Dxrf8TEIe0yo;f4jKz?dHz62X~TV9roE;s(<+# z{d=u~kGoQ)58R`%o9XlR^#>O@ZX_ByqeZNjfMsx9N$_F+w@dKV{kwtaA;*pRXQ_gJ zEx~`g_@}4-&Gg?;_AohUm=7Ldn8qwqXqLfr)G@((|oT{~lcp=}Q+ENog0atVFqOnyvh zWCnKo(blu97cSeBcP>21_flDW@Ag@>bCM-zk3zV9pwr8f{Mje_d*#S?fwg2*e=)WI zar5YeC;5qvP}^2~NK>@9BeG)!vCFwEo-c!jyrRzQm)&&^>tvA1-{~*isQG7#LBcVX z(Kp@xz#KcUY?SA1$XyLj@|p;(jfp_N)kKhacr6jYOY{;kFmQ4~W#r*6`70`5m^{fB zt*xPL+pp#*XTTIcqz;owwf{K-JJ3_3aoOW;Vf`NK+9XAF2W5s6$JmNQ!0Y9FU{LF8 zoQgOHDcve<$5pw>Td;hzHz(h$er^0}&ZM*Wv8m^>aV^Z7+lmi_DGO`(v)PgC8CySY z=q%2_5GQzGZ0IZ=eAG&36p(J!rlEMcEzYiXB7^(*Tjc?E)R20D-9@u9f2%w%JB7a$ zoM3nUMxJD{%T0xpSe(|h(SzJ(nO1DTTy8px=N&w_Hc(8?;#dx|olvPD zPfukq2u5NV4#;IVVBUa()6R%-Uct%s##aCPv$MF5MD+K|Zg^o_qM(hZYb3zv0vWPF zaWy-OQ=lAo7I#V_FQy5oly0RENBE%`F?z#U{B)<(`de5Sf&OQ`%TL`=XN{Daj#$Cr z@&9M*+FUd>2YkWt;d-hs;?e+4k=Y2hEExMV<9-S_5jAVgjBo_eb zif`u8wm@a+2F1m};sMq8wm>$L1-e}7Gi<@ir*!u^>xm*w9=}YErpUqKLfUl&iz^45 z1pqDPMs62-Be#pek-Lb+4i;C%T~v<3U38Az4ocHC2a5-F#k46{{3UsTHE%GgFH%Um zVQ3u|AI}dD7KaIB_JV(T%V6=Uh)TTF4HmE7M-^?bc>M}G#Ov8!=u!|W;6C|zrd;*w z_7iYf!Qy$i`gyM`1h?o3dpeTq?$#rmu9c0s@3cbp2OYlVDVod`E>7# z$e{pf8!Wz22a88nf}ILBUaB)M(&txG#JA9px7X5J;oms*D>x`GFQm0O;TxY`M8Jz_ z3DJ0aNpHQtFqYf?LJFa+&T13gB-w#TV`7<4vKIKNNUL2bQQsq292Rp3sOY=TqTf&q zB!bh$lN_Yt5B8e}X*XhQ=pX!ky7}U?tQcQYmWhr?j-&k&Ena;k^@)#&63EQ(ph$#6 z$cD|{2K|X;-KYcJhib!QF|f(kiQ6?PRpH`?QwRG~UKySdF3v`i#5fNncl%4c2a-VU zH`B7#wQ9lRksxRKPt7@898kG6h+3o$#)ut@p%}n;4h2((iy!KUK7a54DW4ZuT#=O+ z&lFEv&y?7T_-!>)@KxVUX8tNl$xy!}d^Z~-TwGHn?BDdIm=?2DtxW-3>3`jL@r0+B z(;8Kpupl8}5;Fn|tR~FOd0<{5IV?XBcn2nyIm6-YMXFOxzwgcCC{N_e>SaUqo`qTk^8?@$YA4r^mT0K1M2r>y>q4>4c#88$=O zQy6WO$ndQy?c6Bh%B`?rB+L^tJ1k2_kPECAADGhceelp^Cu|A``{zScs~kSAlLBSWL2(DXpT?{mE$WWcqd@VkV<;QjDT-dP-$qK2K9f@?Ol-`h zY{g*OlzMZFH#(wYynoUX>Ka<$a;gjIFH?ou6ywdVU1gv(Vs0zO`$CHG=95~QHxiQ< zq*}q?rKV*;$-YlKd(tu`*bk#J=h`GO(P+2}+Q-9kH*~~!Z}ivsKE86F@TVZDq|?b% zM`OS^OP#fYGsk$#MoTf?GU8Hy zO0n_cYAKXH7%gOxzYtSRY+EcU2jBAu;O%X=V{gM-OX)yXcLtkTXa5&4P9# z70%5#GJYg>L^OT1l;j$x(PgpRXEB`VIhJWY^2FOkP`^y zAa4FrKFvQD51IZQO@Eg!B&K1(Q78Kzfk0GUe=I(e;l#)TY{9+K2hk%jkpQiGAgYh9 zr~wh$VpoC{xy%`qJat1uIIELJ^@Vv-`ZB0~#LTEx{i1-Rwkq)g3AbmWO1$JVQ4N7yq9)e83Yr8JVCaPcPx;iO%6U;woseWKfsG@rB01%0K^mz*QFj6T~PcuqQ z630G^>YMN;*HqtXzSchq4R4F;RbTnyVN_53rur(}|In-x?!Tp@pxFz-XeM&Ff7p#! znpL>}!TX2%*9NKTqPB0AaDTZ~8P3}X_docE;r@?cj^%KFb#Cnsl3!G&SrzWTeUI`W zt*<3l@1uqL%ZHk52V{m;<*IOhkS+1h=3rP|O~;A7P1k70B(iH1lgJ)UOrqi%l}WU{ zaDUlN3itm-Y7w$J-2Xy^`@3f7uJTp7#VuT_!u2`UZLB}o7$YJ;jyk#h!uO44z-olG z?YHGhg)L(?{q!K>{cHC(TxWZW&Tq#ZEe)j$0TvDnb0Cq0=t8X)V5J=4aVb=n5`4dPN=S&nYlDsanb8zM-G( zr$Yx%3?b%ev-ThTo6RzN8q$7-#J59o?r9E`ND?-LNSJa^s_E*?@A@J#(tCxi)8P~7 zP`oayiBoB&U)TjM`QI0B^oN7LqIB{;~e)UU{8>xO->(pxx!;#$2)uPdv22nk_$|^*LX}e5jwgeMHn7NN$$~! zeyNKixpTEg+ea4naxPpZKVoX-N1_t*$h*fhD*A!q>P_cy z?wc?gKZC3e-M{F^`Ddio5@_3`qsMv8WRgd0Z=JVCd4vAbWs98vC;f>e!IUPzB?VR^3-*QVL3w*VUjSX5GA#@;sHd9qk}^${lVR*C7h*!C?2Sc?qR|vXP|YG5h&-3d(H^FbjC6G`Y<7{GmbkWFx(lh zIU~qG8Fn6gy3yfvLm{S)j&#qM0ML%Vd%_nTxmTUbUvg)1%YcA7_Fn0Xu|ADxL_ZSF z4vn)EKBZ&C`rtgusFBqToyuG$T3{}zk-rP=GU4R%H+i|EED$7@zYAprNFRIQ@d)^W zw4mu_jfGr+)IQsVT*0+J=kG$UfZLz*cOh30?$7zVkSj3vb>BvF+qhf{XBX_w=6xiUn)SL{%56FDUwxi6l~BKK3G%OOz_HuFeOGg#zsfj4sCzggpF zd)k=_JxXOUw-ufc?PkX*kMIwiCT5g=7SX~qRYVd;bgv?Efa+Osa)Z69a#4qgoV~ME z+FgADc+dMUM|*_>Qv+>Jewh~ZwIZ}ah!I`X%vM!;b@E-50zB98&2ndHLaY_ZwSJOo z5cG;9%I4kCUEqW3Z*%+A|i?GGtES)>eR~N}r~_TNc`K;CIG*4zCp6 zrqup&Eyo$(axKH1t}xE&3L~AaFxKe`qn&2Faz)kSy+!|suXkT{0b97~pK5Lop=jqn z-Fu7i5bo_VcPVp;Zf6;*x&4)DZgr{x!#>sT4D}Q-NFZ`*df1uTVP|T^=$V>5xvRs@ z)Jjy;Q!80gPpyQ_mQ#CL*!>7o3&R;qnc6e@O;dZ$&oQ;<`!U|Py5oI|@uGXD@s2uE zJL*jBNaM|_8B;aVc$*fLM;dQd$^3qCYDXIHR#SU7^;J^~6J-oBwfE9^G_}Xl^l56f z@B)PTlhZtyedu=DDclOuh?NiSm60%&+Rnu^;})NMH;pz#ra||(IfM6w{(AE#l`izz z9$n2CLy>~cSo{vsqU{t>QX%*N#3P;#1ha;6-e0Zn>7!xPFnoufgKE^=ZjeB z{kcI5M)Hy58!0Iv#$Ya{2v$ii26M@7Xk+jjCc@ac^IPLExX&-1U7QTiKDu(O;4U(6 z=_`8`fI1z70c!t}sADe^o=H`^Kx{$Bc)B*FY+mKgV7;peI0pOw{Y=N@VSGUbc{6 z%onfth`DkXOr-J!ERo8WutX|f#1g4|8B3(NkcFA-iCa&ySFLeneHuk1(P92tP@W`aw0*L>!0OG!rNF z3ktmEv^t4I1@?X8Doz_&xRal=c=3zj_r5f%r+|?(E$}7RPxjY$Grg2tE(q7&fd;m~S$hW>NY>tgCJa;8Ab}nr@`)c#NY*FLGPi=qNzO?;l`_Q((&^Ch%32MImEJKEE!_7m2!k#+!si_+PzH-zzp6-Z}$aF@RTH|*|MdQC8%bhlAx^anFIdK54!}FPz1e094+|qk+qv;=z<8% zl5&#>&9e1Rx(L-dSw(~vdHP5q^eZffi$|5KcK7S-z(0dT1UsjS)HKfqEm77V#KAPl zd?mx`lA;&j zZpR0F2sYfe3oB5Kdzj04n8O&R3jl{GI$f>@GR8YWXIJ#4{C9ZaxPI1MU$RIa34%I0 zmQv`?Xksf&0cW&Lm)3Q$;&6&?_I(XUmo)l2+oih|2LvEfO7YW3+@XFb_j#^Z+=Wkr zbGSx2XKh!yVzED6`qPYwpCgLg0zkO`w5m1MqUQ>Rbe#R)kUvnpW1kRb$0=M1Xhb`y zRqjDX@3p^z3b;qt6-eVnPwDY9DtA3J%)q?QG;)9O57E|=u2AMcr?EeouHo@qxF-Uh zPt|G?+F!UQLRHW#4K~`MiY~-Clq}<_>nzd{_NIx~{l?8+pawpao00cTxx1t{@6Ej) z?1@-kwPmHTqM8YK>6S>=A75OTM3JAB(NLce*_TEh$UBP;&=m7oVQi^2W|%Jl3~j>r z*VcY|+>DI>eAX=BC|YRXC=X0pp~10n)VD;BvKBG27C{+J;F#)1H4O@bjGRqI&T$|o zh>sQ~m(Kc

tEFa;8lS8Qx`bgf6SWd9{46gZ?^n8YE~uUJg8_TOwOFeN4xqSko`& z$aLk2^#SO;IvvWzEsO`9joCjnUHz%qs?a)J$(`^l-5k35`R{*~&sH@3E1Hhg*V&+< zmIcn~5Y*;j36SRvPifuX6sOy}KoJ5l=^1J)q)2IvuTz?uV)qk{agi#7D>cX8%toS? zC2f*i5$>)J7y$)nQ@ENsT6#}M;gPuW_yTwObcJ#l9Lq;kcu4^Wd=uPhMFha))A;)3xC@-mgij zpK5Tq525=$zMSMjWzKQ&q=a?`eMe4c%hHoMp{-2cofC*CdYit%%w!lTfk4$b8J?z2 zcM5_@`l~sG`h>6bisu95?LKC}$jTHQU~a>m33ssylvjSGUv9r|-V;nQHwVc2;!y!;H6Z(097PR;(Zp@>6TxRA9 zIYAAyzgQE%D&`A_wR(kBtembEq{=+V z^;?!k%RID8qYsz|c@#Af{4x_~BzDqNbk|0ES`nog{yyD<{|gZEDm(rucV+Dt#{I|T z(vUlB(^dn@`q=)51tp1qw!GND*K=TpK#4X-8v7k0*Io`AEp@KF95!w0+^M`AgVxIt zHQ38xGpR0XFNck(I@ewfn_MYZekXc!kTC{97+Hf_)^{P+cP|nL#fc%;|vz z;qIV|@OBg&e~fy;H6XwKIFDc;Fj}9$7nd~!I1nd)1>H5HC0)oYf-cBo!F0)Gb+9bF zw4RfX*PauWTw2cw>n*M4gvFNDbE1`&qP?@sl07Fu9Fw3E5y#_!DWaaoA{U+|-%08a z9yw7L6z8$jMl56#dEo{$=|Mb^R~fUAP~=qxErb+#__wl=0XaopW!P#}M=)%S+gMl$ z2e5El#6{}aFjPbXxP>@jUGIed=!V>q2XMu!@Q;5UEZ8p(7!-<+?{{|(SJ9DDl;0&H z8V66pCoSZK=aQrkiq&gMtX_jwkUmKJ3xke)iwyygo!~z3>K0K<1e*|n$hS_qSg>hO zhE57`?0sV8;8(WTjF&^|c7ps;xKdByA`!0C(~K*~57=HnS2r|+7`au3uuozi97m>? z0sde0OmI%lP#QmqVUAol>qB#xFc2}m6Pq)M+25)+cq?6_9J;2&^2Y8P+QNl1Gr^WO z)BFuA&vaeh*d?TIV0){gk@CjQBfWw3nM;&6@S5lW>~B~8Mt=1ZgJ%Y}SooD%e4RB$ zF8Lt$#sI(jKv25jH`fO1Vt1rDQD`83z$GAq>F#F++*(4;)4dI3X`CyB1B`lfu8;%5 z1AN5v2B;%bm`z3t3@~W?oP+mbNf7c?9zdI-%*%i{PgD1s#4oy$F_?Uof~ydJ%jz zzW@;5l3px2wE)_;rWchPEMWkwGL8%bS1vSZ5$Dap`o{tl)<3S1-W;rd+Z6U1!UIvm z>Bga%p{2G9FNy_dg^&UTN-;!QE4UDLtwc>Kpv|vr0MucRyg#lTWVQi7X3Ht5h~E}nmK6MWD+NCmxsrk`21$xY2I-vZ z_)=0z$7V-La!ki(M@o`Tr*TJ0vQVdTM@rJtxZ*k`Pm6@t(2|@*C{6!Vd?4YK6k16& zRzuYpseK97D3IQIDzv(!fc3S%x;9)vm`R|a<4Krp((yz`t(GU*CJ~dv^Lb`NX_i&u z1ZvYeN_Qkp0E4-ZdnL_9SJL><0dH$S+=S49xv|^zzbG7RWY0&%!E|?&nPhyS8?wDs zp%E{X8-b50A#EX-6O;T^WkwUc(te86c>X|qHJSvxWB z#kqhttLnL&lV-H$y{6+B@~GrNX(j0E||3j6wG=TPh!38H+n%cEO+`v)eJAptm8%1 zGhUck$BSw(yfCwl7uEQAVP+jKDvK9Sk5oVxKESC|bH z5i*;BxoTy+;NBfh$Kl@P!G3L)#pPmM;`0cwf~|Bz+_8Cd@EDp|T4JGb+-_ciK#Nih z`={gVvCH(vx#j-ssU0`Ad-nI9wZfNpZ_o3kFNof`LM%JvyVps-AbzCo0ma0gl*a zx=UR^QLR=C&&_CoyCTRu90G)mO*ehlxYuhoV(P>+m z$T(o?wCzzuTTU~3gEV`7&(vi6yvXG3bVb`vSA^|!Mb%D&7n!7;uISn6ikOvFr&F*BPpqc@ zi3)Ps=CKG72{oFWk)NauYidKC+VH2$d!H5EQ+)Ojw}pSCf(y~s9uQs_o7GIi z4-U+i_YVeI#AT$~Kt8=|F;}S;qm^ngU8$A=lv)VxI|NQ6PtVvr^x58d{UTA%C3n$5 zSfATQv=1kL9-RjDwH%9aVIlNUskVnowLMg-?V(a_50z?rsMJCaFVYot@m}hpk4B@5 z+O;E!yP$l&Lg2fnDf|(Y>U)#o;E?dPXS``UMxyN(iMCrL+Fp@Z=oAjgP(#cHbb+VU z5O;``IgGU?&UqHuTPblDakbIyPFQ5;0#81uWfg?1u%ex1ErhJFpUG-vWN0A_0o1i>g!qvz;tsRClsF&(q7wHk zA@Q*k82s2i`sEu#qHP+Y&G?2|Wz(Tn3>OSDR(o>X4J)naV979h2XQw9aCl8vYZdAf z`V+mc<8JDlDe+UFcn-rr&2<=@gl_f1W3aa;LRv@E>+l-NDMBU1*fhVfj-n*H#zs^M zty%u+bmc3vl`5_#MUSi~PE2v?VXR@_yuRK@`EU$PH$bG1lItmnCcPNjM$^~_%BNdi zc)BkipWB0$XhW9KK;Vv#}t4eueZMdZ3%DCs5lMR z))uGZ+8o1rp@^2LT|5_*9Ybsc9t3Z>VH&;VCReHQgUQ*4f$(;JogsffFpSYlodS?2 zfrNdsi-7FiACNuW`IG@Em+xjkGBzJG3_$lZj8$PeF&~sKkkoP>B@{HS3HO~({Ms|! zp9?S3S8~x!{t%#REm4582bD_MLdt@RW}o{ew4YCyYi)>!a2}^imc)hn@RoPu&Zmt5 zOCOxo^Itw5PK#^x8a@r9k`W9nEej{(es_wjy(XrI-uWaFWu$h=``K(C;)}(Ap@72j zNT6-3Fx@8xiwSKPnR47n)S?wAH&N;l8uWz>r6v0hwWqYy6GX$`D3k2CJlGicrcnly z%AH3NTz%J12`W4!4gyM$BH|@4n`r42ZUW+pnaBbL09995g%J1AdkpjZh*_Q=G0O8J zCV75D_sfqsjPoN#f6LVr_mnK26uuTy0-&oNJ(o@5-sDH~u|Q`2#VrwJ7(+4Kr!PZx?@@pSumvVBAq%AawzR(^ze zWXm%3-)BS_HKOr?9+504VvW<#Q5Rc0!KH-{XHZ%=+CJWG+r861-fAB=+Q%F1BdoC7 z$AT=;DTpsnIFbcv+((}g0S9DEQkTI%0E)X-oMBxXDV4*pm>B-LoIs&m#!fDO6KO|o zh&ui*lwD*MKEFd%booV8(d8MD%cy9MzolYaJk0_+>69jRKm|T|6OoZe@L!kd1|s>$ zkY?{-Z^M6l{>O1J2xu3Vy$sNvYZgm-d3T@f43u^uM!!%*$phW1wKi43T7YU;{M0%1 z)mjD71HzO43LMurXOVH>yROy>j_uq#|OH12*a}JPyPi-??y`?ZLiiknj!}fTccEY$Sj(@lHLg$`TS}+Wx*O00zSPJ{*BA0 zLOVV^Nsq;?g>QU%DxGN{MC0vgy%k)pIY!~{rGrqb2vlhfNkpSLgoq|?n~p?|5;Q~azG+^<^7}uGDc8LYmzb<=%%{0hYR;-Z6X@1pHPYCy12U)dw6kkLJ;Ib`ydAB_A3Q+COQDo8 zG=yZrAD*_xA2BjjS%_W9_6@Z&gf4UKq zP%ox{MHpn4Nk$?k+77`0+WwGeyF;Sw4T-ihBsTR$5ovT~aW||zKey1^6Ivyvljxl8 z+Vc~b6&y%}2go^t|)~&YcV!SQM*KjEZuA(v!6ZREkpXK+{1I-s~%F zepG}#NAcx^si;fpAiP=)vuE%+ctl3n61vjnh8ZRV-+xhjOkZDYAKz#niG9ii2)oXY zRFogD^0>$pgA1n14B=2}TrBE@e$_`ywEc*?+#`GfB4aKr^tCwG`{`Po(|z%U_{!tL zjqKD~?J-{*Gh3z1cXz5xU0XSWYBT1HF9il5;izA^1l;j2qsxv=Tlq=ls|65Df z;?zc_rxbISA?SV=Wcs=QMy6xE=$DLwC2fdb4iwL7TixA*w&ZAVALmfYfZv zaO9!TuPudZVfhqqhp)!T*S}mwLCM#@TtRm^iP)rGzVS@&NZ9UCuyXC>X#^We~G@k~hrv5V~3=Q)c8NtPlDD#zEm zw~437;E%Eo4h~^vAX;pU<<20O`kY*1)}uyUoKi5gF-8pL`tZe~nY53W+sBLTqi#!2 z%Fns>@l75JFdG#(lPs=V`bD9+=`>openlv$t3qF_Y$4#NUKxo(4gQ8P z#)wx&yb=)ACgf&pkQB_rB*qv$Rz*OHWL-X&l%fMu^YugAXolOvVlL`bR5^Sgw_ZLL z^UScOO9A>|$>{^Jlw3kD+yk+)=n7riqAOaZQ5Pt42CkED3OWndQP(`Vw$%$O(>`?7 zs$UenKm`{p1m#4> zTUIvcqMak*laf~C0rhjZERfMnXs|NU+-;V^_}o@%1^YIbkJ0CmSy_YgC)Z?^^+BwR z>xazBPK_h9PNvn{wA*piv%YOk1_vjh9rSh?-<1-U6L&}~<-{!#CAtom{j5aS;V_%6 zregZRZ=wTBn3S*mFyIyyep$YZBjh;o0~}}~3vbP^Q&<73^eLduJLb&K38-sh=m@B5 zcNaZb?>i!(uHBKu#-(h6SoKkJ)lxjPtRNFbF+RiD}c222Ho!f>B%$*E3SlgwxJ8f6mZnRx!o8Q#56j|V+ zC?CMGPbrZ+xKw+*$fo1gY`gBRhoBtNrTDtU5h|3sW7onqgGNqPK_e$O1&y4C;}G$1 zUJ6nVuC)_1@^*tp{@TMpxDzxYRNDy}iM6Kspa_v@Kbe1iHmxTe!v4RVpb=Eo&}p>U ztg^8_$_6Vuw_$5kCurn1>7RlgGPw5wR={< zDmy_VJ3%8mK_k6+iqn75H#{zJ3%AwLeR)>39KURD$HX7^USd3Re(MR zjrfC&k8IEgtZXM}1Q6^5jl_=BouCl~TX=C?A^bZ*BRfGOJ3%8KT+qlr8O2E>r#S<( z|0K>)ZO(G!N7$fp9LxrjUrs?IZxN9E%QaB4&X!(4vf%|5*T%Cm+hyJxB<7$yD(7#?5;bE47nZVaGVnI6jAA-mgV~Ir*!SRskJF<#;p5V-h`v8RE+MN51(cWUP%H}& zX?r+t|2*gzwuheZA<_UPObCA7I#?qxsW&HnmBRcjo;hK)?+_}RwF3Y6TgpIX(L|aH z&NMbM^S6|F(>eSt^#sE6H_DW~t})mc_@+^6chZ8Pcsrf&L5y&Z!`>%r+VDWy3!O`%?-JudWUg94eST#CJp{$SdGcJqGh_D(qoyu^!x5^2kfaKeXT2-WLDF$Pnu zW2+bbdUBzSZ%~_Ur!;gJ3pZ5I%?!hMU*H(Y0?SA)0Ma_s&0KK{RBuqbLD2YO%>}Yi zRe>(CB*PZ0bP5n%XTey+$>W#F(G>ac2_fye4xdm?7jq-Gi@lNC#o)+Y#A5HsQN>+U zj>27Zj@%AP(>2Et1a-x<>F|k{7?0--R`o>+F-by0n0!1BzohH*1`xlfV5`F?U;_X& zQ9n_>TO2-76;VLvOWngKs`m~Q=90&J_(c7R9uOqDJdXn~DufESPdHS`>-krR$_KA> z_(UEqt)53TUD5PW#~bWB$~(R;kk2hFI((ukeVXk^asSHGy)*1-y$C?m_p{_*@)b3K z&P>bXzpvW;@>GXUR28Y&4fOcjEStAok(y=yxelMGN~>8!yGyHCA9j+Oy&;VD)+`uI zfAR|?pYDB8TiOiL_V9@fgs#{L^fpSB2Ro(Um9+ms*vRKs(+LtnL*8CXZ-sy3@~O~{ zmlpu5sujNR=|x1ml0r1z>a-5;-#S0m_T39j99B^6Cl}o$>46MoVwq2}7Wk@2t37-| zfQiE=U@?b)ioW|S8VE?^mCiAsx$}-Wx5s&tD zN<{Z7DNuaGno$1eph$#m(rj04_Re{c>VWsjMAPsOO}@^VmL{d@n1{ougZ(M53{Qpw z+z#_mFwR3MI{78u14$tFo9Wn&YfX{8j|Mr@e`?OhJOC=U22qRD!5Fb)F%$!sJvZvn zNXI-J>WDsn@BlfV1Mppu)fmr|RmH7lN^C{^wt{(xAmKJZ7o}vVUs9gg7&|yMRo+P0 z{ZdSe4>>U*e+O`-0d@~hNO;O&Pd+>$O<0hSFo_v~1y&R0<~%S*lpp3hCi*3SROXC@ z44+8(yTdp=;SzJ!JPBg!Kg}99e4@J{4vTTn5B0=`0?!oLav@ypN`2_c5~&C8jTU4b zUEL8~<=)33meoZhus-fE5w}R}!A5{SlRZG+(5ZZSLMU#?#8PiQJptz8(-VGD^fJE& z`&dqOfi{wH0vo$Z3C~gn?1nmZdP1lT{-j2rMx@R`di=sXLG_FXc1){&v(v*q`5vWjozf5|l~ z(+vIGKn6JVoRd}mcDj0Wtok)XL}{vw?Wb*96evi+xQ{2KxQViNEFr}$xW}vNtg6Z5 zH*ehx%oq;^>q^f7N{!+*r1%*>YcDKk4e*@6AJF4#JTPRo-S)EaDLW#lfv&3q*7{T^ zx5Ap%c%3e?F?!r?&~2>#R}#W!4TzU4%(qAY-io+=btFTHqfJNcSp&3{T7f?VN42p? zH96l(TRLk%yepkGAa08pBOV;w7P839N}LsF=$*J!I%`1V0`PIxfOXaXXDOXE0K;9B z-kCCs^p+?Wfo9j9kUlYE_*bZn;=bsiA09eoT~_2L>~GAgrrI1l6K|`!CgL~KqEm63-HeTyZQ|_9Cd1E{_hARB82K=v6>7g zUIo|;!Tdq=DAs26!aWe-M^|WQi>?GWa+x!jSx5t(+4Qc%RrH0UIMSCv_}-aMt?kZy zwWWe(d{mUT`%A>+?f!|2R-@oMdMd)t09AVkGXbydx};mkc*dApQ6~j&juhbP`iwGz zF3Nakekc)4ME;o5Pek~P^sWe>O74m9wUa*DN(C`V3gKJA=KSpuzIWztm+-0Ig#QQ0 z)RNj>?abf4kvb4FXl>5ztkETP(spYfmSH}pT5uRj;|D0(@qW17@qRG$@up)JZ`0aB z|E+1)))vaLjV6@kVl_!w_6hY5It2i(fXM>`<+zB+FH(zpE3ST_@f9Vm85Ue|3%9t1 zmDXS)&1Hz%rC~K)hmnJm90KqzS!W(GMlxOltHSmbEEvfmI%&niSu0fX0Bo|5Z}r0;q^nZ<_g_BywX}T3c@>jiOUq{p zEkZ9R=Wl`Y$g#im;PoRFr5ucmPyR=lke7t9&K^uIKjh=nT9)w_a7-fXT)_ri=+D&= z&H_Y#`rE3NOq}e$+W&&D2Z*}{r_I`5|5%gmIM-5PVk<&+@xEuv>dAB2tFqtIp6-dD z$UXs+d-_nF=lvgWbQ+JcoWlM9F0qahFyh(3p8TEWlZjE}W}?Z>^-J=MRKKi@1)b$a zTC}*-dok}BeRqyZx77IZvS|eeYaM;|lQ~lC2EJp26y7XE$jdFp zmdXDlx_r~eUZa8z=GWWDtL@|E_VHr-xaB5RbycT`wFA84g2jHmzOV1=`zS~IP#NW<&EIa~ zauoZ~KtS%UaGg*0p3{;LeOy=)BCWawDa-^Y>VIgLgidP=?@Q7yIT>6(;PP&E2d&@_@Qs`>*Uu9`;RyOc!ZDVU z+Q)P4XCkqaousil>5__YD7p9>g4Z2ORyGl`MWR#cn`V!EoGTh9hhT{ zSp&coF2aLwpRMTjxh=>RS+bdM4`jNHTf|%!1j}jqQq!ONZ0`kXviIBK&0Ijj4v^WY zp=Z_wg@2DfjFBO#98I7Ju@&@lD>*- z;a^4-2|k7}j~xR>K+A1wZd;G^~qOG52s;Sf`z1 zfKOIfXIP-GK<8l{_j3&EwFD{+>m<+BI^^Gtq*Wnb+S}87oo?MY?J4%~8qLeCCbR%? z4w83LQUnbYbwH-H0Z}p)-E&2rSIwQ~k~y_nFkMRBxA<1KFAt(-kub@tDJeRm=Id#( zQv^oMH)L>Xh8*>>_WQ&BP@4zNw5}?PLaw7Iz=iU>eQ&}7p6@XKBv$FByPCu zujIi1$rD%cw*aU=IqUV-wrBZRskd=Hzj}b4oO`e@I>5yMIp;t$-xEtax43jGM1y^b zhJ**tPJTTt-9A?>-9Bd{2govw>4bhqwE=M5wZ88eCdE$&(j~$^s$bpOCw&~;(#YZX zUJP#><#2R%a27}MXzjgk&CH-evlIx0>>Gj zW`)@)dHE2s{k#%2_Kil^17iG>Gv*e4F`WF_2o;QS=`UAK_%JRCe}U2>9{Vq(L}W(H zL1*h|3@R!S0WayJzZo|}>BD_xs^HY<1Vq8A02hWTVRzb)`@M0jg&ke=&}@q+A(3oG zi72%YCzn(7vq2isO@8*vrPb`UCM$`xzJwW-X>!=5NqeyNVXccCJt(jc9Fj{5s30Fx zOL>eCvE(ftXYS09l`I6pkF9&9@lLk)Dmk zCB%i|UTAZC2%y6gp6=c2cViNyfWm?9ny3mVf_7f0+$}E@NDH-SJyB1>B`6FQBxc0Z zb3r`tT^cq&5HkV`bXC$(d&3Am{wOdb@fR@HjK{h~wyv#2m`9n%fVRWnT@U3(s1G$a z!nr{8o4ApIRVa0V8+`>oqNr*9tv>`q=}Do5F5;e19$5Djv6H_~Vgp)hL~EO`@!h9^ zQG@gtvm;Rxy>pe*{*fR*Wd3(0Kid9zf9;P(&C=KU+V+?hv<$ z@?zf%1ex}q(1MO&Hf?@nHh5xv$-Ivg`pXOxU7;Bo9nGZiE$8tq*W;6C=7HlQa-<#K zl)L9)fLu!D##QrlIS+Ff!*l`Q5JjiU^$591l>T952)46T%B*rEt-HQto;?x-xfWHW z&`#EOO;?zLH3ZPo`e?A1;XKJ?t<-ecj`!2 zlC&HOOmOWZNn&6a=$g2(+;J-?qtfA26NspK$Lm8{wsi$P0*z=VwTjxu z(xDY*D&TBgR{)5`fH_T)yHjUUP*njlFqcpr&zm2jt)=#y*i&zc1sMU3aWejDHQn`m%s9F=a}mEzK@sb);|BMKE76b2bNn~a?4u3re7 zGl<1?tR86CRnD|&$H3r3|0AlGEUsTj3VZ#mL#IK4D!INKc$_W)Ms4E8TY0~P_So3d zl_%B*pf`r^`U(@2E&>*2|I~E#r)I0wUBC&?(v`rgpa1?>`D{g4w<5G&eVv#mwJdN> zhoCkOOMrYjtmZjJLtKYFIPI;#3JUi4I;E-Uh7z@7)=A0N} z8co-8*OR}FW?HXZ&o{Ey9=qP!e>RAKP}zH%LQ44B0VNMx$k8m{=l&`?M-mwF?16&W zJG(xDmtfYA0TxgVh=;fyFszxJ(nk8bA8N;;6Q>Ac85^`q! zJy|*yGAY`SE|qz)XD6^w*e1EcY^l?x!@!8;@bk#Ko8l#<+9@=LvNQo1nlY1N4wKQX zck=FFf}`~+rRk9A6}8E?g8+SAwKT#X`~boojPfSgls~uJ48Jy%HGbzocS~(KJ55<; z1Go~@;!P5-vr$@?YYZKKEK={M4*>cJOl4eqEFSW$ll~+KF2*as{#k0&cUQNF{mZLh zmojPh<~!?i4_luD*4pRji3#MLHCn;VVR3pH({ar+Ls0)vDiVA;JDaZ)_8b%Fj}l(m zQ~DM@#_Q5_ur2QK{HC9u?j6Gu%Z(-WFue+$aNmgU+DlEblpWoQOko8X5oM$fjUwX& z=&TPFyW> z_B5|XU|_^+;P_9}84-I7|J1_~4@fM>%ppD&*I1!|X7Y|N=J@kVH6z%> zrUl2AQA3i6vg5!QIzZ%Krt>VR5VP%C^$wNhbv$!v>G6quXFraTpo><~p-T5e8(u*oF#xgBNf5~>`suo(TdY(DGX%S5p#He~MOW2y2>q{hnP=gkwe*zR}k@Q=l zO-nFn5iw_4MDUmvn^+PASeb?*h>q`|MJ?|HEs};7k=>$cXpwrLMSg2qba!$+ro}{R z_oqetx0*rGqPkK(7A=a@c-NuDv;req6s3FCO^d%Y>aW_jf+~sPH^Oa#8A1gZidHZc z7K6g^M5Z(uh4C6yy4l;<(w>igVn)!-c)>gzPRC&$@?g6-nTJb!et&l;72;Ze`6ly_ z#^uA63j?Quw8R6`akdhd!iC`ic46pA<|UJ!B71BV4yjcdbNwQQC4EZ@CP!jmpZxtg9RjOAChR%G9G19O)I$yXX@Y z$?JfX)l7G(3rh6RGxP;jf=3wD0aawQgn$%1z@TrKVQKuzqW^K@veo9 zKGQDGZR(OZ%?n~g0-2Xi4rspiG|vV1c~<@>!xO&?&IxH0Gjt7&96Mb^3}; zz~HrX0&w=x2&{+owZE|xH*D2+2vO_XTP1>%x7TaEN}^n^b(BQ8Uh6LMzg(|%heWwv z>lTSs0O-gdsR?T-p&ush5u$`4oTmoQm%Fyso*FPO;)>k0)n2^CU0dzNTTj*(Z*kYw zQu&6vw%UugxN9q4yk+?Jfqz6E!&N`ue@0B#PC9-->%2^rVvwE17xm>^M582!zFDNtA_lVMnQUWk;!YX-BDcZAYngaYw0z)t!3v^i5DxbfD#@Od2i$rsLQ5hvqG3*&zB!noUI zSxjB@!Z`9=Yf-3M5bo>ahzdSYE$_k|-p{2_T#64^3>{T`H}UWgYypGCWl(6n@Z5n| zQ-zO8wR5OcJGV-;bFNg2k4hCB5fBfxvkIFvI=)e%E z%P)ZC1$(5URXtUz?Wt02PnBwWs#M!kr51X6vFer3J3{3NkxGQrm0ZA2mzP26oN4S9uNB@AXh?r+g;)G$YI`WwxJT4GdIFCC z<+NasmOPr@SVz1{O|(v$RyvlyI$in7Y^7S}NY4BfE!!zhFLYm)=3XZ(pO(C&(e>9$ zO|ktDP1-NoE^gSN!KXv?vu5u=gjB1gb!7>{f{p$DTJKob3ImF%!e+g~fMj6#Bbu76zWtMHQtc<&6f`6ZVjwT@rKH!pd#NLm zlm7<3oISmNu+jf?Pr4B{694Z#)w{OQmu}bS`HG%#mc{#zAuVXHM?ti%*$|xkT<^Qo zgU|2bY38R-@wD!z&+s(W)9VV6|95!m&zITz^>6!W!qdOyr%&+oB(;7*wW9g-^rPi2 z9ww-#pZVG8`15;y)_nEo(Mx~a`1xpJ8b&P>ZqlHgFaUYY5V*28I>M3H*rG9*U*b55Kk6m|{(gqlx zKNaq(-oMws0Un7^uIu+IatGyQ{J(+$_q~BN5@6q&o_ha$>o%DMv z{cfb+8|n92`n{5VFQwlL>Gyp4J)3?{r{9z5_eA=AHT@n2OEMRlRXe(I?2J9Q-eEp$F<7;r`~@n!R&6O^x%x%RDvn-VZ-9YmS&J z{&D~1S)Y{S!u0Y8`UEr3?8YO*AvW%UK!-y?FrAGAOWv7M4L@KGB;?X_5u$F65dI{= zC6O1=*h|UH1HU~o8_oX+7mel(0$WWkw zchUqDjK$zB6q0oifKg#FANJ>i{hkjQzh5T#Rq=i&xX2thV(LofO#Wd!bC%k_fEYnR zv>cEPg!EZztj|eGWQE~ZhJ+$heWR(7%UL~I1_3laC~!(_7FwX(_l|%;p#_^FG^rtM z1;NeB0lJFXTExQ8luAe#bpuJYGF@I@63D=X7mqmThU$;dsF8WRzD#}4`KI~+5oOQ| znZ_ZUYfb%K5vh-H08`z{WY;InrKZMa0D@8Dp^!n4k<>$lui*;dMXDc58T5L%l+)0Zd8Knu&8RgfX~~o%`V}RORmjR3lLaOT5cUBJ zRc2%N58Wbe!xma{_*?2B)}9>xmNHtw>3bhu z4#BwP9R8Lvx1Gb^R1b$%_^mgi09k4D_X%H#PL%oQM zx{ehb?>`D+;RU8A;XJm-J&jgph@F8q@^uVWXNaBkKGSCYTJxf99=<-_J|1fy@AXT8 zx7tTWn?E~6SuquFX>OEz6DpN>IjeO*n6ny}Id_Y_KPDIX*>n!s znS2h}={_sxtR>2Qqc78JHW(J*a9(!@BO$8-bsl4SpaPC!^SmHkj9QIgl0S64W}6SX zeap?4Pk{e)HE>M$lg=^IJX(uLAv&^6J#;ckI(F34eg7L*srQaHp!By(f zfSXMO(`+J`W)s11T z^i{yQkr}?t{NVlYnl|@R`*@*!Jl{T^Z67yyEF#0ypF0SJ_85uH6?fDg9 z8u&K(0~wAR76fhPKUU@mGPR0K_QV;Sazs*y;EygXDH)lrfIY%X!sme=jL^dS!JL9M zLf=jZeGFEAGa>Y=EXUq5Lc0x`CU)jusu$OAqz0bzmzTMP+iPwiIzgejh2wIe(Tmsc z7#{O8hu7&uJf2N5F*x^3<=$LQ-F_4Om?ANz4jo?PO(vE%{2at`L0`l`gUI+g;HB=W zMSv3--LcU0?X}c&8qZM=w;GRnj`rfwV9(^vF?D6cdIxjJojM6~P^a|GDe^DE1R-I# z{VjH2puKOK|4ByXu?Z%_8V_pl(303w?t$1-?!j&Mpa`Pe1=N(=93{|yIru2w$C^^| zY9tog?ZD`rbRaZH>@DcA3Y`jifHyB7Dtp|Q(RQ!~UR_23Vt~h&*X4rW@cw(IDT9B0 z7XjsINjV5wu|+<4g8&#+abZad52lLMP@tfyO4pDcQ7KS_dP;@2${q|>4Bk!WCdA}( zn6vbWbXY9xr&gdil^N>K8Wieu*104>lg=gas{UG82se2U-6*JB2q{Z~_QA@4zhGdc zxz1!j(MP;QW*3Pj_}&rC#^I}@gzi^;Y~$OMc!nOe0v045fW0?N)!rMLfZt7N*X&5U z1u?TD?Lu6>C(Nl?yxrCm$ZRuHqay9gO)X?F>K*at1`x?_P(yV4G22A)xk=jq<1 zCZyd(j91=;D1LNlhs{$&&BHYI_d?iw2n4Q;+gXU!kasc!by)^yJ6WJqikan|g;hu1 zSutX_u6uR@ynr|6P}M;iP)crQMEg*WZzL$uN4)ZM&|7 z*wVJEq=Pix9ch;>s}HYj_dy8U2U&MpOS`SCyKP9j?HG64lXl5b6vkcU>V8+HU9#;$ zcGY4o*>@6T$-cwXYwf$P6qKr#ZN5@42w1O@%?JE8iOPUJZx$qF*wGfFzO^v?M(4tQ zdwY)1tk$?!d+>E7qwq}sT{j9XCbgWHJ#JX@J1$VWEl#!$#}BIu)GBc6?R>BcG@K0| zv>P>57TThS;{8p|qIGKfpR%ke4)FK6%## zrcC5JYl`Xo2W$OZI>z(P(gUI}yrOCacus`{yLTN8h&1!QYcMYe^QTABv2SaR9`+3V^0fXomDP80a_zdV43e0 zE1$^k$C9I7YL#nO8#1(;Tp|6PB{BBv%W*#Q#=vnxt_d5RFhIY2>LW21YQn#qp=M86+T zz9%0~Y!86`JWW+x9Y%y5VRZsfsI0|KXS4^TjZ%(Z7JDP4u2Nd1|FCsdTUvFx zJ`o8Ars{>jt4Xtw6VjY^K9E}2`9K<;tT6DXAfku0m%5q! zZ>p(J8>uq2P<H9sbFvYaI6S4q1~3vUTXI#BK5JQG{^{X^`tnJbXJH~5UD-w z)6~rp4ldO}2ab~ii}x|U-oh+VgwJT5`hcIK)BRMuN@d#SY#ZSF`vLH8Yym)cx`%_{ zW;jfGf*Yf1AvRt5=@vw>v$BGXc7U*H2&VtU+VAOZJG#&SDFFB_3c-(lZ|<#+JAq1s z0x`q&?xqS)HKyKFM{nw35jf;@hC5|%3J3>bA`BS@A>F`FqF(;Xbp(rkw2_869;HnR zn`)(A*F*P3U~mv`EY(g19lbo)>GI9oROiWM7lUi3!M+=0zX~9*R>Ce5orjy6FK3LZ z4tP3vY?-Yt`1qj~Z5W0&YtcIFLxV4SgMn{3vZni0LN<+>PWCmgRFIL)yMXrz_F|g% zMK{K6BwJhiS52Hh-E3nv5n`Inrow%aoe2uQ;Q17c`^**0(+4Jxx^tEGS(iO3C}x`7 zc2>lr)MA{>$~0-amFQ7*<{8mGHsG&`bWJ$A;IPwS9LvgXX@#yEH;fOeO)wMi7wBA@ zdZ?iWeLA)_(Rn(8*mMrhFo*D@iOvP?M}T|YBbW~WVm`bj#OjV=$bg=k4IHZ%P>#EA zYAWh66YU;B&c8|gLFy0a{}I|FcwL9|c#q(7+9N1k3CZ@n_6R;7(AZ*+U=0w->1vN) z{Yu}v4zx7L;$@*2rFE|YInU=kf{UNP^;F}|9zm^dNZZkNCHNh5x3fpkP%!f^J6%Ph z^KI@Cys2nYNVGpW8Yl>t41`R31UKqEg8zJ!4x+m67O>0S0`}t%+yW*7(~*|40DK59 z$Spou9h(ewgq=+Dl;LkFqgzh;bN=GJ)l*noz;0qfkP(B`7O-1s3mBio6@#%6qLGy4YAJp(UHHw{ zv~DO*^?Uo)^WMG{wS8govdoiPY5UgAynX9ZY~Rw{_{-d{ur<@Ph)|)=0x=!~w3dMZ zQ$%0dzQuUTJg8n{bRa|uB^I_MCyP)3KV5|an%?BJ(cC9jj^-e3-_mS1^shAHsSO;{ zysNX)RG8m%#^n5tw{QK@znf0Fer)UQTSEBZLqaHy6H(m$XIc~ZFvIfmIunw}b4Xhx00E6v2xlDEo zXpj?OPkWGX=n2hitw=+9+w6m5P@4hEeP z3J78aQGmEBP+iKK&k}V0wK6x@f|Rz-Oq_Art~UWJKH4n@S!7Z{0G&n2_!NKn*X3?I z>Wxg7T$Y!eQc)mfx(wBmsgltN);r{iR0CBfqP`9M{+{a8>aI*-Nbo()8~Br7!@np^ z^1^QRs~8oXfiwyB!$4lMaMw7R_|G+<2);^OuK&_iY6U1vqc4AhZDS zn=8m~aDbI3V?tZZ+nR@MrH8!}9=07lY5>S^1q2^zu!!Lqhs0Rq_f*$gEp15<$R{7EoHKWt1e)YYycw-poIP=w^R6uDP} zR4YYpJ4~>(@#7|($}@XEW0Woxt!$f$9DOUF++UGXf9=kBOtCHh*K&W&q0k(F*F1@P zD?I0D{rNyT3|)ICEpE09h0e<32k)VL)U}9k&n|i?Wu4e^9;Af>`{*Q{u=QJC+BXqj zW&Odj>O6k9{^bAAQidJ};*~^JCgq%vVVrY0npU|kCgDc~PEt*Lqa9!_86Lf;B$wi) zM5DFnl9O7SS&lwM^YJN54sG=c!F8`wk7&_264lC`a(;1)lgbHN>1s|nzublLNr&HXR**iC^J|y+4Gk=d z-~8fIMCe|MYc;8bx~d4>M{?^wQiSerdu=xavJ^UDDo~SvCSLOETJUR#KdL5#xk}MK z1dLvYXda5Bh)xOiydpxRog5lm$cCGMF@;=rSy2XUV>igq8w-YF84R8CH#J&d zvS}7BD3Y3K*kIQ4Je*fv0MG+}x_3GQ3;3mp(EFyHi74*B!aJ6xVKaF$LIL4rhV!20 zjbTj31)l)!E-I{JFwY7>#J6%Ym*QJ>Ef|x*6+Nh>zE`h`Zv}0t_*Sm#nf&7v-}-zT z-};=Qs)(2bdie3`IGZp@>2Zp0eXfpg{lgUB`aFHek&o5KpZ7V)jz zuQqMA8Q;p?MAmD%@vYA@gwg!tjDd4L1hqE9hOyfQY_*l7vIWVXpFE73YOrz z@J3=N{T%mJ#kW3J;#+kI9g&VT032bN<6ECE@vY2PT1?EVhR?R~t@ZZ>fbV~N>$jEo z)-8IQ<6DISo8wzMBVgUP#J6@{bt%FTkdGeUx>zfH>O@k$5Am(sM!0}BP~kS>Tf1Lv zBfj;y9A|l7bdxTDn0vmCZ+-Y|B7iiTu~K<|f~H8!=SMxh_1Wp8#kW2R+;e>Eod?~4 zacD*m9P$H*LIwvbo)bBX@vVnSe5=%#k5+u^%@W^wNb#-GbBJ#}toYW$mNYCa4X~vl znItJu9cq9`m8jxd>sR{Tb)aFf_Lk#Y4@vK!jU3;)_{ki3PmMeAtvm6p66;o@h+lYD z?!fq`CBF3+0tI(l69yqueCwU9;#<$N2XkwW(oM&=e)WOzts*c*P{};vtnVsz^|o{P zo8n2?&h8xkGV(BK-*OIrapa^pSquc?WUFw#H=V=ZQqP8S_*?3sr+mfVQqL940WKZL z;e7P)s&n|8>fxdSzuiWBE8U?od)uOvZ9SBPn}UCM$rvgx!(NnA6Hr{f=)v z?D*EG?F*By$UHggyTh?PIK;y@9BuU1SNTSB6V1dJ6+a5MPt%g)TQkJyV}KSX47WTO zrl_bXzLoLh4_$Baq6#5We2%asIWB|(ZoYh?=}qxDn)?)=qd7={KALUEw`QdA)P^TR z^Pb~d>1~d0J?{;I|MdIP1yPf&<6DLB!-)`n>-g5(UibpK$j*k}4zhb(1xaJ1U1TRt zwnAhL7*9Y4*>NjWWn%bUWaqks4zjcBwjetjzySsxt6auj6v;ih7xAqc{HP2by&%zO zT5BuQqrqof4=UEgW3*`{x|jBkBh6O*9q>j{8f+#&FdroEov&SUo5Jf2C*hYY>> zI0_B=#N`P)b^VM-bi(dkp645`SXkGe^Op^p#-q(uAKj|z+mE$X-}G}-ed{r>h67q2 zdr`R3bAk$-n4+Ig{>c_`wzumz+q~k*Fq0`N!l~j~6=zFGTsBZ;RETOgQy^7y*Qs0& zw2|w9aB@A@`wJDYaLukWi-@+KTPj|nccG1357U_IfeLPlvoV>aLlI|t!ZED^#Lvl9 zblM>@ZRV@WJkJ^Y3UMWS;*4t!nH9kNQ3U5krYj(Xb#=nLGpQF>5hXE=cz`%^KG=^Z z{^}%V=M1MUT=p}p9cS(pp7VtQ9P86e*!;j`Mc^*@5HFWf3s)y@Av!^!x`lK2oz#o# zFx@kLCNvZe^I3ZuU6lsso~hiaU8&MjyIg6E2^_2|y|~&U)f;{eq`JVf@pUi{WaR6B z7iU)a7=M5h8Qrna^wr7Yc#e9w)p*o%B(z84P}S%hQ&&2tcaL+3e(KbX$2mklb@om2 zFRohChbvxba!heW>#S95qV?qTj&L~9A_v$q`NJ9yYVgnlk#X*U$T;`lD)|>z@o5Fa z&Rsy9UtNePzFeEoi!sG*2S)Ft1K~J~W~$W?$DN<>;%tSeXc=p01sFqT*H9D~;JGzC z(U1zOP|S3TaPu1y)q+o&kY0%$eq%N4sSB&=82{Dv5<5(bxqMgANXxYrR;{k-rpqT% zG?Eq~xtsUi@K`AtoSgwP$dX@DH0dTxf7VSThOjPE++B(t7NU-V%7u_AUWMF%f5g&> zJDWZuGeD?UX_jKz^u5;}jKjAx`QDCuKHi>WfG06uO_B`E&AoA=qI+W#@VhA$njNX2 zX@={6h@?W$Tws{kY(}dEsn8<7oKnh? zrla+FKCQ)q0}z>A#DXQuR$@WwVP@E}L@N8U5({G3p;^)di>CRDZAt}&4&+bnFBLXL zV@oOwTd82hzY+jq{pQK^sfdbJDkSBhl?sw7*bD&V-INO1UU-kC!j7$A;lCplg7JdY znee5Sy$iO&2PzdlXqMcu6+Q^T^dM_tYpJl6wXhATU|t?l!E)v8ONA8R9(wtEB^8pb z5InvX2gzO#!%y}Cs())Qbftw<8uMyuDg^`S^(xsAz;BaC3Fz}?L863RW^qF}T($>} zhduCi&5UTuz0yT<$;h~wj)i}>T~C|h>$A^@xollMA7R&%gV9 z{>ndlZK4?7KVFIB(@$_4_kCA*z2aj*z2%;PY~p7$&DVKP7+amy5$wy(b;aPr=+1HW94B?diuc-IN@C)gA}e*n-M9 z9o@Kw!sZFdbs$uhbUr96B)Y+tx-KuRuTn;&=r(gnQW*+9W_-;41)M84#_5>x@xzW8 z7bIaCmE%PNb)md@d?J5KI%Zs6_;k#;yzu#$@e{s3;(tz?7*3D!G2_%#ZDM$&wcAJ9#PCaL z^MTY}Y3;%-MS7EFr@)DaZDKg7&%NAJ)svUK3GtA_5eqqXEyOz1XYppTxYjQ5Urw7C z)CGB*Bo|~Acp*WnFwr+HHji;iinjEtg_?Qj?3E`@F%>L>dPVRmO~2{qr+e497GQ&C z*X-{+y!M!JSZNiv0^9v;?~4>?Rkhj#ahM#Kl1M2+C`hY!An~QaHmj{eR#l2vs*048>EVPsSz)4YWH8Cxrq`gEl_o z=%EwJ3jliHnqLp!@Jkb+_syitL=^X5>A2#)1V5(9xYAXFt^RsCP={&FU5rf-lr@3J zCWx1)h{-t250i07Gkbc}IpiC(sWw3zqF4VcZGt%5Zh|c`=B6U0Gsw%7!5_z^Zi9J!By=eoEc~I#p zGKC~Qr>c`5$xRRkA8`}Jp|T0$5CC8kL=Aw2O%R96CJ5#$MSA3rj)Uzci28eKj6DYL z|0alUFPk8?=xyEvAr#oW38FKCUbP9L^Qwa{v3cRqH$g1cN}t~UO%Mm))+UJVSKHVG zaVT$sxG%cds(>lfn;;%On+PDyX7dn&rbx`^M|~5-!AIN#@hEVAb2Z{TA9%?3fmyu? zVxQrD=6BO&2oT0zor}%s`-oiLwa0xQDBB_SA(Yzf5b-TpqgUqrFNqcJM>2qXaxLSy#dRXl^Qqa`o6J*`KWhv#evydFGmu&BvO90?1Q7 zL9;qgp@7o+xgkJMn)Wqq+*G0Y>Xeg?ZasamJR#<3LkRht5AThku?KRY9XG?J@UDWs z#04DMZwtb-ZL?d%h31g{5#9`SkmPLe#Eg^ixlF^^>wSs0{_Z}}tpgtEtB?jH=4W{} z(h2@3e2&lc8&D9$ko0ts-mHIQwyfI~#`CWo*gZ0Im(*u!BGCQFY&8EP0bKfr?s@3H z0(uXp;~#orW)T#2mAXEhOwsMsIwKd->e~C!beRy;=m4s}DjXl-Js7T=0@Skf9@JN( zvuJNz(3$UhGC_pSXg*dLWiqlEl9`>%7;lEn;0Xw8j@o)e8*r%5P;hsaXWSS;1ygqa z^r%U15)|A)brmw4EeQ%Mf&zf%f0*H}X$&y}odSgwb@r7Rq4v`ips=i&SZ9d7fMU7~ z6vhDsw{D^wPnSf_?f}8Ss&M59z#0P`h*~YLkLmPEK!F0&l>!B;n~<@ffKn_d*l;dH z&4+{e!eQtG?pA={bjQz^f8YttLnDm#AMj{$7n~_M9E^V2>ihG%!9F9dH;&+zs5g%M zh1GB?ZZL(5ZbeaOf6fWFv%%yW%#Ek5KlxY9Cv7~59s#h)tO_1vSk3%2&Ij{`&$YZk zd1fKsyO?KA^WBSiW=Kyi=9zDO$6}t@+s7C4MB?*ZB~Q#~_{`vRpWLhMMvp7;=*V%+ zGr%V7)0vEW{xwJfR=>iJa0b3KGGAKOsP}mmAy1v>Ac9!o@w#^ltgrHTEpi12nju5` z*#8Q1!DI<6gPLWM1ylwd#tKjd9rg=M1|231NCq8N4nzhWh7Ukw^k%Uz9VG7DpWpL7 z1jx3po4hmd3huz3nVKO(5_xI4^t&+KI>A zJRWN|x_}tjYo!^392t#I>qtj$FuT*$*bTw#W_K0%l7mZMvoD5^HMhAh$4h3_!DA(} z8p%CsGPY=j^XKxeMP>yX+yN=G0wVGCDYJ#PCS(6II{smPN=-gBc$KNqxXwiKL`t4h z5^F#B=={8rM1aQ{hrU~Wrg@{!cNg_WINUa(b3`Jq>dn=hS9O~J{wPA_c&Vw86-` zDOhItNB_an^4I!b{TBX>_&4w|O}n?=Ve|&PaoF<4rtn6%2_Q^caa3y5mdYGdl7)Y9 zE_BJ3)7ng?PP5uGR%$_C1|$Z&giu+MN<$pt`jVBJgya#~-XuH^y(rOnU6UNz zsV-@#<5bsd{Bl$k+jELyk(we* zCU0%An}l<$d}{k=UW`i$d$7X%^#8N>eld0@*?r%=zu&$6mw)aIXLe_Yvpe_p&T4xk zalICzU1i`HybJCw6*CDR=7A6UFb^Y#AoZ{-?Jf*xwQMPj(t;S9F({de8KEsPQX3cp z3_{0@!5EF02^tO)(+LrG5+dja24(^}X(&uYDTI{I_ni9oySKa9ppseVemmQuZxno6maR!TA%zZO^=IUTkLB&XwL5N5Kz@1!XKJ4t9U z5DtzaMCaS7t;L*N$VvA1BBX4*#^k-6MAODnrd0&tVr~JY7-3`@M!=Ry2Eh2y42Fja zz}U`<&93JpH_u`zoBuJnnv*Lzc`YY5a*~-7p z9I53MywK~2N!fg+ru8Y$dsbS4umr;E%H_s5o9ak7s=@a`)UlkhX3(sm+{IlgH%+Yi zF7i@&Kh}4#mQtGqXjvJ!?Vp zJ-xVhj`iY_tQ(#z?3GE!Di_O?{qf1D(kIQdp(4%Eh$`yu(iF8!zgxTKX!o*geRki^ z6QqCH(rf`!{(+m+*aQnzyioHr0?e=1B>G~~{w)(Kgn62p3x@IM8G#L5yU3!I;f8lg z+^F1esqztA8tzp-f_tNt%13Brv{m^CZH*UHKEeyeJ1TcIDOzE3)fe|>8r>;qv_?A8 zah*C#0mt_W9N#w_`@*uyNJeX)ZCn|8=sw#)M^N)Yn+oOHa+<=ra*X7@SC2@qyEE_g5&h0uhpZsR`8sjyk>sj z)=$B8deYO?Pk*Q2J3V1VJ{_JkId5_LtMvk4bIv%;0tNg3=JY_b2W6?Z^toRoZ^5tj zgq~#g>q*g*-T^x9klK?1Iz3@Tx~!^qiV^7vSkP@oJt?rDCt&WS@T9<;o`CI_!;_}m zTV#*F9RuiV zp|k*$fqf>F76StjuZPkC5g_hhC@l~NqTdLmnLKYRbp2<2Fb|;Xe6=w(_#D-ca2qBF z-bSz+xb|g^H#NA0=|Nvr&rS~p`Xz|{oT$o&IGDV`%O$Z$&=1_(n;N{O_m-yyUr_xI zrUpNTImRBfOdl3Z?X=`zMb$|emR#MGVNEufGA!CAQifICRLWo~PREQWvk;bpT2{^a z@&jY6|El+`Wz{QrS#`imwX6yb1{bi}Uykh!&yjm6<+PCMrJPn!`%_L!r+q1>HPhad z(_(2)%n8QBzDio6z0W#`7;F831A|%C?>mT?W&Jn3R4b~_c~YyBPsQeRCAt6Ul+z05 zwUoO}?lUQOlicemr*+i9l)FyujhGXN(A1V-SZMvvJB(Vo{FsBFWzH8IMy+k$@=}cY z{v1i)tqJ!Sm+=Pby2*75Kat>w=xE2&&x`fz82-?PRaRh0z9w^`hauyCO)oIh@C0Vs}NLDfqufr1aT^h7 z8$w&@aZ6)ci`ATWx_`bcR+e^8wd~@&z>mVx{Z*DMuoN~@bJ?X3m2BPo`Cb;l#~i5@ zXB{fg0ZcuV>5Y9EwkLL%1-r`vt&e_mmjz+tQRgVp0v+xy3(QRW1TG6Ed`nQvf=*r* z$gD@Sr4@i|f8Xpc3iGl++jMS?@HZ|i_^enuDDY*$?m+>|?cIX{jMm+Qg3-<7el+Kc z-6d^T?H&|tdeS+%EZ99L&_*b6L$)|5*zwwH_q5;%PGfdY3w$G8d-c1g1-qvOyQc-8 zh|>bM{LA$~I5CjLA5ILg^7Dzo=yG9$LkKhWeL3J2{q~q1#Zv^%C&m^P7kSRUCXX76 z3N1iv5mBxwye{ohC=Um1hi>P3#3`Cq5{)uj6Ci{q?5in~j-DiEQh&lJvp$loC&~HL zpO{~+#uy*J3+j<_!IMcyF2)lF3sKQ z4n9p)oSJF#HBwMGyMWjO!1zpfP=H}>(0B>>8wKR%IgS6YKPU#v1Mu@kcu?Sn2cYz` z;X#2?9zcc9g$Gl1u@J{+z~AT$-qi2?&Y*9X=twDluY*Uijr<;Y(fC&V)f$dD)Oy&# z$(SmSIyf2g`=B#;OTXtkI2H4Iv4c}FzZW`#FM5*~XhKLl&o55Mox!}?S?UblR{m0F z@Z**FE^YNacBYB2+V0QD4?%!yu8OQP?qi&a;DKrPK~6<543}9NFM_>EcUw-iz#Dho z8nwU}_q0kh`Li01dX2XZO`i2d%OoQeRo=RVA-hylIiPR^-_ zVZYoz5P=XKxVu?Dgd$2G<&ubnMv|W|v&|ilYWFm@HdI8j2i)B_718-??sJ@q0P!>K zc$|tD$m{NXoQfFk!Tx6>Jk}#fd87ZiP&DpEZZwP5Tk;4WzE%2)<3*lb%JCx4F6H#Wr|6{a4$leqGtsNA5{7rQ?lU`IdjmOXXYs>Fiq`JkI4?{)$(4UcTkY zfnJa=0l6;lT}F2V-*New_ZrzRz#yl6kDkx?>*W2smEE%`wP;V_mFX z;?6eQ4Nti52SmX>^e}>`OERk!qTxlrl;%ZSv!j72fGaS?C<3M~wZ~AkYz^=?zF;e* zw*H1sgSPBSd%;w6c$LT;Vk!OBa3tTP+YD6?3{^~k7Xek8k`}X}fhvHDBj+ij2&f`B z!zfoRnBB?W_=5KCc*$>S!d2o6P4O5p!B}thZ%?;pnZY)rr$#E#`GJg<(Pg2tsT>QQ0gJA9|c1p(vPMB)5IqSb4HOocs2uo9^iu- zioM|xK*$iDW9T75$Pl9feG}&71Q`!9!V_Y~0Bv}pndxClctZS{a+;c!iE%^p$>|on zQp5=XzB8bi%d}j>^f)1vU8bcfvsyy$NS{D7$Kp*|pLYR^7MQ^Y7pFEzjdR+RjZ*(yB&tYNHl*=68TL*m*gL5Vo2V0PqEv?6)CqQzm0_E#;@``vs8YBUC0U9Ey>rvE zk6e8cIp>zn;v**AyZ8*DwTPw!PNS5ZFeyoG8n(#V@Po&BqitPq=L@*ra8yofo&_&Z zf{?|+sN;kef732#%ObK1iBuKhwE@G8W6c>^nnnk~9-jV|Q^=mP6JysTcL^W_JqZC! zI%z}9dEf9oLJxo1q=R^5izx*J-qwV4kM_vK{7$CdGD5FcT3P&)cDsFsb`%S+5j*%8 zv4j7_-g>8XJjV_`)`%TkhKQ6vIt+Wlg9?<;uYQ)0X_Or+V+j9$YEgZKMpdC`#M)5( z)XV@8r)Vi=0jPOa0qpA#E6)_G1o?5VacuTaI#u^f{X=UX#Z!57L5~M$;ogQobsFxD zvES&(07S}x0++fxe)Icaf_7DgpUrP8ri0QAP%-lu??CgkIR<82AD|3RF<9ZJI@l*o$mG8_Kn)TYtvl${kh(wpwf?X5+do~k z&T6Y>VQ%IxgXd{Xxv3xivc*sPfi*#6dRu`wk>Nx`ob6Bl0bz|K7I95gKt26b-&MtS zby#f^6pv_z#2F-SBkgyIYDl=8%N{BTsu7IP#w;2Wk`Hwjx;vxx6!ypn53<0GF2)~A zafpwFMjI`PU7)UCpaU>^1L+=-I8)qf1nbpm1ajx_#03Kd1 z%(n@#NRB%5OfVD=k_S10>FXi#sH3*fmAum;k^~`S#4-wt2;UtgN}`)!M1=gj(2Z@w z6p^7numLtp0x}{kg?XCocMqC^AK_p6#kN-+XV7ohKqi^fqvYG{Z4Y!DTQA!gfbGEq z__fw;t**leio5z@XhJYUo|UbzX@70UuoPk&_}d2=hCUw(q%~_ci3B3mgX>`%2CarB zgF@>T$au=S_g6%x{7QmiN>C8Ea#n4CbF3g)CBE+!|H{Dm@m%E|1Ty)T(32NC$Ul ze$CGQdWX#@K~E)@fwL7XsSJoqPp96M%uQ0Fk1=|T+>!x3?_SM67$d=pGbqG_|7=-Eu;XGo{ z;)lRu9kCby*&G&&=?!9r_Vs}W#854LLeo%6%~2p+OgMi^I$E;`Vjih!1c8`UJs|l^ z)p=csT_}h2Q6G}Ezy$8HtnECBtYxT@u0hsXr>H_*_7FSZqeF}1_OmOA`RbuL>8e^Wd6tc1U*4$Cp#;%{iDJ>0OT#0OT$ zVJEF?jv{gqb^>3Qu~#{X^U=ngMQCk%8#HJ-(MQi0ZX$4lDVrp=IWafQvHQ<~ST=TP zZaTCj`ub?+h-G_OClqn8b9^sm+0686c%eGwn+?_QTux%!$5Pf0G08eICK+u^UZSpy zpPqa|DwW=C0}FCtnNDSAsdFjYb(IT7LirwQ9km@INB`G*e^p0N%N3dt>+^Com@=)q z)E><6j_7M|#<6JyR!5Tf8a!j2aXNW4u>xIC2=*BrLwS6$+*i@5MfftkIF6WW;%IHL zSoi4_u}BDk1L*O~JEEfn{thubfiJyb?BP4Z;vMFdZRf!w&hi{wo7Mc!|B^>j-{3Q1 z^;<0wI51D1H65QdCgtW`7KLFY9`aKcJL*j}G`LFhCULrBl)tHt50$?Oa1F}vmFj53 z)!2-w#%4^VZK2eTM$PAxMrI7(ph+`^%a>Ni=M4z5iNol%64B_bL1J~9%+TngB(~9; z`@xGNFFK8pM`m<}GG-VXdE{Lmxr_t;pA_{2+H9LdWr?B9ezJ`rP-MF9|NT$3BSsfD3v~ zX5bjJFpbF3g6G6Jy+7R~*6Gb>9_uuTMBBcNYYpb0B%@>tVn)Kz6sHF{)#TF=m4{tj zj3Tx*T*%3Xty3;|cW_~ut(908#6}R#(^vruAgpUvb*t@`}X`CTi%V6Bf$<>@( z$;oRuc_k;8b8?+z0R~e)0tk~vh~VA`5&GkD2y4nW@&bwfK)W03rVMf+YKQv-6e^;q zzNcpe8**7PPOz6&aB0Hp%?hmnzIQh%j;@t3mKKB7Ln@XmeLt}DS;YO_z|xCTeE7~- z+M1(l+=@OB6uNTnoX%e!#vbnLb9L6XS1NlrXVK;G*T4`wYiUA2qnZ{KI?iFz;KJKP z(whok-<2Fjeli^>GN7r25`+DT0F#9R;BKVE}L| z(pNQw6=}O}{%x>=QHek}g~dZ;!9{(;kpZ5Y8YtA|I$uX&5@Z5tx7f)N2!gJaOyZTR zldKVF;+j5-NS;|S<3<#-sxUWXN`wOu*%^FUGDx?6kZuz3)^+ScVm?|}GAV-Hh4?9r zC~gKZ`=eS%K191qIy8Rqkfh*sLpwy$6Qg!}Hp|73vJU8c_^bQJ1Qpi-C< zyl)%V#=|$ef!%R7)4X{)ooCpiRnVe

o^`&EmnOW}mITt9JEWL(%N&J6D*`Mc=tJ z@wv05zRT0vjKrw#t}~INzFXmYmmjyj8yyQXbyVMB&M;q#@$ex{wj)hivV`TCE8{2E zccrok%Y`ki_UEB)UI3Nr$55MxcGH2P89>pDFpX#GYDD9ir39T~#o>8VfzTzY7FScQ z@JwfJrtox18CB8N3eQw$aLg#T0CuSF04;U0wZ4;9b$u5?L`mOuvc3y%cuI;>ASebd+z#fcYW91)pucW^xW5XqdH>K^Vl|U1Nb)YRS$0zube; zw)jW58S0kzV-|`PaQk)EIEw)mf>-s$dG%qPHdR z&DSen*}wqxaWojsT~wgle!9W!r^^YGd9HY$u_n2Q1>K)F*xWM@j~zOHM8}aG-KzPY%$3hgA}zGUTbvr&UU&@`gbm7q8t_VRdgW5i znqIe4)o`okA;XM*Gj`A69x~@T8@i0uk9*%?Yu&OSho-(#-3S*=>{a>~p|y~+^Ew@N z>VbQ!$RATnDg83F?9z$X4k+gejob_T*!ezPb0>`>Xyz;5US1+?Eyv3$FuAqFCMg#b z-Hxxhw-{4DnNn}1)Eg=FN=o5aon0Vmy{!-a$)T1XfH_PcU@t% z>WuYW5Yjc!HZweWY<+los?o5WZKD+G19`PNj@&j%63`$P+w3Y>9Fdxv zkQSjgS}M9#L{lzmW2_6jE9kvk%zXzP*t7z+c0&-B^$YX5(joaMne!3 zPihhLh`3|Dmc6)B2i}Xj4!pY#yullE*MYY+yE6w~n>BxK9eC5|+sJCSaH5GGjUO3P zAFsoIG(=kRz6BQkCTL}kMW=E%%VexISC=^I?mF-mzQIrH&?IKTN<=Yfr_yrhv3BoQ zYrh1T7-)CN?yPu`H3Y_n)(!l;kV|%VSWFJQS7dIEI`IA{Dl8p%t$+==zzOyedwXQP z@VPkf{(V7#!vudHvu91EXnmCjydR$fui=Z`#pJ+i1*2oZG#uTpmcOJ8I*#YXa^Nla zAaA!~QGa9(ydMI9?T&Y^paa=wNc$@cXxD+)X8DK%ui>9n3JTXZTHxuP6*>y_sOtqj zXZ5~q2(ZX~whm3t!GU*keOK-3yJB@6LNo2^JJ|WzURW`G=Q}Qs(RWme`k~Z!AD;uS zNq{kZH#!zDHmdJz59Y;n;QbKl2D6zZR=lthS1e{uKhd3;4*`Pj$L%`s+8%y!VMP}D zCJwww-$`G&73P{uO0D!s8qs&1QGNF#AbpQ!KRp`q!!&2GAHd1vOs=sWFc&Q-;krwRtPDTg>~PE1Fuyo9C$77_O1E|o{=xO1MfD9a@T=( z!6VQ7s4Waf9C&ReY`GCyI`A3?e=M7!eh~eb#bI$2T`mqkJ_lZ(@wR#F!a@$bRyaDI zO%{k_$Ln^iZktIjf&*{C3y>u(${EO$Ml^V82i^|>!ggDt&Sg7Mm|FK|--g#oJ6)L~ z0UBg}AI`GEeITv62 z)4(wY-hW39e+!z?vJD#!yzEboJMbcX3b$8(XT|nQu5c(<_3R}%d&XM!u<79{&slc~ z&TgA8hy$+;Zw=$t9e52TJ{k&f;I-i`Jxd2(YY}f-dK9YMf!DEYVC*{Z7SU=xNe;a5 zmV5*;kqF2B_dj|E-YXxW120Uz>%c2&`}v32!_V4**A_HzllOvTmOYakc z@8Imvfmc@Nt^@BD4!nQZ4H0;`7O;5)UP3?4)xF=@-eSBPBJkcbhdlmfCpas)U&IsL zuoC{JIuERbzr)y$^cdgJDV*uQis2(9YCdozo{Lq$#4)XzLs>;O86Vv zA&#y+-9ZFi2MVLnp~R6de%OaIGaDfO@wfnbsp4-saDy0uml0Y7-e0mXr7J)(9okaB zT_3GQ;FaUHeb)sbEdsB?153?vSETa`xUk)^z>k&8w`G|@xVNof-hAy>a4qlgWkHpx zeT$xZ(xT@&>b~ClfnB4i!!;UimRj`Ob&sAa+ITlU#>)Ns16eE}Er3Ogk#y8@QGy`E zhErn6g)p;>C(%LehKns=Dn@Y=w*g6}Jn=djy?tCNkxe9x-0yWX`pEv?j+h}%C$FQ?cTyXo zcVtF?Zp<(?^2oc?VdM?xTSr?NJ=f6|&cSaO#>&u*@e~-OZxs zuJ0FR!UnfR&joKD;`Z0896fhqpY$Y^!{F`i`g?$FSLU*mug9B{<*4Twl(&zqX07%GOdU{D&&MLWo#4 z16AC!f?MX<3eNqd6$@SLh1LL0J2O2fkMVMSW}s+~A|$7sL`3yDXr#Z{bNXE77T^s_ zb4!xAq^qQ(yDa;CRqr1O3N8bthO~t|8G5+cvmP7>DwREafH@{8ZXBM98`y2;lIbClT|ezq6_eK(FU zGXUKW1Hg7Wvgd7|wP4hF7zfLM%Y)0ax>d;`+N^Gz4VTP|7&1ll57(rwhu|la6g#pr zAPT%_; zhWhDr12PGEnT7~aW+%cddNg4Z_}S`(YF96a(8&E4NH6%Ta~|7LFJ$&N%@g&)bpq~0 zy|6;SosU~DjE)6qGpZL*_t2mi5BH-(u$}83Z0Bk90)})F%E9~$o+aaY;dzMV7eF;_ z=gf({2I5CG1D45{W-#X#nPtJ&Q6O<%Efs@_bEtcD#&yfJO%#I+#3-`2Rty%khwn!l zbj6Z#hk60fQYTyMg)wJN>4i?#3&EK)sQ?Lox7#<>3&DKIdLcV=K1;n|n(3p^3%lzD z@%OG?&=dy|@O7N}GR>aBdf{W$3oqDu;p0$E+pQQj*9)7i7jXD1o$2)`tRukRm{M`<^Q56ud~Ie6 z5xxo%*97N$P4Ki!4e!dJ(zj5;LgQ|TTKeoapvIgYP1&$HoV&ft)X+DOP1s5&Sj$uj?EN{mc2L!5*}&m6~|6AOEz3=V|yoCQFNWw56^VTA$YY* zd#k5tO$##~-Sa%3jok9E_mg|n>xW;>BOoo8wd|WybWfejHlurf0+j`haoE=!^1|-z z-oIxj#o~OeLpc`;w#Kld^8yYEZNE{a_J(Wf@P`chYSR_G_N|ZWe;(p zGxLGXkvsO0Wb4N&2EI2Zx|@WD)aJoCj&5&Q`cUgU+qbKvL#G8i9E(iJeBg!a`g9q7 zZw3hcmW|#gSe@$JCUV(bOLGRm2Jb!6c_jX}5AT}xaD^Wqo{xq?oahWEOPtiiSM6bQ zcxv~edBssNLc-_OW)b(maaP~+b66Dx(^|}^GWP`s;}$lX5hS+3HrAv^!CcjM)@bX7 zzO!a0(B5aPNiJf+qF_!85CR%@h=MusxG0#yBvPZ;ebGQ`oppyk>Y>n7hn#)xU6aT5 zXm~r8+h%+?u-EZ$yxU4LY@Yj`3(cojBmsl7z{qBN*rM0jul1i^(WXm?f~n2;5Cv14 z@i7YKd5drS-%olJ%%yIOf=OFN6wKlf7#tSII-4Eh#slCTMZx^-5baQwuMBtbmfWhy zqXm6QVd!c*m;5u zV;nY}I?Lrvb4$NEuNk`8UTnw7y@JzFI~cr4*LN&^sCA2|wd&5B?=n10Ou$pv!=E>L31Jq;@*j@IvHTDeQKMla z&_*fb1p*22kzYoU3L1caTQ@j0Hz6F_Y7i+{*=RM;Q7T*%3qXb|&^yxMyviJbHgM6` zhHv-_gwXRUQ^Kp;Um3ZQzL^-SqjoT#`!qY)>|uH{5JL>gAQLCB(gViWUlVR zwfd+%&nmpZm>!fLC&IbcI7)|SuoM1D@h(N(?+)9);4NsLRNtLrgtP=f)!4s1eDfCx zv~|jxY0bmr{2}=8>3;oh$=sN)I*Mj!?RQS&@nMCr+FbWEG9P}W2>|I1+lt#d z)$g#L-}k!J8g%5Q#32lAYpYDyGm+boM^C3WC)Y6udyF3`{csNj7c(&NmFhScC3S3$ z7T&EK8}15p#s{Qv{Tct&-|5%iJlGqkBJpNz&@{jAb=p@39Dk)cq4c5FyK_Xt{gz{Y zZ>v5`yAS}}k$`89mq;W}=MJ1v;Ol!UA$_Et8nXtQ_3@Azw!dQl&sQfn2!PwZHRz1J zujY;!8F<9^VgF5mU|xR=#SmkC59{w(r6CxFM#xxB)#us=;h!`Ax?Z8!xuf3OrU89t zmp<~|pFQYNt6gKsC$Q7&!#>7E-Za3|#1!8PbpWR5k_IPEgBkb>W!G2F zgDzc7I5Sb9KarS;_f4CNnb5*wCO>C^D)8wX!U^w#q<4ZWPd2tV3}_m6dfu}H~Rx0_5Ma#GHmz$TN8}m+6%{uaqB&;S-rB}La6PB z2t8!m|J4cKV`z`A*u?Pd;dQWA_kLf_xguM;_wU!Qn@gYO+R}7`>WQNh(PvI$X-?UQ0p>MQ(awCcD`D+nO8}86J@-TM!O(@ zA-iEMH4e_)$F(J#_4hcG3^BUAF!26fZyR*DBX4U6O3m#>Bq25_40rcmt-5C>e)##; z@cjPGy<^34oy>AoVmXKe$ia(LwYs@hWK2z1{^vv8P{8R@dR#hrTuTSyYoZ5D%`46W z%<4{mQtEZs{>C8qUly$~nxds@la_1+W(;6zcOtYkH}M^J>0<4J_nvLA+o|eg@4u4W zvjL;p3Ws&V4R^*&*h4?x zu&K;Vp{co`Dfu`m{#ma~EQxHz05O+(6E8)B9J!6R7ig37!52YBRBMQI@JQnfs zw%nA(E1C^6!U%pjP)^fLuB?YzH_T6mt%@1jQ;@o35|l06nI2G6E!^SFx2xOJ18}bv zZj(RMx;w4K62W_>%`wq-n;=ZogXVf^w3yOPm)a3UpwrX0^!(n!uF{hxbmrPsdLLHlmD=NR7H*YoqXRJyv2iQnEr^EGs}0{>%WKWohgu3K}P2PAzu&1d@N`Ds4iqrnP! zyyj!S=V>%wP(L4s<_k)LlkJN3i7hs>1DPZ$scdyj8K^yC@k7TcO zS9!__V|T+874h^NrY3s!>y+~kXWFlv;f(Xj)RxEU<7b!J$*@yD_LY0T$JW5EzWU^E zZ=$cF6EwRA>@)p!ISVOSYtNyweQ|T9=;&0AgJ;`4_uX=;$qb_b+l0`en!O`sVm19J z&l`!g++x!6Sc^36$+n_rD|9btDum|ER#R^dlFkaud3VZT^6vdrOgL{z&C3DVp!R1f zGM^G}R{LDmbvPDbOYBjXlbg!URm^wtVVCn5${)yw&-@b}Sbjm5#5mzPJ0XWa}siI_90 zC(n|XJgJkZS3Rj!$}8TcJWCFEsXR+wCaLMe0Ua`TrPHp@^x3LqW0ePX9EvXsKAAMF zaYwfyZ$MDDjSm#<87_>&zF@u%T_*WP-HBnMbvd0H=P;ujv}bLIa?04zC;J z)=?^HE7QE6{s&GGl5D zq10xOLX-gMWv~={wjl60sG?+B^bBKgGPgzS6g_SPn@oHgu1$6W6~YHlgNscQrwg_^ zg8?=Jl{W&Y_+B~3m={+9wIx>{V00H9N2k~(`eO;50U{@W@M6wO!Ar|tnf-q{?W*7) z>exCF>dx92ASYg$HZWrihZXn4Vm{hrBUYigqN!QAnen2igU2^)NgggCukB@dyjAjG z;H2LD-7527pz2X~dWDa0XN~R)PscdX_a=?R=p07^C*+a9Qjwj-IRMLFfQ>`p&Bjo8 z`SC-6!_0wKoJM4(b{@^s@Rpfqtl!gU*tXAfk$a7q4WbKNmqsJ$61_L#Xn31qU(1?7I34j-@?m6U>A2rp2+bm9n0b1+K+B$gB{%< z`8zfx>){fJl8TYC*SsOm6^noRxEmx(dflXMxQPPK+|}8K+KZntm$ZZsApI-VJsy$` zG(hRx*FH`hfFHh`!7UemP@HPx{Ft!$L2cT$`%aKSp6VFi(z556IUC+E62Ros1J5$w zt=oqhNCb;9D($KcmxKVX?=#`F<w)b16;oZ(XW0MFK4~sR~2-&TlM~? zT2x=5QB^1!u{KmcH8Vgw>0{+4a@9N@z6UkePfK1nbYA25?4NY-W37K^?c+*Z`Go*? z;WrQMArtwuxS9X{8t&S3WB_(;in#FS@tfZV698Bprh{(pzm}hs(hX2iSB!U{>Cqg6 zwRyz6%sWPx-@octPN<1jzh6O^6u%QV7;#|U)x#g)SbB=VicZzRK51@8{=LD}*W^)+ z0bWDu{`A-Szt(U6bk#bGH}=%R+{|AF2h;tT{?reD*&MHbU`^1N-qy{P&alM=hS~n~ zAK)^p$-u;v54?V=@2XjAIfTTh)Mw8g~My$RQsVj10J;MHSX zY;YCFC63Pv-7G6)-D1TIjJKL40U42&!aU9Py9ez`$OsDQw`&s-H)%2GH*6r2kam=O zo4wsPuf*7T*^an-Fadt8b+cZ~y629Htb6Gb5X_KgMb}OHgE@I*J+y(J8#>*-0;&ON zjlJO}gf5{B+b}3rfMif;y`uHOly&c~h)(&HRBuX9aMxs3ZGdyRuSbCTRWT`?h7g5u znL<1TNIH*U`T_}ny7r|@c%qnDn>M0XHL3K&4MZ^|Yhb}FRmp>LZVfB$79H1x5y{5! z*;RlhEE(yjtJyO<`|Dbi1y(J&6#492N&*f}Tq*`UgE(Qv_!fp9UQw?y6_LJhGFO|-3P z1c8`UJs|l^)p=csT_}h2v70?eO<)3dS=M%*MAkA?aX^r@);R4+4ix+V9kyWx@Z1!& zt;7m{Jl{T`J<;>dGrtM=mFg@rPYUm$ku!L8xHa>~~at>I6m z)LSX_MoPVsQhQSBFJ-TNNl+UUGfRV-5W(lG!zR}}Y%a6CL#e4kxN4s3CR`5eNC05& zaw`z#8N%+T#ogS@V@kaFy*UQm`Ng4`Pd2Osu;(Jso{NBcE&}hlH~`PZL3pkhNZ;L> zbv^*TgkB-+s(!)PhRQ{VYRHYm-v45TBiHjI77hOilb*{!LFHivO1TV_av3P)#(=tE zKm=|8C^3kDT2VP~IB3I8?@q-{)&$d2P*yA9-iw2MyrQsbMjH0N+0Cp z{hYj;lNWeR2C3cNF}mK7?G9a+L`P6~$>{8W8#EPkZ9`X>b+SI}qqykyj*r5JyvEz# z(Wt`^7znTZVVkQN2o;$L8o~7p%GI3wASW;9x^^g|*Z<-z4aIX<`@WRb{(6u|6_3%MA(eQpw-p$E7Ie9xLZ|3A9l1;qa*m821 zK88(~AfvOVX0h0G1EWWvH3(dyhqSRMLDXuxpD>?2VWMR;oy7vh5mOf|CMS+NUWFmlF)vrXR%6Wso8c=1@$#7Z1g;p!zB3Hmgu7HbN0T;Of zE^^~=*%aSQlt;$6hLz+Daom4e&K6hPdJ59Z$)5(p35W)$J@0y)9WpEAQRNZk(d3cj zQH+fs4B#l;f!8DanC{lZ4;;zv)hT^`6KD#gDwn%gE`y+421B_FigFno<;Fl_Lqkk> zQRo0BZqXW0;7=k3H9rKSjvP&}BiL244tl3$8Dg;L)fa8rFi;L84Ub~*OhV-{9+k^@ zR4(IDxr|5UG9Hy1!{c_7=1}WiJE4-dL8#4d#d#dZ=QZ1T60tJi%4NWn%YZAF0aq>q zu3QFOxiP@EW&oqQO_Ru#n)VqeX$wmUA7&ZfI@_uAc z4o5RS#h#9MGeX3v_l#40rm5R#rSr%XBK&<<@=gj!xa$0Z6rO%$;^+;MJe0&>#Y6Mg zDy^0!e)Nw35?H^Q7?>X4lpdY05IxwJZa4u5mF!t-Q^7QkjFqX6Jn}wtwik91y{*Cs zqrhw1s9a%-HRGtP2{$Vo)OXO}m^CcZ6y$*w*z~Y9n5hroqnbaA6 z`PAHAUr}_1^QY$a#dQDF-2Rw;?bKW^rhBL6UW#eLY`h%O{*#1E3ZRn(jZ2qoa%kpu z0mT970*JTK1&o;Lr_^gH)k~?Vm?}D#nvI>Wht8MyHFn~5?oQch%Gn7c%Gt>gU$PUA zWYdX;ciVGB^SUV`db&SrJI4a)xv$}LZqndL%*g}&nZ%W=7Ne!)N_*CFuHkE z8qC1x+Is3Az#I$uggK|xQ^C(?b$kNNM72eQs*{;caFJPzR`_@#G0j9`nu)|T6T`?f z6T`?f6T`?f6NDsjZkZ^U22CA#<}lzSZ4J3yB8XSRj0uw^%#$!h!t4kWW9M_i?EA!& z2qWjGtbSd*Aqg`-CPfTr5?>K<#;X4Q1;iT&6t3sEA6A(eF9nZKwE8U8B{#IS+9!#G z<7Vzr?Kca#ik)M-IT8--fG!D#nV3d6OvW_A;Xq6y9HwI$;qXdG`wxiKhQ`N;Y8+g) zwsaDzU-hZ~YP5NL;Z&lUN4EF^he9W26Z2niFv?fK^RT${~t$`HcHMeWU_e~{A1^xn^TSU@b4-cQ+nyZn$O z%^JbaIKDDD!JaC8%pn4hv@OXbg4FcwA8UZ{W~XdZ-E3pTkuigZ@D_gid)*ciZ--ZR7Ul0vg-#Vx7(*&rV}JICvW5=E+Vl4 zepoSycTP;+A(=LW43C!?LD(p%!bS;sZIl2JoD2(z+M;GHZXv~vo}M+K^%Ct>+b%TO z(TM{qo@P4Q+)*u$R@N5dvl$2Lhq+?p=(n6nZ6yo|-5`VsU6I0lMzbS*=R;|@Kz8wb zXe-tQiCTK7GQ_*bz22jmxSXdr)Fpvba;U|awQtEk->+oUoT;FpY>hECav{Z5Ci75h z@;k#{)-kOP*=Vi1uWq$l9Oh~K%ujV}&Hmip7H3qNCoc$gpEUx(2;(1N17YMzvBfg2 z_jA}&@|Mt=O*_beBAjuV4A%5O1>h)E&;H*(*?via{nj+W{O|~#P^k!rVXQMmc56A? zG_frKSRJmlxRf~O$L!=9I&$n@TfP1?17QuPX~=3&GZIs+^KY>9Z0kG5lh|&|ubQKH zH;gT1t0_zM(^E5yt;`H#OCgEk%ecwJB(6s>c`qk7a`ItLF4*+0Q9yt^Ib39wYGP1! zP_4zN*?*H+OxgoMdyY5bCq>C#(3|p#oRs8?{kx~A!FnZ^;@TN2tmNcsPTtDNHIm+q zwX&YOxtA+JJQ_rLPYxgE(uFFO;t>{m#D^=^y_idv6evsbpAqZm*oMj0+vM;AJ@J8E zrhYNxYx#9H@nid|Ie9B532GZFtmovtoP3zO*`Tx-GM-NHRaUeyiDPz5Ud+j*oLtVy zD>-?M^N2joy9`jR@V)v;ouo*H3k4jB#4)erQr>%{iVL08^~2oqMo!+#$@QFM%REAS zD8XRcngLm{qyc{|mtM)Goax5imvSjV&tvKB z+|`{7z*;V)(+kA#8(y>{66416Ik}jV3px2Pw~zT9ySkT>Dp^;fODw0u@RvzOhRdb& zZWZt8sSkfW_p_Fhw{mhdC$YX`@7HpYI~uW+L!t-(M@JEWja*8n9}t#hcx58Jvz(Jl zIe9TBxmgn1U(Cscl+?qAYV;c4LJh-TAsL2$J(tqERpcWBNzvkq4$(~wqj@>)(_$;suMT*}FdDXHO~pQKSP z$Hd;(a__fuDZN|8iv$iMtvPz$c14U07jtqUCm*JM^pU1WhkH4>o|BhoHw^!>x(I?i zm(uASLAsvXU(3l`Ik}pXD>->BC%IY?VA0RAbj-cn&qnV3elDf=#@0i!&1i3dFoTn)hgVU@GoEF8cy1O|JJ`df)|XFlFK3p`5w7LTvh~ERoLTmr zxPvpxrW03hX4!EXyli{IuH)%?YG1e2uIi4w1BIWX=q!A!3y*w9BBRuz3ny!$l7@BhNG{S4fC7aGa%IU(i`F3un z#Jo8}hZJWm#VNFW8LIGu;^d@9ic`lyC{DEx#b)?HaYC}e%K-5bs_y0C8NMY^efJa+ zV$d7DF*v}3mi|$Hy8nu4r2eZ;v#=8%C|G&njQ{NMpW1)6rEXN&{u`*uB-?xuh*)t7dv&I-EJGj}uYXIfysL>+{g` z!Bn$vD5k!VR?aX-j1OpaQnAmGfDK5eRY=VGRGTFKz~$cOfy@5hucPj#N5|(laD43V z?{|FU@oAz-k(-I|*zq-Le+=W}TFNJSeC;s4#GRW`k0of}&IUa;ryko@HYuLx6n@O? zv$K-}d;UB@@)(S;?vMtVbW@>0#c}yIv7=hvq@+!r&*N>$b_=qqQFClAOQ!bv2fjbt z|D8F>R%0UR!JqH5&}FeEF~%UClUk54qfbrt{pux6h#;;_+3)S|HF2h@lYJtho3d9V z^uE+bLm2PPQkbMGc$S~2SEB?b>jAca=lH|nn6C<7W+Qp-<^GfkWYON5)~54;*?&;` zY2q!u2UXjKb2MG+v>2?@Vz5ptraG;b>a-ZF8;e0xm~xde6<7O0ken?985On`hJ~GF zRE#_xR-INJ-|kpe7rCwB>4CaqUD#YZ~E&&)ceJq%WX z&j4J5(SB%;RBBI$fE)w=>1W!r7L{i*5{}(L27cQ<3^yko6B##E2vt5vy;bMSj(LPkw!$?EnlLQ{hm3lHa>o8c=Rko$x- zDjK^J$7MVkPT6HMerBJ4r-~gyAXFPL`J#`vDhsjaB#127VdW; zynFT2?k#9HzPJkkP-DI8(|EeOplc(s_hs!4(PFyCz!5`}Y3&}v2|M$0B&+GjxJ(w2 zL`UP|-oUc7k!oPm8q4Ao#-?dOD6wm}$3TlbQM-}&hgw%Uevjb;J}?*VG3=Znd}{EC z3ee{y6|;%NOS({7mf%%B60H$0_Rm@D88um4+LIeRTNQt zUS(9~uh9x>#mEI??>`LhFYz1SSHJ;5;H}`%Fa8d^{tIcIZ!@(bHXc?H8}B(XT8@hi z$}^k$n6;|2K8cQ`{y9j*@qP>kqjUQNRT(}=kI>7Dxi*VHBN0$Y6d z3Pp&+dlGiTBe3+ocIGqe;Wmgi4&VuQJ`QOEzb9aTI@hbm zVxrqL2Kg75MmCjwICj2`%k@k`zxD#eHUlQmq1HptBqi?u@Z<^J*BrbD?`!yvd0+au z+Oy5MbDk;e&Oo7$;P|qAZDS6f-6C=vl{LX(mgK&H`VMjjL5laaemFGH4#rf?J~`gy z`qU-1qA6B=kVS^n7F_G|#cwm2f`IL@bb?N{H@9NT4@)~Acw%O zgT+gF|0-u5jK}YWH#~=f5vdR~>@J~ZI;KeYSN0apJ=dV9c(=to_@4$ zag2=CERHZ*tPTQM_>_DMY^KHDgXjj!F*oa<|6#@#u1i&lN^0vGTSwZmCc1Go))?Ek z!G1ft!M>B+U^Us|!pYWS@5&7prne>83Aw>C8(7=3q(L^=KQkE21ncy^AKYM1AOhK& zeK#(1NtbZx*|u)5f&(Q_$8;fO|0uh`zT0qv9cwnZ!Nz(rzYXN*5LvupfQ-ArzUywV zh5c1I3-M!{{n3UZ`jL%XvE2w{1)3n8p-VV2WL0i#qzb+oH9Nsqqc9oxwPvht??1Ft z1z-S)EUZt+3JdxioE#s~1yo83-5wXpfIPBYE_0-8P*hEBtOXvlP3319qL{g{LW0s< zGXy|;!@vp+MiiWv&EMMI1-0x+wFOqg1+}aIUv1%n%HrN+x+AM?6M(LbLCjV)7u1V@ z-$wI_A_`x_$R&`S2PAp}$$ay{GO;dLlKrL1ApRm>wK*ZobZwi2hDtCs4i2?S7t{qQ zho%ea$QwLty1-DizJ7#wUeF-Au6#MqM8>9oMO?B+3n96PC$~r%_)7IHN^$ZG zjY@0bbs4M67c;pxT6NQBIAaF&torwJ{ky5YmY8ZDNyZw<>I-PqUu7R5fP=^4Nc*;! z#^(PjrP?U(pqs?Vpv= zg7;q0z8v5JJXi2aYvN~J_02CXS(z82n;0=XaN}yWe_eYnxS190;{g`imj_t0{fkom zxQi9=-;91(_3#D`Tg~<#s6IYlMf=Mf_yzcvrepnxpIfrGuBb+W|12Mc4fP+T`jNgL z$a{KGHH;}m-}PL7ZDzFn#Tn+Q?_}%8#U@|!4kDJ6X}uHLEZE?ie)Z|$W!4EHi#i$X z!QieA$AA5L#M$cv%6bObjRl8XkJvcw&R#PT>(SZEqYO z9cZ7>G*l1C-CCisqH77eae8m4g9%qIegbR8S=e@%)M>H-t3#ROtQCObh}l#Qhs}-; z+-d?SV5QWm2F|KZD1c`J@emniMP))ETCT@P$n9tpaU68KI$I3H8`If0D|*!LTpo>l zqBNS&;bgE>tWcoo^o8N@qE2NDCPDP9aBIgw85&`I1h?+fv?XrMr%7NX$i?u6R4oK% z-KVKhArHxXnlRK>XR}Y!_Y7}4MtSn`J7KrUL5x_!><&k@`RpXd!8=8aQ|m}YtfLrm zhFKdRCwpl!1?F+qfji-T{reEemrv2-7(2i>!(9sN(Xk4@M8Gmv2cM$4KZCQ2;&jjL zsD}*LrxNqV|<=AAy7Z@t*kd^UIq?U#8yW6;ka3$vHdjEO4Iv1yh7 za4UKV^|XJ`^b+b}T9}tmkG;Do3obx-d#0Q%9NbH2T0hhDikHw#_7d7c`gwCcC`2f` zc@`eAha(N45VPCQ9^8IrYC-2*0x1Fkpaqz>NwFyfqCEEBfcb_e4??*>t9$aC008ZG zfY^68^W?#dmZUL12q@;BJTt+Q=S1-2aVi5aR2`{Lk1oZUeS=j=D^yqLTTHE1Ydam6 zn92-5?|AZ*wdKcyC(rlTV}#3mn?ed|OY|h?oF>RVEC;!{1oKBMj{xzkK(2No1%zbtpaJ4xAfV`!xFVq#6EJYa z4&a>5J0Vm{z9a!*=1X#- z^d)%=JfprO0Wb~3!P1tOAr`Sse4j7y!n@nYMG`Pq@T@DA!8a6X>g(s+)Mr=;&h{>u> zeJF?cTqvKzs5fdDtx=aBweb|4I;t z?$uAb_cum-Nwobj+PitO*zj`ii=1aL8?rA6+b>O~HD8jGc3R{}R@0GjnJglS_NNUa z&a$+TYM}3pWjVgOEg~mEiCu#)2`%zO?P6Mj0a4|=q8&qnbA0b9_>%DI*qAnF2%j2< zS_>1Av>RYvq`ehC1ZVc8Z2bAic>*x5AjNxFE#ZFSy1WkheJ-Ui$1ev{swv;Q)jRUVfc^Tm1&~H&B z;lz9#isKCmamD*CwBPUj3c;3mBB{NGL~|64LiHG`s8zhN46r953Zf&slOzI}Do3T5 zbS>e#CjZMP8MzHtNXdA65}rE*MufS5J6??#oUd-TGl0UM4@Ek`P`T~Fry-IH5 zOe0y!xYzKdIT^i51i0C$#s{0r^v#DG-AbOrc-_!Nb41ET>w^hw5*x9MI!65LVfX$dDht@7C>898(g=H4d~U^MLDBGKPjOiUJ-qa+Ay2*~-s{K! zWUWY=+-_^}ceRc_zxMUT|1tQM+-mxkyl+C?mO1f!wz1~e#<%2`vTw=Z^N5+<`P(N4;@ggL>PI!hdE2>WODgN!LYd-W?I5l0AkA6dwDp~L6t5->g6*11H@ zv7n-7`kqB)lszJw&h7U7g+5~T{9#IZazo1txWU^5VG%~;*u@0gnhFfd*%CuNkG z`ljN1_1=h5pi0bBPU#s>!*ez=IAjtXHZB=MsiBh5(3f7+43Ah=P?J zIG2_xpiC+;%nZ5*b|WKoa*Z0pahv zcL_8(8ENL*5!RSdhq}gdUKz}<;$3o5sOieu64)i2DjD%EVc`gZ8v)Kn-r(_*dzbvu zW4ud7`uGUY8@T?NVGtGvozQb+C{K(ot@?kdbT7#yDcwtuz-;iu+OyjBXuuX z$0C?B?YOC8vUN>1cy2QjQKZ0Y(F&XX2W-0zi3^6(Rin~eD_G;9x}tJ5-5X4&5tgg4 zr}#cdtgr8bG@F+pHza0O(f&m_gE%-ury6PB*4G4;D%wAr-9H|s`jtk5EVb`kxVuP% zAIH(yJ^`La+PBL>4^<=CgLksK$nE4V65D^EeFuUc74Q?aD7L>c=Kis+O(lgO%I#mx z?jIkFxqsZ$HVhGciuUpOi0xlY?i_U(?=@LP<{*;bKbPG(@B|sb|79%&&#OkF@55Z5 zGt?3MoS&io!fXluUFDo!cV=V#h@VHQf6wYi{NLJ>>aP-VrpZ6|w3X|d+xl_2Y3?N^ zW6ixpGFGee^*t<-PY*8y_Y$&N)IP?&laAid?%Rj6`v=r~E4sq*B`@ty`IRcq!Arr=-(O~moP86bX$Xa?H*VIRVrAPn4w zgGm5uGJ!Q2z)B7#j)=rz2G1(jW(Cmtp2ERIWkMpF4*N8FnD|O)>v6=9(DUlvhKGq- z1F{=?$Ho&}OoSJ!6zmmuF#!<02A+8nq&QRt)3d^F_A%KKza8s(OZ=LXNdtDVy&+cX zx4rIU(x{LJ#rTX&t9!GP2`CpEBrlW4p*?w-oE-Hs!T7+K@gPTec(`$hea78PY>4J& z5++q(A(^B`v?k7hRK+K*djzLp=(8Ux044-x= zSN6iW!P5k#hjCSSnuu`nG$9@)xGX$PB0}rFTut_Z(NR|uUJdMQuiKu@UUxO28{4Pg zNYMh)1XmNmKZ9J{%+;i6q5yI0`M8>FAqk_ai3YWER};wKz9zObkG>{b(4fNF&HsWV z-^AA>;?;dkP6l5SF#G;yz9xai%ws?_YdV{pOwJ}EbSZT63+PanXgoLd64ej8Oeb~1 zEy+gjnkL!XL=vk}8(NpO<->rt2^eyB6T^`7mrIXLxHP$&G=X+N3wIM6Wd>TRJfY0| zO-e9EfgY*74bX8D)M5{93$!_$Yz?$IoP0z;S4sap2GQnn0?fleMG*^CG>T^TIYHZr z4<3i+UZ3X;@zswluaCU`m1V}UwA+dgkJ=;_iXHY|_7AI* zKdc1_9}(BqmCoB($Y9jVL}f>sj;rL|LEF4vY*<#%TdJvCy`` zEMn|d#PDMg!?z+Z5R1To6@i3MB)$OlBLQN;2QHj4KzjVE)lrq1TazvfLbPN46LLol z0p_g)TZl>i*}qmFJk$Q+E5<14qswb-eL!G!F9O@LUu8C8CvqyYAv>W{nT^?royu&` zPViJ_qjsXFG8?uN-pUw+JK-24YiLM~`UsmYI=B=9#0*R9sVZ~W&i*4q@Y(D58T<5s za2g|wkT{}i9ARyM)yvkLvBWZs@mwdkjJo%C>fl7BP=zetzSjP#7*YDC*_H!{t2y~WPF~K*OF4NVCvT*r8agN6Dj>hfna2Pu3j8(g z6X~c)zaV-M&mLHeAPF$hao@UciU-ib0Z?%MI?NZWkWVHj?4#60YqWZkR&|VGy@dPy z_8pq$XR6gL&2m484X(QPYi$G$yLIf2MO=C=1|0U>TM0X=nLmH1+$)V|G2pPj7jO(N zz=^&-D4f{-8u&10EFd>OAMkNS`);(zOlaeVq>IxAWd=+zXTX%pfGL*&Q!WFhTn0?J z24I<3^td^p3=#)#*y;W8GyHh9cyK!|7qK`To)DenK(%0V5+Au*PxxjrPcTMYiVyppRCEWbp;;>#0-^ z&jP2YeIs!HE&Ym5E$`zP3Zlx~?jBZ5l;n1I!-HS=pnRMwI2_P|-sl`mXDD7^f7!)f z8gatAQztlY=j6?t)VHg{KsNsn_T5xL^*+F6(3tM?D@J*!U&i!6zjExWYiKg$vlJ*( zwr;ARQ%$t0l#k1CYb0piRI1O+QCf&=)$N~}(}7|k*j37>=k`!qr~sAn5xTvU7Ro}U ze2#7(rCF_@VJj5OJ+pZT=qCAdWU$}luY|NXNvE^}U4YqAteem?Uv zFEf5kFccb_)*J%RI||jts&bT?mji2Aj$-q2Mpl-i+`Qa1dTIv+=jC9ntdElOaui)z zj-vB&lwB-G=6G<4x9jElt2Oc%I?hAgAWcbc)G}>vnaG^4?wJLI+ayPJ)pzF(@bhQ< zSAVD9{pP{mKviiFF{Y~h1FrE*xPp#-sb5J=@UXX000QJk;vUGdzv5I{|ik-0rt^SgW z^Zv^c=bEr4drX}7e$V_&5ntkmK!vsmc(_cPCeKg#()gzG+&CVj+)CeDH#9JXE$#uR zYe*oPkthuVz%RL!MMAU*HK{JUsV(u^bXC=5?ySa?%W6!yw~`oAE~_!+vKmt^t1;yo zYV10qU()H3Oeu!FC>4NoI;&rJ{hG>oi@!+GAa%){M^t3sl*_;=mw{6*1E*XDPPq)6 zat+{g=Ul+uHelXqtq0)l1mG;-8*e#?IN3_ax)G6K)5OWJDVJeWF2kl=hE2H)n{o}< z9&eaLep#=g8h(%20=rDPa=K0VFezcTVoVX=s!VHXU>#G$HeOZ(jBU#FaFbD3^W@=@ z$)hEc2TLZ8l}sKgnLJW5je%<492y*>bNEB|P+$*kS&KV#$Y??v^pNCl?>BJGVRr?m zsSJ~H87Sp4RLW(rl*@1_mjP3*0onTw+2z2x3SuYNKCrySx3gO#)#0J!2(R;3(9YXk z5Sh`vbJ-L5iaDBUf@Hvz%YZAF0aq>qu3QFOxeT~+4ZxpZ(h2HzK&s|PhE2H)n{pX8 z8{rwr&&FpmIIgvW z!NEu$$#BN#c)MPx2A|^v2D^YZn6Dm!InO_Yx-w3%HtPQ8>|X|Fcx zShrZjMVxTyb%Y-&t+fRu$!@KE2HL;Jr@K{sD&qK_-3*Ym3S!^n4NWDI{Rq2RvLJR4 zo{^kuJOi1|Y$7As1xRdPAs2+PJ>RW$MREezaPgCRR*hAb5^U~TtaH(_K4Q!Chd zWbe?f7Cka7*P#UqA&dNYh_%CX&6x*hDji`Ee+V6#cEpvlzSQanL*aWAogo+rpBL|F zZL=@dVZ`A>;~gkD7d|uI@yGSo{5z`klIaHmQ1TngmaWWmMo<*V>@?xq1uloG3sl}< z7nowIpHlH#>Ros|KE<2I7K~m0Nxh0wqtO*15jU$R8D1t2ri1>1A$bC?3bo_%fFtxI z58zb`_C8(m>YM#I`v?6v*FWEnGy4l{9QzXIi~Trj-|ojb`V;-J8Mz!dL^D#{vgwS} zK?`HC8OcXJ?&%$7z@ckap?=&za5G) z%0TMk#8(l3J{fOv9Zz<;7~s~#+?x`8E}T{;;>3JY6Z6eDG2gU_Nku4th|(U9{w`FF ziFuoLW$%mO);Ne+RI7*lJ3IL0oYtKhc3Id~jFVs@O@fIu2__i4^Y;XkGN$4rm|#MN zGXF`F;3!CO!!k|*A{mQol5y#r&tIF0K{^D%5M)9S2SE}9A@FqbUp6Ba`tY$fBhCQW zj81@u?Gf$p5NlGjWxj&7g8nK<+YI6n6{P(L@sSGB#)WuI1!;#v{HTJo6(XKhLEbab zWPC5P&1Gh&*oF;@cGQ`Yck|U!+b@3TxW||CQnpyPum_|Z>A*B7MjtuZ3vcwm6!V+IBSc2`;FKSkP zF$&?;iP^q%vxo%_zZjT8Dp^IKGD?7-3PoTv%89=iia>0XCSMLk;5W*gzYvN*bCgV9 z3PoT$$}cEu3=;RQ#2`8e*pxx^K9kWHX4OGjKL@UlF{R&n+ZM|J9UXBluG((?8Y!bjq-a{94Me z#r%58uvzj(%xC})*sJDPRmlyKhn0Mrj|uy!HrB%e)e5tMB&--b1#pb@&I<{>W)gXJA9pybr?ZjSVY-x-PCYqNm8>2OEUK=cweTaI? zTsX|>#auXyCjE+y{Q=!7jvE(a+Oz*_-y`2_Oz-ewOm(>CBLRNdY)X;mZNVvLteR*$ zI8kfmW9B^{JpkMD@`uimSCM)@BSVxCPr?W>Wh*%=Gb7egX2e>`j95#-r|}hZHc2KL z-%`${IQGQShq-j2ok|xiS+`j9YW>SsFEu-8MeXuA#ApK@<{@VB@mzA$>!`y^G~%mS z>;FPCds%JjA_gB05518@b4Jita&k2%ad?gu)^d{Td9ieZWLQJ1?R(Aa!`$mamEKv* zNu*Y6iMX>dxs;R3Ie8@~xmy%4q@Q;k3Cmm~7~Y^#frXo@=)=C=e6p5XThB>OJ0lPq zIr%Ur7wS}DF()sQEU<9CnO$Nv8GvA68QbS#6G@}hwOmTXl~}r(ONp5qOZmb?Y++sP z8lUI~bKdv`EipN~pC57Z9BbVpiM|n`9;nn2vyn?_=CU~ON+)$f^nuvlQciLYE0*dW zR+u}BIk}LMdT84^E4rEGy)(}xkgx) zQ&J^M3RuD2vj~%gC-yGyW|%fIO!sps!?4${uo! zObfY`3vaQM^VQfc&P_3?kjVj6_%20Mt>jWbLG$zR!pYRq!`u}&>SO!&auTB;magUG zt(4S5HZBmBx-aMWSkg}puhv|AQrJlX6Z^?#t9_D^FENL?3UM^kFrE9sAP}Klqbysug zx!msAoLnRsz`CGP2kU$;1r#Dx*|!@bfmXTl7-+SUlh<;R*w?WF_aI|ZfwKKI{an=7 zGuJa9YdLu*_kK^M4%6LS3QQN-o8`uuT$Yu=jN&V{Y1vIjXS} zZ&sfMbTn=hS}SJKkuvM?_$!mU$n0b7as4)r7W}oaq|38? z@^aW_wRDj7DvOhVJF|}O;=le>3V%M-4NSY3%34crPVwf{L7yQlabomo)%^%nZp-Ps z>m5^F%UK;$Q5R~mLWI?A-DaG^l>AtH!;k7D=_o^i9ktE?TvE2SXu*tIoG4-IJ2Qfb z#EjO4F(WBwM(*t@@B-|$Tn}np&7DkVx|8WVcXIfaroTz0c#b=n&TuEw`R!ynyOo*6 zk;J52AdUo^-6+6EAmzIqHc?P{*0s+7j4tDI0I|!s_}B)}_*9goTMi~$4b6zrZ7qtR z=o5TW9x#sdXExyu5bUg=X^wHu>Zr}y38b@HvY`knK~h4sO_~O$hi`m;&Q1Y4dY6UV z?UsE?_yexRm;i7xJZY=1S)AAB(C{nItKr`BYIx7{YIy2-HQae#4abjGJFiV|!fS2g zYJ>;p6U6DHzhPf_u4n(*bi4E9S8RqRRV915niAaS72d`Kw&W`3g~OJ7>?Lu& z>2ZyQ$|--jrk-uL*xejYmkPm4)HtWy^369N+S+b}vvCq`^dQ*Gu4rl#Qwb@OP;9{V zL&DyYK=_Yqo8T2@K-ei{sz!g5DoMsFNyaKk#wvNZR7o=GtI|PmRuYJK6T44XC3U3F zC?SOiuq%bb-VB$eKwyn>;}BnQPf0XK5fD_Mpc$v9#1?q1PqT+6ZBfueAB{>8dya=_ zlNvA-qbe6Z)Ms==@({t+ZM4_CJt<51%|K66mTgy-ZQuSwQ^=GujVUwB@)%%oQ_}Jn zXmLZ*^2KJPfnxZQJ>kEvr|xU0UoiTM@gev4{a%ksoU^ zrk0FaEAoR)D*|m+&Cu8u$hRUt-c&7tb39%zBYjk$%Y@hlE2`EPUZXv0 ztq^5eY!a?xH3Be|44804-QpU7I&JIvz-TC@k#~#OLM8uBerNd0r-+AG`Ik65`|4Jk z*Z{`u#A;yvLd?9)U+It#>!6$n`)ezLW7Y|cKWNg5`e!!aGPLrO8%m?!QXXSm>{b2y>0 z?T)2P8!h7xwfKt^2(cBV5)n~6lP+oIl7_8o?!h3OzdkTOJG&Rfkol@E^QK?<-0`+y z1#7PNCs=eS43VQVk3?)+KfS+AamNWbyHOl|DCGD@<@5sR;glsU4&f#%gHwtF2rq+G zidCnVHCLuy2D2205ncwj6bBMs2D=o85~!zeGUBUO+=_)M_=QszOZuI`wo}RkpRQ17 ziW5F?r4ltt5kd|Fo5E}_!0TN8liX%>k4$s^>P-^Kdm z6aU+Q4m;=w+sifzleWuB`W+hZE#W1B?x~}5=*^>yk{6Z&;PD6@D zXDdaclbRx?Mq}<%#O!H^2#T0sr6dXaP#njFnaqs=rEDTg4wFtizJ;om0#P*y|KlJr zIFCAp!k67RO*}E{xODqPFJz>Q*>N`Yup7*dixR=|g+#D?ArUNZHj7IH%NG*C@`XgO zd?68(*IZ3@oH*Y%J;d{(;A8AKRWtNOG+2AVjtkQr(ih*w5JA8jX1IE87{1397h$E& zVnB8S4I(FgLra}bk_eq75jsgCbdp5qB#F>T5}}hNf_d8R>33{xAU#XNwmx7Lp!I4Hn)V{3Y2f^nQv>y}DCeESY?^K&^M;!MhKlpst zl^|V|dJ-HRVMbs{j70o6(uWKF|MtE-p6VuQ{Mxq?6;g@pvWAqUB8rfuloTRMWM8tE zeT!@%ArVCqDNVQV99YeDA&PC2i01KJVxE$9q2??yP6doH=vm%*;7+ z!2|>^6e5xnAcm2l%244}#?G}xZ5td#V%McbZCeiL#;^s9^#%e+4dFm|x~d_80(vYr z;c;-92@NU`xsN2!q$2_zWB@E+IvNqcl{|#X@WdGjX+YmG5aLH^Lr8>>G~f#=56X!3 zk{BU8KtL!&?;xzBuUU7!E<0 zhx00fF&u(0hC>j>a0tTK5(JkH9wZ~0oLHps1`fdilz^QirU@egZ>BHe_b-_8FJ=MY z4Imj?N#TrK=^ctXkb`r9g$o)Gu2sw5p+LCDWAPn|j33{jz`Y_N^RJ(zfLwsQLxGtg z*taMe!6J(#@=xBQ2nC~odynEJF<$2&C7^>im>)#HevhJh*?SbY*Cb^A_0trvZyA79 zvHgIKJCK3q@Y0sOO96ffd{OQ~wG!wW;7egEPy#@opuB~>L>_>k`0WD_V5Ncbn-u(_ z9wKPBQbGu7Tj3rCNKI&j4rdYgp9Tz-u)-b?ZWI_&qD{`>0|jttYa~UJbP%olVNa7* zt+2iUuwYihHyT)0VRjTCHVr^R&Vn2|2abx+G6`)}4W|r10`z?m39!PzxsNzWz?BAZ zu=?dP1H=dZYX_8QLBaxlA{FC>i0&z9istT5UONbdOD-hNf4c;L27W3tU zw-kYX;2{ZPI3!^Vha`;Qkc2TDk}$Re$zVK$sz4YSBfK>9s|et2CYT3mqfrH~AV5iv zmijmx;TnKP$p8K263a)egjha;XMW&R1cjc*bs!zL6d>qhmIL%_2(W|b*ASpdJUq4p z>go^NgX=J^v$(;)4Fqlwa09S}_;|t|=*5uq;P?T{9vB55&IdH2$bXtN>7!Dm6!=VIYIJ964hZ>A6K~Ecp3_LJ}_`zonun5BAN65c`#6X>0{3SL32BHik zF8Yi>jpjD){eujk+=G6Ase;2E#&Fof7!G?F!(k6&IP75zhdqof!TujiKZrW8?La6D zX9^BS7{lQRV>ldP42L6(;c$d89F8!y1joObef&UpED{+&Lemiv+5>FRktGhF(yib& z0DUNq>jfNPTrXe@*9#cK^#aCly?`-XFJNp*FaDfQkQs%DJFp(1=?upWharsNFoZE2 zhA@W15XNvA!Wa%i7+Zqj-|zxIVDd#e14w8pLOQ1rtUzZUX6?1h&{b{LMS)ZjYX&jfnI8BoSIbR{hTT9;i2nF9cjGpq7L^I7DXrI{+8H zJcj7wpesP*L!9ryqru1z#ZzLP@2Q}U2+!kyKOzM-3>*>ho$rx5a##kq9#Uh=0G~sA z=X)AVI{Ir-GW|wcq2)U6%_oEtq4PZ&%>SVCJs4;}{a>v62(wWVO3MH-kI@0ZP_N8v zP`AS}8yIa$cmzQS&La^aj6d3tH5Nx3&1_Hy$1)rCc?8I8b8y^OFLR9l-#T}|I>=Lk zESLoAD-zwl58 z2U!TC{8Rxz1QDPI!mOD2gPA&*S%aA{n7M+PCjV@P!1WyLy%4TM_z{xphxHuzri1ky zP5Ma!oJlBV{4gs$=oge;iv!35ZeM})0}}%>WD1miNEl89L_z++4;)KkAT03xz*l3_ zfx9xs3m-lTz`7Qj4ur)zY#12SuE&JYUyH)x|2x9d{g&`_c!UQB8FWw*&|xJ(74QJZ z?vGX=JY;<=;ju69LBfNbDPo3-V!_ZDLtYGJF+|1C^Bg;nF61a1#28|4~9;qP@e)pWf%nN6p-RTpu$ZG z)Ue>hM-M4*1_BmR&eE!2(>?OYp4u8b5r1o10u*h zz%M;>p)P`yT=dKZjX+dEZFn7kKt*2%z#!(H1-ZjV?pctKGIW%M_bl)R1W{$mk^!ETc-0%17V5%PZ(W)LS`Q-z)qxWvUiA!; zC2bUd`G`S2XK4Dz zs>i?+U*HvpS3L(fvtiU+$Qz|t-#PH)>(U%heH2y)4t#jkgMqUdUiElzD~aiQPs8eU zu*72Pk>Gds@T#Zaet|E3X%47fM*)NmxPS#ZFbn|c!%79^4;5D1kORsFR%ijMMC8_5 zfdvUEv#weywBW+i1M z0Z<5XE3je%a3EHwWmw^3xGW3+5w=s4cPMifur#Fs|14wpuXD_Rsnc0Hgi0{sX{h|E&K2Fxo%sKL8B;vyekjG_Mh?z-xpE zS12S)ll>EeC>e}@7Bn{j=5uJHs3rbc$zTRy{j;=|`DbNf{j<bXFXbOF{2EvP$)&I&> z3kt?nEQDCW2=-f0=xF0oFg92}_tU~(vVI`NQa>&HqB1~TGs7$kc;m9fPYZh&1v?H# z4k#tSml=`_dliNFX=%fgDe%2_Ve(U&d@$ffLzeh71}H#)Y=FYMq~tmm}cGqZ8y?C~Q zm=!=ST};88kdYHfqr14se~<|H{0F-aWbV%#Y2=nU(yXu-K#rpDkF|io6aHQR9&7!? zYXi^|8FDxXi#x;>j<(BNAF%b>Mj5%dDS^ z_~ok(sEM#7fQM#DKnGwtjs5*eL|{TWvBazZSv57FlSdBWN=_bWXeWN57Yz@cxdqe!i%=&AcV0!C&t*GBaRgSGuQ*bUpU7KK(!SdD*)BN+VLOFb%bg_ z=B+s20be7t0W#(y)zH%cax&1FAk~QBih-pXFzm;p8oKN+IT@K=SgL`;d5pzA2w|uO z*>3TW9$tQ;sfL-uz?or~1Vtz<1C*nja00~5ADmU~h<$ z@py)!;Rl5wCV0y#(o zkMdnf5I6wU3ImYxgCOuIoB&cDNU0^12lNJSi(uG2G7C$5SltK25IA$01TtVkFR2HL zf@(7HnV>frvQ$*VAq4ADGGWh9RGtLJ`ljYahAj40Ec)i=RtEa^Ml9C)XN>Gn=PZq! ztc?upL8g(dt(7f{sU?fCsgsf6sngE(Ms_R)R+e`5w&x7&t!z>IW#x{@u$;ElH?_33 zvNBf_-XUhYoyE@djHSN)Ia?zZ2P0ckV^aX!)CvGWTHK1leq=JA14PJCKR^)?7WzGu z|i;fAjAI~{831aBS-$c>=NjJLcbpVCGh{S^pX|;mHwiIKPr{r z^X)eUjLl!Y1RjabPVXEds+(4HFSm~SzZ7%JN(t=r^nn&dbXPShz4%BxHjbF z5wZm5eLY$vD}KHbwG~&==Z%zC{!pr3grQ2-Wm=RiU@pPv&pZ!r@P}W zu{cw;wc;K(zb3Iy})6*J_sJ)z8Sl?u9C$!1yuXVg>+o`}}U#laf{W|v$Me-1jzW?O#Nuh|dE~$|( zFY>LqMlrQj*78JL43WL2W5yvSW{R^Pj%R>(IBS#Z0M zu;^cMZtz0P@o#G#_sp!K=^NYkHJ(V#QSj>ZF{&Fk2W={ciQFZel1lZs=_pae^8_*Z zp69*^&0jG}=`3?zduWJ6yWzYHVQx><`%TC5b5v}L#a?`Bmd)vD(o<;_b5!0TVH=li z=&mU8R=Lu8>K>84>mBC+|3_c7i)hom54Oy$Q4=HPH*YMBqcKozyB7ac|NXRfWM)j| zl#Oi}eYC7f!M3u@&@-Xb(mbE5LbFY;(ihecn!lI#Xg{7xW_10lT63>foY^LWox;0> zb55wV@0?AuRyPW9W)H0??0v3B5p|I9rMvf87N2*ahj&g19%AuX+t2)Uf`h~UgBwaj zaZPP#)rBfvs!&rDY6OfgiU53bqQ_aS;9ipL<2w$9eM%3-1!uu^7bg0N* zZGZXMyUA(v`>ngXUb4IiqG4q^xaamB(o^pah*EaMMV7VZ1uvAxMfpmbL>{$MjBU>^ zQY(7XAJeZ%c8%7PwXyK&CquI65e4Vs>gTVWv+-!YxOFH(_VrovCXsnjEL;7J1uT)4X<=^7Sn* zeJ3@EF57XZym1}%;_o4o58f~(MuZ-+qq}qef+qEItHRlwPjn$XIeNOA$OVp#K>iXI z65aKe{N)>w>q`}P+tNL=vh7Sab<-@%hWW&TvlMp>_J^-2-JfCBLhYh#W?Lagf3Tw0 zlOjKz$$946tbb%uqWQyJg`rZS^o`20wSK%8iNUvJSvzJro}!N;WsriU@%`8(a~(%)2vP2VRwaQ?w*=izZ$6iSsFJ&$X_H=M^ar*+B0 z6O4stsA8`dPG6?Bsbt`IB%&}QPEvlKFh0CoVCPF#x+_zi*;iIc-&~#heg4xXriCqW z*UnnsW6QX={tBJP&;LK+vYwTtWHv{JV*ar(#b_)Z{u#14q-dZ%-*@H$4_*B zNOv$_!+i4F>27L=M6HyhzV*e!F=8EbQFcr<3NwmHnPTr>(4W|I-(%gk5}S_jDT2^` z%Mv|`;-Adrl_ft)Cc6PeXn~X|fVq|6cHoK!ZhFmzJ^8WrEiFHw>P& zRfJ}hY*&kVdyjdhQMrCWb=C!c{#YvTERQV0oma4bTi;>w^BiNZ^{VW{bh~HnYYdSb zRJ`7CM)N3$|muNM%S)cOGjDDSR#h_{SzHH3Ugf(x4Qn3jmf$>3JKbv-c zrN=duB*Et1a_PaB&mFQ{sFq9F^0uAwT6MUbtov5p4FOEV{306P{h=B|Y_5vL zDRi-?POIIBz75Plhtv>Tx(PG``U;iqh8&|6QmXelc{aAZ=5sVUJI82pJZa13GpiE@v^dxGB;-t_ zt1$@KOOzgv^DECZnO92)v@!@#iDds8zxl|OsOwt}Cz}|%XkBEkAmHHIeOZP_M=)e_ zX>{B;_e;GFmmLR+1cs8TyF&U8k#ZA!H?~xC>8p%?8*%y>!#&R|f7MaqBd=sXsm$l> zUAULOFQv0#o33_6p9c5|pMD_@>QhHVI!3xfzdvOZiuDZO!U2ND;}=X`WnIeA%sVkD_^ftg@2i^EesA3~%!lqtyjNW>^19*>c@I_b z{0NC`HII6)(E~4``T9%UuV0-$-%2Fdak5Zwd<%be$;_c3ny$S(d}viue_1O8b}V*61tIV~tEAMzX(?!=oWu_myE=8rtAn}J*m+C zUNfZ*$?hPg7ndoRa(8)qm*_c9$aQAkLe+g@r&rp)#x?GMI&B{3DalQwLV=kVIN9db zGC$nv zeX3@h^`Z;w27~wyt))Ia(KHcA*B;?dQo6B^UiM%hyghfczvOKT0e&U--yx$$D8qMAJ zNL7&ba`pF&L9TH7onE`Qj0FnZJxCpEXnrBcJ*ES zII&K<&@NQWp-p~*WUfcIo+NU=6>zla%cb+hms12HK1>xFSkl&U#_yx%$kHKs!L%L}va@LZ*A4X?W|Sj8XR%8a*9~ zo=0OT;pq+R4HgS}cdz-lMn_W0O7xO7U1@&(NQL<(g=JL$<)y$IhAuhW@|r5q0X{i< z6`U^-YF!Bmt}Q?v&^SRuO3jQlD*eP|Jy^p?ia?Xj{U&+M%3*+)GZm@*Luk;SJl()*j#a z?jz^u47+FJg;fJp9d=KePTVXD4qeSB`R#+vgWgl(#3kbk_VId8Gf0xvKTRL*I9A(y zTgdR@SY+tlgnHq2R^Ezd>IXjQ9pol_a_cikqps=xt-JTAq-J<2yVbuZ^jJ&#O*AW{ z;7N4EbuTUYX78%J+b5ITyv;4@!jq|tqul4oRVb-8eooA-V&Ce~9<4STv8ktS6Z@!> zg3IYh{n^(hhweQLqbt3bPHEY8Pi5M*jezgv{8JT@O49@LA&P;CUlY>(8Yb5eJpaCW zz;kn__gmYmU-v77j>x2%@=LFY{hojJ43sybLgHe}blKlaohXANgL%go_qQIE>(XO4 zCJVki?n`FPJTKmP+f(Y|OMB|GZ#GBiD5$7Q?ykAX)j^QBVVIA_Z3F4;GX~s*V%1V! zs~4QT-Quj{b8=Z5+6uxW*jcqoC3|&m$ThgtrlpjtvEQh5E4TC!xD{XiYAu)aNivlD zE*CYEt}B*GAx$&sZLWvzvClqwTX>Opb*M2-aoGTqlAgu<2G$*QV&on|hfbU$CCXa0 zPboOWqG0WF)ARg#@mDl1II0MU3EZ}z4{MDSrsX?w`1pesK4sy%>Z{Gk?ve%UaPsy` zm<>7|5o4<$AE7 zeoHoAw4#}X`S3Y`Q?EAW+@5E<)X?Wg$>gw`g>k0$al%_;3l$=Nni*=;<$`0T{%@X9 z2x_i#=p}iuug>^|iY13rglk0cXvC#1l~_yWgOAC|(pB|zE1t(R=}d1vvs03&%9Dm( zFo$8rs$na!pZtf)2NC<#>8is8(nQpK_nh5u*vBwn-`&dBx@Q;^B`-g^rQBI_t)oxV zHOQFnlK_X26Q@zzuI~I(RjMBaWLcW?93?eQP?R-XyY{3}Yn*w{X_cNKAazJY&@zW) z$I`VvQn)y^L3Zw2CB0Is+=5Lp_hyuWUv??COjtmjdBd@dE=~#>L3B^qx>^~@yC0+n z23|Hl7~!y^9-ks0a zDF(fr8hm$X9ZIHf07d0T?sa>QcC49cMcNo&p}v4Z_j)bcq`RsSm6V#3Dr?&JE4(V)8F)cX{tTSaCJJD)V`1 zLxj=DT`6&o*oJY{A#tx(`xoxhwRBGJrDw_-)U#%))7d@iCXSNG2Hx3b*%gCFfo_rQnCX;o@p@^u@qj9qHWinRR zLFCV$={mQ^oKKZ0UeBOz+kfQqNn2jgTu!qQ9xc_h)i28qi9Fw*&@wMJ@9N94yGS|7 z?So7Ao>N)vLm?MUybOIWWqY#AUX+}mrL<*=WUU$@8E>ipI$N=T%BAeLa=DntDbppLgWM__gacG2c zSt#8R?Hi3hNO42GdfxR@rMu?jyUBt&riC>(g)_F(JFX$&$~Bjx`@lGxsBpZOjA+!% zim>|4zSSHjwnj;O;!bB6NTA!2G)F=IeeVv^cVjBkeI3^=1vue2tZ-iT`;*Cs>S_uf zr;^ny%tpCClhA9iINca{(?Xo3C!Md;9uVMkf%&~%cD-IR$CI$A{j2?qIWqHVO_UCA zn;a@&x%;gSaO}SDIEV0$(u&^$=*D?ao2I5avtQ6QohG{?u;<(HP~xegG+x8flO;g~ zx>Cv6MSh20D2iO}KXJS~ShT#nX7ILmKO@V5^BYvEPuwL~KfRlTp=a1DQh7|Yf274^ zOqNyMrHY1IJCHB3Cy*~%Yt}c*f>xM+Mx{N^WoN>ba=j28;F0ot0!8Id{xa@ZDr@ec z@KMhVM@zP>k{J@)_ED~L(sJOjOPFSvU0c<&@fwC;iBZ4$83~GQ+q#49SxenA*bu(Q z^pn;5E6E@I3B=JG9pLbW@PxD4w7slG(x6p}!QE1xV?4f(RSaK_cfX|{d!BvN;>q@W z9_qlpz%xt!${861#g>soXC6t7~#x=sLAC!#};T#+N9__i*X0{ypzyP4Yz? zY8aj{k$VcDlw@xo?sR{#I8Y_TzxM%}4!8y}Gje9JH8QXQ7f#NL7fmzST%+%{ z6x6%ACVpPG*?6@m6-mueH!phXHO{*`&hKIfV~gar$;dL3l3KMt`a{a;uR%w>>k@zLeF!qLLVbGB)b*rv-r&x zAAgmW^D*Q8Ajh&d7~xsB(pm zepbF-S1HQ*>88^4vS@8IDBNw?ia_cgjcgr|@fzkL-9<`ckUUXrPOBnv+1+%OjqjyM z^ohtNKz=s7(I>sXG^pCk4g~auR%LI3BTNW>Q$k!p*|j#P(Iv()N<~wJ=KKJq5RilUg)qZ~qQe zIG)%seV;2dA*ZC+Z?4_SS$x!Ews*lrM(EtvVND^vxpNdJ&i@Uphh)JE8(OQ(YCcYB z^U(W5J#~AVj}QNEV8v*nP^X1!VhfMRNtCb^e)`DO{x~bob52k}iLX-gLgnMk*Fk>^ z?}{n0V7Ug9wnoSh|GNE-B^6Bi>o*>lzA|6h{Cvms1&zOjmwHU$iWl{ku&G=6xydf# z!8ZS59KabS@~NBS2#6K`5-Q|e%Ix7v*!er0mgmE9CB`Hkv~iJ89xhStaQ%U*vMAG%G$_QADAkg)RAC;+M%(zl_N^#N)7>4DEU$# zC__^RQ#)v=blRE4#mLqQWnpEAA3kTU4~?M!5IZA`j)^ijXX{|ZVrs`?dCuH?5uUNB zkvXuQGB>g?0(gTyoHIhnTAedDwB)kK*-x>YHa!FTWo&C@0onn!Rj}J!0uRQr*EY^^ z4_o-VvU>9Ct=iBTqYi@Cx=vCb^HdAOSmbpZFeLiz7bPeG|KKNw+VA}Ba}yDh zw-XTL0c=jG9$d$)}V$I}! z8zXpeU$xN)Te#d#8$roKgSE5Iatm4lJ#V(;_V3D7m^fK-Oq{Wf#1 zmeiDIczD*&3BEqyOPR;TS;48jYwIR~p>3rn<}COQeRvRcZQbf!N7@atf;8+XjneKr zO660Yb?C_)k{75b@s!-*wceM{Ho}l-OgX9V=?wy*eFaL!8`HwCOxIZlDU}EnX^vX^u;NRNAAd|lbi3{ za&;i&gR-LnSDHfH$J~N@q6Q}_UOZT}S-kS1%qPY4cPe(D3>;No#h*-mbpOqSm4M0I z{SlpEuTXnEK?YeXgPTsacSe)eJH7N76gS*RPFNnyy~Tj-+d@%Tf1y|VfVo-e|D<39ClYd|K*7lgKhem zQPNv6FK@g!Z$O#3dZvgtW-sj~`OWKgP}ywqIZw>?#j%C^GJCnS>z!A^1w|Efltl?r z%ByMOOV2RLKHRsbvZ(Qe^0o^`bMZXxT7%!-NZhfiJjHNaUNM+a&irpoU5^ZsZC{6y z_qW-|6vmUWrI%~Ksb|rglc^r)8^*{Yy1q#AH z_~GQPVQni&Q%@OA!N_f(Bq=w?(V0_AS~kPa?9SC5liy$F1q~z@D4b0Rp#Pw~~E4pC{-hH%hOOD;|W!>Can1 zm&9*NN)LtFlGP~RdEb8|{lFVB(GJeOKAOT+-(R`6d{P~|(3>nDV79k7&r{;ojfMTS zCZmR%nf`5ibVsB(Wr)1?(RzkEZar{-nwuwlMwKM~qv7$v?>tm_rw=#PMuiMyYp0aV zu$*Hmy0}7nG7n1$sKT)d=L!X2((-;984>pr3I|BiJa;$CdMHtw%0ZlAZb{Gl;6LCO ztc)M_BT}HLDN@qcyvFV_8q?-FaK9nLEN?3wPm{5>7eoQZ&+qcY%UvR;b zyT>EBXIoNr=020MI8@xB^ETun*016X-cY};c<|toP$k)1g-B*k)L)91mp__dYHk=S^jxb)C=04EabEjOtvX{4}(Gq?zZkHx_N5SF=zIWxBg8#E5VdAK%rQt z9~V%t?g%o`Ju5A*X5n_~{Nu~6CiQBU8tXcpm?alNDC#DMPfO+$)4$KPzCPr8`K)rh zfbiB6hVKR56?SEM{tRve`8$a-Lqk^K&qp4e}QuPN$wyjQe;ZdHs@OCT|_(b?Yf(T4{L;o_$QJ zPxq|h#+Jhj_ljRwTq!WQ#^y#&r_nn6%1S&aCpfpT@E!Ww{p7P^LwJe!`$)XxKMu;2 zR}oM}EENnehV3ueA46KXAU>>@MkrJa!!-R#&vC8y+%^0yb8&=ZRQ@$lrxTB6ujbF(QrMy1J|j?EGZxSA`6mcx^g z5vvQ8U(5MmF{RSlZ%h{W=6; zl3zvm#}BaH;s?L%KY^vB_nK>uRE^}v28(^ z*mDPb9AJ1kAHy{K4;BXQTjqTu0o7$J4RPs9L-;xaXHP_^(q7C0|dpR>t$YWjxacM*itfW+WjoUA=ocQw6s_SQ+BaQ}Nr{ za2AEiqja#{rK=%f&U5ss&N$)GUE4IgI%KA_V&YPRPD?Ub+TUfF*ixPyvXdmJi1n2} zq8t1i`j0uw+dD=5In0eo*5#V#1*V#8J<4Z~MswF~Z|-+nAIn|HG&#-F8WHg{CPBxF zk26}aok8qJh`&x*-ku%Li>kAXgM%)q_Z050-gx{2|ISIzLk8veJc1woHS`~I@!P}l zd+-|xk?5Xv>wJ%^<|&VNr!v2ONp<0V{H`Bs|Faa>CRW$O$Ne9LA=2POi~d^t#+RZ0 zlWlJg6_f9leWz_ zhNXQUCT@+5V2<4!qW^eLl=?C}v3Rpspistz-6h*ET$qX5chEVx=Kk;b{{g+%i^Bin!A@o+|w|AUrrR8apj(b>V9J4Jkk(fl+0i&0aYY<*)Q5q zGp@hx5Lpx;U1EE~&su7SKH1&91dr8TNOMl=UbP**!e_jPi=i-!!9*@j^Pt?9nD?8` z^W~hns7?G#GS=xVkNAe4&>P}UVYn-NOP*DJrhI(hql#R~x|IAz5V^v zzx{3?egYfImtW(`Ek7!R$*DgwaF7>MEEPQQl|1jeh)1MpowS>ib0&5z#&rLuUs#%B z^+Dj2YGnzJQ|+y+;K?b<+RD)a?V-xYqHoV)ZlrH#&$1mjvD)feu$buEvFKaE(^}*J z+1$wTjJ?T{DyQ}Bj81`cP|T18ob;YEKWB%I1HV;EE6|RK5sRI^1^8#`Vzi{H)j4~l zB*etd0=UnjgtiJ%kdp9H6A^ACK@qPP+Ag%3ltRx>fxw7}n2-P@u?WfFClP`qAt81A zBqER`4X6R{4cJ|?lJv2x!-)m+nQaCV_B*5bV=*J}Q_>-KBiOYE z!qZCFG#1uzxIRHs!sq^D0z(newMP48q_0M%oO~LX75vxt2F$eA4(xs_%4zyNjxNnq zlacPO-k8jEUDG~t{wLPKrzn4p89E1l{kCjwe3O_I?7$#C99SoI)@N+LZPI^D@xsTWYS z=67(h`LHwC4ng>mt>3GQ48?9bluhv^TJ&ft*@}f_U7EUB8_>3AaB@qqLW6mULk|}- zw*K$F@!8E!X!_%YQDhz!B;&l*YkFqa(EsR?=Jnt z?07-8@9*Ga^YPo+yz5L=Y4!kFaLjJk+G?o?5~BB#O2x;vNtW6OANsx~P2WQEp1$#J zZ*1M)edEKH(nFydMws#hlrJc@ZsjShVw>k^5VlnDRS9=le|z6)cd`%U?yOG+&G#~e zi?N;8sA&>l{2lz|`S|N0Y;Wsa&s8o9JLg#+ix{4bgErBm6G>(P><|6clCS2Lu(X(y zUr0!!|N$^sbH5RL4lx@7SzJ8$$hett~xEVs|;_N*CnJeBnXE^|;iCz9>Q6_>R|Nq<4er zZ4NY^Yl*#~Qxz{5F|(Sq)i=d8{g1~CixYm|;5orfsu;?wO}XLP8DZHzo4Y$1FMp7n z2+Z)FHgg3NvHA<)vh>Y1{pO141KGJzkL}(`>vbEtm5%G4 zF4F$$bVP}fG^{rjK^J>Qfc=JW%V$W9g8E!6{7h$82llT`bQ=;Jmhdtb>Jm7h;JxL0 z6|tF7MuwL4s-dH2sKb>RV+9&7$>?31c|~YmB`>P=nrbC{ZOrmQZ`dhUxUD%WAsxYf zyw;tb-?{f){^zTKuU{V-DhoLobotrM`uEH|vflco@h zs!wm++6gF3DFavvkJwEr)!#5^-kj3T`#X5}^4&$bf~oQC3AXQ%R!;LT)o$(ZezIrF zNpCx8QZXUft8~x*1{U0lN_jx%3x7 zLpOqb+dol-Yg@;s#6FIG`Zw@4`wwcaNuY|@9{T>Akg$r}+7EZ=8sjB9N&>??qtsq7 z{0%I)50e{L zD6H~#@R#S~%M#dLzWwv5`9klg#8)lbKF!8W={>)%WyO3ncxV$r?A^+-Z(Fx|)lTs( zv@%I+9ycq!TD=_J@8Zkbd*V&4nDFH2uvDXbU+1;c86xyX_Rg{!DJg z!UOS?SMF=+TV{Wq>nj)x$&~#CY_ZJ;ddn7Qg;mA+mf-M2qa$xN|&KTLF4E6277Q@yEY%lcf?Tsv~;S)LF{Tz@2OjO|R18y0N REDcfMJs&D!AvYB2{{hir^}qlC literal 329320 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�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Μ~1P*RBE#aVkp_&IQy((j8-b5Usk{Uogn7NjKlVVXz@Mb6cjd%Y1proJN12JzX39)e0Tsc>hq-N{D)dN6%f;`0tiR@u z&hm)zxXbpmiBC_&N?Sa^1z%c1aKU%8Zxr|Eq#;

3lO&Wq(;tR@v)BqEx0YV!M!6)ZJ))4O3&4dSt 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 diff --git a/examples/helloack/include/helloack.hpp b/examples/helloack/include/helloack.hpp index 49ab684..a5daded 100644 --- a/examples/helloack/include/helloack.hpp +++ b/examples/helloack/include/helloack.hpp @@ -240,47 +240,95 @@ struct [[eosio::contract]] helloack : public eosio::contract { * Benchmark action for testing verification of 1 brainpoolP256r1 ECDSA signature. */ [[eosio::action("bteccbr1"), eosio::read_only]] - void bt_ecc_brainpoolP256r1_sha256(); + void bt_ecdsa_brainpoolP256r1_sha256(); + + /** + * Benchmark action for testing recovery of 1 key from brainpoolP256r1 ECDSA signature. + */ + [[eosio::action("bteccbr1r"), eosio::read_only]] + void bt_ecdsa_recover_brainpoolP256r1_sha256(); /** * Benchmark action for testing verification of 1 brainpoolP320r1 ECDSA signature. */ [[eosio::action("bteccbr132"), eosio::read_only]] - void bt_ecc_brainpoolP320r1_sha384(); + void bt_ecdsa_brainpoolP320r1_sha384(); + + /** + * Benchmark action for testing recovery of 1 key from brainpoolP320r1 ECDSA signature. + */ + [[eosio::action("bteccbr132r"), eosio::read_only]] + void bt_ecdsa_recover_brainpoolP320r1_sha384(); /** * Benchmark action for testing verification of 1 brainpoolP384r1 ECDSA signature. */ [[eosio::action("bteccbr13"), eosio::read_only]] - void bt_ecc_brainpoolP384r1_sha384(); + void bt_ecdsa_brainpoolP384r1_sha384(); + + /** + * Benchmark action for testing recovery of 1 key from brainpoolP384r1 ECDSA signature. + */ + [[eosio::action("bteccbr13r"), eosio::read_only]] + void bt_ecdsa_recover_brainpoolP384r1_sha384(); /** * Benchmark action for testing verification of 1 brainpoolP512r1 ECDSA signature. */ [[eosio::action("bteccbr15"), eosio::read_only]] - void bt_ecc_brainpoolP521r1_sha512(); + void bt_ecdsa_brainpoolP512r1_sha512(); + + /** + * Benchmark action for testing recovery of 1 key from brainpoolP512r1 ECDSA signature. + */ + [[eosio::action("bteccbr15r"), eosio::read_only]] + void bt_ecdsa_recover_brainpoolP512r1_sha512(); /** * Benchmark action for testing verification of 1 secp256k1 ECDSA signature. */ [[eosio::action("btecck1"), eosio::read_only]] - void bt_ecc_secp256k1_sha256(); + void bt_ecdsa_secp256k1_sha256(); + + /** + * Benchmark action for testing recovery of 1 key from secp256k1 ECDSA signature. + */ + [[eosio::action("btecck1r"), eosio::read_only]] + void bt_ecdsa_recover_secp256k1_sha256(); /** * Benchmark action for testing verification of 1 secp256r1 ECDSA signature. */ [[eosio::action("bteccr1"), eosio::read_only]] - void bt_ecc_secp256r1_sha256(); + void bt_ecdsa_secp256r1_sha256(); + + /** + * Benchmark action for testing recovery of 1 key from secp256r1 ECDSA signature. + */ + [[eosio::action("bteccr1r"), eosio::read_only]] + void bt_ecdsa_recover_secp256r1_sha256(); /** * Benchmark action for testing verification of 1 secp384r1 ECDSA signature. */ [[eosio::action("bteccr13"), eosio::read_only]] - void bt_ecc_secp384r1_sha384(); + void bt_ecdsa_secp384r1_sha384(); /** - * Benchmark action for testing verification of 1 secp384r1 ECDSA signature. + * Benchmark action for testing recovery of 1 key from secp384r1 ECDSA signature. + */ + [[eosio::action("bteccr13r"), eosio::read_only]] + void bt_ecdsa_recover_secp384r1_sha384(); + + /** + * Benchmark action for testing verification of 1 secp521r1 ECDSA signature. */ [[eosio::action("bteccr15"), eosio::read_only]] - void bt_ecc_secp521r1_sha512(); + void bt_ecdsa_secp521r1_sha512(); + + /** + * Benchmark action for testing recovery of 1 key from secp521r1 ECDSA signature. + */ + [[eosio::action("bteccr15r"), eosio::read_only]] + void bt_ecdsa_recover_secp521r1_sha512(); }; diff --git a/examples/helloack/src/helloack.cpp b/examples/helloack/src/helloack.cpp index bafe70a..9756b90 100644 --- a/examples/helloack/src/helloack.cpp +++ b/examples/helloack/src/helloack.cpp @@ -13,7 +13,6 @@ using namespace ack::ec_curve; -[[eosio::action("ecdsabr1"), eosio::read_only]] void helloack::check_ecdsa_brainpoolP256_sha256(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s) { using int_type = typename decltype(brainpoolP256r1)::int_type; @@ -24,7 +23,6 @@ void helloack::check_ecdsa_brainpoolP256_sha256(bytes_view qx, bytes_view qy, by ); } -[[eosio::action("ecdsabr132"), eosio::read_only]] void helloack::check_ecdsa_brainpoolP320_sha384(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s) { using int_type = typename decltype(brainpoolP320r1)::int_type; @@ -35,7 +33,6 @@ void helloack::check_ecdsa_brainpoolP320_sha384(bytes_view qx, bytes_view qy, by ); } -[[eosio::action("ecdsabr13"), eosio::read_only]] void helloack::check_ecdsa_brainpoolP384_sha384(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s) { using int_type = typename decltype(brainpoolP384r1)::int_type; @@ -46,7 +43,6 @@ void helloack::check_ecdsa_brainpoolP384_sha384(bytes_view qx, bytes_view qy, by ); } -[[eosio::action("ecdsabr15"), eosio::read_only]] void helloack::check_ecdsa_brainpoolP512_sha512(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s) { using int_type = typename decltype(brainpoolP512r1)::int_type; @@ -57,7 +53,6 @@ void helloack::check_ecdsa_brainpoolP512_sha512(bytes_view qx, bytes_view qy, by ); } -[[eosio::action("ecdsak1"), eosio::read_only]] void helloack::check_ecdsa_secp256k1_sha256(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s) { using int_type = typename decltype(secp256k1)::int_type; @@ -68,7 +63,6 @@ void helloack::check_ecdsa_secp256k1_sha256(bytes_view qx, bytes_view qy, bytes_ ); } -[[eosio::action("ecdsar1"), eosio::read_only]] void helloack::check_ecdsa_secp256r1_sha256(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s) { using int_type = typename decltype(secp256r1)::int_type; @@ -79,7 +73,6 @@ void helloack::check_ecdsa_secp256r1_sha256(bytes_view qx, bytes_view qy, bytes_ ); } -[[eosio::action("ecdsar13"), eosio::read_only]] void helloack::check_ecdsa_secp384r1_sha384(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s) { using int_type = typename decltype(secp384r1)::int_type; @@ -90,7 +83,6 @@ void helloack::check_ecdsa_secp384r1_sha384(bytes_view qx, bytes_view qy, bytes_ ); } -[[eosio::action("ecdsar15"), eosio::read_only]] void helloack::check_ecdsa_secp521r1_sha512(bytes_view qx, bytes_view qy, bytes_view msg, bytes_view r, bytes_view s) { using int_type = typename decltype(secp521r1)::int_type; @@ -101,7 +93,6 @@ void helloack::check_ecdsa_secp521r1_sha512(bytes_view qx, bytes_view qy, bytes_ ); } -[[eosio::action("rsasha1"), eosio::read_only]] void helloack::check_rsa_sha1(rsa_public_key_view pubkey, bytes_view msg, bytes_view sig) { const auto md = eosio::sha1( reinterpret_cast( msg.data() ), msg.size() ); @@ -110,7 +101,6 @@ void helloack::check_rsa_sha1(rsa_public_key_view pubkey, bytes_view msg, bytes_ ); } -[[eosio::action("rsapsssha1"), eosio::read_only]] void helloack::check_rsa_pss_sha1(rsa_pss_public_key_view pubkey, bytes_view msg, bytes_view sig) { const auto md = eosio::sha1( reinterpret_cast( msg.data() ), msg.size() ); @@ -119,7 +109,6 @@ void helloack::check_rsa_pss_sha1(rsa_pss_public_key_view pubkey, bytes_view msg ); } -[[eosio::action("rsasha2"), eosio::read_only]] void helloack::check_rsa_sha256(rsa_public_key_view pubkey, bytes_view msg, bytes_view sig) { const auto md = eosio::sha256( reinterpret_cast( msg.data() ), msg.size() ); @@ -128,7 +117,6 @@ void helloack::check_rsa_sha256(rsa_public_key_view pubkey, bytes_view msg, byte ); } -[[eosio::action("rsapsssha2"), eosio::read_only]] void helloack::check_rsa_pss_sha256(rsa_pss_public_key_view pubkey, bytes_view msg, bytes_view sig) { const auto md = eosio::sha256( reinterpret_cast( msg.data() ), msg.size() ); @@ -137,7 +125,6 @@ void helloack::check_rsa_pss_sha256(rsa_pss_public_key_view pubkey, bytes_view m ); } -[[eosio::action("rsasha34"), eosio::read_only]] void helloack::check_rsa_sha384(rsa_public_key_view pubkey, bytes_view msg, bytes_view sig) { const auto md = sha384( msg ); @@ -146,7 +133,6 @@ void helloack::check_rsa_sha384(rsa_public_key_view pubkey, bytes_view msg, byte ); } -[[eosio::action("rsapsssha34"), eosio::read_only]] void helloack::check_rsa_pss_sha384(rsa_pss_public_key_view pubkey, bytes_view msg, bytes_view sig) { const auto md = sha384( msg ); @@ -155,7 +141,6 @@ void helloack::check_rsa_pss_sha384(rsa_pss_public_key_view pubkey, bytes_view m ); } -[[eosio::action("rsasha512"), eosio::read_only]] void helloack::check_rsa_sha512(rsa_public_key_view pubkey, bytes_view msg, bytes_view sig) { const auto md = eosio::sha512( reinterpret_cast( msg.data() ), msg.size() ); @@ -164,7 +149,6 @@ void helloack::check_rsa_sha512(rsa_public_key_view pubkey, bytes_view msg, byte ); } -[[eosio::action("rsapsssha512"), eosio::read_only]] void helloack::check_rsa_pss_sha512(rsa_pss_public_key_view pubkey, bytes_view msg, bytes_view sig) { const auto md = eosio::sha512( reinterpret_cast( msg.data() ), msg.size() ); @@ -173,7 +157,6 @@ void helloack::check_rsa_pss_sha512(rsa_pss_public_key_view pubkey, bytes_view m ); } -[[eosio::action("btrsa1ksha1"), eosio::read_only]] void helloack::bt_rsa_1024_sha1() { constexpr auto pubkey = rsa_public_key_view( rsa_1024_sha1::mod, rsa_1024_sha1::exp ); @@ -182,7 +165,6 @@ void helloack::bt_rsa_1024_sha1() ); } -[[eosio::action("btrsa2ksha1"), eosio::read_only]] void helloack::bt_rsa_2048_sha1() { constexpr auto pubkey = rsa_public_key_view( rsa_2048_sha1::mod, rsa_2048_sha1::exp ); @@ -191,7 +173,6 @@ void helloack::bt_rsa_2048_sha1() ); } -[[eosio::action("btrsa1ksha2"), eosio::read_only]] void helloack::bt_rsa_1024_sha256() { constexpr auto pubkey = rsa_public_key_view( rsa_1024_sha256::mod, rsa_1024_sha256::exp ); @@ -200,7 +181,6 @@ void helloack::bt_rsa_1024_sha256() ); } -[[eosio::action("btrsa2ksha2"), eosio::read_only]] void helloack::bt_rsa_2048_sha256() { constexpr auto pubkey = rsa_public_key_view( rsa_2048_sha256::mod, rsa_2048_sha256::exp ); @@ -209,7 +189,6 @@ void helloack::bt_rsa_2048_sha256() ); } -[[eosio::action("btrsapss2sha2"), eosio::read_only]] void helloack::bt_rsa_pss_2048_sha256() { constexpr auto pubkey = rsa_pss_public_key_view( rsa_pss_mgf1_sha256_2048::mod, rsa_pss_mgf1_sha256_2048::exp, rsa_pss_mgf1_sha256_2048::salt_len ); @@ -218,7 +197,6 @@ void helloack::bt_rsa_pss_2048_sha256() ); } -[[eosio::action("btrsa4ksha2"), eosio::read_only]] void helloack::bt_rsa_4096_sha256() { constexpr auto pubkey = rsa_public_key_view( rsa_4096_sha256::mod, rsa_4096_sha256::exp ); @@ -227,7 +205,6 @@ void helloack::bt_rsa_4096_sha256() ); } -[[eosio::action("btrsapss4sha2"), eosio::read_only]] void helloack::bt_rsa_pss_4096_sha256() { constexpr auto pubkey = rsa_pss_public_key_view( rsa_pss_mgf1_sha256_4096::mod, rsa_pss_mgf1_sha256_4096::exp, rsa_pss_mgf1_sha256_4096::salt_len ); @@ -236,7 +213,6 @@ void helloack::bt_rsa_pss_4096_sha256() ); } -[[eosio::action("btrsa1ksha512"), eosio::read_only]] void helloack::bt_rsa_1024_sha512() { constexpr auto pubkey = rsa_public_key_view( rsa_1024_sha512::mod, rsa_1024_sha512::exp ); @@ -245,7 +221,6 @@ void helloack::bt_rsa_1024_sha512() ); } -[[eosio::action("btrsa2ksha512"), eosio::read_only]] void helloack::bt_rsa_2048_sha512() { constexpr auto pubkey = rsa_public_key_view( rsa_2048_sha512::mod, rsa_2048_sha512::exp ); @@ -254,8 +229,7 @@ void helloack::bt_rsa_2048_sha512() ); } -[[eosio::action("bteccbr1"), eosio::read_only]] -void helloack::bt_ecc_brainpoolP256r1_sha256() +void helloack::bt_ecdsa_brainpoolP256r1_sha256() { using tv = brainpoolP256r1_sha256_tv; assert_ecdsa( tv::pub_point, tv::h, tv::r, tv::s, @@ -263,8 +237,14 @@ void helloack::bt_ecc_brainpoolP256r1_sha256() ); } -[[eosio::action("bteccbr132"), eosio::read_only]] -void helloack::bt_ecc_brainpoolP320r1_sha384() +void helloack::bt_ecdsa_recover_brainpoolP256r1_sha256() +{ + using tv = brainpoolP256r1_sha256_tv; + const auto rkey = ecdsa_recover( tv::curve, tv::h, tv::r, tv::s, tv::recid ); + check( rkey == tv::pub_point, "ECDSA brainpoolP256r1 key recovery failed!" ); +} + +void helloack::bt_ecdsa_brainpoolP320r1_sha384() { using tv = brainpoolP320r1_sha384_tv; assert_ecdsa( tv::pub_point, tv::h, tv::r, tv::s, @@ -272,8 +252,14 @@ void helloack::bt_ecc_brainpoolP320r1_sha384() ); } -[[eosio::action("bteccbr13"), eosio::read_only]] -void helloack::bt_ecc_brainpoolP384r1_sha384() +void helloack::bt_ecdsa_recover_brainpoolP320r1_sha384() +{ + using tv = brainpoolP320r1_sha384_tv; + const auto rkey = ecdsa_recover( tv::curve, tv::h, tv::r, tv::s, tv::recid ); + check( rkey == tv::pub_point, "ECDSA brainpoolP320r1 key recovery failed!" ); +} + +void helloack::bt_ecdsa_brainpoolP384r1_sha384() { using tv = brainpoolP384r1_sha384_tv; assert_ecdsa( tv::pub_point, tv::h, tv::r, tv::s, @@ -281,8 +267,14 @@ void helloack::bt_ecc_brainpoolP384r1_sha384() ); } -[[eosio::action("bteccbr15"), eosio::read_only]] -void helloack::bt_ecc_brainpoolP521r1_sha512() +void helloack::bt_ecdsa_recover_brainpoolP384r1_sha384() +{ + using tv = brainpoolP384r1_sha384_tv; + const auto rkey = ecdsa_recover( tv::curve, tv::h, tv::r, tv::s, tv::recid ); + check( rkey == tv::pub_point, "ECDSA brainpoolP384r1 key recovery failed!" ); +} + +void helloack::bt_ecdsa_brainpoolP512r1_sha512() { using tv = brainpoolP512r1_sha512_tv; assert_ecdsa( tv::pub_point, tv::h, tv::r, tv::s, @@ -290,8 +282,14 @@ void helloack::bt_ecc_brainpoolP521r1_sha512() ); } -[[eosio::action("btecck1"), eosio::read_only]] -void helloack::bt_ecc_secp256k1_sha256() +void helloack::bt_ecdsa_recover_brainpoolP512r1_sha512() +{ + using tv = brainpoolP512r1_sha512_tv; + const auto rkey = ecdsa_recover( tv::curve, tv::h, tv::r, tv::s, tv::recid ); + check( rkey == tv::pub_point, "ECDSA brainpoolP512r1 key recovery failed!" ); +} + +void helloack::bt_ecdsa_secp256k1_sha256() { using tv = secp256k1_sha256_tv; assert_ecdsa( tv::pub_point, tv::h, tv::r, tv::s, @@ -299,8 +297,14 @@ void helloack::bt_ecc_secp256k1_sha256() ); } -[[eosio::action("bteccr1"), eosio::read_only]] -void helloack::bt_ecc_secp256r1_sha256() +void helloack::bt_ecdsa_recover_secp256k1_sha256() +{ + using tv = secp256k1_sha256_tv; + const auto rkey = ecdsa_recover( tv::curve, tv::h, tv::r, tv::s, tv::recid ); + check( rkey == tv::pub_point, "ECDSA secp256k1 key recovery failed!" ); +} + +void helloack::bt_ecdsa_secp256r1_sha256() { using tv = secp256r1_sha256_tv; assert_ecdsa( tv::pub_point, tv::h, tv::r, tv::s, @@ -308,8 +312,14 @@ void helloack::bt_ecc_secp256r1_sha256() ); } -[[eosio::action("bteccr13"), eosio::read_only]] -void helloack::bt_ecc_secp384r1_sha384() +void helloack::bt_ecdsa_recover_secp256r1_sha256() +{ + using tv = secp256r1_sha256_tv; + const auto rkey = ecdsa_recover( tv::curve, tv::h, tv::r, tv::s, tv::recid ); + check( rkey == tv::pub_point, "ECDSA secp256r1 key recovery failed!" ); +} + +void helloack::bt_ecdsa_secp384r1_sha384() { using tv = secp384r1_sha384_tv; assert_ecdsa( tv::pub_point, tv::h, tv::r, tv::s, @@ -317,11 +327,24 @@ void helloack::bt_ecc_secp384r1_sha384() ); } -[[eosio::action("bteccr15"), eosio::read_only]] -void helloack::bt_ecc_secp521r1_sha512() +void helloack::bt_ecdsa_recover_secp384r1_sha384() +{ + using tv = secp384r1_sha384_tv; + const auto rkey = ecdsa_recover( tv::curve, tv::h, tv::r, tv::s, tv::recid ); + check( rkey == tv::pub_point, "ECDSA secp384r1 key recovery failed!" ); +} + +void helloack::bt_ecdsa_secp521r1_sha512() { using tv = secp521r1_sha512_tv; assert_ecdsa( tv::pub_point, tv::h, tv::r, tv::s, - "ECDSA secp384r1 signature verification failed!" + "ECDSA secp521r1 signature verification failed!" ); } + +void helloack::bt_ecdsa_recover_secp521r1_sha512() +{ + using tv = secp521r1_sha512_tv; + const auto rkey = ecdsa_recover( tv::curve, tv::h, tv::r, tv::s, tv::recid ); + check( rkey == tv::pub_point, "ECDSA secp521r1 key recovery failed!" ); +} From 03c84aa45852b73aee5744a7fcc7173519df680d Mon Sep 17 00:00:00 2001 From: Crt Vavros - smlu Date: Fri, 29 Dec 2023 17:38:47 +0100 Subject: [PATCH 18/18] [Test] Add additional misc tsts fro ECDSA key recovery --- include/ack/buffer.hpp | 2 +- tests/include/ack/tests/ecdsa_misc_test.hpp | 103 +++++++++++++------- 2 files changed, 70 insertions(+), 35 deletions(-) diff --git a/include/ack/buffer.hpp b/include/ack/buffer.hpp index 95ad4f6..5080d46 100644 --- a/include/ack/buffer.hpp +++ b/include/ack/buffer.hpp @@ -223,7 +223,7 @@ namespace ack { } else { if ( n > N && n > dsize_ ) { - bool scpy = ( ddata_ == nullptr ); + const bool scpy = ( ddata_ == nullptr ); T* pold = ddata_; dsize_ += std::max( N, n ); diff --git a/tests/include/ack/tests/ecdsa_misc_test.hpp b/tests/include/ack/tests/ecdsa_misc_test.hpp index 5f2146c..950de22 100644 --- a/tests/include/ack/tests/ecdsa_misc_test.hpp +++ b/tests/include/ack/tests/ecdsa_misc_test.hpp @@ -20,58 +20,93 @@ namespace ack::tests { using point_type = std::remove_cvref_t::point_type; using int_type = std::remove_cvref_t::int_type; - constexpr auto q = curve.make_point( - "e424dc61d4bb3cb7ef4344a7f8957a0c5134e16f7a67c074f82e6e12f49abf3c", - "970eed7aa2bc48651545949de1dddaf0127e5965ac85d1243d6f60e7dfaee927" - ); - - constexpr auto h = from_hex( "d1b8ef21eb4182ee270638061063a3f3c16c114e33937f69fb232cc833965a94" ); - auto md = hash256( h ); - constexpr int_type r = "bf96b99aa49c705c910be33142017c642ff540c76349b9dab72f981fd9347f4f"; - constexpr int_type s = "17c55095819089c2e03b9cd415abdf12444e323075d98f31920b9e0f57ec871c"; - constexpr size_t recid = 1; - // Misc ECDSA key recovery tests { - // Test recovery succeeds - REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, r, s, recid, /*verify=*/true ), q ) + auto q = curve.make_point( + "e424dc61d4bb3cb7ef4344a7f8957a0c5134e16f7a67c074f82e6e12f49abf3c", + "970eed7aa2bc48651545949de1dddaf0127e5965ac85d1243d6f60e7dfaee927" + ); + + auto h = from_hex( "d1b8ef21eb4182ee270638061063a3f3c16c114e33937f69fb232cc833965a94" ); + auto md = hash256( h ); + int_type r = "bf96b99aa49c705c910be33142017c642ff540c76349b9dab72f981fd9347f4f"; + int_type s = "17c55095819089c2e03b9cd415abdf12444e323075d98f31920b9e0f57ec871c"; + size_t recid = 1; - // Test passing too big recid results in point at infinity - REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, r, s, /*recid=*/4, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, r, s, /*recid=*/4, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, r, s, /*recid=*/0xff, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, r, s, /*recid=*/0xff, /*verify=*/true ).is_identity(), true ) + // Test recovery succeeds + REQUIRE_EQUAL( ecdsa_recover( curve, h, r, s, recid, /*verify=*/true ), q ) + + // Test using invalid recid recovers different point than q + REQUIRE_EQUAL( ecdsa_recover( curve, h, r, s, /*recid=*/0, /*verify=*/true ) != q, true ) + REQUIRE_EQUAL( ecdsa_recover( curve, md, r, s, /*recid=*/0, /*verify=*/true ) != q, true ) + REQUIRE_EQUAL( ecdsa_recover( curve, h, r, s, /*recid=*/2, /*verify=*/true ) != q, true ) + REQUIRE_EQUAL( ecdsa_recover( curve, md, r, s, /*recid=*/2, /*verify=*/true ) != q, true ) + REQUIRE_EQUAL( ecdsa_recover( curve, h, r, s, /*recid=*/3, /*verify=*/true ) != q, true ) + REQUIRE_EQUAL( ecdsa_recover( curve, md, r, s, /*recid=*/3, /*verify=*/true ) != q, true ) + + // Test passing too big recid results in point at infinity + REQUIRE_EQUAL( ecdsa_recover( curve, h, r, s, /*recid=*/0x04, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, md, r, s, /*recid=*/0x04, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, h, r, s, /*recid=*/0xff, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, md, r, s, /*recid=*/0xff, /*verify=*/true ).is_identity(), true ) // Test passing too small and too big r - REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, int_type( 0 ), s, recid, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, int_type( 0 ), s, recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, h, int_type( 0 ), s, recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, md, int_type( 0 ), s, recid, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, curve.n, s, recid, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, curve.n, s, recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, h, curve.n, s, recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, md, curve.n, s, recid, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, curve.n + 1, s, recid, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, curve.n + 1, s, recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, h, curve.n + 1, s, recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, md, curve.n + 1, s, recid, /*verify=*/true ).is_identity(), true ) // Test passing too small and too big s - REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, r, int_type( 0 ), recid, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, r, int_type( 0 ), recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, h, r, int_type( 0 ), recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, md, r, int_type( 0 ), recid, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, r, curve.n, recid, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, r, curve.n, recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, h, r, curve.n, recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, md, r, curve.n, recid, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, r, curve.n + 1, recid, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, r, curve.n + 1, recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, h, r, curve.n + 1, recid, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, md, r, curve.n + 1, recid, /*verify=*/true ).is_identity(), true ) // Test passing too big r when recovering second key - REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, curve.p_minus_n, s, 2, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, curve.p_minus_n, s, 2, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, h, curve.p_minus_n, s, 2, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, md, curve.p_minus_n, s, 2, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), h, curve.p_minus_n + 1, s, 2, /*verify=*/true ).is_identity(), true ) - REQUIRE_EQUAL( ecdsa_recover( q.curve(), md, curve.p_minus_n + 1, s, 2, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, h, curve.p_minus_n + 1, s, 2, /*verify=*/true ).is_identity(), true ) + REQUIRE_EQUAL( ecdsa_recover( curve, md, curve.p_minus_n + 1, s, 2, /*verify=*/true ).is_identity(), true ) + + // Test recovery fails when signed message changes + q = curve.make_point( + "69b7667056e1e11d6caf6e45643f8b21e7a4bebda463c7fdbc13bc98efbd0214", + "d3f9b12eb46c7c6fda0da3fc85bc1fd831557f9abc902a3be3cb3e8be7d1aa2f" + ); + h = from_hex( "d80e9933e86769731ec16ff31e6821531bcf07fcbad9e2ac16ec9e6cb343a870" ); + md = hash256( h ); + r = "288f7a1cd391842cce21f00e6f15471c04dc182fe4b14d92dc18910879799790"; + s = "247b3c4e89a3bcadfea73c7bfd361def43715fa382b8c3edf4ae15d6e55e9979"; + for ( std::size_t i = 0; i < 4; i++ ) { + REQUIRE_EQUAL( ecdsa_recover( curve, h, r, s, /*recid=*/i, /*verify=*/false ) != q, true ) + REQUIRE_EQUAL( ecdsa_recover( curve, md, r, s, /*recid=*/i, /*verify=*/false ) != q, true ) + REQUIRE_EQUAL( ecdsa_recover( curve, h, r, s, /*recid=*/i, /*verify=*/true ) != q, true ) + REQUIRE_EQUAL( ecdsa_recover( curve, md, r, s, /*recid=*/i, /*verify=*/true ) != q, true ) + } } // Misc ECDSA sigver tests { + auto q = curve.make_point( + "e424dc61d4bb3cb7ef4344a7f8957a0c5134e16f7a67c074f82e6e12f49abf3c", + "970eed7aa2bc48651545949de1dddaf0127e5965ac85d1243d6f60e7dfaee927" + ); + + auto h = from_hex( "d1b8ef21eb4182ee270638061063a3f3c16c114e33937f69fb232cc833965a94" ); + auto md = hash256( h ); + int_type r = "bf96b99aa49c705c910be33142017c642ff540c76349b9dab72f981fd9347f4f"; + int_type s = "17c55095819089c2e03b9cd415abdf12444e323075d98f31920b9e0f57ec871c"; + size_t recid = 1; + // Test verification ECDSA signature succeeds REQUIRE_EQUAL( ecdsa_verify( q, h, r, s ), true ) REQUIRE_EQUAL( ecdsa_verify( q, md, r, s ), true )