use crate::proto::tags::Error;
use sl_mpc_mate::coord::MessageSendError;
#[derive(Debug, thiserror::Error)]
pub enum KeygenError {
#[error(
"Error while deserializing message or invalid message data length"
)]
InvalidMessage,
#[error("Invalid commitment hash")]
InvalidCommitmentHash,
#[error("Invalid DLog proof")]
InvalidDLogProof,
#[error("Invalid Polynomial Point")]
InvalidPolynomialPoint,
#[error("Invalid key refresh")]
InvalidKeyRefresh,
#[error("Invalid Quorum Change")]
InvalidQuorumChange,
#[error("Not unique x_i values")]
NotUniqueXiValues,
#[error("Big F vec mismatch")]
BigFVecMismatch,
#[error("Failed feldman verify")]
FailedFelmanVerify,
#[error("Public key mismatch between the message and the party")]
PublicKeyMismatch,
#[error("Big S value mismatch")]
BigSMismatch,
#[error("PPRF error")]
PPRFError(&'static str),
#[error("Missing message")]
MissingMessage,
#[error("Send message")]
SendMessage,
#[error("Abort protocol by party {0}")]
AbortProtocol(usize),
}
impl From<MessageSendError> for KeygenError {
fn from(_err: MessageSendError) -> Self {
KeygenError::SendMessage
}
}
impl From<Error> for KeygenError {
fn from(err: Error) -> Self {
match err {
Error::Abort(p) => KeygenError::AbortProtocol(p as _),
Error::Recv => KeygenError::MissingMessage,
Error::Send => KeygenError::SendMessage,
Error::InvalidMessage => KeygenError::InvalidMessage,
}
}
}
#[cfg(test)]
mod tests {
use k256::{
elliptic_curve::{scalar::FromUintUnchecked, Curve},
ProjectivePoint, Scalar, Secp256k1, U256,
};
use sl_mpc_mate::math::{GroupPolynomial, Polynomial};
#[test]
fn test_derivative_large() {
let order = Secp256k1::ORDER;
let u_i_k = vec![
Scalar::from(1_u64),
Scalar::from(2_u64),
Scalar::from_uint_unchecked(order.wrapping_sub(&U256::ONE)),
];
let poly = Polynomial::<ProjectivePoint>::new(u_i_k);
let n = 1;
let result = poly.derivative_at(n, &Scalar::from(2_u64));
assert_eq!(
result,
Scalar::from_uint_unchecked(
order.wrapping_sub(&U256::from(2_u64))
)
);
}
#[test]
fn test_derivative_normal() {
let u_i_k = vec![
Scalar::from(1_u64),
Scalar::from(2_u64),
Scalar::from(3_u64),
Scalar::from(4_u64),
];
let poly = Polynomial::<ProjectivePoint>::new(u_i_k);
let n = 2;
let result = poly.derivative_at(n, &Scalar::from(2_u64));
assert_eq!(result, Scalar::from(54_u64));
}
#[test]
fn test_derivative_coeffs() {
let g = ProjectivePoint::GENERATOR;
let u_i_k = vec![
(g * Scalar::from(1_u64)),
(g * Scalar::from(2_u64)),
(g * Scalar::from(3_u64)),
(g * Scalar::from(4_u64)),
];
let poly = GroupPolynomial::<ProjectivePoint>::new(u_i_k);
let n = 2;
let coeffs = poly.derivative_coeffs(n).collect::<Vec<_>>();
assert_eq!(coeffs.len(), 2);
assert_eq!(coeffs[0], g * Scalar::from(6_u64));
assert_eq!(coeffs[1], g * Scalar::from(24_u64));
let coeffs = poly.derivative_coeffs(1).collect::<Vec<_>>();
assert_eq!(coeffs.len(), 3);
assert_eq!(coeffs[0], g * Scalar::from(2_u64));
assert_eq!(coeffs[1], g * Scalar::from(6_u64));
assert_eq!(coeffs[2], g * Scalar::from(12_u64));
}
}