diff --git a/src/carrot_core/output_set_finalization.cpp b/src/carrot_core/output_set_finalization.cpp index 9f94f97..64bcc33 100644 --- a/src/carrot_core/output_set_finalization.cpp +++ b/src/carrot_core/output_set_finalization.cpp @@ -160,8 +160,8 @@ void get_output_enote_proposals(const std::vector &norm const crypto::key_image &tx_first_key_image, std::vector &output_enote_proposals_out, encrypted_payment_id_t &encrypted_payment_id_out, - size_t change_index_out, - std::vector> *payment_proposal_order_out) + std::vector> *payment_proposal_order_out, + size_t change_index_out) { output_enote_proposals_out.clear(); encrypted_payment_id_out = {{0}}; diff --git a/src/carrot_core/output_set_finalization.h b/src/carrot_core/output_set_finalization.h index d27afdc..1d8d65d 100644 --- a/src/carrot_core/output_set_finalization.h +++ b/src/carrot_core/output_set_finalization.h @@ -110,8 +110,8 @@ void get_output_enote_proposals(const std::vector &norm const crypto::key_image &tx_first_key_image, std::vector &output_enote_proposals_out, encrypted_payment_id_t &encrypted_payment_id_out, - size_t change_index_out = 0, - std::vector> *payment_proposal_order_out = nullptr); + std::vector> *payment_proposal_order_out = nullptr, + size_t change_index_out = 0); /** * brief: get_coinbase_output_enotes - convert a *finalized* set of payment proposals into coinbase output enotes * param: normal_payment_proposals - diff --git a/src/cryptonote_config.h b/src/cryptonote_config.h index 07af623..0567211 100644 --- a/src/cryptonote_config.h +++ b/src/cryptonote_config.h @@ -359,6 +359,7 @@ namespace config const constexpr char HASH_KEY_MULTISIG_TX_PRIVKEYS_SEED[] = "multisig_tx_privkeys_seed"; const constexpr char HASH_KEY_MULTISIG_TX_PRIVKEYS[] = "multisig_tx_privkeys"; const constexpr char HASH_KEY_TXHASH_AND_MIXRING[] = "txhash_and_mixring"; + const constexpr char HASH_KEY_SA_PROOF[] = "SPARC_sa_proof_domain_separator"; // Multisig const uint32_t MULTISIG_MAX_SIGNERS{16}; diff --git a/src/ringct/rctSigs.cpp b/src/ringct/rctSigs.cpp index 1bb6a4c..b14b47e 100644 --- a/src/ringct/rctSigs.cpp +++ b/src/ringct/rctSigs.cpp @@ -1374,13 +1374,12 @@ namespace rct { return index; } - zk_proof SAProof_Gen(const key &P, const key &x_change, const key &y_change, const key &key_yF) { + zk_proof SAProof_Gen(const key &P, const key &x_change, const key &y_change) { // Sanity checks for inputs CHECK_AND_ASSERT_THROW_MES(!rct::equalKeys(P, rct::zero()), "SAProof_Gen() failed - invalid public key provided"); CHECK_AND_ASSERT_THROW_MES(!rct::equalKeys(x_change, rct::zero()), "SAProof_Gen() failed - invalid x_change key provided"); CHECK_AND_ASSERT_THROW_MES(!rct::equalKeys(y_change, rct::zero()), "SAProof_Gen() failed - invalid y_change key provided"); - CHECK_AND_ASSERT_THROW_MES(!rct::equalKeys(key_yF, rct::zero()), "SAProof_Gen() failed - invalid shared secret key provided"); // Declare a return structure zk_proof proof{}; @@ -1389,9 +1388,14 @@ namespace rct { rct::key r_x = rct::skGen(); rct::key r_y = rct::skGen(); rct::addKeys2(proof.R, r_x, r_y, rct::pk2rct(crypto::get_T())); + + // Make the domain separator into a key + rct::key sa_proof_domain_sep; + sc_0(sa_proof_domain_sep.bytes); + memcpy(sa_proof_domain_sep.bytes,config::HASH_KEY_SA_PROOF,sizeof(config::HASH_KEY_SA_PROOF)-1); // Calculate the challenge hash from the commitment plus the pubkey plus the shared secret - keyV challenge_keys{proof.R, P, key_yF}; + keyV challenge_keys{sa_proof_domain_sep, proof.R, P}; rct::key c = rct::hash_to_scalar(challenge_keys); rct::key z_x,z_y; @@ -1404,14 +1408,18 @@ namespace rct { return proof; } - bool SAProof_Ver(const zk_proof &proof, const key &P, const key &key_yF) { + bool SAProof_Ver(const zk_proof &proof, const key &P) { // Sanity checks for inputs CHECK_AND_ASSERT_THROW_MES(!rct::equalKeys(P, rct::zero()), "SAProof_Ver() failed - invalid public key provided"); - CHECK_AND_ASSERT_THROW_MES(!rct::equalKeys(key_yF, rct::zero()), "SAProof_Ver() failed - invalid shared secret key provided"); + + // Make the domain separator into a key + rct::key sa_proof_domain_sep; + sc_0(sa_proof_domain_sep.bytes); + memcpy(sa_proof_domain_sep.bytes,config::HASH_KEY_SA_PROOF,sizeof(config::HASH_KEY_SA_PROOF)-1); // Recompute the challenge hash - keyV challenge_keys{proof.R, P, key_yF}; + keyV challenge_keys{sa_proof_domain_sep, proof.R, P}; rct::key c = rct::hash_to_scalar(challenge_keys); // Recalculate the expected commitment using the formula: R + c * P @@ -1511,7 +1519,7 @@ namespace rct { xmr_amount txnFee, const ctkeyM & mixRing, const std::vector & index, - ctkeyV &outSk, + const ctkeyV &outSk, const RCTConfig &rct_config, hw::device &hwdev, const rct::salvium_data_t &salvium_data, @@ -1592,9 +1600,9 @@ namespace rct { // Check if spend authority proof is needed (only for TRANSFER TXs) if (tx_type == cryptonote::transaction_type::TRANSFER && rv.type == rct::RCTTypeSalviumOne) { - rv.salvium_data.sa_proof = SAProof_Gen(destinations[change_index], x_change, y_change, key_yF); + rv.salvium_data.sa_proof = SAProof_Gen(destinations[change_index], x_change, y_change); #ifdef DBG - CHECK_AND_ASSERT_THROW_MES(SAProof_Ver(rv.salvium_data.sa_proof, destinations[change_index], key_yF), "SAProof_Ver() failed on recently created proof"); + CHECK_AND_ASSERT_THROW_MES(SAProof_Ver(rv.salvium_data.sa_proof, destinations[change_index]), "SAProof_Ver() failed on recently created proof"); #endif } diff --git a/src/ringct/rctSigs.h b/src/ringct/rctSigs.h index 1bb159d..9730e28 100644 --- a/src/ringct/rctSigs.h +++ b/src/ringct/rctSigs.h @@ -150,7 +150,7 @@ namespace rct { xmr_amount txnFee, const ctkeyM & mixRing, const std::vector & index, - ctkeyV &outSk, + const ctkeyV &outSk, const RCTConfig &rct_config, hw::device &hwdev, const rct::salvium_data_t &salvium_data, diff --git a/src/wallet/tx_builder.cpp b/src/wallet/tx_builder.cpp index 6f6f479..19df29c 100644 --- a/src/wallet/tx_builder.cpp +++ b/src/wallet/tx_builder.cpp @@ -769,6 +769,7 @@ cryptonote::transaction finalize_all_proofs_from_transfer_details( tx_proposal.key_images_sorted.at(0), output_enote_proposals, encrypted_payment_id, + nullptr, change_index); CHECK_AND_ASSERT_THROW_MES(output_enote_proposals.size() == n_outputs, "finalize_all_proofs_from_transfer_details: unexpected number of output enote proposals");