1use crate::proto::tags::Error;
9use sl_mpc_mate::coord::MessageSendError;
10
11#[derive(Debug, thiserror::Error)]
17pub enum KeygenError {
18 #[error(
20 "Error while deserializing message or invalid message data length"
21 )]
22 InvalidMessage,
23
24 #[error("Invalid commitment hash")]
26 InvalidCommitmentHash,
27
28 #[error("Invalid DLog proof")]
30 InvalidDLogProof,
31
32 #[error("Invalid Polynomial Point")]
34 InvalidPolynomialPoint,
35
36 #[error("Invalid key refresh")]
38 InvalidKeyRefresh,
39
40 #[error("Invalid Quorum Change")]
42 InvalidQuorumChange,
43
44 #[error("Not unique x_i values")]
46 NotUniqueXiValues,
47
48 #[error("Big F vec mismatch")]
50 BigFVecMismatch,
51
52 #[error("Failed feldman verify")]
54 FailedFelmanVerify,
55
56 #[error("Public key mismatch between the message and the party")]
58 PublicKeyMismatch,
59
60 #[error("Big S value mismatch")]
62 BigSMismatch,
63
64 #[error("PPRF error")]
66 PPRFError(&'static str),
67
68 #[error("Missing message")]
70 MissingMessage,
71
72 #[error("Send message")]
74 SendMessage,
75
76 #[error("Abort protocol by party {0}")]
78 AbortProtocol(usize),
79}
80
81impl From<MessageSendError> for KeygenError {
82 fn from(_err: MessageSendError) -> Self {
83 KeygenError::SendMessage
84 }
85}
86
87impl From<Error> for KeygenError {
88 fn from(err: Error) -> Self {
89 match err {
90 Error::Abort(p) => KeygenError::AbortProtocol(p as _),
91 Error::Recv => KeygenError::MissingMessage,
92 Error::Send => KeygenError::SendMessage,
93 Error::InvalidMessage => KeygenError::InvalidMessage,
94 }
95 }
96}
97
98#[cfg(test)]
99mod tests {
100 use k256::{
101 elliptic_curve::{scalar::FromUintUnchecked, Curve},
102 ProjectivePoint, Scalar, Secp256k1, U256,
103 };
104 use sl_mpc_mate::math::{GroupPolynomial, Polynomial};
105
106 #[test]
112 fn test_derivative_large() {
113 let order = Secp256k1::ORDER;
115 let u_i_k = vec![
118 Scalar::from(1_u64),
119 Scalar::from(2_u64),
120 Scalar::from_uint_unchecked(order.wrapping_sub(&U256::ONE)),
121 ];
122
123 let poly = Polynomial::<ProjectivePoint>::new(u_i_k);
126 let n = 1;
127
128 let result = poly.derivative_at(n, &Scalar::from(2_u64));
129
130 assert_eq!(
131 result,
132 Scalar::from_uint_unchecked(
133 order.wrapping_sub(&U256::from(2_u64))
134 )
135 );
136 }
137
138 #[test]
143 fn test_derivative_normal() {
144 let u_i_k = vec![
146 Scalar::from(1_u64),
147 Scalar::from(2_u64),
148 Scalar::from(3_u64),
149 Scalar::from(4_u64),
150 ];
151
152 let poly = Polynomial::<ProjectivePoint>::new(u_i_k);
153
154 let n = 2;
156 let result = poly.derivative_at(n, &Scalar::from(2_u64));
158
159 assert_eq!(result, Scalar::from(54_u64));
160 }
161
162 #[test]
167 fn test_derivative_coeffs() {
168 let g = ProjectivePoint::GENERATOR;
170 let u_i_k = vec![
171 (g * Scalar::from(1_u64)),
172 (g * Scalar::from(2_u64)),
173 (g * Scalar::from(3_u64)),
174 (g * Scalar::from(4_u64)),
175 ];
176
177 let poly = GroupPolynomial::<ProjectivePoint>::new(u_i_k);
178
179 let n = 2;
181 let coeffs = poly.derivative_coeffs(n).collect::<Vec<_>>();
182
183 assert_eq!(coeffs.len(), 2);
184 assert_eq!(coeffs[0], g * Scalar::from(6_u64));
185 assert_eq!(coeffs[1], g * Scalar::from(24_u64));
186
187 let coeffs = poly.derivative_coeffs(1).collect::<Vec<_>>();
189
190 assert_eq!(coeffs.len(), 3);
191 assert_eq!(coeffs[0], g * Scalar::from(2_u64));
192 assert_eq!(coeffs[1], g * Scalar::from(6_u64));
193 assert_eq!(coeffs[2], g * Scalar::from(12_u64));
194 }
195}