mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-24 07:11:38 +00:00
Implement private networks (#1385)
* Add pnet protocol copied from plaintext protocol, since that seems to be the closest match * Minimalize the pnet protocol * WIP private swarms with fixed key * Different nonces for write and read * Use per stream write buffer to avoid allocations * Add parsing and formating of PSKs * Directly call handshake Also remove unneeded InboundUpgrade and OutboundUpgrade * Add HandshakeError * Add dedicated pnet example * Add tests for PSK parsing and formatting * Some more tests for the parsing, fail case * Add fingerprint To be able to check if a go-ipfs and rust-libp2p use the same key without having to dump the actual key. Not sure if there is a spec for this anywhere, but it is basically just copied from go-ipfs. * Minimize dependencies and remove dead code * Rename PSK to PreSharedKey and use pin_project * Add crypt_writer Basically a stripped down and modified version of async_std BufWriter that also encrypts using the given cipher. * cargo fmt * Actually get rid of the Unpin requirement * Rewrite flushing and remove written count from state * Add docs for pnet/lib.rs * Increase library version * Remove pnet example There will be a more elaborate and useful example in a different PR * Return pending on pending... also make doc text less ambiguous * Add debug assertions to check invariants of poll_flush_buf Also, clarify the invariants in the comments of that method
This commit is contained in:
committed by
Pierre Krieger
parent
4bf42d188f
commit
f5e7461cec
21
src/lib.rs
21
src/lib.rs
@ -152,6 +152,7 @@
|
||||
#![doc(html_logo_url = "https://libp2p.io/img/logo_small.png")]
|
||||
#![doc(html_favicon_url = "https://libp2p.io/img/favicon.png")]
|
||||
|
||||
use libp2p_pnet::{PnetConfig, PreSharedKey};
|
||||
pub use bytes;
|
||||
pub use futures;
|
||||
#[doc(inline)]
|
||||
@ -203,6 +204,8 @@ pub use libp2p_wasm_ext as wasm_ext;
|
||||
pub use libp2p_websocket as websocket;
|
||||
#[doc(inline)]
|
||||
pub use libp2p_yamux as yamux;
|
||||
#[doc(inline)]
|
||||
pub use libp2p_pnet as pnet;
|
||||
|
||||
mod transport_ext;
|
||||
|
||||
@ -251,6 +254,24 @@ pub fn build_tcp_ws_secio_mplex_yamux(keypair: identity::Keypair)
|
||||
.timeout(Duration::from_secs(20)))
|
||||
}
|
||||
|
||||
/// Builds an implementation of `Transport` that is suitable for usage with the `Swarm`.
|
||||
///
|
||||
/// The implementation supports TCP/IP, WebSockets over TCP/IP, secio as the encryption layer,
|
||||
/// and mplex or yamux as the multiplexing layer.
|
||||
///
|
||||
/// > **Note**: If you ever need to express the type of this `Transport`.
|
||||
pub fn build_tcp_ws_pnet_secio_mplex_yamux(keypair: identity::Keypair, psk: PreSharedKey)
|
||||
-> io::Result<impl Transport<Output = (PeerId, impl core::muxing::StreamMuxer<OutboundSubstream = impl Send, Substream = impl Send, Error = impl Into<io::Error>> + Send + Sync), Error = impl error::Error + Send, Listener = impl Send, Dial = impl Send, ListenerUpgrade = impl Send> + Clone>
|
||||
{
|
||||
Ok(CommonTransport::new()?
|
||||
.and_then(move |socket, _| PnetConfig::new(psk).handshake(socket))
|
||||
.upgrade(core::upgrade::Version::V1)
|
||||
.authenticate(secio::SecioConfig::new(keypair))
|
||||
.multiplex(core::upgrade::SelectUpgrade::new(yamux::Config::default(), mplex::MplexConfig::new()))
|
||||
.map(|(peer, muxer), _| (peer, core::muxing::StreamMuxerBox::new(muxer)))
|
||||
.timeout(Duration::from_secs(20)))
|
||||
}
|
||||
|
||||
/// Implementation of `Transport` that supports the most common protocols.
|
||||
///
|
||||
/// The list currently is TCP/IP, DNS, and WebSockets. However this list could change in the
|
||||
|
Reference in New Issue
Block a user