From 0d72ac71874f493bdd4e33facd03a5871c072978 Mon Sep 17 00:00:00 2001 From: sowle Date: Tue, 26 Jul 2022 06:44:19 +0200 Subject: [PATCH] bulletproofs+ tests fixed --- src/crypto/range_proof_bpp.h | 28 +++++++++++++++---- src/currency_core/currency_basic.h | 4 +-- .../crypto_tests_range_proofs.h | 11 ++++++-- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/crypto/range_proof_bpp.h b/src/crypto/range_proof_bpp.h index 93e039b9..2bb2e4ba 100644 --- a/src/crypto/range_proof_bpp.h +++ b/src/crypto/range_proof_bpp.h @@ -23,8 +23,8 @@ namespace crypto scalar_t delta; }; -#define DBG_VAL_PRINT(x) (void(0)) // std::cout << #x ": " << x << ENDL -#define DBG_PRINT(x) (void(0)) // std::cout << x << ENDL +#define DBG_VAL_PRINT(x) (void(0)) //*/ std::cout << #x ": " << x << ENDL +#define DBG_PRINT(x) (void(0)) //*/ std::cout << x << ENDL #define CHECK_AND_FAIL_WITH_ERROR_IF_FALSE(cond, err_code) \ if (!(cond)) { LOG_PRINT_RED("bpp_gen: \"" << #cond << "\" is false at " << LOCATION_SS << ENDL << "error code = " << err_code, LOG_LEVEL_3); \ @@ -36,7 +36,7 @@ namespace crypto { // Note: commitments_1div8 are supposed to be already calculated static_assert(CT::c_bpp_n <= 255, "too big N"); - CHECK_AND_FAIL_WITH_ERROR_IF_FALSE(values.size() > 0 && values.size() <= CT::c_bpp_values_max && values.size() == masks.size(), 1); + CHECK_AND_FAIL_WITH_ERROR_IF_FALSE(values.size() > 0 && values.size() <= CT::c_bpp_values_max && values.size() == masks.size() && values.size() == commitments_1div8.size(), 1); CHECK_AND_FAIL_WITH_ERROR_IF_FALSE(masks.is_reduced(), 3); const size_t c_bpp_log2_m = constexpr_ceil_log2(values.size()); @@ -318,9 +318,27 @@ namespace crypto DBG_VAL_PRINT(sig.delta); return true; -#undef CHECK_AND_FAIL_WITH_ERROR_IF_FALSE } // bpp_gen() + + // convenient overload for tests + template> + bool bpp_gen(const scalar_vec_t& values, const scalar_vec_t& masks, bpp_signature& sig, std::vector& commitments_1div8_to_be_generated, uint8_t* p_err = nullptr) + { + CHECK_AND_FAIL_WITH_ERROR_IF_FALSE(values.size() == masks.size(), 91); + commitments_1div8_to_be_generated.resize(values.size()); + std::vector commitments_1div8(values.size()); + std::vector commitments_1div8_pointers(values.size()); + for(size_t i = 0; i < values.size(); ++i) + { + CT::calc_pedersen_commitment(c_scalar_1div8 * values[i], c_scalar_1div8 * masks[i], commitments_1div8_to_be_generated[i]); + commitments_1div8[i] = (commitments_1div8_to_be_generated[i]).to_public_key(); + commitments_1div8_pointers[i] = &commitments_1div8[i]; + } + return bpp_gen(values, masks, commitments_1div8_pointers, sig, p_err); + } +#undef CHECK_AND_FAIL_WITH_ERROR_IF_FALSE + struct bpp_sig_commit_ref_t { @@ -329,7 +347,7 @@ namespace crypto , commitments(commitments) {} const bpp_signature& sig; - const std::vector& commitments; + const std::vector& commitments; // assumed to be premultiplied by 1/8 }; diff --git a/src/currency_core/currency_basic.h b/src/currency_core/currency_basic.h index 662c4ad1..3c0009ef 100644 --- a/src/currency_core/currency_basic.h +++ b/src/currency_core/currency_basic.h @@ -355,8 +355,8 @@ namespace currency tx_out_zarcanum& operator=(const tx_out_zarcanum&) = default; crypto::public_key stealth_address; - crypto::public_key concealing_point; // group element Q, see also Zarcanum paper - crypto::public_key amount_commitment; + crypto::public_key concealing_point; // group element Q, see also Zarcanum paper, premultiplied by 1/8 + crypto::public_key amount_commitment; // premultiplied by 1/8 uint64_t encrypted_amount; uint8_t mix_attr; //crypto::public_key token_masked_generator; diff --git a/tests/functional_tests/crypto_tests_range_proofs.h b/tests/functional_tests/crypto_tests_range_proofs.h index 0bc267af..003371c6 100644 --- a/tests/functional_tests/crypto_tests_range_proofs.h +++ b/tests/functional_tests/crypto_tests_range_proofs.h @@ -71,11 +71,18 @@ TEST(bpp, basics) scalar_vec_t values = { 5 }; scalar_vec_t masks = { 0 }; bpp_signature bpp_sig; - std::vector commitments; + std::vector commitments_1div8; uint8_t err = 0; - bool r = bpp_gen>(values, masks, bpp_sig, commitments, &err); + bool r = bpp_gen>(values, masks, bpp_sig, commitments_1div8, &err); + LOG_PRINT_L0("err = " << (uint16_t)err); + ASSERT_TRUE(r); + std::vector sigs; + sigs.emplace_back(bpp_sig, commitments_1div8); + + r = bpp_verify>(sigs, &err); + LOG_PRINT_L0("err = " << (uint16_t)err); ASSERT_TRUE(r); return true;