The foundations of end-to-end encryption: Key exchange (with example in Rust)
kerkour.com