From 3332aa621b360fbed161966566110c34627fc68c Mon Sep 17 00:00:00 2001 From: Alois Date: Thu, 25 Jun 2026 18:31:11 +0200 Subject: [PATCH 1/2] [Fix] Connection issues in example-usage & wasm --- .gitignore | 1 + example-usage/.gitignore | 4 + example-usage/server/Cargo.toml | 1 + example-usage/server/src/keys.rs | 11 + example-usage/server/src/main.rs | 26 ++- example-usage/server/src/tls.rs | 45 +++++ example-usage/web-client/index.html | 25 ++- example-usage/web-client/public/.gitkeep | 0 example-usage/web-client/src/main.ts | 245 ++++++++++++++++++----- example-usage/web-client/vite.config.ts | 13 ++ flake.nix | 38 ++++ wasm/src/client.rs | 4 +- wasm/src/transport.rs | 6 +- 13 files changed, 360 insertions(+), 59 deletions(-) create mode 100644 example-usage/web-client/public/.gitkeep diff --git a/.gitignore b/.gitignore index fdb1a18..250f93f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ **Cargo.lock *.pem *.key +example-usage/dev-cert/ diff --git a/example-usage/.gitignore b/example-usage/.gitignore index 006bccb..894dd06 100644 --- a/example-usage/.gitignore +++ b/example-usage/.gitignore @@ -3,5 +3,9 @@ host_keys.json host_sig_pk.bin host_sig_pq_pk.bin host_enc_kem_pk.bin +host_public_key_bundle.hex clients.json web-client/node_modules +dev-cert/ +web-client/public/host_public_key_bundle.hex +web-client/public/mtp_dev_cert_hash.txt diff --git a/example-usage/server/Cargo.toml b/example-usage/server/Cargo.toml index 79d33be..d94132e 100644 --- a/example-usage/server/Cargo.toml +++ b/example-usage/server/Cargo.toml @@ -14,3 +14,4 @@ tokio = { version = "1", features = ["full"] } serde_json = { version = "1" } hex = "0.4" serde_core = "1.0.228" +base64 = "0.22" diff --git a/example-usage/server/src/keys.rs b/example-usage/server/src/keys.rs index 86ac9c2..fdebfd6 100644 --- a/example-usage/server/src/keys.rs +++ b/example-usage/server/src/keys.rs @@ -27,6 +27,17 @@ pub fn load_or_generate_host_keys(path: &str) -> Result<(u64, Keyring), Box Result<(), Box> { + let public_key_bundle_hex = hex::encode(host_keyring.public_key_bundle().as_bytes()); + + fs::write( + "host_public_key_bundle.hex", + &public_key_bundle_hex, + )?; + fs::create_dir_all("web-client/public")?; + fs::write( + "web-client/public/host_public_key_bundle.hex", + &public_key_bundle_hex, + )?; fs::write( "host_enc_kem_pk.bin", host_keyring.kem_public_key.as_bytes(), diff --git a/example-usage/server/src/main.rs b/example-usage/server/src/main.rs index 414bbe1..4b0bd5d 100644 --- a/example-usage/server/src/main.rs +++ b/example-usage/server/src/main.rs @@ -5,10 +5,34 @@ mod tls; use mtp::host::{HostConfig, MTPHost}; use mtp::type_map::TypeMap; +use std::path::Path; + +fn dev_cert_paths() -> (String, String) { + let cert = std::env::var("MTP_DEV_CERT").unwrap_or_else(|_| { + if Path::new("example-usage/dev-cert/cert.pem").exists() { + "example-usage/dev-cert/cert.pem".to_string() + } else { + "dev-cert/cert.pem".to_string() + } + }); + let key = std::env::var("MTP_DEV_KEY").unwrap_or_else(|_| { + if Path::new("example-usage/dev-cert/key.pem").exists() { + "example-usage/dev-cert/key.pem".to_string() + } else { + "dev-cert/key.pem".to_string() + } + }); + (cert, key) +} #[tokio::main] async fn main() -> Result<(), Box> { - let (cert_pem, key_pem) = tls::load_or_generate_tls("server.pem", "server.key")?; + let (cert_path, key_path) = dev_cert_paths(); + let (cert_pem, key_pem) = tls::load_or_generate_tls(&cert_path, &key_path)?; + let cert_hash = tls::certificate_sha256_hex(&cert_pem)?; + tls::export_webtransport_cert_hash(&cert_hash)?; + println!("WebTransport certificate sha256: {cert_hash}"); + let (host_id, host_keyring) = keys::load_or_generate_host_keys("host_keys.json")?; keys::export_host_public_keys(&host_keyring)?; diff --git a/example-usage/server/src/tls.rs b/example-usage/server/src/tls.rs index ab8c993..b312100 100644 --- a/example-usage/server/src/tls.rs +++ b/example-usage/server/src/tls.rs @@ -1,4 +1,7 @@ use std::fs; +use std::path::Path; + +use base64::Engine; pub fn load_or_generate_tls( cert_path: &str, @@ -10,6 +13,12 @@ pub fn load_or_generate_tls( } println!("Generating self-signed TLS certificate ..."); + if let Some(parent) = Path::new(cert_path).parent() { + fs::create_dir_all(parent)?; + } + if let Some(parent) = Path::new(key_path).parent() { + fs::create_dir_all(parent)?; + } let key_pair = rcgen::KeyPair::generate()?; let params = rcgen::CertificateParams::new(vec!["localhost".into(), "127.0.0.1".into()])?; let cert = params.self_signed(&key_pair)?; @@ -23,3 +32,39 @@ pub fn load_or_generate_tls( Ok((cert_str.into_bytes(), key_str.into_bytes())) } + +pub fn certificate_sha256_hex(cert: &[u8]) -> Result> { + let der = if cert.starts_with(b"-----BEGIN CERTIFICATE-----") { + let pem = std::str::from_utf8(cert)?; + let base64 = pem + .lines() + .filter(|line| !line.starts_with("-----")) + .collect::(); + base64::engine::general_purpose::STANDARD.decode(base64)? + } else { + cert.to_vec() + }; + + Ok(hex::encode(mtp::crypto::sha256(&der))) +} + +pub fn export_webtransport_cert_hash(hash: &str) -> Result<(), Box> { + let public_dir = if Path::new("web-client").exists() { + Path::new("web-client/public") + } else { + Path::new("example-usage/web-client/public") + }; + fs::create_dir_all(public_dir)?; + fs::write(public_dir.join("mtp_dev_cert_hash.txt"), hash)?; + + let dev_cert_dir = if Path::new("dev-cert").exists() { + Path::new("dev-cert") + } else { + Path::new("example-usage/dev-cert") + }; + if dev_cert_dir.exists() { + fs::write(dev_cert_dir.join("sha256.txt"), hash)?; + } + + Ok(()) +} diff --git a/example-usage/web-client/index.html b/example-usage/web-client/index.html index 904cc81..5a6b1b2 100644 --- a/example-usage/web-client/index.html +++ b/example-usage/web-client/index.html @@ -5,8 +5,11 @@ MTP Web Client