| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
dimpl — DTLS 1.2 implementation (Sans‑IO, Sync)
dimpl is a focused DTLS 1.2 implementation aimed at WebRTC. It is a Sans‑IO state machine you embed into your own UDP/RTC event loop: you feed incoming datagrams, poll for outgoing records or timers, and wire up certificate verification and SRTP key export yourself.
dimpl was built as a support package for str0m, with WebRTC as its primary use case, which currently uses DTLS 1.2. The author is not a cryptography expert; however, our understanding is that DTLS 1.2 is acceptable provided we narrow the protocol's scope—for example, by supporting only specific cipher suites and hash algorithms and by requiring the Extended Master Secret extension.
If you are interested in extending this crate to support DTLS 1.3 and/or additional cipher suites or hash algorithms, we welcome collaboration, but we are not planning to lead such initiatives.
During the handshake the engine emits Output::PeerCert with the peer's leaf certificate (DER). The crate uses that certificate to verify DTLS handshake messages, but it does not perform any PKI validation. Your application is responsible for validating the peer certificate according to your policy (fingerprint, chain building, name/EKU checks, pinning, etc.).
Drive the engine with three calls:
The output is an Output enum with borrowed references into your provided buffer:
use std::sync::Arc;
use std::time::Instant;
use dimpl::{certificate, Config, Dtls, Output};
// Stub I/O to keep the example focused on the state machine
enum Event { Udp(Vec<u8>), Timer(Instant) }
fn wait_next_event(_next_wake: Option<Instant>) -> Event { Event::Udp(Vec::new()) }
fn send_udp(_bytes: &[u8]) {}
fn example_event_loop(mut dtls: Dtls) -> Result<(), dimpl::Error> {
let mut next_wake: Option<Instant> = None;
loop {
// Drain engine output until we have to wait for I/O or a timer
let mut out_buf = vec![0u8; 2048];
loop {
match dtls.poll_output(&mut out_buf) {
Output::Packet(p) => send_udp(p),
Output::Timeout(t) => { next_wake = Some(t); break; }
Output::Connected => {
// DTLS established — application may start sending
}
Output::PeerCert(_der) => {
// Inspect peer leaf certificate if desired
}
Output::KeyingMaterial(_km, _profile) => {
// Provide to SRTP stack
}
Output::ApplicationData(_data) => {
// Deliver plaintext to application
}
}
}
// Block waiting for either UDP input or the scheduled timeout
match wait_next_event(next_wake) {
Event::Udp(pkt) => dtls.handle_packet(&pkt)?,
Event::Timer(now) => dtls.handle_timeout(now)?,
}
}
}
fn mk_dtls_client() -> Dtls {
let cert = certificate::generate_self_signed_certificate().unwrap();
let cfg = Arc::new(Config::default());
let mut dtls = Dtls::new(cfg, cert);
dtls.set_active(true); // client role
dtls
}
// Putting it together
let dtls = mk_dtls_client();
let _ = example_event_loop(dtls);Rust 1.81.0
License: MIT OR Apache-2.0
| Back | FazBrowse Home | New Git URL |