Skip to content

Commit d04ddf5

Browse files
committed
Core key share contains KeyInfo + transitive trust in Valid<T>
1 parent 2641e30 commit d04ddf5

File tree

8 files changed

+185
-126
lines changed

8 files changed

+185
-126
lines changed

cggmp21-keygen/src/non_threshold.rs

+14-12
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use serde::{Deserialize, Serialize};
1212
use crate::progress::Tracer;
1313
use crate::{
1414
errors::IoError,
15-
key_share::{CoreKeyShare, DirtyCoreKeyShare, Validate},
15+
key_share::{CoreKeyShare, DirtyCoreKeyShare, DirtyKeyInfo, Validate},
1616
security_level::SecurityLevel,
1717
utils, ExecutionId,
1818
};
@@ -339,18 +339,20 @@ where
339339
Ok(DirtyCoreKeyShare {
340340
curve: Default::default(),
341341
i,
342-
shared_public_key: decommitments
343-
.iter_including_me(&my_decommitment)
344-
.map(|d| d.X)
345-
.sum(),
346-
public_shares: decommitments
347-
.iter_including_me(&my_decommitment)
348-
.map(|d| d.X)
349-
.collect(),
342+
key_info: DirtyKeyInfo {
343+
shared_public_key: decommitments
344+
.iter_including_me(&my_decommitment)
345+
.map(|d| d.X)
346+
.sum(),
347+
public_shares: decommitments
348+
.iter_including_me(&my_decommitment)
349+
.map(|d| d.X)
350+
.collect(),
351+
vss_setup: None,
352+
#[cfg(feature = "hd-wallets")]
353+
chain_code,
354+
},
350355
x: x_i,
351-
vss_setup: None,
352-
#[cfg(feature = "hd-wallets")]
353-
chain_code,
354356
}
355357
.validate()
356358
.map_err(|e| Bug::InvalidKeyShare(e.into_error()))?)

cggmp21-keygen/src/threshold.rs

+11-9
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use serde_with::serde_as;
1313
use crate::progress::Tracer;
1414
use crate::{
1515
errors::IoError,
16-
key_share::{CoreKeyShare, DirtyCoreKeyShare, Validate, VssSetup},
16+
key_share::{CoreKeyShare, DirtyCoreKeyShare, DirtyKeyInfo, Validate, VssSetup},
1717
security_level::SecurityLevel,
1818
utils, ExecutionId,
1919
};
@@ -424,14 +424,16 @@ where
424424
Ok(DirtyCoreKeyShare {
425425
curve: Default::default(),
426426
i,
427-
shared_public_key: y,
428-
public_shares: ys,
429-
vss_setup: Some(VssSetup {
430-
min_signers: t,
431-
I: key_shares_indexes,
432-
}),
433-
#[cfg(feature = "hd-wallets")]
434-
chain_code,
427+
key_info: DirtyKeyInfo {
428+
shared_public_key: y,
429+
public_shares: ys,
430+
vss_setup: Some(VssSetup {
431+
min_signers: t,
432+
I: key_shares_indexes,
433+
}),
434+
#[cfg(feature = "hd-wallets")]
435+
chain_code,
436+
},
435437
x: sigma,
436438
}
437439
.validate()

cggmp21/src/key_refresh/non_threshold.rs

+8-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ use serde::{Deserialize, Serialize};
2020
use super::{Bug, KeyRefreshError, PregeneratedPrimes, ProtocolAborted};
2121
use crate::{
2222
errors::IoError,
23-
key_share::{DirtyAuxInfo, DirtyIncompleteKeyShare, KeyShare, PartyAux, Validate},
23+
key_share::{
24+
DirtyAuxInfo, DirtyIncompleteKeyShare, DirtyKeyInfo, KeyShare, PartyAux, Validate,
25+
},
2426
progress::Tracer,
2527
security_level::SecurityLevel,
2628
utils,
@@ -649,6 +651,7 @@ where
649651
.sum::<Point<E>>()
650652
});
651653
let X_stars = old_core_share
654+
.key_info
652655
.public_shares
653656
.into_iter()
654657
.zip(X_sums)
@@ -657,7 +660,10 @@ where
657660

658661
tracer.stage("Assemble new core share");
659662
let new_core_share: IncompleteKeyShare<E> = DirtyIncompleteKeyShare {
660-
public_shares: X_stars,
663+
key_info: DirtyKeyInfo {
664+
public_shares: X_stars,
665+
..old_core_share.key_info
666+
},
661667
x: SecretScalar::new(&mut x_star),
662668
..old_core_share
663669
}

cggmp21/src/key_share.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ use crate::security_level::SecurityLevel;
1414

1515
#[doc(inline)]
1616
pub use cggmp21_keygen::key_share::{
17-
CoreKeyShare as IncompleteKeyShare, DirtyCoreKeyShare as DirtyIncompleteKeyShare, HdError,
18-
InvalidCoreShare as InvalidIncompleteKeyShare, Valid, Validate, ValidateError,
19-
ValidateFromParts, VssSetup,
17+
CoreKeyShare as IncompleteKeyShare, DirtyCoreKeyShare as DirtyIncompleteKeyShare, DirtyKeyInfo,
18+
HdError, InvalidCoreShare as InvalidIncompleteKeyShare, KeyInfo, Valid, Validate,
19+
ValidateError, ValidateFromParts, VssSetup,
2020
};
2121

