diff --git a/src/crypto/crypto-sugar.h b/src/crypto/crypto-sugar.h index 1caf06f0..0c8f9dd9 100644 --- a/src/crypto/crypto-sugar.h +++ b/src/crypto/crypto-sugar.h @@ -1,5 +1,5 @@ -// Copyright (c) 2020-2022 Zano Project -// Copyright (c) 2020-2022 sowle (val@zano.org, crypto.sowle@gmail.com) +// Copyright (c) 2020-2023 Zano Project +// Copyright (c) 2020-2023 sowle (val@zano.org, crypto.sowle@gmail.com) // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. // @@ -309,6 +309,14 @@ namespace crypto return *this; } + scalar_t operator-() const + { + static unsigned char zero[32] = { 0 }; + scalar_t result; + sc_sub(&result.m_s[0], zero, &m_s[0]); + return result; + } + // returns this = a * b scalar_t& assign_mul(const scalar_t& a, const scalar_t& b) { diff --git a/tests/functional_tests/crypto_tests.cpp b/tests/functional_tests/crypto_tests.cpp index 74ca3425..77a0cfa4 100644 --- a/tests/functional_tests/crypto_tests.cpp +++ b/tests/functional_tests/crypto_tests.cpp @@ -823,13 +823,18 @@ TEST(crypto, keys) TEST(crypto, scalar_basics) { - scalar_t zero = 0; + const scalar_t zero = 0; ASSERT_TRUE(zero.is_zero()); - scalar_t one = 1; + const scalar_t one = 1; ASSERT_FALSE(one.is_zero()); ASSERT_TRUE(one > zero); ASSERT_TRUE(one.muladd(zero, zero) == zero); + ASSERT_EQ(-one, c_scalar_Lm1); + ASSERT_EQ(-one, scalar_t(0) - one); + ASSERT_EQ(-zero, zero); + ASSERT_EQ(-c_scalar_Lm1, one); + scalar_t z = 0; for (size_t j = 0; j < 1000; ++j) {