3 个版本 (破坏性更改)

0.3.0 2022 年 11 月 30 日
0.2.1 2022 年 11 月 30 日
0.1.0 2022 年 11 月 28 日

#752加密学

MIT 许可证

160KB
3.5K SLoC

Tandem HTTP 服务器

此软件包提供了一个 HTTP 服务器,充当贡献者并运行 Tandem 引擎。连接的 HTTP 客户端应充当评估者。

要了解如何使用提供的服务器,请参阅下面的 使用方法 部分。

服务器参与 Tandem 协议执行,并提供了通过客户端提供的明文元数据配置的贡献者输入。

协议描述

HTTP 服务器有效地实现了以下协议(内部称为 "dialog")[感谢 @spacejam]

server::dialog(
    engine_id: String,
    last_durably_received_offset: Option<u32>,
    messages: MessageLog,
) -> Result<(MessageLog, Option<u32>), Error>

含义:HTTP 客户端与由 engine_id 标识的引擎进行通信。与引擎的每次交互都提交可选的消息偏移量 last_durably_received_offset,以确认之前接收到的消息。提交消息意味着:调用客户端已成功接收和处理了所有消息,包括给定的偏移量。然后,服务器不再返回 ID 低于或等于 last_durably_received_offset 的消息。其次,服务器接受一个新消息的向量,它将随后处理这些消息。

HTTP 调用的结果是一个元组,其中第一个元素

  • 是一个由 调用 方处理的消息向量,
  • 以及可选的消息偏移量提交。后者的语义与 last_durably_received_offset 相同,但用于从调用客户端接收的消息

端点的描述

端点 语义
POST / 接收一个类型为 NewSession 的 JSON 结构,并返回 engine_id
POST /<engine_id>?[last_durably_received_offset=<offset>] 如上所述实现 dialog 协议

使用方法

此软件包可以用作 二进制文件。作为库,它提供了一个 build 函数,可以用来构建一个具有自定义选择输入逻辑的服务器。作为二进制文件,它提供了一个基于 Rocket 的示例服务器。

要将这个crate用作二进制程序,必须使用bin特性进行编译。为此,请使用以下命令:

cd tandem_http_server
cargo build --features="bin"

作为二进制程序的使用:静态配置

服务器二进制程序支持两种执行模式:

如果服务器未带任何配置启动,则充当简单的“echo服务器”,并期望客户端提供贡献者的输入(作为明文元数据)。这可以用来测试不同的程序,而无需重新部署服务器。

或者,可以在服务器启动时提供Tandem.jsonTandem.toml文件形式的静态配置》。此文件描述了根据客户端提供的明文元数据使用哪个MPC功能和哪个贡献者输入。此文件必须存储在启动服务器的目录中。该目录还必须包含一个名为program.garble.rs的文件,其中包含在Tandem引擎上运行的MPC程序。

示例Tandem.toml

考虑以下Garble程序:

pub fn mul_1(a: u64, b: u64) -> u64 {
    a * b
}

pub fn mul_10(a: u64, b: u64) -> u64 {
    a * b * b * b * b * b * b * b * b * b * b
}

此程序存储在program.garble.rs文件中。在相同的目录中,我们有一个Tandem.toml文件,内容如下:

[handlers.mul_1]
_ = "42u64"

[handlers.mul_10]
_ = "42u64"

[section name]始终由handlers.后跟贡献者输入所引用的函数名称组成。

在每一节中,key是客户端将提供给服务器以影响服务器选择贡献者输入的明文元数据;值是一个字符串,用作贡献者的输入。

由于一些TOML解析器难以处理空字符串作为键,我们的约定是,如果服务器的输入选择完全由服务器决定,则使用_作为明文元数据。

在此示例中,服务器将始终将42u64作为贡献者的输入。如果我们想给服务器提供更多的选择,我们可以通过向相关部分添加key = value对来实现,如下所示:

[handlers.mul_1]
_ = "42u64"
contrib2 = "100u64"
contrib3 = "200u64"

使用此Tandem.toml文件,客户端在运行具有mul_1函数的Tandem时可以选择_contrib2contrib3。请注意,贡献者的输入仍然对客户端隐藏,客户端只知道与之关联的键。

有关如何构建和使用此类Tandem.toml文件的更真实和复杂的示例,请参阅智能cookie信用评分示例。

作为二进制程序的使用:Rocket配置

由于服务器基于Rocket框架,因此可以按照官方Rocket文档进行配置。

例如,为了让服务器监听端口号8080,可以将以下内容的Rocket.toml文件添加到启动服务器的目录中:

[global]
port = 8080

或者,也可以在启动服务器时将其作为环境变量传递

ROCKET_PORT=8080 tandem_http_server

该crate包含通过Rocket配置配置CORS的可能性。这也可以通过Rocket.toml文件或通过环境变量来完成

[global]
origins = "[\"example.com\", \"another_example.com\"]"
ROCKET_ORIGINS="example.com","another_example.com"

默认情况下允许本地源(https://127.0.0.1http://127.0.0.1)。如果没有指定源,CORS配置默认为"*"。

依赖关系

~20-55MB
~1M SLoC