use core::fmt::{Debug, Display, Formatter};
use serde::{Deserialize, Serialize};
use crate::{
encoding::{self, BinaryMarshaler, MarshallingError},
share::{
poly::PriShare,
vss::{
pedersen::vss::{self, EncryptedDeal},
suite::Suite,
},
},
sign::dss,
Point,
};
#[derive(Clone, Default, Eq, PartialEq, Serialize, Deserialize)]
pub struct DistKeyShare<SUITE: Suite> {
pub commits: Vec<SUITE::POINT>,
pub share: PriShare<<SUITE::POINT as Point>::SCALAR>,
pub private_poly: Vec<<SUITE::POINT as Point>::SCALAR>,
}
impl<SUITE: Suite> Debug for DistKeyShare<SUITE> {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
f.debug_struct("DistKeyShare")
.field("commits", &self.commits)
.finish()
}
}
impl<SUITE: Suite> Display for DistKeyShare<SUITE> {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
write!(f, "DistKeyShare(")?;
write!(f, " commits: [")?;
let commits = self
.commits
.iter()
.map(|c| c.to_string())
.collect::<Vec<_>>()
.join(",");
write!(f, "{}] )", commits)
}
}
impl<SUITE: Suite> DistKeyShare<SUITE> {
pub fn public(&self) -> SUITE::POINT {
self.commits[0].clone()
}
}
impl<SUITE: Suite> dss::DistKeyShare<SUITE> for DistKeyShare<SUITE> {
fn pri_share(&self) -> PriShare<<SUITE::POINT as Point>::SCALAR> {
self.share.clone()
}
fn commitments(&self) -> Vec<SUITE::POINT> {
self.commits.clone()
}
}
#[derive(Clone, Serialize, Deserialize, Debug, Default)]
pub struct Deal<POINT: Point> {
pub index: u32,
#[serde(deserialize_with = "EncryptedDeal::deserialize")]
pub deal: EncryptedDeal<POINT>,
pub signature: Vec<u8>,
}
impl<POINT: Point> Display for Deal<POINT> {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
write!(
f,
"Deal( index: {}, deal: {}, signature: 0x{} )",
self.index,
self.deal,
hex::encode(&self.signature)
)
}
}
impl<POINT: Point> BinaryMarshaler for Deal<POINT> {
fn marshal_binary(&self) -> Result<Vec<u8>, MarshallingError> {
let mut deal = self.clone();
deal.signature = Vec::new();
encoding::marshal_binary(&deal)
}
}
#[derive(Clone, Serialize, Deserialize, Debug, Default, PartialEq, Eq)]
pub struct Response {
pub index: u32,
pub response: vss::Response,
}
impl Display for Response {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
write!(
f,
"Response( index: {}, response: {} )",
self.index, self.response
)
}
}
#[derive(Clone, Serialize, Deserialize, Debug, Default, PartialEq, Eq)]
pub struct Justification<SUITE: Suite> {
pub index: u32,
pub justification: vss::Justification<SUITE>,
}
impl<SUITE: Suite> Display for Justification<SUITE> {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
write!(
f,
"Justification( index: {}, justification: {} )",
self.index, self.justification
)
}
}