def validate_mnemonics(mnemonics, threshold, expected_ems): # 3of5 shares 3of5 groups # TODO: test all possible group+share combinations? test_combination = mnemonics[0:3] + mnemonics[5:8] + mnemonics[10:13] groups = shamir.decode_mnemonics(test_combination) ems = shamir.recover_ems(groups) assert expected_ems == ems.ciphertext
def backup_flow_slip39_advanced(client): mnemonics = [] def input_flow(): # 1. Confirm Reset # 2. shares info # 3. Set & Confirm number of groups # 4. threshold info # 5. Set & confirm group threshold value # 6-15: for each of 5 groups: # 1. Set & Confirm number of shares # 2. Set & confirm share threshold value # 16. Confirm show seeds yield from click_through(client.debug, screens=16, code=B.ResetDevice) # show & confirm shares for all groups for _ in range(5): for _ in range(5): # mnemonic phrases mnemonic = yield from read_and_confirm_mnemonic(client.debug) mnemonics.append(mnemonic) # Confirm continue to next share br = yield assert br.code == B.Success client.debug.press_yes() # safety warning br = yield assert br.code == B.Success client.debug.press_yes() with client: client.set_input_flow(input_flow) client.set_expected_responses( [messages.ButtonRequest(code=B.ResetDevice)] * 6 # intro screens + [ messages.ButtonRequest(code=B.ResetDevice), messages.ButtonRequest(code=B.ResetDevice), ] * 5 # group thresholds + [ messages.ButtonRequest(code=B.ResetDevice), messages.ButtonRequest(code=B.Success), ] * 25 # individual shares + [ messages.ButtonRequest(code=B.Success), messages.Success, messages.Features, ] ) device.backup(client) mnemonics = mnemonics[0:3] + mnemonics[5:8] + mnemonics[10:13] groups = shamir.decode_mnemonics(mnemonics) ems = shamir.recover_ems(groups) return ems.ciphertext
def validate_mnemonics(mnemonics, threshold, expected_ems): # We expect these combinations to recreate the secret properly for test_group in combinations(mnemonics, threshold): groups = shamir.decode_mnemonics(test_group) ems = shamir.recover_ems(groups) assert expected_ems == ems.ciphertext # We expect these combinations to raise MnemonicError for test_group in combinations(mnemonics, threshold - 1): with pytest.raises(MnemonicError, match=f".*Expected {threshold} mnemonics.*"): shamir.combine_mnemonics(test_group)
def backup_flow_slip39_basic(client): mnemonics = [] def input_flow(): # 1. Checklist # 2. Number of shares (5) # 3. Checklist # 4. Threshold (3) # 5. Checklist # 6. Confirm show seeds yield from click_through(client.debug, screens=6, code=B.ResetDevice) # Mnemonic phrases for _ in range(5): # Phrase screen mnemonic = yield from read_and_confirm_mnemonic(client.debug) mnemonics.append(mnemonic) yield # Confirm continue to next client.debug.press_yes() # Confirm backup yield client.debug.press_yes() with client: client.set_input_flow(input_flow) client.set_expected_responses( [messages.ButtonRequest(code=B.ResetDevice)] * 6 # intro screens + [ messages.ButtonRequest(code=B.ResetDevice), messages.ButtonRequest(code=B.Success), ] * 5 # individual shares + [ messages.ButtonRequest(code=B.Success), messages.Success, messages.Features, ] ) device.backup(client) groups = shamir.decode_mnemonics(mnemonics[:3]) ems = shamir.recover_ems(groups) return ems.ciphertext
def validate_mnemonics(mnemonics, expected_ems): # We expect these combinations to recreate the secret properly # In case of click tests the mnemonics are always XofX so no need for combinations groups = shamir.decode_mnemonics(mnemonics) ems = shamir.recover_ems(groups) assert expected_ems == ems.ciphertext