2026-01-30 15:57:18 -08:00
|
|
|
use crypto::PrivateKey32;
|
|
|
|
|
use double_ratchets::{RatchetState, hkdf::PrivateV1Domain};
|
2026-01-15 08:47:02 +08:00
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
|
// === Initial shared secret (X3DH / prekey result in real systems) ===
|
|
|
|
|
let shared_secret = [42u8; 32];
|
|
|
|
|
|
2026-01-30 15:57:18 -08:00
|
|
|
let bob_dh = PrivateKey32::random();
|
2026-01-15 08:47:02 +08:00
|
|
|
|
|
|
|
|
let mut alice: RatchetState<PrivateV1Domain> =
|
2026-01-30 15:57:18 -08:00
|
|
|
RatchetState::init_sender(shared_secret, bob_dh.public_key());
|
2026-01-15 08:47:02 +08:00
|
|
|
let mut bob: RatchetState<PrivateV1Domain> = RatchetState::init_receiver(shared_secret, bob_dh);
|
|
|
|
|
|
|
|
|
|
let (ciphertext, header) = alice.encrypt_message(b"Hello Bob!");
|
|
|
|
|
|
|
|
|
|
// === Bob receives ===
|
|
|
|
|
let plaintext = bob.decrypt_message(&ciphertext, header);
|
|
|
|
|
println!(
|
|
|
|
|
"Bob received: {}",
|
|
|
|
|
String::from_utf8_lossy(&plaintext.unwrap())
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// === Bob replies (triggers DH ratchet) ===
|
|
|
|
|
let (ciphertext, header) = bob.encrypt_message(b"Hi Alice!");
|
|
|
|
|
|
|
|
|
|
let plaintext = alice.decrypt_message(&ciphertext, header);
|
|
|
|
|
println!(
|
|
|
|
|
"Alice received: {}",
|
|
|
|
|
String::from_utf8_lossy(&plaintext.unwrap())
|
|
|
|
|
);
|
|
|
|
|
}
|