cggmp21 0.6.3

TSS ECDSA implementation based on CGGMP21 paper
Documentation
use std::convert::Infallible;

use round_based::rounds_router::{
    errors::{self as router_error, CompleteRoundError},
    simple_store::RoundInputError,
};
use thiserror::Error;

pub type BoxedError = Box<dyn std::error::Error + Send + Sync>;

#[derive(Debug, Error)]
pub enum IoError {
    #[error("send message")]
    SendMessage(#[source] BoxedError),
    #[error("receive message")]
    ReceiveMessage(#[source] BoxedError),
    #[error("got eof while recieving messages")]
    ReceiveMessageEof,
    #[error("route received message (possibly malicious behavior)")]
    RouteReceivedError(router_error::CompleteRoundError<RoundInputError, Infallible>),
}

impl IoError {
    pub fn send_message<E: std::error::Error + Send + Sync + 'static>(err: E) -> Self {
        Self::SendMessage(Box::new(err))
    }

    pub fn receive_message<E: std::error::Error + Send + Sync + 'static>(
        err: CompleteRoundError<RoundInputError, E>,
    ) -> Self {
        match err {
            CompleteRoundError::Io(router_error::IoError::Io(e)) => {
                Self::ReceiveMessage(Box::new(e))
            }
            CompleteRoundError::Io(router_error::IoError::UnexpectedEof) => Self::ReceiveMessageEof,

            CompleteRoundError::ProcessMessage(e) => {
                Self::RouteReceivedError(CompleteRoundError::ProcessMessage(e))
            }
            CompleteRoundError::Other(e) => Self::RouteReceivedError(CompleteRoundError::Other(e)),
        }
    }
}

macro_rules! impl_from {
    (impl From for $target:ty {
        $($var:ident: $ty:ty => $new:expr),+,
    }) => {$(
        impl From<$ty> for $target {
            fn from($var: $ty) -> Self {
                $new
            }
        }
    )+}
}

pub(crate) use impl_from;