use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub struct KeyedSig {
pub public_key: bls::PublicKey,
pub signature: bls::Signature,
}
impl KeyedSig {
pub fn verify(&self, payload: &[u8]) -> bool {
self.public_key.verify(&self.signature, payload)
}
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub struct SigShare {
pub public_key_set: bls::PublicKeySet,
pub index: usize,
pub signature_share: bls::SignatureShare,
}
impl SigShare {
pub fn new(
public_key_set: bls::PublicKeySet,
index: usize,
secret_key_share: &bls::SecretKeyShare,
payload: &[u8],
) -> Self {
Self {
public_key_set,
index,
signature_share: secret_key_share.sign(payload),
}
}
pub fn verify(&self, payload: &[u8]) -> bool {
self.public_key_set
.public_key_share(self.index)
.verify(&self.signature_share, payload)
}
}
#[cfg(test)]
mod tests {
use super::*;
use bls::SecretKey;
#[test]
fn verify_keyed_sig() {
let sk = SecretKey::random();
let public_key = sk.public_key();
let data = "hello".to_string();
let signature = sk.sign(&data);
let sig = KeyedSig {
public_key,
signature,
};
assert!(sig.verify(data.as_bytes()));
}
}