mithril_stm/signature_scheme/bls_multi_signature/
error.rs1use anyhow::anyhow;
3use blst::BLST_ERROR;
4
5use crate::StmResult;
6
7use super::{BlsSignature, BlsVerificationKey, BlsVerificationKeyProofOfPossession};
8
9#[derive(Debug, thiserror::Error, Eq, PartialEq)]
11pub enum BlsSignatureError {
12 #[error("Invalid single signature")]
14 SignatureInvalid(BlsSignature),
15
16 #[error("Invalid aggregated signature")]
18 AggregateSignatureInvalid,
19
20 #[error("Invalid bytes")]
22 SerializationError,
23
24 #[error("Key with invalid PoP")]
26 KeyInvalid(Box<BlsVerificationKeyProofOfPossession>),
27
28 #[error("One signature in the batch is invalid")]
30 BatchInvalid,
31
32 #[error("Single signature is the infinity")]
34 SignatureInfinity(BlsSignature),
35
36 #[error("Verification key is the infinity")]
38 VerificationKeyInfinity(Box<BlsVerificationKey>),
39}
40
41pub fn blst_error_to_stm_error(
42 e: BLST_ERROR,
43 sig: Option<BlsSignature>,
44 key: Option<BlsVerificationKey>,
45) -> StmResult<()> {
46 match e {
47 BLST_ERROR::BLST_SUCCESS => Ok(()),
48 BLST_ERROR::BLST_PK_IS_INFINITY => {
49 if let Some(s) = sig {
50 return Err(anyhow!(BlsSignatureError::SignatureInfinity(s)));
51 }
52 if let Some(vk) = key {
53 return Err(anyhow!(BlsSignatureError::VerificationKeyInfinity(
54 Box::new(vk)
55 )));
56 }
57 Err(anyhow!(BlsSignatureError::SerializationError))
58 }
59 BLST_ERROR::BLST_VERIFY_FAIL => {
60 if let Some(s) = sig {
61 Err(anyhow!(BlsSignatureError::SignatureInvalid(s)))
62 } else {
63 Err(anyhow!(BlsSignatureError::AggregateSignatureInvalid))
64 }
65 }
66 _ => Err(anyhow!(BlsSignatureError::SerializationError)),
67 }
68}