mithril_stm/signature_scheme/bls_multi_signature/
error.rs

1//! Crate specific errors
2use anyhow::anyhow;
3use blst::BLST_ERROR;
4
5use crate::StmResult;
6
7use super::{BlsSignature, BlsVerificationKey, BlsVerificationKeyProofOfPossession};
8
9/// Error types for multi signatures.
10#[derive(Debug, thiserror::Error, Eq, PartialEq)]
11pub enum BlsSignatureError {
12    /// Invalid Single signature
13    #[error("Invalid single signature")]
14    SignatureInvalid(BlsSignature),
15
16    /// Invalid aggregate signature
17    #[error("Invalid aggregated signature")]
18    AggregateSignatureInvalid,
19
20    /// This error occurs when the serialization of the raw bytes failed
21    #[error("Invalid bytes")]
22    SerializationError,
23
24    /// Incorrect proof of possession
25    #[error("Key with invalid PoP")]
26    KeyInvalid(Box<BlsVerificationKeyProofOfPossession>),
27
28    /// At least one signature in the batch is invalid
29    #[error("One signature in the batch is invalid")]
30    BatchInvalid,
31
32    /// Single signature is the infinity
33    #[error("Single signature is the infinity")]
34    SignatureInfinity(BlsSignature),
35
36    /// Verification key is the infinity
37    #[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}