use super::*; use crate::case_result::compare_result; use crate::cases::common::BlsCase; use bls::{PublicKey, Signature, SignatureBytes}; use serde_derive::Deserialize; use std::convert::TryInto; #[derive(Debug, Clone, Deserialize)] pub struct BlsVerifyInput { pub pubkey: PublicKey, pub message: String, pub signature: SignatureBytes, } #[derive(Debug, Clone, Deserialize)] pub struct BlsVerify { pub input: BlsVerifyInput, pub output: bool, } impl BlsCase for BlsVerify {} impl Case for BlsVerify { fn result(&self, _case_index: usize) -> Result<(), Error> { let message = hex::decode(&self.input.message[2..]) .map_err(|e| Error::FailedToParseTest(format!("{:?}", e)))?; let signature_ok = (&self.input.signature) .try_into() .map(|signature: Signature| signature.verify(&message, &self.input.pubkey)) .unwrap_or(false); compare_result::(&Ok(signature_ok), &Some(self.output)) } }