use elliptic_curve::Group;
use zeroize::{Zeroize, ZeroizeOnDrop};
use crate::common::{
traits::GroupElem,
utils::{BaseMessage, SessionId},
DLogProof,
};
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Zeroize, ZeroizeOnDrop)]
pub struct SignMsg1 {
pub from_party: u8,
pub session_id: SessionId,
pub commitment_r_i: [u8; 32],
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone)]
pub struct SignMsg2<G>
where
G: GroupElem,
{
pub from_party: u8,
pub session_id: SessionId,
pub(crate) blind_factor: [u8; 32],
#[cfg_attr(
feature = "serde",
serde(bound(
serialize = "G::Scalar: serde::Serialize",
deserialize = "G::Scalar: serde::Deserialize<'de>"
))
)]
pub(crate) dlog_proof: DLogProof<G>,
pub(crate) big_r_i: Vec<u8>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone)]
pub struct SignMsg3<G: Group> {
pub from_party: u8,
pub session_id: SessionId,
pub s_i: G::Scalar,
}
#[derive(Clone, Zeroize, ZeroizeOnDrop)]
pub struct SignComplete {
pub(crate) from_party: u8,
pub(crate) session_id: SessionId,
pub(crate) signature: [u8; 64],
}
impl<G> BaseMessage for SignMsg2<G>
where
G: GroupElem,
{
fn party_id(&self) -> u8 {
self.from_party
}
}
impl<G> BaseMessage for SignMsg3<G>
where
G: Group,
{
fn party_id(&self) -> u8 {
self.from_party
}
}