aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorkoe <ukoe@protonmail.com>2022-04-29 14:04:59 -0500
committerkoe <ukoe@protonmail.com>2022-04-29 14:04:59 -0500
commit0d6ecb113651ac99abd25a04fe4ddb9ac0a73c3e (patch)
tree3b7d1c453e2d38060f1c26b020f22e74309e2ef3 /tests
parentMerge pull request #8161 (diff)
downloadmonero-0d6ecb113651ac99abd25a04fe4ddb9ac0a73c3e.tar.xz
multisig: add post-kex verification round to check that all participants have completed the multisig address
Diffstat (limited to 'tests')
-rw-r--r--tests/core_tests/multisig.cpp8
-rwxr-xr-xtests/functional_tests/multisig.py85
-rw-r--r--tests/unit_tests/multisig.cpp15
3 files changed, 61 insertions, 47 deletions
diff --git a/tests/core_tests/multisig.cpp b/tests/core_tests/multisig.cpp
index 73bc1f104..a397d388d 100644
--- a/tests/core_tests/multisig.cpp
+++ b/tests/core_tests/multisig.cpp
@@ -81,9 +81,7 @@ static bool make_multisig_accounts(std::vector<cryptonote::account_base> &accoun
for (std::size_t account_index{0}; account_index < accounts.size(); ++account_index)
{
multisig_accounts[account_index].initialize_kex(threshold, signers, round_msgs);
-
- if (!multisig_accounts[account_index].multisig_is_ready())
- temp_round_msgs[account_index] = multisig_accounts[account_index].get_next_kex_round_msg();
+ temp_round_msgs[account_index] = multisig_accounts[account_index].get_next_kex_round_msg();
}
// perform key exchange rounds
@@ -94,9 +92,7 @@ static bool make_multisig_accounts(std::vector<cryptonote::account_base> &accoun
for (std::size_t account_index{0}; account_index < multisig_accounts.size(); ++account_index)
{
multisig_accounts[account_index].kex_update(round_msgs);
-
- if (!multisig_accounts[account_index].multisig_is_ready())
- temp_round_msgs[account_index] = multisig_accounts[account_index].get_next_kex_round_msg();
+ temp_round_msgs[account_index] = multisig_accounts[account_index].get_next_kex_round_msg();
}
}
diff --git a/tests/functional_tests/multisig.py b/tests/functional_tests/multisig.py
index bb7ccbe56..a45388ec4 100755
--- a/tests/functional_tests/multisig.py
+++ b/tests/functional_tests/multisig.py
@@ -125,17 +125,18 @@ class MultisigTest():
for i in range(N_total):
res = self.wallet[i].is_multisig()
assert res.multisig == True
- assert res.ready == (M_threshold == N_total)
+ assert not res.ready
assert res.threshold == M_threshold
assert res.total == N_total
while True:
- n_empty = 0
- for i in range(len(next_stage)):
- if len(next_stage[i]) == 0:
- n_empty += 1
- assert n_empty == 0 or n_empty == len(next_stage)
- if n_empty == len(next_stage):
+ n_ready = 0
+ for i in range(N_total):
+ res = self.wallet[i].is_multisig()
+ if res.ready == True:
+ n_ready += 1
+ assert n_ready == 0 or n_ready == N_total
+ if n_ready == N_total:
break
info = next_stage
next_stage = []
@@ -162,54 +163,72 @@ class MultisigTest():
'peeled mixture ionic radar utopia puddle buying illness nuns gadget river spout cavernous bounced paradise drunk looking cottage jump tequila melting went winter adjust spout',
'dilute gutter certain antics pamphlet macro enjoy left slid guarded bogeys upload nineteen bomb jubilee enhanced irritate turnip eggs swung jukebox loudly reduce sedan slid',
]
- info = []
- wallet = [None, None, None]
- for i in range(3):
- wallet[i] = Wallet(idx = i)
- try: wallet[i].close_wallet()
+ info2of2 = []
+ wallet2of2 = [None, None]
+ for i in range(2):
+ wallet2of2[i] = Wallet(idx = i)
+ try: wallet2of2[i].close_wallet()
except: pass
- res = wallet[i].restore_deterministic_wallet(seed = seeds[i])
- res = wallet[i].is_multisig()
+ res = wallet2of2[i].restore_deterministic_wallet(seed = seeds[i])
+ res = wallet2of2[i].is_multisig()
assert not res.multisig
- res = wallet[i].prepare_multisig()
+ res = wallet2of2[i].prepare_multisig()
assert len(res.multisig_info) > 0
- info.append(res.multisig_info)
-
- for i in range(3):
- ok = False
- try: res = wallet[i].exchange_multisig_keys(info)
- except: ok = True
- assert ok
- res = wallet[i].is_multisig()
- assert not res.multisig
-
- res = wallet[0].make_multisig(info[0:2], 2)
- res = wallet[0].is_multisig()
+ info2of2.append(res.multisig_info)
+
+ kex_info = []
+ res = wallet2of2[0].make_multisig(info2of2, 2)
+ kex_info.append(res.multisig_info)
+ res = wallet2of2[1].make_multisig(info2of2, 2)
+ kex_info.append(res.multisig_info)
+ res = wallet2of2[0].exchange_multisig_keys(kex_info)
+ res = wallet2of2[0].is_multisig()
assert res.multisig
assert res.ready
ok = False
- try: res = wallet[0].prepare_multisig()
+ try: res = wallet2of2[0].prepare_multisig()
except: ok = True
assert ok
ok = False
- try: res = wallet[0].make_multisig(info[0:2], 2)
+ try: res = wallet2of2[0].make_multisig(info2of2, 2)
except: ok = True
assert ok
- res = wallet[1].make_multisig(info, 2)
- res = wallet[1].is_multisig()
+ info2of3 = []
+ wallet2of3 = [None, None, None]
+ for i in range(3):
+ wallet2of3[i] = Wallet(idx = i)
+ try: wallet2of3[i].close_wallet()
+ except: pass
+ res = wallet2of3[i].restore_deterministic_wallet(seed = seeds[i])
+ res = wallet2of3[i].is_multisig()
+ assert not res.multisig
+ res = wallet2of3[i].prepare_multisig()
+ assert len(res.multisig_info) > 0
+ info2of3.append(res.multisig_info)
+
+ for i in range(3):
+ ok = False
+ try: res = wallet2of3[i].exchange_multisig_keys(info)
+ except: ok = True
+ assert ok
+ res = wallet2of3[i].is_multisig()
+ assert not res.multisig
+
+ res = wallet2of3[1].make_multisig(info2of3, 2)
+ res = wallet2of3[1].is_multisig()
assert res.multisig
assert not res.ready
ok = False
- try: res = wallet[1].prepare_multisig()
+ try: res = wallet2of3[1].prepare_multisig()
except: ok = True
assert ok
ok = False
- try: res = wallet[1].make_multisig(info[0:2], 2)
+ try: res = wallet2of3[1].make_multisig(info2of3[0:2], 2)
except: ok = True
assert ok
diff --git a/tests/unit_tests/multisig.cpp b/tests/unit_tests/multisig.cpp
index 362a658de..c4e24fa53 100644
--- a/tests/unit_tests/multisig.cpp
+++ b/tests/unit_tests/multisig.cpp
@@ -120,7 +120,7 @@ static void check_results(const std::vector<std::string> &intermediate_infos,
for (size_t i = 0; i < wallets.size(); ++i)
{
- EXPECT_TRUE(intermediate_infos[i].empty());
+ EXPECT_TRUE(!intermediate_infos[i].empty());
bool ready;
uint32_t threshold, total;
EXPECT_TRUE(wallets[i].multisig(&ready, &threshold, &total));
@@ -171,7 +171,7 @@ static void make_wallets(std::vector<tools::wallet2>& wallets, unsigned int M)
{
ASSERT_TRUE(wallets.size() > 1 && wallets.size() <= KEYS_COUNT);
ASSERT_TRUE(M <= wallets.size());
- std::uint32_t rounds_required = multisig::multisig_kex_rounds_required(wallets.size(), M);
+ std::uint32_t total_rounds_required = multisig::multisig_kex_rounds_required(wallets.size(), M) + 1;
std::uint32_t rounds_complete{0};
// initialize wallets, get first round multisig kex msgs
@@ -203,18 +203,17 @@ static void make_wallets(std::vector<tools::wallet2>& wallets, unsigned int M)
++rounds_complete;
// perform kex rounds until kex is complete
- while (!intermediate_infos[0].empty())
+ bool ready;
+ wallets[0].multisig(&ready);
+ while (!ready)
{
- bool ready{false};
- wallets[0].multisig(&ready);
- EXPECT_FALSE(ready);
-
intermediate_infos = exchange_round(wallets, intermediate_infos);
+ wallets[0].multisig(&ready);
++rounds_complete;
}
- EXPECT_EQ(rounds_required, rounds_complete);
+ EXPECT_EQ(total_rounds_required, rounds_complete);
check_results(intermediate_infos, wallets, M);
}