예제 #1
0
async def main():
    random.seed(0)

    my_key_pair_nacl = nacl.signing.SigningKey.generate()

    conn = await connect(nodes[0].addr())

    handshake = create_handshake(my_key_pair_nacl, nodes[0].node_key.pk, 12345)
    # Use future version
    handshake.HandshakeV2.version = 2**32 - 1
    raw_message = BinarySerializer(schema).serialize(handshake)

    # Keep header (9 bytes)
    # - 1 byte  PeerMessage::HandshakeV2 enum id
    # - 4 bytes version
    # - 4 bytes oldest_supported_version
    raw_message = raw_message[:9] + bytes(
        [random.randint(0, 255) for _ in range(random.randint(1, 32))])

    # First handshake attempt. Should fail with Protocol Version Mismatch
    await conn.send_raw(raw_message)
    response = await conn.recv()

    print(obj_to_string(response))

    assert response.enum == 'HandshakeFailure', response.enum
    assert response.HandshakeFailure[
        1].enum == 'ProtocolVersionMismatch', response.HandshakeFailure[1].enum
    pvm = response.HandshakeFailure[1].ProtocolVersionMismatch.version
    handshake.HandshakeV2.version = pvm
예제 #2
0
async def main():
    my_key_pair_nacl = nacl.signing.SigningKey.generate()

    conn = await connect(nodes[0].addr())
    handshake = create_handshake(my_key_pair_nacl, nodes[0].node_key.pk, 12345)
    handshake.Handshake.edge_info.nonce = 1505

    # First handshake attempt. Should fail with Genesis Mismatch
    sign_handshake(my_key_pair_nacl, handshake.Handshake)
    await conn.send(handshake)
    response = await conn.recv()
    assert response.enum == 'HandshakeFailure', response.enum
    assert response.HandshakeFailure[
        1].enum == 'ProtocolVersionMismatch', response.HandshakeFailure[1].enum
    pvm = response.HandshakeFailure[1].ProtocolVersionMismatch.version
    handshake.Handshake.version = pvm

    # Second handshake attempt. Should fail with Protocol Version Mismatch
    sign_handshake(my_key_pair_nacl, handshake.Handshake)
    await conn.send(handshake)
    response = await conn.recv()
    assert response.enum == 'HandshakeFailure', response.enum
    assert response.HandshakeFailure[
        1].enum == 'GenesisMismatch', response.HandshakeFailure[1].enum
    gm = response.HandshakeFailure[1].GenesisMismatch
    handshake.Handshake.chain_info.genesis_id.chain_id = gm.chain_id
    handshake.Handshake.chain_info.genesis_id.hash = gm.hash

    # Third handshake attempt.
    sign_handshake(my_key_pair_nacl, handshake.Handshake)
    await conn.send(handshake)
    response = await conn.recv()

    # Connection should be closed by other peer because too large nonce on handshake.
    assert response is None
예제 #3
0
async def main():
    my_key_pair_nacl = nacl.signing.SigningKey.generate()

    conn = await connect(nodes[0].addr())

    # First handshake attempt. Should fail with Genesis Mismatch
    handshake = create_handshake(my_key_pair_nacl, nodes[0].node_key.pk, 12345)
    sign_handshake(my_key_pair_nacl, handshake.Handshake)

    await conn.send(handshake)
    response = await conn.recv()

    assert response.enum == 'HandshakeFailure', response.enum
    assert response.HandshakeFailure[
        1].enum == 'GenesisMismatch', response.HandshakeFailure[1].enum

    # Second handshake attempt. Should fail with Protocol Version Mismatch
    gm = response.HandshakeFailure[1].GenesisMismatch
    handshake.Handshake.chain_info.genesis_id.chain_id = gm.chain_id
    handshake.Handshake.chain_info.genesis_id.hash = gm.hash
    sign_handshake(my_key_pair_nacl, handshake.Handshake)

    await conn.send(handshake)
    response = await conn.recv()

    assert response.enum == 'HandshakeFailure', response.enum
    assert response.HandshakeFailure[
        1].enum == 'ProtocolVersionMismatch', response.HandshakeFailure[1].enum

    # Third handshake attempt. Should succeed
    pvm = response.HandshakeFailure[1].ProtocolVersionMismatch
    handshake.Handshake.version = pvm
    sign_handshake(my_key_pair_nacl, handshake.Handshake)

    await conn.send(handshake)
    response = await conn.recv()

    assert response.enum == 'Handshake', response.enum
    assert response.Handshake.chain_info.genesis_id.chain_id == handshake.Handshake.chain_info.genesis_id.chain_id
    assert response.Handshake.chain_info.genesis_id.hash == handshake.Handshake.chain_info.genesis_id.hash
    assert response.Handshake.edge_info.nonce == 1
    assert response.Handshake.peer_id.keyType == 0
    assert response.Handshake.peer_id.data == base58.b58decode(
        nodes[0].node_key.pk[len(ED_PREFIX):])
    assert response.Handshake.target_peer_id.keyType == 0
    assert response.Handshake.target_peer_id.data == bytes(
        my_key_pair_nacl.verify_key)
    assert response.Handshake.version == handshake.Handshake.version
    assert response.Handshake.listen_port == nodes[0].addr()[1]