Source code for microraiden.test.test_crypto

import pytest  # noqa: F401
from coincurve import PublicKey
from eth_utils import encode_hex, decode_hex, is_same_address
from web3.contract import Contract

from microraiden.utils import (
    privkey_to_addr,
    keccak256_hex,
    sign,
    pubkey_to_addr,
    sign_balance_proof,
    verify_balance_proof,
    eth_sign,
    keccak256,
    addr_from_sig,
    eth_verify,
    eth_sign_typed_data_message_eip,
    eth_sign_typed_data_eip,
    pack,
    sign_close,
    verify_closing_sig
)

SENDER_PRIVATE_KEY = '0xa0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0'
SENDER_ADDR = privkey_to_addr(SENDER_PRIVATE_KEY)
RECEIVER_PRIVATE_KEY = '0xb1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1'
RECEIVER_ADDR = privkey_to_addr(RECEIVER_PRIVATE_KEY)


[docs]def test_encode_hex(): assert isinstance(encode_hex(b''), str) assert isinstance(decode_hex(''), bytes)
[docs]def test_pack(): assert pack(False) == b'\x00' assert pack(True) == b'\x01'
[docs]def test_keccak256(): addr1 = '0x1212121212121212121212121212121212121212' addr2 = '0x3434343434343434343434343434343434343434' ref = '0x3ac225168df54212a25c1c01fd35bebfea408fdac2e31ddd6f80a4bbf9a5f1cb' assert keccak256_hex('a') == ref ref = '0x0ef9d8f8804d174666011a394cab7901679a8944d24249fd148a6a36071151f8' assert keccak256_hex('0x0a') == ref ref = '0x1e17ec1733a759ef0d988fd0195d0e2792dc6181c8953130d14f9a261c6260bb' assert keccak256_hex(addr1, (15, 32)) == ref ref = '0x00424f9e17d5fecf44d798962d27cd1d44ef37d3968b05a5ff078ff696c14ea8' assert keccak256_hex(addr1, (17, 32), addr2) == ref ref = '0xc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15' assert keccak256_hex((23, 256)) == ref ref = '0x66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090' assert keccak256_hex(19) == ref ref = '0x7234c58e51ab4abdf62492ac6faf025ebff2afd4f861cebfa33d3e76667716a9' assert keccak256_hex(-5) == ref ref = '0x5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd2' assert keccak256_hex(True) == ref ref = '0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a' assert keccak256_hex(False) == ref
[docs]def test_sign(): msg = b'32' * 16 assert len(msg) == 32 sig = sign(SENDER_PRIVATE_KEY, msg) pubkey = PublicKey.from_signature_and_message(sig, msg, hasher=None) pubkey = pubkey.format(compressed=False) assert len(sig) == 65 assert is_same_address(pubkey_to_addr(pubkey), SENDER_ADDR)
[docs]def test_eth_sign(): # Generated using https://www.myetherwallet.com/signmsg.html msg = 'is it wednesday, my dudes?' sig_expected = '0xcc7b4e6cde6ace1d99995661250e52388aae17ebd66dcf52e634a6dd51bf286a2' \ 'e9757967b7baff8b549da7d8c3340701abf8560430b7a0bdf34f42b19bbf1861b' assert encode_hex(eth_sign(SENDER_PRIVATE_KEY, msg)) == sig_expected
[docs]def test_eth_sign_typed_data(): pass
[docs]def test_eth_sign_typed_data_eip(): # Test cases from the EIP: # https://github.com/0xProject/EIPs/blob/01dfc0f9a4122d8ad8817c503447cab8efa8a6c4/EIPS/eip-signTypedData.md#test-cases privkey = 'f2f48ee19680706196e2e339e5da3491186e0c4c5030670656b0e0164837257d' addr = '0x5409ed021d9299bf6814279a6a1411a7e866a631' assert is_same_address(addr, privkey_to_addr(privkey)) typed_data = [('string', 'message', 'Hi, Alice!')] msg = eth_sign_typed_data_message_eip(typed_data) assert encode_hex(msg) == '0xe18794748cc6d73634d578f6a83f752bee11a0c9853d76bd0111d67a9b555a2c' sig = eth_sign_typed_data_eip(privkey, typed_data) sig_expected = '0x1a4ca93acf066a580f097690246e6c85d1deeb249194f6d3c2791f3aecb6adf8' \ '714ca4a0f12512ddd2a4f2393ea0c3b2c856279ba4929a5a34ae6859689428061b' assert encode_hex(sig) == sig_expected typed_data = [('uint', 'value', 42)] msg = eth_sign_typed_data_message_eip(typed_data) assert encode_hex(msg) == '0x6cb1c2645d841a0a3d142d1a2bdaa27015cc77f442e17037015b0350e468a957' sig = eth_sign_typed_data_eip(privkey, typed_data) sig_expected = '0x87c5b6a9f3a758babcc9140a96ae07957c6c9109af65bf139266cded52da49e6' \ '3df6af6f7daef588218e156bc83b95e0bfcfa8e72843cf4cf8c67c3ca11c3fd11b' assert encode_hex(sig) == sig_expected typed_data = [ ('uint', 'value', 42), ('string', 'message', 'Hi, Alice!'), ('bool', 'removed', False) ] msg = eth_sign_typed_data_message_eip(typed_data) assert encode_hex(msg) == '0x36c3ed8591950e33dc4777bb455ab1a3e4223f84c42172a1ff2e200d5e25ee2e' sig = eth_sign_typed_data_eip(privkey, typed_data) sig_expected = '0x466a5a021225b681836e9951d2e603a37a605850ca26da0692ca532d4d1581d6' \ '031e2e3754fe31036e3a56d7e37fb6f598f7ab7a5cdd87aa04c9811c8b6209f31b' assert encode_hex(sig) == sig_expected
[docs]def test_sign_balance_proof_contract(channel_manager_contract: Contract): sig = sign_balance_proof( SENDER_PRIVATE_KEY, RECEIVER_ADDR, 37, 15, channel_manager_contract.address ) sender_recovered = channel_manager_contract.call().extractBalanceProofSignature( RECEIVER_ADDR, 37, 15, sig ) assert is_same_address(sender_recovered, SENDER_ADDR)
[docs]def test_verify_balance_proof(channel_manager_address: str): sig = sign_balance_proof( SENDER_PRIVATE_KEY, RECEIVER_ADDR, 315123, 8, channel_manager_address ) assert is_same_address(verify_balance_proof( RECEIVER_ADDR, 315123, 8, sig, channel_manager_address ), SENDER_ADDR)
[docs]def test_sign_close_contract(channel_manager_contract: Contract): sig = sign_close( RECEIVER_PRIVATE_KEY, SENDER_ADDR, 315832, 13, channel_manager_contract.address ) receiver_recovered = channel_manager_contract.call().extractClosingSignature( SENDER_ADDR, 315832, 13, sig ) assert is_same_address(receiver_recovered, RECEIVER_ADDR)
[docs]def test_verify_closing_sign(channel_manager_address: str): sig = sign_close( RECEIVER_PRIVATE_KEY, SENDER_ADDR, 315832, 13, channel_manager_address ) receiver_recovered = verify_closing_sig(SENDER_ADDR, 315832, 13, sig, channel_manager_address) assert is_same_address(receiver_recovered, RECEIVER_ADDR)
[docs]def test_sign_v0(): msg = keccak256('hello v=0') sig = sign(SENDER_PRIVATE_KEY, msg) assert sig[-1] == 1 assert is_same_address(addr_from_sig(sig, msg), SENDER_ADDR)
[docs]def test_eth_sign_v27(): sig = eth_sign(SENDER_PRIVATE_KEY, 'hello v=27') assert sig[-1] == 27 assert is_same_address(eth_verify(sig, 'hello v=27'), SENDER_ADDR)
[docs]def test_verify_balance_proof_v0(channel_manager_address: str): sig = sign_balance_proof( SENDER_PRIVATE_KEY, RECEIVER_ADDR, 312524, 11, channel_manager_address ) sig = sig[:-1] + bytes([sig[-1] % 27]) assert is_same_address(verify_balance_proof( RECEIVER_ADDR, 312524, 11, sig, channel_manager_address ), SENDER_ADDR)
[docs]def test_verify_balance_proof_v27(channel_manager_address: str): # Should be default but test anyway. sig = sign_balance_proof( SENDER_PRIVATE_KEY, RECEIVER_ADDR, 312524, 11, channel_manager_address ) sig = sig[:-1] + bytes([sig[-1] % 27 + 27]) assert is_same_address(verify_balance_proof( RECEIVER_ADDR, 312524, 11, sig, channel_manager_address ), SENDER_ADDR)