use super::session::SessionKind;
use anyhow::Result;
use serde::{Deserialize, Serialize};
use thiserror::Error;
#[derive(Error, Debug)]
pub enum ParametersError {
#[error("invalid threshold {0}")]
InvalidThreshold(u16),
#[error("invalid number of parties {0}")]
InvalidParties(u16),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Parameters {
n: u16,
t: u16,
}
impl Parameters {
pub fn new(n: u16, t: u16) -> Result<Self> {
let params = Self { n, t };
params.validate()?;
Ok(params)
}
pub fn n(&self) -> u16 {
self.n
}
pub fn t(&self) -> u16 {
self.t
}
pub fn validate(&self) -> Result<()> {
if self.n < 2 {
return Err(ParametersError::InvalidParties(self.n).into());
}
if self.t == 0 || self.t >= self.n {
return Err(ParametersError::InvalidThreshold(self.t).into());
}
Ok(())
}
pub fn threshold_reached(&self, kind: SessionKind, parties: usize) -> bool {
match kind {
SessionKind::Keygen => parties == self.n as usize,
SessionKind::Sign => parties > self.t as usize,
}
}
}