29 #include <unordered_set> 37 #undef ELECTRONEUM_DEFAULT_LOG_CATEGORY 38 #define ELECTRONEUM_DEFAULT_LOG_CATEGORY "multisig" 42 static const rct::key multisig_salt = { {
'M',
'u',
'l',
't' ,
'i',
's',
'i',
'g', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } };
51 data.push_back(rct::sk2rct(
key));
52 data.push_back(multisig_salt);
61 multisig_keys.clear();
64 for (
const auto &k: spend_keys)
66 multisig_keys.push_back(spend_secret_key);
67 spend_skey = rct::sk2rct(spend_secret_key);
72 multisig_keys.clear();
78 for (
const auto &k: spend_keys)
82 multisig_keys.push_back(msk);
89 std::vector<crypto::public_key> multisig_keys;
91 for (
const auto &k: derivations)
94 multisig_keys.push_back(rct::rct2pk(d));
103 for (
const auto &k: multisig_keys)
113 std::vector<crypto::secret_key> multisig_keys;
114 multisig_keys.reserve(derivations.size());
116 for (
const auto &k: derivations)
121 return multisig_keys;
127 for (
const auto &k: skeys)
129 return rct::rct2sk(view_skey);
135 for (
const auto &pk: pkeys)
137 rct::addKeys(spend_public_key, spend_public_key, rct::pk2rct(pk));
139 return rct::rct2pk(spend_public_key);
161 std::unordered_set<crypto::key_image> used;
170 for (
const auto &pki: pkis)
172 if (used.find(pki) == used.end())
void generate_multisig_LR(const crypto::public_key pkey, const crypto::secret_key &k, crypto::public_key &L, crypto::public_key &R)
#define CHECK_AND_ASSERT_THROW_MES(expr, message)
void generate_multisig_N1_N(const account_keys &keys, const std::vector< crypto::public_key > &spend_keys, std::vector< crypto::secret_key > &multisig_keys, rct::key &spend_skey, rct::key &spend_pkey)
void scalarmultKey(key &aP, const key &P, const key &a)
std::vector< crypto::public_key > generate_multisig_derivations(const account_keys &keys, const std::vector< crypto::public_key > &derivations)
generate_multisig_derivations performs common DH key derivation. Each middle round in M/N scheme is D...
epee::mlocked< tools::scrubbed< ec_scalar > > secret_key
void generate_multisig_N_N(const account_keys &keys, const std::vector< crypto::public_key > &spend_keys, std::vector< crypto::secret_key > &multisig_keys, rct::key &spend_skey, rct::key &spend_pkey)
Holds cryptonote related classes and helpers.
crypto::public_key generate_multisig_M_N_spend_public_key(const std::vector< crypto::public_key > &pkeys)
generate_multisig_M_N_spend_public_key calculates multisig wallet's spend public key by summing all o...
uint32_t multisig_rounds_required(uint32_t participants, uint32_t threshold)
std::vector< crypto::secret_key > calculate_multisig_keys(const std::vector< crypto::public_key > &derivations)
calculate_multisig_keys. Calculates secret multisig keys from others' participants ones as follows: m...
void generate_key_image(const public_key &pub, const secret_key &sec, key_image &image)
bool generate_multisig_key_image(const account_keys &keys, size_t multisig_key_index, const crypto::public_key &out_key, crypto::key_image &ki)
bool generate_key_image_helper(const account_keys &ack, const std::unordered_map< crypto::public_key, subaddress_index > &subaddresses, const crypto::public_key &out_key, const crypto::public_key &tx_public_key, const std::vector< crypto::public_key > &additional_tx_public_keys, size_t real_output_index, keypair &in_ephemeral, crypto::key_image &ki, hw::device &hwdev, const uint32_t account_major_offset)
crypto::secret_key get_multisig_blinded_secret_key(const crypto::secret_key &key)
void hash_to_scalar(key &hash, const void *data, const std::size_t l)
bool generate_multisig_composite_key_image(const account_keys &keys, const std::unordered_map< crypto::public_key, subaddress_index > &subaddresses, const crypto::public_key &out_key, const crypto::public_key &tx_public_key, const std::vector< crypto::public_key > &additional_tx_public_keys, size_t real_output_index, const std::vector< crypto::key_image > &pkis, crypto::key_image &ki)
void scalarmultBase(key &aG, const key &a)
crypto::secret_key generate_multisig_view_secret_key(const crypto::secret_key &skey, const std::vector< crypto::secret_key > &skeys)
crypto::secret_key m_spend_secret_key
std::vector< crypto::secret_key > m_multisig_keys
void addKeys(key &AB, const key &A, const key &B)
bool secret_key_to_public_key(const secret_key &sec, public_key &pub)
void * memwipe(void *src, size_t n)
void sc_add(unsigned char *, const unsigned char *, const unsigned char *)
hw::device & get_device() const
crypto::secret_key calculate_multisig_signer_key(const std::vector< crypto::secret_key > &multisig_keys)