33个版本 (21个破坏性更新)
0.21.0 | 2024年8月1日 |
---|---|
0.20.0 | 2024年6月27日 |
0.19.0 | 2024年6月5日 |
0.16.1 | 2024年3月4日 |
0.0.0 | 2021年6月24日 |
#65 in 加密学
每月4,636次下载
用于 30 个crate(直接使用15个)
2MB
35K SLoC
tor-proto
核心Tor协议的实现
概述
tor-proto
crate位于Arti的核心,Arti是一个用Rust实现Tor的项目。大多数人不应直接使用此crate,因为其API对于大多数用途来说过于底层,且很容易在不安全或侵犯隐私的方式中误用。
大多数人应使用arti-client
crate。此crate主要对那些希望以低级别访问Tor协议的人感兴趣。
核心概念
本质上,Tor通过TLS与其他Tor实例建立称为“通道”的连接。这些通道使用TLS实现。每个通道都复用多个匿名多跳“电路”,这些电路作为“中继消息”的可靠传输,这些消息在客户端和电路上的不同中继之间发送。最后,每个电路复用多个“流”,每个流大致对应于一个应用层请求。
此crate实现了实现这些channel::Channel
、circuit::ClientCirc
和stream::DataStream
的逻辑、协议和加密。它使用Rust异步代码和与future相关的特性,旨在与(几乎)任何遵循futures API的executor实现一起工作。它还应该与(几乎)任何公开AsyncRead和AsyncWrite特性的TLS实现一起工作。
不在本crate中
该软件包不实现基于Tor协议的高级协议,例如洋葱服务或Tor目录协议。它也不决定何时、如何或在哪里构建通道和电路:这是高级软件包的作用。
该软件包也不支持超时,因此这里的所有网络操作都有可能无限期地阻塞当前任务。超时是另一个在高级别添加的必要组件。
为了创建通道和电路,您需要了解一些Tor中继站的信息,并通过tor_linkspec::ChanTarget
和tor_linkspec::CircTarget
暴露这些信息。目前,tor-netdir
软件包是实现此功能的最简单方法。
关于此软件包的示例,请参阅arti-client
库或arti
CLI。
设计说明
该软件包的API结构旨在限制异步运行时的使用:它只在必要时启动任务或创建计时器。
在尽可能的情况下,该软件包避免在其用于网络活动的函数中执行公钥密码学。这使得高级代码更容易并行化或让出公钥操作。
此外,该软件包试图避免了解或编码有关其对象(通道、电路、流)的用途的信息。也就是说,只要可能,我们编码对象应该如何行为,而不是它应该为什么那样行为。例如,该软件包中的Circuit
对象会记住电路建立的路由,但不会记住电路所服务的目的或可能被用于什么。这是其他软件包执行此类规则的责任。
为什么以这种方式将行为与目的分开?我们这样做是为了防止我们在C tor实现中遇到的一种逻辑过载,其中使用信息与行为设置没有分开。由于使用信息可用,在代码库的所有位置,C tor代码都在许多地方趋于复杂逻辑,涉及该使用信息以设置个别行为。正因为如此,向C tor添加新的用途或行为变得相当复杂。我们正在尝试在Arti中避免这种复杂性。
限制
这些都是正在进行中的工作,完成前需要严重重构。
这是一个仅限客户端的实现;没有支持中继站需要的操作。
有许多缺失的功能无法列出。
文档或示例不足。
这是我在Rust中使用异步的第一个尝试,可能相当糟糕。
我敢打赌,在这段代码中某处存在死锁。我修复了我能找到或想到的所有死锁,但找到一种消除我们拥有的每一个锁的好方法会更好。
许可证:MIT OR Apache-2.0
依赖关系
24–36MB
~564K SLoC