1use crate::{Ciphersuite, Identifier};
4use alloc::vec::Vec;
5use thiserror::Error;
6
7#[non_exhaustive]
9#[derive(Error, Debug, Clone, Eq, PartialEq)]
10pub enum Error<C: Ciphersuite> {
11 #[error("min_signers must be at least 2 and not larger than max_signers")]
13 InvalidMinSigners,
14 #[error("max_signers must be at least 2")]
16 InvalidMaxSigners,
17 #[error("coefficients must have min_signers-1 elements")]
19 InvalidCoefficients,
20 #[error("Malformed identifier is unserializable.")]
22 MalformedIdentifier,
23 #[error("Duplicated identifier.")]
25 DuplicatedIdentifier,
26 #[error("Unknown identifier.")]
28 UnknownIdentifier,
29 #[error("Incorrect number of identifiers.")]
31 IncorrectNumberOfIdentifiers,
32 #[error("Malformed signing key encoding.")]
34 MalformedSigningKey,
35 #[error("Malformed verifying key encoding.")]
37 MalformedVerifyingKey,
38 #[error("Malformed signature encoding.")]
40 MalformedSignature,
41 #[error("Invalid signature.")]
43 InvalidSignature,
44 #[error("Duplicated shares provided.")]
46 DuplicatedShares,
47 #[error("Incorrect number of shares.")]
49 IncorrectNumberOfShares,
50 #[error("Commitment equals the identity.")]
52 IdentityCommitment,
53 #[error("The Signing Package must contain the participant's Commitment.")]
55 MissingCommitment,
56 #[error("The participant's commitment is incorrect.")]
58 IncorrectCommitment,
59 #[error("Incorrect number of commitments.")]
61 IncorrectNumberOfCommitments,
62 #[error("Invalid signature share.")]
64 InvalidSignatureShare {
65 culprits: Vec<Identifier<C>>,
67 },
68 #[error("Invalid secret share.")]
70 InvalidSecretShare {
71 culprit: Option<Identifier<C>>,
74 },
75 #[error("Round 1 package not found for Round 2 participant.")]
77 PackageNotFound,
78 #[error("Incorrect number of packages.")]
80 IncorrectNumberOfPackages,
81 #[error("The incorrect package was specified.")]
83 IncorrectPackage,
84 #[error("The ciphersuite does not support DKG.")]
86 DKGNotSupported,
87 #[error("The proof of knowledge is not valid.")]
89 InvalidProofOfKnowledge {
90 culprit: Identifier<C>,
92 },
93 #[error("Error in scalar Field.")]
95 FieldError(#[from] FieldError),
96 #[error("Error in elliptic curve Group.")]
98 GroupError(#[from] GroupError),
99 #[error("Invalid coefficient")]
101 InvalidCoefficient,
102 #[error("The ciphersuite does not support deriving identifiers from strings.")]
104 IdentifierDerivationNotSupported,
105 #[error("Error serializing value.")]
107 SerializationError,
108 #[error("Error deserializing value.")]
110 DeserializationError,
111}
112
113impl<C> Error<C>
114where
115 C: Ciphersuite,
116{
117 pub fn culprits(&self) -> Vec<Identifier<C>> {
123 match self {
126 Error::InvalidSignatureShare { culprits } => culprits.clone(),
127 Error::InvalidProofOfKnowledge { culprit } => vec![*culprit],
128 Error::InvalidSecretShare { culprit } => culprit.map(|i| vec![i]).unwrap_or_default(),
129 Error::InvalidMinSigners
130 | Error::InvalidMaxSigners
131 | Error::InvalidCoefficients
132 | Error::MalformedIdentifier
133 | Error::MalformedSigningKey
134 | Error::MalformedVerifyingKey
135 | Error::MalformedSignature
136 | Error::InvalidSignature
137 | Error::DuplicatedShares
138 | Error::IncorrectNumberOfShares
139 | Error::IdentityCommitment
140 | Error::MissingCommitment
141 | Error::IncorrectCommitment
142 | Error::PackageNotFound
143 | Error::IncorrectNumberOfPackages
144 | Error::IncorrectPackage
145 | Error::DKGNotSupported
146 | Error::FieldError(_)
147 | Error::GroupError(_)
148 | Error::DuplicatedIdentifier
149 | Error::InvalidCoefficient
150 | Error::UnknownIdentifier
151 | Error::IncorrectNumberOfIdentifiers
152 | Error::IncorrectNumberOfCommitments
153 | Error::SerializationError
154 | Error::DeserializationError
155 | Error::IdentifierDerivationNotSupported => vec![],
156 }
157 }
158}
159
160#[non_exhaustive]
162#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
163pub enum FieldError {
164 #[error("Malformed scalar encoding.")]
166 MalformedScalar,
167 #[error("Invalid for this scalar to be zero.")]
169 InvalidZeroScalar,
170}
171
172#[non_exhaustive]
174#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
175pub enum GroupError {
176 #[error("Malformed group element encoding.")]
178 MalformedElement,
179 #[error("Invalid for this element to be the identity.")]
181 InvalidIdentityElement,
182 #[error("Invalid for this element to not have large prime order.")]
184 InvalidNonPrimeOrderElement,
185}