pub struct Sike {
pub public_key: Vec<u8>,
pub private_key: Vec<u8>,
}
impl Sike {
pub fn new() -> Self {
Sike {
public_key: vec![0; 64], private_key: vec![0; 64], }
}
pub fn encapsulate(&self) -> Vec<u8> {
self.simple_transform(&self.public_key, |x| x.wrapping_add(1))
}
pub fn decapsulate(&self, encapsulated_key: &[u8]) -> Vec<u8> {
self.simple_transform(encapsulated_key, |x| x.wrapping_sub(1))
}
fn simple_transform<F>(&self, data: &[u8], f: F) -> Vec<u8>
where
F: Fn(u8) -> u8,
{
data.iter().map(|&x| f(x)).collect()
}
}
impl Default for Sike {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_sike_encapsulate_decapsulate() {
let sike = Sike::new();
let encapsulated_key = sike.encapsulate();
let decapsulated_key = sike.decapsulate(&encapsulated_key);
assert_eq!(decapsulated_key, sike.public_key);
}
#[test]
fn test_sike_encapsulation_consistency() {
let sike = Sike::new();
let first_encapsulated_key = sike.encapsulate();
let second_encapsulated_key = sike.encapsulate();
assert_eq!(first_encapsulated_key, second_encapsulated_key);
}
#[test]
fn test_sike_decapsulation_consistency() {
let sike = Sike::new();
let encapsulated_key = sike.encapsulate();
let first_decapsulated_key = sike.decapsulate(&encapsulated_key);
let second_decapsulated_key = sike.decapsulate(&encapsulated_key);
assert_eq!(first_decapsulated_key, second_decapsulated_key);
}
}