30 #ifndef ELECTRONEUM_PROTOCOL_H 31 #define ELECTRONEUM_PROTOCOL_H 52 template<
class sub_t,
class InputIterator>
53 void assign_to_repeatable(::google::protobuf::RepeatedField<sub_t> * dst,
const InputIterator begin,
const InputIterator end){
54 for (InputIterator it = begin; it != end; it++) {
60 template<
class sub_t,
class InputIterator>
62 for (InputIterator it = begin; it != end; it++) {
70 ss.write(static_cast<const char *>(buff), len);
83 std::ostringstream oss;
102 void decrypt(
const void* ciphertext,
size_t length,
const uint8_t*
key,
const uint8_t* iv,
char* plaintext,
size_t *plaintext_len=
nullptr);
120 const std::vector<tools::wallet2::transfer_details> & transfers,
121 std::vector<ElectroneumTransferDetails> &
res);
132 const std::vector<tools::wallet2::transfer_details> & transfers,
133 std::shared_ptr<messages::electroneum::ElectroneumKeyImageExportInitRequest> & req);
140 const std::shared_ptr<messages::electroneum::ElectroneumLiveRefreshStepAck> & ack,
147 using TsxData = messages::electroneum::ElectroneumTransactionInitRequest_ElectroneumTransactionData;
153 using ElectroneumRctKey = messages::electroneum::ElectroneumTransactionSourceEntry_ElectroneumOutputEntry_ElectroneumRctKeyPublic;
169 typedef boost::variant<rct::rangeSig, rct::Bulletproof>
rsig_v;
207 std::shared_ptr<rct::rctSig>
rv;
221 unsigned m_client_version;
226 return m_unsigned_tx->
txes[m_tx_idx];
229 void extract_payment_id();
230 void compute_integrated_indices(
TsxData * tsx_data);
231 bool should_compute_bp_now()
const;
232 void compute_bproof(messages::electroneum::ElectroneumTransactionRsigData & rsig_data);
238 std::shared_ptr<messages::electroneum::ElectroneumTransactionInitRequest>
step_init();
239 void step_init_ack(std::shared_ptr<const messages::electroneum::ElectroneumTransactionInitAck> ack);
241 std::shared_ptr<messages::electroneum::ElectroneumTransactionSetInputRequest>
step_set_input(
size_t idx);
242 void step_set_input_ack(std::shared_ptr<const messages::electroneum::ElectroneumTransactionSetInputAck> ack);
245 std::shared_ptr<messages::electroneum::ElectroneumTransactionInputsPermutationRequest>
step_permutation();
246 void step_permutation_ack(std::shared_ptr<const messages::electroneum::ElectroneumTransactionInputsPermutationAck> ack);
248 std::shared_ptr<messages::electroneum::ElectroneumTransactionInputViniRequest>
step_set_vini_input(
size_t idx);
249 void step_set_vini_input_ack(std::shared_ptr<const messages::electroneum::ElectroneumTransactionInputViniAck> ack);
251 std::shared_ptr<messages::electroneum::ElectroneumTransactionAllInputsSetRequest>
step_all_inputs_set();
252 void step_all_inputs_set_ack(std::shared_ptr<const messages::electroneum::ElectroneumTransactionAllInputsSetAck> ack);
254 std::shared_ptr<messages::electroneum::ElectroneumTransactionSetOutputRequest>
step_set_output(
size_t idx);
255 void step_set_output_ack(std::shared_ptr<const messages::electroneum::ElectroneumTransactionSetOutputAck> ack);
257 std::shared_ptr<messages::electroneum::ElectroneumTransactionSetOutputRequest>
step_rsig(
size_t idx);
258 void step_set_rsig_ack(std::shared_ptr<const messages::electroneum::ElectroneumTransactionSetOutputAck> ack);
260 std::shared_ptr<messages::electroneum::ElectroneumTransactionAllOutSetRequest>
step_all_outs_set();
263 std::shared_ptr<messages::electroneum::ElectroneumTransactionSignInputRequest>
step_sign_input(
size_t idx);
264 void step_sign_input_ack(std::shared_ptr<const messages::electroneum::ElectroneumTransactionSignInputAck> ack);
266 std::shared_ptr<messages::electroneum::ElectroneumTransactionFinalRequest>
step_final();
267 void step_final_ack(std::shared_ptr<const messages::electroneum::ElectroneumTransactionFinalAck> ack);
272 return m_client_version;
277 throw std::invalid_argument(
"RV not initialized");
279 auto tp = m_ct.
rv->type;
289 throw std::invalid_argument(
"RV not initialized");
291 auto tp = m_ct.
rv->type;
315 std::shared_ptr<messages::electroneum::ElectroneumGetTxKeyRequest>
get_tx_key(
319 std::vector<::crypto::secret_key> & tx_keys,
322 std::shared_ptr<const messages::electroneum::ElectroneumGetTxKeyAck> ack
331 #endif //ELECTRONEUM_PROTOCOL_H
std::vector< rct::ecdhTuple > tx_out_ecdh
void generate_commitment(std::vector< ElectroneumTransferDetails > &mtds, const std::vector< tools::wallet2::transfer_details > &transfers, std::shared_ptr< messages::Electroneum::ElectroneumKeyImageExportInitRequest > &req)
#define CHECK_AND_ASSERT_THROW_MES(expr, message)
Signer(wallet_shim *wallet2, const unsigned_tx_set *unsigned_tx, size_t tx_idx=0, hw::tx_aux_data *aux_data=nullptr)
messages::electroneum::ElectroneumKeyImageSyncStepRequest_ElectroneumTransferDetails ElectroneumTransferDetails
void step_set_rsig_ack(std::shared_ptr< const messages::electroneum::ElectroneumTransactionSetOutputAck > ack)
std::string store_tx_aux_info()
void step_init_ack(std::shared_ptr< const messages::electroneum::ElectroneumTransactionInitAck > ack)
const TData & tdata() const
void get_tx_key_ack(std::vector<::crypto::secret_key > &tx_keys, const std::string &tx_prefix_hash, const ::crypto::secret_key &view_key_priv, std::shared_ptr< const messages::Electroneum::ElectroneumGetTxKeyAck > ack)
cryptonote::transaction tx
std::vector< std::string > pseudo_outs_hmac
void step_permutation_ack(std::shared_ptr< const messages::electroneum::ElectroneumTransactionInputsPermutationAck > ack)
std::shared_ptr< messages::electroneum::ElectroneumTransactionInputViniRequest > step_set_vini_input(size_t idx)
bool is_bulletproof() const
size_t num_outputs() const
void string_to_key(::crypto::ec_scalar &key, const std::string &str)
void step_sign_input_ack(std::shared_ptr< const messages::electroneum::ElectroneumTransactionSignInputAck > ack)
bool cn_deserialize(const void *buff, size_t len, T &dst)
std::string cn_serialize(T &obj)
void translate_klrki(ElectroneumMultisigKLRki *dst, const rct::multisig_kLRki *src)
std::shared_ptr< ElectroneumRsigData > rsig_param
messages::electroneum::ElectroneumTransactionSourceEntry_ElectroneumOutputEntry ElectroneumOutputEntry
epee::mlocked< tools::scrubbed< ec_scalar > > secret_key
std::shared_ptr< messages::electroneum::ElectroneumTransactionSignInputRequest > step_sign_input(size_t idx)
std::string tx_prefix_hash
void step_all_outs_set_ack(std::shared_ptr< const messages::electroneum::ElectroneumTransactionAllOutSetAck > ack, hw::device &hwdev)
std::vector< std::string > tx_out_entr_hmacs
bool is_offloading() const
std::shared_ptr< messages::electroneum::ElectroneumTransactionSetOutputRequest > step_set_output(size_t idx)
std::shared_ptr< messages::Electroneum::ElectroneumGetTxKeyRequest > get_tx_key(const hw::device_cold::tx_key_data_t &tx_data)
unsigned client_version() const
void translate_src_entry(ElectroneumTransactionSourceEntry *dst, const cryptonote::tx_source_entry *src)
void step_final_ack(std::shared_ptr< const messages::electroneum::ElectroneumTransactionFinalAck > ack)
void translate_address(ElectroneumAccountPublicAddress *dst, const cryptonote::account_public_address *src)
std::shared_ptr< messages::electroneum::ElectroneumTransactionAllOutSetRequest > step_all_outs_set()
void assign_to_repeatable(::google::protobuf::RepeatedField< sub_t > *dst, const InputIterator begin, const InputIterator end)
std::vector< std::string > tx_in_hmacs
void step_set_vini_input_ack(std::shared_ptr< const messages::electroneum::ElectroneumTransactionInputViniAck > ack)
tools::wallet2::unsigned_tx_set unsigned_tx_set
boost::variant< rct::rangeSig, rct::Bulletproof > rsig_v
std::string compute_hash(const ElectroneumTransferDetails &rr)
std::vector< std::string > spend_encs
std::vector< std::string > couts
void translate_dst_entry(ElectroneumTransactionDestinationEntry *dst, const cryptonote::tx_destination_entry *src)
void translate_rct_key(ElectroneumRctKey *dst, const rct::ctkey *src)
messages::electroneum::ElectroneumTransactionSourceEntry_ElectroneumOutputEntry_ElectroneumRctKeyPublic ElectroneumRctKey
messages::electroneum::ElectroneumTransactionSourceEntry_ElectroneumMultisigKLRki ElectroneumMultisigKLRki
void load_tx_key_data(hw::device_cold::tx_key_data_t &res, const std::string &data)
hw::device_cold::exported_key_image exported_key_image
messages::electroneum::ElectroneumTransactionRsigData ElectroneumRsigData
size_t cur_output_in_batch_idx
void step_set_input_ack(std::shared_ptr< const messages::electroneum::ElectroneumTransactionSetInputAck > ack)
messages::electroneum::ElectroneumKeyImageExportInitRequest_ElectroneumSubAddressIndicesList ElectroneumSubAddressIndicesList
bool is_req_bulletproof() const
std::shared_ptr< messages::electroneum::ElectroneumTransactionFinalRequest > step_final()
messages::electroneum::ElectroneumKeyImageSyncStepAck_ElectroneumExportedKeyImage ElectroneumExportedKeyImage
std::vector< rct::ctkey > tx_out_pk
::crypto::secret_key compute_enc_key(const ::crypto::secret_key &private_view_key, const std::string &aux, const std::string &salt)
void serialize(Archive &a, unsigned_tx_set &x, const boost::serialization::version_type ver)
std::vector< size_t > source_permutation
std::vector< uint64_t > grouping_vct
size_t num_inputs() const
std::vector< std::string > couts_dec
std::vector< std::string > alphas
tools::wallet2::tx_construction_data tx_construction_data
messages::electroneum::ElectroneumTransactionDestinationEntry_ElectroneumAccountPublicAddress ElectroneumAccountPublicAddress
std::vector< rct::key > rsig_gamma
std::shared_ptr< messages::electroneum::ElectroneumTransactionInitRequest > step_init()
messages::electroneum::ElectroneumTransactionInitRequest_ElectroneumTransactionData TsxData
expect< void > success() noexcept
void decrypt(const void *ciphertext, size_t length, const uint8_t *key, const uint8_t *iv, char *plaintext, size_t *plaintext_len)
std::shared_ptr< messages::electroneum::ElectroneumTransactionInputsPermutationRequest > step_permutation()
std::shared_ptr< messages::electroneum::ElectroneumTransactionAllInputsSetRequest > step_all_inputs_set()
void live_refresh_ack(const ::crypto::secret_key &view_key_priv, const ::crypto::public_key &out_key, const std::shared_ptr< messages::Electroneum::ElectroneumLiveRefreshStepAck > &ack, ::cryptonote::keypair &in_ephemeral, ::crypto::key_image &ki)
void step_set_output_ack(std::shared_ptr< const messages::electroneum::ElectroneumTransactionSetOutputAck > ack)
void assign_from_repeatable(std::vector< sub_t > *dst, const InputIterator begin, const InputIterator end)
RangeProofType range_proof_type
messages::electroneum::ElectroneumTransactionSourceEntry ElectroneumTransactionSourceEntry
bool key_image_data(wallet_shim *wallet, const std::vector< tools::wallet2::transfer_details > &transfers, std::vector< ElectroneumTransferDetails > &res)
messages::electroneum::ElectroneumTransactionDestinationEntry ElectroneumTransactionDestinationEntry
std::string hash_addr(const ElectroneumAccountPublicAddress *addr, boost::optional< uint64_t > amount, boost::optional< bool > is_subaddr)
std::shared_ptr< rct::rctSig > rv
std::vector< std::string > tx_out_hmacs
std::shared_ptr< messages::electroneum::ElectroneumTransactionSetInputRequest > step_set_input(size_t idx)
std::string key_to_string(const ::crypto::ec_point &key)
std::shared_ptr< messages::electroneum::ElectroneumTransactionSetOutputRequest > step_rsig(size_t idx)
tx_construction_data tx_data
std::vector< rsig_v > tx_out_rsigs
void step_all_inputs_set_ack(std::shared_ptr< const messages::electroneum::ElectroneumTransactionAllInputsSetAck > ack)
std::vector< std::string > pseudo_outs
std::vector< std::pair< crypto::key_image, crypto::signature > > exported_key_image