2222
/// Key share

cggmp21/src/trusted_dealer.rs

+9-7
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ use thiserror::Error;
3535

3636
use crate::{
3737
key_share::{
38-
AuxInfo, DirtyAuxInfo, DirtyIncompleteKeyShare, IncompleteKeyShare, InvalidKeyShare,
39-
KeyShare, PartyAux, Validate, VssSetup,
38+
AuxInfo, DirtyAuxInfo, DirtyIncompleteKeyShare, DirtyKeyInfo, IncompleteKeyShare,
39+
InvalidKeyShare, KeyShare, PartyAux, Validate, VssSetup,
4040
},
4141
security_level::SecurityLevel,
4242
utils,
@@ -211,12 +211,14 @@ impl<E: Curve, L: SecurityLevel> TrustedDealerBuilder<E, L> {
211211
DirtyIncompleteKeyShare::<E> {
212212
curve: Default::default(),
213213
i,
214-
shared_public_key,
215-
public_shares: public_shares.clone(),
214+
key_info: DirtyKeyInfo {
215+
shared_public_key,
216+
public_shares: public_shares.clone(),
217+
vss_setup: vss_setup.clone(),
218+
#[cfg(feature = "hd-wallets")]
219+
chain_code,
220+
},
216221
x: x_i,
217-
vss_setup: vss_setup.clone(),
218-
#[cfg(feature = "hd-wallets")]
219-
chain_code,
220222
}
221223
.validate()
222224
.map_err(|err| Reason::InvalidKeyShare(err.into_error().into()))

key-share/src/lib.rs

+29-69
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
#![forbid(unused_crate_dependencies)]
1717
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
1818

19+
use core::ops;
20+
1921
use generic_ec::{serde::CurveName, Curve, NonZero, Point, Scalar, SecretScalar};
2022
use generic_ec_zkp::polynomial::lagrange_coefficient;
2123

2224
mod utils;
2325
mod valid;
2426

25-
pub use self::valid::{Valid, ValidProjection, Validate, ValidateError, ValidateFromParts};
27+
pub use self::valid::{Valid, Validate, ValidateError, ValidateFromParts};
2628

2729
/// Core key share
2830
///
@@ -92,6 +94,23 @@ pub struct DirtyCoreKeyShare<E: Curve> {
9294
pub curve: CurveName<E>,
9395
/// Index of local party in key generation protocol
9496
pub i: u16,
97+
/// Public key info
98+
#[cfg_attr(feature = "serde", serde(flatten))]
99+
pub key_info: DirtyKeyInfo<E>,
100+
/// Secret share $x_i$
101+
#[cfg_attr(feature = "serde", serde(with = "As::<generic_ec::serde::Compact>"))]
102+
pub x: SecretScalar<E>,
103+
}
104+
105+
/// Public Key Info
106+
///
107+
/// Contains public information about the TSS key, including shared public key, commitments to
108+
/// secret shares and etc.
109+
#[derive(Clone, Debug)]
110+
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
111+
#[cfg_attr(feature = "serde", serde(bound = ""))]
112+
#[cfg_attr(feature = "udigest", derive(udigest::Digestable))]
113+
pub struct DirtyKeyInfo<E: Curve> {
95114
/// Public key corresponding to shared secret key. Corresponds to _X_ in paper.
96115
#[cfg_attr(feature = "serde", serde(with = "As::<generic_ec::serde::Compact>"))]
97116
pub shared_public_key: Point<E>,
@@ -112,10 +131,8 @@ pub struct DirtyCoreKeyShare<E: Curve> {
112131
serde(default),
113132
serde(with = "As::<Option<utils::HexOrBin>>")
114133
)]
134+
#[cfg_attr(feature = "udigest", udigest(with = utils::encoding::maybe_bytes))]
115135
pub chain_code: Option<slip_10::ChainCode>,
116-
/// Secret share $x_i$
117-
#[cfg_attr(feature = "serde", serde(with = "As::<generic_ec::serde::Compact>"))]
118-
pub x: SecretScalar<E>,
119136
}
120137

121138
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -134,42 +151,6 @@ pub struct VssSetup<E: Curve> {
134151
pub I: Vec<NonZero<Scalar<E>>>,
135152
}
136153

137-
/// Public Key Info
138-
///
139-
/// Contains public information about the TSS key, including shared public key, commitments to
140-
/// secret shares and etc.
141-
#[derive(Clone, Debug)]
142-
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
143-
#[cfg_attr(feature = "serde", serde(bound = ""))]
144-
#[cfg_attr(feature = "udigest", derive(udigest::Digestable))]
145-
pub struct DirtyKeyInfo<E: Curve> {
146-
/// Guard that ensures curve consistency for deseraization
147-
#[cfg_attr(feature = "udigest", udigest(with = utils::encoding::curve_name))]
148-
pub curve: CurveName<E>,
149-
/// Public key corresponding to shared secret key. Corresponds to _X_ in paper.
150-
#[cfg_attr(feature = "serde", serde(with = "As::<generic_ec::serde::Compact>"))]
151-
pub shared_public_key: Point<E>,
152-
/// Public shares of all signers sharing the key
153-
///
154-
/// `public_shares[i]` corresponds to public share (or public commitment) of $\ith$ party.
155-
#[cfg_attr(
156-
feature = "serde",
157-
serde(with = "As::<Vec<generic_ec::serde::Compact>>")
158-
)]
159-
pub public_shares: Vec<Point<E>>,
160-
/// Verifiable secret sharing setup, present if key was generated using VSS scheme
161-
pub vss_setup: Option<VssSetup<E>>,
162-
/// Chain code associated with the key, if HD wallets support was enabled
163-
#[cfg(feature = "hd-wallets")]
164-
#[cfg_attr(
165-
feature = "serde",
166-
serde(default),
167-
serde(with = "As::<Option<utils::HexOrBin>>")
168-
)]
169-
#[cfg_attr(feature = "udigest", udigest(with = utils::encoding::maybe_bytes))]
170-
pub chain_code: Option<slip_10::ChainCode>,
171-
}
172-
173154
impl<E: Curve> Validate for DirtyCoreKeyShare<E> {
174155
type Error = InvalidCoreShare;
175156

@@ -182,12 +163,7 @@ impl<E: Curve> Validate for DirtyCoreKeyShare<E> {
182163
return Err(InvalidShareReason::PartySecretShareDoesntMatchPublicShare.into());
183164
}
184165

185-
match &self.vss_setup {
186-
Some(vss_setup) => {
187-
validate_vss_key_info(self.shared_public_key, &self.public_shares, vss_setup)?
188-
}
189-
None => validate_non_vss_key_info(self.shared_public_key, &self.public_shares)?,
190-
}
166+
self.key_info.is_valid()?;
191167

192168
Ok(())
193169
}
@@ -391,34 +367,18 @@ impl<E: Curve> CoreKeyShare<E> {
391367
}
392368
}
393369

