pub mod participants;
pub mod protocol;
mod types;
pub mod constants;
pub mod helpers;
use constants::{H, H_Y, I};
use helpers::shuffle_and_split;
use participants::{Receiver, Sender};
use protocol::{PublicDiscussionResult, QExecutionResult, QKD};
pub use types::{ComplexMatrix, Qubit};
pub fn build_bb84() -> QKD {
let alice = Sender::builder().posible_basis(vec![I, H]).build();
let bob = Receiver::builder().posible_basis(vec![I, H]).build();
QKD::builder()
.name("BB84".to_string())
.alice(alice)
.bob(bob)
.build()
}
pub fn build_six_state() -> QKD {
let alice = Sender::builder().posible_basis(vec![I, H, H_Y]).build();
let bob = Receiver::builder()
.posible_basis(vec![I, H, H_Y.invert().unwrap()])
.build();
let eve = Receiver::builder()
.posible_basis(vec![I, H, H_Y.invert().unwrap()])
.build();
QKD::builder()
.name("SixState".to_string())
.alice(alice)
.bob(bob)
.eve(eve)
.build()
}
pub fn build_b92() -> QKD {
let prepare_b92 = Box::new(|| (Qubit::new(), false));
let alice = Sender::builder()
.posible_basis(vec![I, H])
.prepare(prepare_b92)
.build();
let bob = Receiver::builder().posible_basis(vec![I, H]).build();
QKD::builder()
.name("B92".to_string())
.alice(alice)
.bob(bob)
.public_basis_discussion(Box::new(public_basis_discussion_b92))
.build()
}
fn public_basis_discussion_b92(results: &Vec<QExecutionResult>) -> PublicDiscussionResult {
let mut results = results.clone();
let bob_values: Vec<bool> = results.iter().map(|x| x.bob_value).collect();
let conclusive_indexes = bob_values
.iter()
.enumerate()
.filter_map(|(i, &value)| if value { Some(i) } else { None })
.collect::<Vec<usize>>();
results.iter_mut().enumerate().for_each(|(i, result)| {
if conclusive_indexes.contains(&i) {
result.bob_value = (1 - result.bob_basis) == 1;
}
result.alice_value = result.alice_basis == 1;
});
let (indexes_to_check, indexes_to_key) = shuffle_and_split(conclusive_indexes);
let (alice_public_values, bob_public_values) = indexes_to_check
.iter()
.map(|&i| (results[i].alice_value, results[i].bob_value))
.unzip();
PublicDiscussionResult {
alice_public_values,
bob_public_values,
indexes_to_key,
results,
}
}