39个版本 (10个重大更新)

0.11.7 2020年11月21日
0.10.5 2020年11月10日

#2060密码学

每月 36次下载

Apache-2.0

66KB
1.5K SLoC

Vented

Vented是一个基于事件异步TCP服务器,使用消息包作为有效载荷数据进行加密。

加密

Vented使用密钥加密来加密客户端和服务器之间的连接。双方的真实性通过双方事先需要知道的全局公钥进行验证。加密本身使用随机生成的密钥和与消息编号相对应的nonce。用于加密的crate是crypto_box,它使用XChaCha20Poly1305加密。用于密钥交换的crate是x25519-dalek

用法

use vented::server::VentedServer;
use vented::server::data::{Node, ServerTimeouts};
use vented::stream::SecretKey;
use rand::thread_rng;
use vented::event::Event;

fn main() {
   let global_secret_b = SecretKey::generate(&mut thread_rng());
   let nodes = vec![
   Node {
          id: "B".to_string(),
          addresses: vec![],
          trusted: true,
          public_key: global_secret_b.public_key() // load it from somewhere
      },
   ];
   // in a real world example the secret key needs to be loaded from somewhere because connections
   // with unknown keys are not accepted.
   let global_secret = SecretKey::generate(&mut thread_rng());
   let mut server = VentedServer::new("A".to_string(), global_secret, nodes.clone(), ServerTimeouts::default());
   
   
   server.listen("localhost:20000".to_string());
   server.on("pong", |_event| {
      Box::pin(async {println!("Pong!");
      
          None
      })
   });
   assert!(async_std::task::block_on(server.emit("B", Event::new("ping".to_string()))).is_err()) // this won't work without a known node B
   }
}

依赖

~9–23MB
~300K SLoC