mpc_manager/state/
parameters.rs1use super::session::SessionKind;
6use anyhow::Result;
7use serde::{Deserialize, Serialize};
8use thiserror::Error;
9
10#[derive(Error, Debug)]
12pub enum ParametersError {
13 #[error("invalid threshold {0}")]
14 InvalidThreshold(u16),
15 #[error("invalid number of parties {0}")]
16 InvalidParties(u16),
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct Parameters {
22 n: u16,
24
25 t: u16,
30}
31
32impl Parameters {
33 pub fn new(n: u16, t: u16) -> Result<Self> {
40 let params = Self { n, t };
41 params.validate()?;
42 Ok(params)
43 }
44
45 pub fn n(&self) -> u16 {
47 self.n
48 }
49
50 pub fn t(&self) -> u16 {
52 self.t
53 }
54
55 pub fn validate(&self) -> Result<()> {
57 if self.n < 2 {
58 return Err(ParametersError::InvalidParties(self.n).into());
59 }
60 if self.t == 0 || self.t >= self.n {
61 return Err(ParametersError::InvalidThreshold(self.t).into());
62 }
63 Ok(())
64 }
65
66 pub fn threshold_reached(&self, kind: SessionKind, parties: usize) -> bool {
68 match kind {
69 SessionKind::Keygen => parties == self.n as usize,
70 SessionKind::Sign => parties > self.t as usize,
71 }
72 }
73}