use rand_core::UnwrapErr;
use shortcake::{Initiator, Responder, XWingSha3};
fn main() {
let mut initiator_rng = UnwrapErr(getrandom::SysRng);
let mut responder_rng = UnwrapErr(getrandom::SysRng);
let (initiator, msg1) = Initiator::<XWingSha3>::start(&mut initiator_rng);
let initiator_bytes = postcard::to_allocvec(&initiator).expect("Failed to serialize Initiator");
println!(
"initiator bytes ({} bytes): {:?}",
initiator_bytes.len(),
hex::encode(&initiator_bytes)
);
drop(initiator);
let msg1_bytes = postcard::to_allocvec(&msg1).expect("Failed to serialize MessageOne");
println!(
"msg1 bytes ({} bytes): {:?}",
msg1_bytes.len(),
hex::encode(&msg1_bytes)
);
let msg1_deserialized =
postcard::from_bytes(&msg1_bytes).expect("Failed to deserialize MessageOne");
let (responder, msg2) = Responder::<XWingSha3>::start(&mut responder_rng, msg1_deserialized)
.expect("Responder failed to start");
let responder_bytes = postcard::to_allocvec(&responder).expect("Failed to serialize Responder");
println!(
"responder bytes ({} bytes): {:?}",
responder_bytes.len(),
hex::encode(&responder_bytes)
);
drop(responder);
let msg2_bytes = postcard::to_allocvec(&msg2).expect("Failed to serialize MessageTwo");
println!(
"msg2 bytes ({} bytes): {:?}",
msg2_bytes.len(),
hex::encode(&msg2_bytes)
);
let initiator_deserialized: Initiator<XWingSha3> =
postcard::from_bytes(&initiator_bytes).expect("Failed to deserialize Initiator");
let msg2_deserialized =
postcard::from_bytes(&msg2_bytes).expect("Failed to deserialize MessageTwo");
let (i_output, msg3) = initiator_deserialized
.finish(msg2_deserialized)
.expect("Initiator failed to finish");
let msg3_bytes = postcard::to_allocvec(&msg3).expect("Failed to serialize MessageThree");
println!(
"msg3 bytes ({} bytes): {:?}",
msg3_bytes.len(),
hex::encode(&msg3_bytes)
);
let responder_deserialized: Responder<XWingSha3> =
postcard::from_bytes(&responder_bytes).expect("Failed to deserialize Responder");
let msg3_deserialized =
postcard::from_bytes(&msg3_bytes).expect("Failed to deserialize MessageThree");
let r_output = responder_deserialized
.finish(msg3_deserialized)
.expect("Responder failed to finish");
println!("Initiator SAS: {:02x?}", i_output.sas_code());
println!("Responder SAS: {:02x?}", r_output.sas_code());
assert_eq!(
i_output.sas_code(),
r_output.sas_code(),
"SAS codes must match"
);
let i_secret = i_output.into_session_key();
let r_secret = r_output.into_session_key();
assert_eq!(
i_secret.as_slice(),
r_secret.as_slice(),
"Shared secrets must match"
);
println!(
"shared secret ({} bytes): {:?}",
i_secret.as_slice().len(),
hex::encode(i_secret.as_slice())
);
println!("Protocol complete!");
}