mirror of
https://github.com/serai-dex/serai.git
synced 2025-12-08 20:29:23 +00:00
* Add dkg crate * Remove F_len and G_len They're generally no longer used. * Replace hash_to_vec with a provided method around associated type H: Digest Part of trying to minimize this trait so it can be moved elsewhere. Vec, which isn't std, may have been a blocker. * Encrypt secret shares within the FROST library Reduces requirements on callers in order to be correct. * Update usage of Zeroize within FROST * Inline functions in key_gen There was no reason to have them separated as they were. sign probably has the same statement available, yet that isn't the focus right now. * Add a ciphersuite package which provides hash_to_F * Set the Ciphersuite version to something valid * Have ed448 export Scalar/FieldElement/Point at the top level * Move FROST over to Ciphersuite * Correct usage of ff in ciphersuite * Correct documentation handling * Move Schnorr signatures to their own crate * Remove unused feature from schnorr * Fix Schnorr tests * Split DKG into a separate crate * Add serialize to Commitments and SecretShare Helper for buf = vec![]; .write(buf).unwrap(); buf * Move FROST over to the new dkg crate * Update Monero lib to latest FROST * Correct ethereum's usage of features * Add serialize to GeneratorProof * Add serialize helper function to FROST * Rename AddendumSerialize to WriteAddendum * Update processor * Slight fix to processor
86 lines
2.5 KiB
Rust
86 lines
2.5 KiB
Rust
#![cfg_attr(docsrs, feature(doc_cfg))]
|
|
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
|
|
|
|
//! A modular implementation of FROST for any curve with a ff/group API.
|
|
//! Additionally, custom algorithms may be specified so any signature reducible to
|
|
//! Schnorr-like may be used with FROST.
|
|
//!
|
|
//! A Schnorr algorithm is provided, of the form (R, s) where `s = r + cx`, which
|
|
//! allows specifying the challenge format. This is intended to easily allow
|
|
//! integrating with existing systems.
|
|
//!
|
|
//! This library offers ciphersuites compatible with the
|
|
//! [IETF draft](https://github.com/cfrg/draft-irtf-cfrg-frost). Currently, version
|
|
//! 11 is supported.
|
|
|
|
use core::fmt::Debug;
|
|
use std::collections::HashMap;
|
|
|
|
use thiserror::Error;
|
|
|
|
/// Distributed key generation protocol.
|
|
pub use dkg::{self, ThresholdParams, ThresholdCore, ThresholdKeys, ThresholdView};
|
|
|
|
/// Curve trait and provided curves/HRAMs, forming various ciphersuites.
|
|
pub mod curve;
|
|
use curve::Curve;
|
|
|
|
/// Algorithm for the signing process.
|
|
pub mod algorithm;
|
|
mod nonce;
|
|
/// Threshold signing protocol.
|
|
pub mod sign;
|
|
|
|
/// Tests for application-provided curves and algorithms.
|
|
#[cfg(any(test, feature = "tests"))]
|
|
pub mod tests;
|
|
|
|
// Validate a map of values to have the expected included participants
|
|
pub(crate) fn validate_map<T>(
|
|
map: &HashMap<u16, T>,
|
|
included: &[u16],
|
|
ours: u16,
|
|
) -> Result<(), FrostError> {
|
|
if (map.len() + 1) != included.len() {
|
|
Err(FrostError::InvalidParticipantQuantity(included.len(), map.len() + 1))?;
|
|
}
|
|
|
|
for included in included {
|
|
if *included == ours {
|
|
if map.contains_key(included) {
|
|
Err(FrostError::DuplicatedIndex(*included))?;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
if !map.contains_key(included) {
|
|
Err(FrostError::MissingParticipant(*included))?;
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Various errors possible during signing.
|
|
#[derive(Copy, Clone, Error, Debug)]
|
|
pub enum FrostError {
|
|
#[error("invalid participant index (0 < index <= {0}, yet index is {1})")]
|
|
InvalidParticipantIndex(u16, u16),
|
|
#[error("invalid signing set ({0})")]
|
|
InvalidSigningSet(&'static str),
|
|
#[error("invalid participant quantity (expected {0}, got {1})")]
|
|
InvalidParticipantQuantity(usize, usize),
|
|
#[error("duplicated participant index ({0})")]
|
|
DuplicatedIndex(u16),
|
|
#[error("missing participant {0}")]
|
|
MissingParticipant(u16),
|
|
|
|
#[error("invalid preprocess (participant {0})")]
|
|
InvalidPreprocess(u16),
|
|
#[error("invalid share (participant {0})")]
|
|
InvalidShare(u16),
|
|
|
|
#[error("internal error ({0})")]
|
|
InternalError(&'static str),
|
|
}
|