2个不稳定版本
0.7.0 | 2019年5月4日 |
---|---|
0.6.0 | 2019年5月4日 |
#8 in #susyp2p
用于 4 crates
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 生成一个实现 Sink
和 Stream
的 SecioMiddleware
,可以用来发送数据包。
依赖项
~8–13MB
~245K SLoC