use alloc::collections::BTreeMap;
use crate::keys::{KeyPackage, PublicKeyPackage};
use crate::{frost, Ciphersuite, CryptoRng, Identifier, RngCore};
use crate::{Ed448Shake256, Error};
pub type Delta = frost::keys::repairable::Delta<Ed448Shake256>;
pub type Sigma = frost::keys::repairable::Sigma<Ed448Shake256>;
pub fn repair_share_part1<C: Ciphersuite, R: RngCore + CryptoRng>(
helpers: &[Identifier],
key_package_i: &KeyPackage,
rng: &mut R,
participant: Identifier,
) -> Result<BTreeMap<Identifier, Delta>, Error> {
frost::keys::repairable::repair_share_part1(helpers, key_package_i, rng, participant)
}
pub fn repair_share_part2(deltas: &[Delta]) -> Sigma {
frost::keys::repairable::repair_share_part2::<Ed448Shake256>(deltas)
}
pub fn repair_share_part3(
sigmas: &[Sigma],
identifier: Identifier,
public_key_package: &PublicKeyPackage,
) -> Result<KeyPackage, Error> {
frost::keys::repairable::repair_share_part3(sigmas, identifier, public_key_package)
}
#[cfg(test)]
mod tests {
use lazy_static::lazy_static;
use serde_json::Value;
use crate::Ed448Shake256;
lazy_static! {
pub static ref REPAIR_SHARE: Value =
serde_json::from_str(include_str!("../../tests/helpers/repair-share.json").trim())
.unwrap();
}
#[test]
fn check_repair_share_part1() {
let rng = rand::rngs::OsRng;
frost_core::tests::repairable::check_repair_share_part1::<Ed448Shake256, _>(rng);
}
#[test]
fn check_repair_share_part2() {
frost_core::tests::repairable::check_repair_share_part2::<Ed448Shake256>(&REPAIR_SHARE);
}
#[test]
fn check_repair_share_part3() {
let rng = rand::rngs::OsRng;
frost_core::tests::repairable::check_repair_share_part3::<Ed448Shake256, _>(
rng,
&REPAIR_SHARE,
);
}
#[test]
fn check_repair_share_part1_fails_with_invalid_min_signers() {
let rng = rand::rngs::OsRng;
frost_core::tests::repairable::check_repair_share_part1_fails_with_invalid_min_signers::<
Ed448Shake256,
_,
>(rng);
}
}