ostp/ostp-core/examples/test_handshake.rs

59 lines
2.1 KiB
Rust

use ostp_core::{ProtocolMachine, ProtocolConfig, OstpEvent, ProtocolAction, NoiseRole};
fn main() {
let key = "3f5dfaf68e377a3724bdde3ac7b4f4de";
let secrets = ostp_core::crypto::derive_all_secrets(key.as_bytes());
let mut init_cfg = ProtocolConfig {
role: NoiseRole::Initiator,
session_id: 12345,
psk: secrets.psk,
obfuscation_key: secrets.obfuscation_key,
handshake_pad_min: secrets.handshake_pad_min,
handshake_pad_max: secrets.handshake_pad_max,
max_reorder: 10,
max_reorder_buffer: 10,
ack_delay_ms: 10,
rto_ms: 100,
max_retries: 5,
max_sent_history: 100,
handshake_payload: vec![],
mtu: 1400,
max_padding: 0,
padding_strategy: ostp_core::PaddingStrategy::Adaptive,
};
let mut payload = Vec::new();
payload.extend_from_slice(&0u64.to_be_bytes()); // time
payload.extend_from_slice(&12345u32.to_be_bytes());
payload.extend_from_slice(key.as_bytes());
init_cfg.handshake_payload = payload;
let mut init_machine = ProtocolMachine::new(init_cfg.clone()).unwrap();
let action = init_machine.on_event(OstpEvent::Start).unwrap();
let pkt = match action {
ProtocolAction::SendDatagram(p) => p,
_ => panic!("Expected SendDatagram"),
};
println!("Initiator sent {} bytes", pkt.len());
let mut resp_cfg = init_cfg.clone();
resp_cfg.role = NoiseRole::Responder;
let mut resp_machine = ProtocolMachine::new(resp_cfg).unwrap();
// Simulate what server dispatcher does
let mut raw_vec = pkt.to_vec();
ostp_core::crypto::deobfuscate_packet_inplace(&mut raw_vec, &secrets.obfuscation_key, true);
println!("Deobfuscated length: {}", raw_vec.len());
let action = resp_machine.on_event(OstpEvent::Inbound(pkt));
match action {
Ok(ProtocolAction::HandshakePayload(_, _)) => println!("Responder: Handshake OK!"),
Ok(_) => println!("Responder: Not HandshakePayload"),
Err(e) => println!("Responder error: {:?}", e),
}
}