#![allow(non_snake_case)]
use core::fmt;
use core::fmt::Display;
pub type SignatureResult<T> = Result<T, SignatureError>;
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
pub enum MultiSignatureStage {
Commitment,
Reveal,
Cosignature,
}
impl Display for MultiSignatureStage {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
use self::MultiSignatureStage::*;
match *self {
Commitment => write!(f, "commitment"),
Reveal => write!(f, "reveal"),
Cosignature => write!(f, "cosignature"),
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
pub enum SignatureError {
EquationFalse,
PointDecompressionError,
ScalarFormatError,
InvalidKey,
BytesLengthError {
name: &'static str,
description: &'static str,
length: usize,
},
NotMarkedSchnorrkel,
MuSigAbsent {
musig_stage: MultiSignatureStage,
},
MuSigInconsistent {
musig_stage: MultiSignatureStage,
duplicate: bool,
},
}
#[rustfmt::skip]
impl Display for SignatureError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
use self::SignatureError::*;
match *self {
EquationFalse =>
write!(f, "Verification equation failed"),
PointDecompressionError =>
write!(f, "Cannot decompress Ristretto point"),
ScalarFormatError =>
write!(f, "Cannot use scalar with high-bit set"),
InvalidKey =>
write!(f, "The provided key is not valid"),
BytesLengthError { name, length, .. } =>
write!(f, "{name} must be {length} bytes in length"),
NotMarkedSchnorrkel =>
write!(f, "Signature bytes not marked as a schnorrkel signature"),
MuSigAbsent { musig_stage, } =>
write!(f, "Absent {musig_stage} violated multi-signature protocol"),
MuSigInconsistent { musig_stage, duplicate, } =>
if duplicate {
write!(f, "Inconsistent duplicate {musig_stage} in multi-signature")
} else {
write!(f, "Inconsistent {musig_stage} violated multi-signature protocol")
},
}
}
}
#[cfg(feature = "failure")]
impl failure::Fail for SignatureError {}
#[cfg(feature = "serde")]
pub fn serde_error_from_signature_error<E>(err: SignatureError) -> E
where
E: serde_crate::de::Error,
{
E::custom(err)
}