Crate gday_hole_punch

Source
Expand description

Lets 2 peers, possibly behind NAT (network address translation), try to establish a direct authenticated TCP connection. Uses TCP hole punching and a helper gday_server to do this. This library is used by gday, a command line tool for sending files.

§Example

let timeout = std::time::Duration::from_secs(5);

//////// Peer 1 ////////

// Connect to a random server in the default server list
let (mut server_connection, server_id) = server_connector::connect_to_random_server(
    server_connector::DEFAULT_SERVERS,
    timeout,
).await?;

// PeerCode useful for giving rendezvous info to peer,
// over an existing channel like email.
let peer_code = PeerCode {
    server_id,
    room_code: "roomcode".to_string(),
    shared_secret: "shared_secret".to_string()
};
let code_to_share = String::try_from(&peer_code)?;

// Create a room in the server, and get my contact from it
let (my_contact, peer_contact_future) = share_contacts(
    &mut server_connection,
    peer_code.room_code.as_bytes(),
    true,
).await?;

// Wait for the server to send the peer's contact
let peer_contact = peer_contact_future.await?;

// Use TCP hole-punching to connect to the peer,
// verify their identity with the shared_secret,
// and get a cryptographically-secure shared key
let (tcp_stream, strong_key) = try_connect_to_peer(
    my_contact.local,
    peer_contact,
    peer_code.shared_secret.as_bytes(),
).await?;

//////// Peer 2 (on a different computer) ////////

// Get the peer_code that Peer 1 sent, for example
// over email.
let peer_code = PeerCode::from_str(&code_to_share)?;

// Connect to the same server as Peer 1
let mut server_connection = server_connector::connect_to_server_id(
    server_connector::DEFAULT_SERVERS,
    peer_code.server_id,
    timeout,
).await?;

// Join the same room in the server, and get my local contact
let (my_contact, peer_contact_future) = share_contacts(
    &mut server_connection,
    peer_code.room_code.as_bytes(),
    false,
).await?;

let peer_contact = peer_contact_future.await?;

let (tcp_stream, strong_key) = try_connect_to_peer(
    my_contact.local,
    peer_contact,
    peer_code.shared_secret.as_bytes(),
).await?;

Modules§

server_connector
Functions for connecting to a Gday server.

Structs§

PeerCode
Info that 2 peers must share before they can exchange contacts.

Enums§

Error
gday_hole_punch error

Functions§

share_contacts
Shares contacts on room_code in the gday server that server_connection is connected to.
try_connect_to_peer
Tries to connect to the other peer using TCP hole punching.