pub struct Falcon1024Signer {
key: crate::pqc::falcon1024::FalconPrivateKey,
public_key: crate::pqc::falcon1024::FalconPublicKey,
}
impl Falcon1024Signer {
pub fn from_seed(seed: &[u8; 32]) -> Result<Self, crate::error::CryptoError> {
let (pk, sk) = crate::pqc::falcon1024::generate_keypair_from_seed(seed)
.map_err(|e| crate::error::CryptoError::InvalidKey(format!("Falcon-1024 keygen: {e}")))?;
Ok(Self { key: sk, public_key: pk })
}
pub fn from_keys(
sk: crate::pqc::falcon1024::FalconPrivateKey,
pk: crate::pqc::falcon1024::FalconPublicKey,
) -> Self {
Self { key: sk, public_key: pk }
}
pub fn sign(&self, message: &[u8]) -> Result<Vec<u8>, crate::error::CryptoError> {
crate::pqc::falcon1024::sign(message, &self.key)
.map(|s| s.as_bytes().to_vec())
.map_err(|e| crate::error::CryptoError::InvalidKey(format!("Falcon-1024 sign: {e}")))
}
pub fn verify(&self, message: &[u8], signature: &[u8]) -> bool {
let Ok(sig) = crate::pqc::falcon1024::FalconSignature::from_bytes(signature) else {
return false;
};
crate::pqc::falcon1024::verify(message, &sig, &self.public_key).is_ok()
}
pub fn verify_with_pubkey(pubkey: &[u8], message: &[u8], signature: &[u8]) -> bool {
let Ok(pk) = crate::pqc::falcon1024::FalconPublicKey::from_bytes(pubkey) else {
return false;
};
let Ok(sig) = crate::pqc::falcon1024::FalconSignature::from_bytes(signature) else {
return false;
};
crate::pqc::falcon1024::verify(message, &sig, &pk).is_ok()
}
pub fn public_key_bytes(&self) -> Vec<u8> {
self.public_key.as_bytes().to_vec()
}
}
pub struct Falcon512Signer {
sk: crate::pqc::falcon512::Falcon512PrivateKey,
pk: crate::pqc::falcon512::Falcon512PublicKey,
}
impl Falcon512Signer {
pub fn from_seed(seed: &[u8; 32]) -> Self {
let (sk, pk) = crate::pqc::falcon512::generate_keypair(*seed);
Self { sk, pk }
}
pub fn sign(&self, message: &[u8]) -> Result<Vec<u8>, crate::error::CryptoError> {
crate::pqc::falcon512::sign(message, &self.sk)
.map(|s| s.0)
.map_err(|e| crate::error::CryptoError::InvalidKey(format!("Falcon-512 sign: {e}")))
}
pub fn verify(&self, message: &[u8], signature: &[u8]) -> bool {
let sig = crate::pqc::falcon512::Falcon512Signature(signature.to_vec());
crate::pqc::falcon512::verify(message, &sig, &self.pk)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn falcon1024_roundtrip() {
let s = Falcon1024Signer::from_seed(&[1u8; 32]).unwrap();
let msg = b"hello";
let sig = s.sign(msg).unwrap();
assert!(s.verify(msg, &sig));
}
#[test]
fn falcon1024_rejects_tampered() {
let s = Falcon1024Signer::from_seed(&[2u8; 32]).unwrap();
let sig = s.sign(b"original").unwrap();
assert!(!s.verify(b"tampered", &sig));
}
#[test]
fn falcon512_roundtrip() {
let s = Falcon512Signer::from_seed(&[3u8; 32]);
let msg = b"hello";
let sig = s.sign(msg).unwrap();
assert!(s.verify(msg, &sig));
}
}