#dns #隐私 #协议 #doh #odoh #密钥对 #客户端-服务器

odoh-rs

Rust 实现 ODoH(无感知 DNS over HTTPS)协议版本 1

19 个版本 (4 个稳定版本)

1.0.3 2024 年 6 月 25 日
1.0.2 2023 年 7 月 14 日
1.0.1 2023 年 1 月 25 日
1.0.0 2022 年 9 月 22 日
0.1.4 2020 年 11 月 11 日

#299网络编程

Download history • Rust 包仓库 70/week @ 2024-04-28 • Rust 包仓库 95/week @ 2024-05-05 • Rust 包仓库 117/week @ 2024-05-12 • Rust 包仓库 85/week @ 2024-05-19 • Rust 包仓库 123/week @ 2024-05-26 • Rust 包仓库 84/week @ 2024-06-02 • Rust 包仓库 93/week @ 2024-06-09 • Rust 包仓库 114/week @ 2024-06-16 • Rust 包仓库 257/week @ 2024-06-23 • Rust 包仓库 109/week @ 2024-06-30 • Rust 包仓库 94/week @ 2024-07-07 • Rust 包仓库 109/week @ 2024-07-14 • Rust 包仓库 114/week @ 2024-07-21 • Rust 包仓库 77/week @ 2024-07-28 • Rust 包仓库 82/week @ 2024-08-04 • Rust 包仓库 112/week @ 2024-08-11 • Rust 包仓库

每月下载量 390
用于 3 个包 (2 个直接使用)

BSD-2-Clause

39KB
644

odoh-rs

Latest Version docs.rs

odoh-rs 是一个库,它使用 Rust 实现了 RFC 9230 无感知 DNS over HTTPS(ODoH)协议。

它可以用于实现 ODoH 客户端或服务器(目标)。odoh-client-rs 使用 odoh-rs 来实现其功能,并且是 API 使用示例的良好来源,特别是在 odoh-rs 的测试中,尤其是 test_vectors_for_odoh

此库与 odoh-go 兼容。

odoh-rs 使用 hpke 作为底层的 HPKE 实现。它支持默认的无感知 DoH 加密套件 (KEM: X25519HkdfSha256, KDF: HkdfSha256, AEAD: AesGcm128)

它不提供完整的加密灵活性。

API 使用示例

本例概述了成功进行 ODoH 查询所需的步骤。

// Use a seed to initialize a RNG. *Note* you should rely on some
// random source.
let mut rng = StdRng::from_seed([0; 32]);

// Generate a key pair on server side.
let key_pair = ObliviousDoHKeyPair::new(&mut rng);

// Create client configs from the key pair. It can be distributed
// to the clients.
let public_key = key_pair.public().clone();
let client_configs: ObliviousDoHConfigs = vec![ObliviousDoHConfig::from(public_key)].into();
let client_configs_bytes = compose(&client_configs).unwrap().freeze();

// ... distributing client_configs_bytes ...

// Parse and extract first supported config from client configs on client side.
let client_configs: ObliviousDoHConfigs = parse(&mut client_configs_bytes.clone()).unwrap();
let client_config = client_configs.into_iter().next().unwrap();
let config_contents = client_config.into();

// This is a example client request. This library doesn't validate
// DNS message.
let query = ObliviousDoHMessagePlaintext::new(b"What's the IP of one.one.one.one?", 0);

// Encrypt the above request. The client_secret returned will be
// used later to decrypt server's response.
let (query_enc, cli_secret) = encrypt_query(&query, &config_contents, &mut rng).unwrap();

// ... sending query_enc to the server ...

// Server decrypt request.
let (query_dec, srv_secret) = decrypt_query(&query_enc, &key_pair).unwrap();
assert_eq!(query, query_dec);

// Server could now resolve the decrypted query, and compose a response.
let response = ObliviousDoHMessagePlaintext::new(b"The IP is 1.1.1.1", 0);

// server encrypt response
let nonce = ResponseNonce::default();
let response_enc = encrypt_response(&query_dec, &response, srv_secret, nonce).unwrap();

// ... sending response_enc back to the client ...

// client descrypt response
let response_dec = decrypt_response(&query, &response_enc, cli_secret).unwrap();
assert_eq!(response, response_dec);

依赖关系

~7.5MB
~103K SLoC