polysig_driver/
protocol.rsuse crate::{Error, Result};
use polysig_protocol::{hex, PartyNumber, RoundNumber};
use serde::{de::DeserializeOwned, Deserialize, Serialize};
#[cfg(feature = "cggmp")]
pub use synedrion::{self, bip32, k256};
#[cfg(feature = "frost-ed25519")]
pub use frost_ed25519;
#[derive(Debug)]
pub struct RoundInfo {
pub can_finalize: bool,
pub is_echo: bool,
pub round_number: u8,
}
pub trait ProtocolDriver {
type Error: std::error::Error
+ std::fmt::Debug
+ Send
+ Sync
+ From<polysig_protocol::Error>
+ 'static;
type Message: std::fmt::Debug + Round;
type Output;
fn handle_incoming(
&mut self,
message: Self::Message,
) -> std::result::Result<(), Self::Error>;
fn proceed(
&mut self,
) -> std::result::Result<Vec<Self::Message>, Self::Error>;
fn round_info(
&self,
) -> std::result::Result<RoundInfo, Self::Error>;
fn try_finalize_round(
&mut self,
) -> std::result::Result<Option<Self::Output>, Self::Error>;
}
pub trait Round: Serialize + DeserializeOwned + Send + Sync {
#[allow(dead_code)]
fn round_number(&self) -> RoundNumber;
fn receiver(&self) -> &PartyNumber;
}
#[derive(Debug, Serialize, Deserialize)]
pub struct RoundMessage<Body, Verifier>
where
Body: Send + Sync,
{
pub(crate) round: RoundNumber,
pub(crate) sender: Verifier,
pub(crate) receiver: PartyNumber,
pub(crate) body: Body,
}
impl<Body, Verifier> RoundMessage<Body, Verifier>
where
Body: Serialize + Send + Sync + DeserializeOwned,
Verifier: Serialize + Send + Sync + DeserializeOwned,
{
#[allow(dead_code)]
pub fn into_body(self) -> (Body, Verifier) {
(self.body, self.sender)
}
}
impl<Body, Verifier> Round for RoundMessage<Body, Verifier>
where
Body: Serialize + Send + Sync + DeserializeOwned,
Verifier: Serialize + Send + Sync + DeserializeOwned,
{
fn round_number(&self) -> RoundNumber {
self.round
}
fn receiver(&self) -> &PartyNumber {
&self.receiver
}
}
#[derive(Clone)]
pub struct Participant<Signer, Verifier> {
signing_key: Signer,
party: PartyOptions<Verifier>,
}
impl<Signer, Verifier> Participant<Signer, Verifier>
where
Verifier: PartialEq + std::fmt::Debug,
{
pub fn new(
signing_key: Signer,
verifying_key: Verifier,
party: PartyOptions<Verifier>,
) -> Result<Self> {
if party
.verifiers()
.into_iter()
.find(|v| *v == &verifying_key)
.is_none()
{
return Err(Error::NotVerifyingParty);
}
Ok(Self { signing_key, party })
}
pub fn signing_key(&self) -> &Signer {
&self.signing_key
}
pub fn party(&self) -> &PartyOptions<Verifier> {
&self.party
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PartyOptions<Verifier> {
#[serde(with = "hex::serde")]
public_key: Vec<u8>,
participants: Vec<Vec<u8>>,
is_initiator: bool,
party_index: usize,
verifiers: Vec<Verifier>,
}
impl<Verifier> PartyOptions<Verifier> {
pub fn new(
public_key: Vec<u8>,
participants: Vec<Vec<u8>>,
is_initiator: bool,
verifiers: Vec<Verifier>,
) -> Result<Self> {
let party_index = participants
.iter()
.position(|v| v == &public_key)
.ok_or(Error::NotVerifyingParty)?;
if participants.len() != verifiers.len() {
return Err(Error::ParticipantVerifierLength(
participants.len(),
verifiers.len(),
));
}
Ok(Self {
public_key,
participants,
is_initiator,
party_index,
verifiers,
})
}
pub fn public_key(&self) -> &[u8] {
&self.public_key
}
pub fn participants(&self) -> &[Vec<u8>] {
self.participants.as_slice()
}
pub fn party_index(&self) -> usize {
self.party_index
}
pub fn is_initiator(&self) -> bool {
self.is_initiator
}
pub fn verifiers(&self) -> &[Verifier] {
self.verifiers.as_slice()
}
}