2个不稳定版本

0.7.0 2019年5月4日
0.6.0 2019年5月4日

#8 in #susyp2p


用于 4 crates

MIT 协议

670KB
12K SLoC

secio 协议是一个中间件,它将加密和解密通过套接字(或实现 AsyncRead + AsyncWrite 的任何东西)进行的通信。

连接升级

SecioConfig 结构体实现了 ConnectionUpgrade 特性。您可以通过使用 with_upgrade 方法将其应用于 Transport。返回的对象也将实现 Transport 并会自动将 secio 协议应用于通过它打开的任何连接。

use futures::Future;
use susyp2p_secio::{SecioConfig, SecioOutput};
use susyp2p_core::{Multiaddr, identity, upgrade::apply_inbound};
use susyp2p_core::transport::Transport;
use susyp2p_tcp::TcpConfig;
use tokio_io::io::write_all;
use tokio::runtime::current_thread::Runtime;

let dialer = TcpConfig::new()
    .with_upgrade({
        # let private_key = &mut [];
        // See the documentation of `identity::Keypair`.
        let keypair = identity::Keypair::rsa_from_pkcs8(private_key).unwrap();
        SecioConfig::new(keypair)
    })
    .map(|out: SecioOutput<_>, _| out.stream);

let future = dialer.dial("/ip4/127.0.0.1/tcp/12345".parse::<Multiaddr>().unwrap())
    .unwrap()
    .map_err(|e| panic!("error: {:?}", e))
    .and_then(|connection| {
        // Sends "hello world" on the connection, will be encrypted.
        write_all(connection, "hello world")
    })
    .map_err(|e| panic!("error: {:?}", e));

let mut rt = Runtime::new().unwrap();
let _ = rt.block_on(future).unwrap();

手动使用

注意:您被鼓励按照上述方式使用 SecioConfig

您可以通过调用 SecioMiddleware::handshake() 在套接字上添加 secio 层。此方法将与主机进行握手,并返回一个对应于握手成功或出错时刻的 future。在成功的情况下,future 生成一个实现 SinkStreamSecioMiddleware,可以用来发送数据包。

依赖项

~8–13MB
~245K SLoC