wamu_core/
share_split_reconstruct.rs1use crypto_bigint::{Encoding, U256};
6
7use crate::errors::Error;
8use crate::share::{SecretShare, SigningShare, SubShare, SubShareInterpolator};
9use crate::traits::IdentityProvider;
10
11pub fn split(
16 secret_share: &SecretShare,
17 identity_provider: &impl IdentityProvider,
18) -> Result<(SigningShare, SubShare), Error> {
19 let signing_share = SigningShare::generate();
21
22 let (r, s) = identity_provider.sign_message_share(&signing_share.to_be_bytes());
24 let sub_share_a = SubShare::new(U256::from_be_bytes(r), U256::from_be_bytes(s))?;
25
26 let sub_share_interpolator = SubShareInterpolator::new(
28 &SubShare::new(U256::ZERO, secret_share.as_u256())?,
30 &sub_share_a,
31 );
32
33 let sub_share_b = sub_share_interpolator.sub_share(U256::ONE)?;
35
36 Ok((signing_share, sub_share_b))
38}
39
40pub fn reconstruct(
44 signing_share: &SigningShare,
45 sub_share_b: &SubShare,
46 identity_provider: &impl IdentityProvider,
47) -> Result<SecretShare, Error> {
48 let (r, s) = identity_provider.sign_message_share(&signing_share.to_be_bytes());
50 let sub_share_a = SubShare::new(U256::from_be_bytes(r), U256::from_be_bytes(s))?;
51
52 let sub_share_interpolator = SubShareInterpolator::new(&sub_share_a, sub_share_b);
54
55 Ok(sub_share_interpolator.secret().into())
57}
58
59#[cfg(test)]
60mod tests {
61 use super::*;
62 use crate::crypto::Random32Bytes;
63 use crate::test_utils::MockECDSAIdentityProvider;
64
65 #[test]
66 fn share_splitting_and_reconstruction_works() {
67 let secret_share = SecretShare::from(Random32Bytes::generate_mod_q());
69
70 let identity_provider = MockECDSAIdentityProvider::generate();
72
73 let (signing_share, sub_share_b) = split(&secret_share, &identity_provider).unwrap();
75
76 let reconstructed_secret_share =
78 reconstruct(&signing_share, &sub_share_b, &identity_provider).unwrap();
79
80 assert_eq!(
82 &reconstructed_secret_share.to_be_bytes(),
83 &secret_share.to_be_bytes()
84 );
85 }
86}