def test_sign_msg_good(dev, need_keypress, msg, path, addr_fmt, addr_vs_path): msg = msg.encode('ascii') dev.send_recv(CCProtocolPacker.sign_message(msg, path, addr_fmt=addr_fmt), timeout=None) need_keypress('y') done = None while done == None: time.sleep(0.050) done = dev.send_recv(CCProtocolPacker.get_signed_msg(), timeout=None) assert len(done) == 2, done addr, raw = done sig = str(b64encode(raw), 'ascii').replace('\n', '') assert 40 <= len(raw) <= 65 if addr_fmt != AF_CLASSIC: # TODO # - need bech32 decoder here # - pycoin can't do signature decode if addr_fmt & AFC_BECH32: assert '1' in addr return # check expected addr was used sk = addr_vs_path(addr, path, addr_fmt) # verify signature assert verify_message(sk, sig, message=msg.decode('ascii')) == True assert verify_message(addr, sig, message=msg.decode('ascii')) == True
def test_sign_msg_refused(dev, need_keypress, msg=b'testing 123', path='m'): # user can refuse to sign (cancel) dev.send_recv(CCProtocolPacker.sign_message(msg, path), timeout=None) need_keypress('x') with pytest.raises(CCUserRefused): done = None while done == None: time.sleep(0.050) done = dev.send_recv(CCProtocolPacker.get_signed_msg(), timeout=None)
def test_sign_msg_microsd_fails(dev, sign_on_microsd, msg, concern, no_file, transport, path='m/12/34'): if transport == 'usb': with pytest.raises(CCProtoError) as ee: dev.send_recv(CCProtocolPacker.sign_message(msg.encode('ascii'), path), timeout=None) story = ee.value.args[0] else: story = sign_on_microsd(msg, path, expect_fail=True) if no_file: assert story == 'NO-FILE' return assert story.startswith('Problem: ') assert concern in story
def doit(refuse, *args, **kws): tt = kws.pop('timeout', None) dev.send_recv(CCProtocolPacker.sign_message(*args, **kws), timeout=tt) try: done = None while done == None: time.sleep(0.050) done = dev.send_recv(CCProtocolPacker.get_signed_msg(), timeout=tt) assert len(done) == 2 assert refuse == None, "signing didn't fail, but expected to" except CCUserRefused: msg = hsm_status().last_refusal assert refuse != None, "should not have been refused: " + msg assert refuse in msg
def test_low_R_cases(msg, num_iter, expect, dev, set_seed_words, use_mainnet, need_keypress): # Thanks to @craigraw of Sparrow for this test case, copied from: # <https://github.com/sparrowwallet/drongo/blob/master/src/test/java/com/sparrowwallet/drongo/crypto/ECKeyTest.java> set_seed_words( 'absent essay fox snake vast pumpkin height crouch silent bulb excuse razor' ) use_mainnet() path = "m/44'/0'/0'/0/0" # first address, P2PKH addr_fmt = AF_CLASSIC #addr = dev.send_recv(CCProtocolPacker.show_address(path, addr_fmt), timeout=None) #assert addr == '14JmU9a7SzieZNEtBnsZo688rt3mGrw6hr' msg = msg.encode('ascii') dev.send_recv(CCProtocolPacker.sign_message(msg, path, addr_fmt=addr_fmt), timeout=None) need_keypress('y') done = None while done == None: time.sleep(0.050) done = dev.send_recv(CCProtocolPacker.get_signed_msg(), timeout=None) assert len(done) == 2, done got_addr, raw = done assert got_addr == '14JmU9a7SzieZNEtBnsZo688rt3mGrw6hr' assert 40 <= len(raw) <= 65 sig = str(b64encode(raw), 'ascii').replace('\n', '') if num_iter != 1: # I have gotten these cases to pass, but I didn't want to keep the code # that grinded for low R in message signing... Ok for txn signing, but # needless delay for message signing. raise pytest.xfail('no code') assert sig == expect
def test_sign_msg_good(dev, need_keypress, master_xpub, msg, path, addr_fmt, addr_vs_path): msg = msg.encode('ascii') dev.send_recv(CCProtocolPacker.sign_message(msg, path, addr_fmt=addr_fmt), timeout=None) need_keypress('y') done = None while done == None: time.sleep(0.050) done = dev.send_recv(CCProtocolPacker.get_signed_msg(), timeout=None) assert len(done) == 2, done addr, raw = done sig = str(b64encode(raw), 'ascii').replace('\n', '') assert 40 <= len(raw) <= 65 if addr_fmt != AF_CLASSIC: # TODO # - need bech32 decoder here # - pycoin can't do signature decode if addr_fmt & AFC_BECH32: assert '1' in addr return if "'" not in path and 'p' not in path: # check expected addr was used mk = BIP32Node.from_wallet_key(master_xpub) sk = mk.subkey_for_path(path[2:]) addr_vs_path(addr, path, addr_fmt) # verify signature assert verify_message(sk, sig, message=msg.decode('ascii')) == True else: # just verify signature assert verify_message(addr, sig, message=msg.decode('ascii')) == True
def test_sign_msg_fails(dev, msg, path='m'): msg = msg.encode('ascii') with pytest.raises(CCProtoError): dev.send_recv(CCProtocolPacker.sign_message(msg, path), timeout=None)