pub struct Sphincs {
pub private_key: Vec<u8>,
pub public_key: Vec<u8>,
}
impl Sphincs {
pub fn new() -> Self {
Sphincs {
private_key: vec![0; 64], public_key: vec![0; 32], }
}
pub fn sign(&self, message: &[u8]) -> Vec<u8> {
self.simple_transform(message, |x| x.wrapping_add(1))
}
pub fn verify(&self, message: &[u8], signature: &[u8]) -> bool {
let expected_signature = self.sign(message);
expected_signature == signature
}
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 Sphincs {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_sphincs_sign_verify() {
let sphincs = Sphincs::new();
let message = vec![1, 2, 3, 4];
let signature = sphincs.sign(&message);
let is_valid = sphincs.verify(&message, &signature);
assert!(is_valid);
}
#[test]
fn test_sphincs_invalid_signature() {
let sphincs = Sphincs::new();
let message = vec![1, 2, 3, 4];
let signature = sphincs.sign(&message);
let invalid_message = vec![4, 3, 2, 1];
let is_valid = sphincs.verify(&invalid_message, &signature);
assert!(!is_valid);
}
}