394-
impl<E: Curve> From<&DirtyCoreKeyShare<E>> for DirtyKeyInfo<E> {
395-
fn from(key_share: &DirtyCoreKeyShare<E>) -> Self {
396-
DirtyKeyInfo {
397-
curve: key_share.curve,
398-
shared_public_key: key_share.shared_public_key,
399-
public_shares: key_share.public_shares.clone(),
400-
vss_setup: key_share.vss_setup.clone(),
401-
#[cfg(feature = "hd-wallets")]
402-
chain_code: key_share.chain_code,
403-
}
370+
impl<E: Curve> ops::Deref for DirtyCoreKeyShare<E> {
371+
type Target = DirtyKeyInfo<E>;
372+
fn deref(&self) -> &Self::Target {
373+
&self.key_info
404374
}
405375
}
406-
impl<E: Curve> From<DirtyCoreKeyShare<E>> for DirtyKeyInfo<E> {
407-
fn from(key_share: DirtyCoreKeyShare<E>) -> Self {
408-
DirtyKeyInfo {
409-
curve: key_share.curve,
410-
shared_public_key: key_share.shared_public_key,
411-
public_shares: key_share.public_shares,
412-
vss_setup: key_share.vss_setup,
413-
#[cfg(feature = "hd-wallets")]
414-
chain_code: key_share.chain_code,
415-
}
376+
impl<E: Curve> AsRef<DirtyKeyInfo<E>> for DirtyCoreKeyShare<E> {
377+
fn as_ref(&self) -> &DirtyKeyInfo<E> {
378+
&self.key_info
416379
}
417380
}
418381

419-
impl<E: Curve> ValidProjection<DirtyCoreKeyShare<E>> for DirtyKeyInfo<E> {}
420-
impl<E: Curve> ValidProjection<&DirtyCoreKeyShare<E>> for DirtyKeyInfo<E> {}
421-
422382
/// Error indicating that key share is not valid
423383
#[derive(Debug, thiserror::Error)]
424384
#[error(transparent)]

key-share/src/utils.rs

-7
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,6 @@ use hex as _;
1212

1313
#[cfg(feature = "udigest")]
1414
pub mod encoding {
15-
pub fn curve_name<B: udigest::Buffer, E: generic_ec::Curve>(
16-
_value: &generic_ec::serde::CurveName<E>,
17-
encoder: udigest::encoding::EncodeValue<B>,
18-
) {
19-
encoder.encode_leaf_value(E::CURVE_NAME)
20-
}
21-
2215
#[cfg(feature = "hd-wallets")]
2316
pub fn maybe_bytes<B: udigest::Buffer>(
2417
m: &Option<impl AsRef<[u8]>>,

0 commit comments

Comments
 (0)